@nordicsemiconductor/pc-nrfconnect-shared 121.0.0 → 123.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/Changelog.md +85 -0
  2. package/coverage/cobertura-coverage.xml +2276 -1778
  3. package/ipc/launcherConfig.ts +25 -0
  4. package/ipc/openWindow.ts +17 -1
  5. package/ipc/schema/packageJson.ts +26 -22
  6. package/main/index.ts +11 -5
  7. package/mocks/packageJsonMock.ts +1 -1
  8. package/nrfutil/device/__mocks__/device.ts +2 -0
  9. package/nrfutil/device/batch.ts +19 -9
  10. package/nrfutil/device/common.ts +32 -46
  11. package/nrfutil/device/device.ts +2 -0
  12. package/nrfutil/device/deviceInfo.ts +70 -0
  13. package/nrfutil/device/erase.ts +2 -2
  14. package/nrfutil/device/firmwareRead.ts +2 -2
  15. package/nrfutil/device/getCoreInfo.ts +2 -2
  16. package/nrfutil/device/getFwInfo.ts +2 -2
  17. package/nrfutil/device/getProtectionStatus.ts +2 -2
  18. package/nrfutil/device/list.ts +5 -31
  19. package/nrfutil/device/program.ts +4 -4
  20. package/nrfutil/device/recover.ts +2 -2
  21. package/nrfutil/device/reset.ts +2 -2
  22. package/nrfutil/device/setMcuState.ts +2 -5
  23. package/nrfutil/device/setProtectionStatus.ts +2 -2
  24. package/nrfutil/index.ts +1 -1
  25. package/nrfutil/moduleVersion.ts +22 -2
  26. package/nrfutil/sandbox.ts +52 -32
  27. package/nrfutil/sandboxTypes.ts +15 -1
  28. package/package.json +3 -2
  29. package/scripts/check-app-properties.ts +6 -6
  30. package/scripts/esbuild.ts +3 -3
  31. package/scripts/nordic-publish.js +23 -23
  32. package/scripts/nordic-publish.ts +3 -3
  33. package/scripts/release-shared.ts +2 -2
  34. package/src/About/ApplicationCard.tsx +3 -5
  35. package/src/About/DeviceCard.tsx +6 -5
  36. package/src/About/SupportCard.tsx +2 -2
  37. package/src/App/App.test.tsx +7 -0
  38. package/src/App/App.tsx +14 -27
  39. package/src/Device/DeviceSelector/BasicDeviceInfo.tsx +12 -6
  40. package/src/Device/DeviceSelector/DeviceList/AnimatedList.tsx +1 -1
  41. package/src/Device/DeviceSelector/DeviceList/Device.tsx +7 -5
  42. package/src/Device/DeviceSelector/DeviceList/DeviceList.tsx +23 -5
  43. package/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.tsx +7 -6
  44. package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +26 -30
  45. package/src/Device/DeviceSelector/DeviceList/edit-device-buttons.scss +1 -2
  46. package/src/Device/DeviceSelector/DeviceSelector.test.tsx +17 -37
  47. package/src/Device/DeviceSelector/DeviceSelector.tsx +64 -21
  48. package/src/Device/DeviceSelector/Favorite.tsx +10 -10
  49. package/src/Device/DeviceSelector/basic-device-info.scss +0 -12
  50. package/src/Device/deviceInfo/deviceInfo.ts +2 -2
  51. package/src/Device/deviceLister.ts +111 -59
  52. package/src/Device/deviceSetup.ts +30 -13
  53. package/src/Device/deviceSlice.ts +157 -84
  54. package/src/Device/jprogOperations.ts +56 -27
  55. package/src/Device/sdfuOperations.ts +25 -31
  56. package/src/ErrorBoundary/ErrorBoundary.tsx +7 -13
  57. package/src/Feedback/sendFeedback.ts +2 -4
  58. package/src/InlineInput/NumberInlineInput.tsx +1 -1
  59. package/src/InlineInput/NumberInputWithDropdown.tsx +1 -2
  60. package/src/index.ts +4 -0
  61. package/src/logging/sendInitialLogMessages.ts +15 -13
  62. package/src/utils/appDetails.ts +22 -0
  63. package/src/utils/appDirs.ts +4 -4
  64. package/src/utils/launcherConfig.ts +17 -0
  65. package/src/utils/logLibVersions.ts +1 -1
  66. package/src/utils/packageJson.ts +52 -10
  67. package/src/utils/persistentStore.ts +21 -14
  68. package/src/utils/systemReport.ts +4 -6
  69. package/src/utils/usageData.ts +75 -167
  70. package/src/utils/usageDataCommon.ts +59 -0
  71. package/src/utils/usageDataMain.ts +117 -0
  72. package/src/utils/usageDataRenderer.ts +126 -0
  73. package/src/utils/useHotKey.ts +2 -2
  74. package/typings/generated/ipc/launcherConfig.d.ts +14 -0
  75. package/typings/generated/ipc/launcherConfig.d.ts.map +1 -0
  76. package/typings/generated/ipc/openWindow.d.ts +10 -4
  77. package/typings/generated/ipc/openWindow.d.ts.map +1 -1
  78. package/typings/generated/ipc/schema/packageJson.d.ts +34 -52
  79. package/typings/generated/ipc/schema/packageJson.d.ts.map +1 -1
  80. package/typings/generated/main/index.d.ts +8 -2
  81. package/typings/generated/main/index.d.ts.map +1 -1
  82. package/typings/generated/nrfutil/device/__mocks__/device.d.ts +1 -0
  83. package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -1
  84. package/typings/generated/nrfutil/device/batch.d.ts +3 -2
  85. package/typings/generated/nrfutil/device/batch.d.ts.map +1 -1
  86. package/typings/generated/nrfutil/device/common.d.ts +7 -34
  87. package/typings/generated/nrfutil/device/common.d.ts.map +1 -1
  88. package/typings/generated/nrfutil/device/device.d.ts +14 -13
  89. package/typings/generated/nrfutil/device/device.d.ts.map +1 -1
  90. package/typings/generated/nrfutil/device/deviceInfo.d.ts +40 -0
  91. package/typings/generated/nrfutil/device/deviceInfo.d.ts.map +1 -0
  92. package/typings/generated/nrfutil/device/erase.d.ts +2 -2
  93. package/typings/generated/nrfutil/device/erase.d.ts.map +1 -1
  94. package/typings/generated/nrfutil/device/firmwareRead.d.ts +2 -2
  95. package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -1
  96. package/typings/generated/nrfutil/device/getCoreInfo.d.ts +2 -2
  97. package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -1
  98. package/typings/generated/nrfutil/device/getFwInfo.d.ts +2 -2
  99. package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -1
  100. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +2 -2
  101. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -1
  102. package/typings/generated/nrfutil/device/list.d.ts +3 -3
  103. package/typings/generated/nrfutil/device/list.d.ts.map +1 -1
  104. package/typings/generated/nrfutil/device/program.d.ts +2 -2
  105. package/typings/generated/nrfutil/device/program.d.ts.map +1 -1
  106. package/typings/generated/nrfutil/device/recover.d.ts +2 -2
  107. package/typings/generated/nrfutil/device/recover.d.ts.map +1 -1
  108. package/typings/generated/nrfutil/device/reset.d.ts +2 -2
  109. package/typings/generated/nrfutil/device/reset.d.ts.map +1 -1
  110. package/typings/generated/nrfutil/device/setMcuState.d.ts +2 -2
  111. package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -1
  112. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +2 -2
  113. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -1
  114. package/typings/generated/nrfutil/index.d.ts +2 -1
  115. package/typings/generated/nrfutil/index.d.ts.map +1 -1
  116. package/typings/generated/nrfutil/moduleVersion.d.ts +4 -0
  117. package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -1
  118. package/typings/generated/nrfutil/sandbox.d.ts +2 -2
  119. package/typings/generated/nrfutil/sandbox.d.ts.map +1 -1
  120. package/typings/generated/nrfutil/sandboxTypes.d.ts +10 -1
  121. package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -1
  122. package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -1
  123. package/typings/generated/src/About/DeviceCard.d.ts.map +1 -1
  124. package/typings/generated/src/App/App.d.ts +0 -1
  125. package/typings/generated/src/App/App.d.ts.map +1 -1
  126. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -1
  127. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +0 -1
  128. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -1
  129. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -1
  130. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -1
  131. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +0 -1
  132. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -1
  133. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
  134. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +0 -1
  135. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -1
  136. package/typings/generated/src/Device/deviceLister.d.ts +1 -15
  137. package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
  138. package/typings/generated/src/Device/deviceSetup.d.ts +7 -6
  139. package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -1
  140. package/typings/generated/src/Device/deviceSlice.d.ts +16 -15
  141. package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -1
  142. package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -1
  143. package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -1
  144. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
  145. package/typings/generated/src/Feedback/sendFeedback.d.ts.map +1 -1
  146. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -1
  147. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -1
  148. package/typings/generated/src/InlineInput/NumberInputWithDropdown.d.ts.map +1 -1
  149. package/typings/generated/src/index.d.ts +3 -1
  150. package/typings/generated/src/index.d.ts.map +1 -1
  151. package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
  152. package/typings/generated/src/utils/appDetails.d.ts +4 -0
  153. package/typings/generated/src/utils/appDetails.d.ts.map +1 -0
  154. package/typings/generated/src/utils/appDirs.d.ts +1 -1
  155. package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
  156. package/typings/generated/src/utils/launcherConfig.d.ts +4 -0
  157. package/typings/generated/src/utils/launcherConfig.d.ts.map +1 -0
  158. package/typings/generated/src/utils/packageJson.d.ts +30 -7
  159. package/typings/generated/src/utils/packageJson.d.ts.map +1 -1
  160. package/typings/generated/src/utils/persistentStore.d.ts +3 -2
  161. package/typings/generated/src/utils/persistentStore.d.ts.map +1 -1
  162. package/typings/generated/src/utils/systemReport.d.ts +1 -1
  163. package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
  164. package/typings/generated/src/utils/usageData.d.ts +8 -65
  165. package/typings/generated/src/utils/usageData.d.ts.map +1 -1
  166. package/typings/generated/src/utils/usageDataCommon.d.ts +27 -0
  167. package/typings/generated/src/utils/usageDataCommon.d.ts.map +1 -0
  168. package/typings/generated/src/utils/usageDataMain.d.ts +10 -0
  169. package/typings/generated/src/utils/usageDataMain.d.ts.map +1 -0
  170. package/typings/generated/src/utils/usageDataRenderer.d.ts +10 -0
  171. package/typings/generated/src/utils/usageDataRenderer.d.ts.map +1 -0
  172. package/src/Device/DeviceSelector/DeviceList/device.scss +0 -28
  173. package/src/Device/DeviceSelector/DeviceList/more-device-info.scss +0 -33
  174. package/src/Device/DeviceSelector/favorite.scss +0 -17
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright (c) 2023 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import { ipcMain, ipcRenderer } from 'electron';
8
+
9
+ export interface Configuration {
10
+ isRunningLauncherFromSource: boolean;
11
+ isSkipUpdateApps: boolean;
12
+ isSkipUpdateLauncher: boolean;
13
+ launcherVersion: string;
14
+ userDataDir: string;
15
+ }
16
+ const channel = 'get-config';
17
+
18
+ const getConfig = (): Configuration => ipcRenderer.sendSync(channel);
19
+ const registerGetConfig = (config: Configuration) =>
20
+ ipcMain.on(channel, event => {
21
+ event.returnValue = config;
22
+ });
23
+
24
+ export const forRenderer = { registerGetConfig };
25
+ export const inMain = { getConfig };
package/ipc/openWindow.ts CHANGED
@@ -12,8 +12,24 @@ const channel = {
12
12
  launcher: 'open-app-launcher', // It would be nice to call this `open:launcher` but we have to stick to the current name, because that is used by supported apps.
13
13
  };
14
14
 
15
+ export const isOpenAppOptionsDeviceSN = (
16
+ device: OpenAppOptionsDevice
17
+ ): device is OpenAppOptionsDeviceSN =>
18
+ (device as OpenAppOptionsDeviceSN).serialNumber !== undefined;
19
+
20
+ export const isOpenAppOptionsDevicePort = (
21
+ device: OpenAppOptionsDevice
22
+ ): device is OpenAppOptionsDevicePort =>
23
+ (device as OpenAppOptionsDevicePort).serialPortPath !== undefined;
24
+
25
+ type OpenAppOptionsDeviceSN = { serialNumber: string };
26
+
27
+ type OpenAppOptionsDevicePort = { serialPortPath: string };
28
+
29
+ type OpenAppOptionsDevice = OpenAppOptionsDeviceSN | OpenAppOptionsDevicePort;
30
+
15
31
  export interface OpenAppOptions {
16
- device?: { serialNumber: string; serialPortPath?: string };
32
+ device?: OpenAppOptionsDevice;
17
33
  }
18
34
 
19
35
  type OpenApp = (app: AppSpec, openAppOptions?: OpenAppOptions) => void;
@@ -10,6 +10,20 @@ import { knownDevicePcas } from '../device';
10
10
  import { nrfModules, semver } from '../MetaFiles';
11
11
  import { parseWithPrettifiedErrorMessage } from './parseJson';
12
12
 
13
+ const packageJson = z.object({
14
+ name: z.string(),
15
+ version: semver,
16
+
17
+ displayName: z.string().optional(),
18
+ });
19
+
20
+ export type PackageJson = z.infer<typeof packageJson>;
21
+
22
+ export const parsePackageJson =
23
+ parseWithPrettifiedErrorMessage<PackageJson>(packageJson);
24
+
25
+ // Apps have more required fields in their package.json
26
+
13
27
  const nrfConnectForDesktop = z.object({
14
28
  supportedDevices: z.enum(knownDevicePcas).array().nonempty().optional(),
15
29
  nrfutil: nrfModules.optional(),
@@ -22,12 +36,7 @@ const engines = recordOfOptionalStrings.and(
22
36
  z.object({ nrfconnect: z.string() })
23
37
  );
24
38
 
25
- const packageJson = z.object({
26
- name: z.string(),
27
- version: semver,
28
-
29
- author: z.string().optional(),
30
- bin: z.string().or(recordOfOptionalStrings).optional(),
39
+ const packageJsonApp = packageJson.extend({
31
40
  dependencies: recordOfOptionalStrings.optional(),
32
41
  description: z.string(),
33
42
  homepage: z.string().url().optional(),
@@ -36,8 +45,6 @@ const packageJson = z.object({
36
45
  engines,
37
46
  nrfConnectForDesktop,
38
47
  files: z.string().array().optional(),
39
- license: z.string().optional(),
40
- main: z.string().optional(),
41
48
  peerDependencies: recordOfOptionalStrings.optional(),
42
49
  repository: z
43
50
  .object({
@@ -45,25 +52,22 @@ const packageJson = z.object({
45
52
  url: z.string().url(),
46
53
  })
47
54
  .optional(),
48
- scripts: recordOfOptionalStrings.optional(),
49
55
  });
50
56
 
51
- export type PackageJson = z.infer<typeof packageJson>;
57
+ export type PackageJsonApp = z.infer<typeof packageJsonApp>;
52
58
 
53
- export const parsePackageJson =
54
- parseWithPrettifiedErrorMessage<PackageJson>(packageJson);
59
+ export const parsePackageJsonApp =
60
+ parseWithPrettifiedErrorMessage<PackageJsonApp>(packageJsonApp);
55
61
 
56
62
  // In the launcher we want to handle that the whole nrfConnectForDesktop may be missing
57
63
  // and the html in it can also be undefined, so there we need to use this legacy variant
58
- const legacyPackageJson = packageJson.merge(
59
- z.object({
60
- nrfConnectForDesktop: nrfConnectForDesktop
61
- .partial({ html: true })
62
- .optional(),
63
- })
64
- );
64
+ const packageJsonLegacyApp = packageJsonApp.extend({
65
+ nrfConnectForDesktop: nrfConnectForDesktop
66
+ .partial({ html: true })
67
+ .optional(),
68
+ });
65
69
 
66
- export type LegacyPackageJson = z.infer<typeof legacyPackageJson>;
70
+ export type PackageJsonLegacyApp = z.infer<typeof packageJsonLegacyApp>;
67
71
 
68
- export const parseLegacyPackageJson =
69
- parseWithPrettifiedErrorMessage<LegacyPackageJson>(legacyPackageJson);
72
+ export const parsePackageJsonLegacyApp =
73
+ parseWithPrettifiedErrorMessage<PackageJsonLegacyApp>(packageJsonLegacyApp);
package/main/index.ts CHANGED
@@ -6,6 +6,7 @@
6
6
 
7
7
  import { forRenderer as forRendererAppDetails } from '../ipc/appDetails';
8
8
  import { forRenderer as forRendererApps } from '../ipc/apps';
9
+ import { forRenderer as forRendererLauncherConfig } from '../ipc/launcherConfig';
9
10
  import { forRenderer as forRendererOpenWindow } from '../ipc/openWindow';
10
11
  import { forRenderer as forRendererPreventSleep } from '../ipc/preventSleep';
11
12
  import { forRenderer as forRendererSafeStorage } from '../ipc/safeStorage';
@@ -18,6 +19,7 @@ export { registerLauncherWindowFromMain } from '../ipc/infrastructure/mainToRend
18
19
 
19
20
  export const appDetails = { forRenderer: forRendererAppDetails };
20
21
  export const apps = { forRenderer: forRendererApps };
22
+ export const launcherConfig = { forRenderer: forRendererLauncherConfig };
21
23
  export const openWindow = { forRenderer: forRendererOpenWindow };
22
24
  export const preventSleep = { forRenderer: forRendererPreventSleep };
23
25
  export const safeStorage = {
@@ -37,11 +39,15 @@ export {
37
39
  type WithdrawnJson,
38
40
  } from '../ipc/MetaFiles';
39
41
  export {
40
- type LegacyPackageJson,
41
- type PackageJson,
42
- parseLegacyPackageJson,
43
- parsePackageJson,
42
+ type PackageJsonLegacyApp,
43
+ type PackageJsonApp,
44
+ parsePackageJsonLegacyApp,
45
+ parsePackageJsonApp,
44
46
  } from '../ipc/schema/packageJson';
45
47
 
46
48
  export { type OverwriteOptions } from '../ipc/serialPort';
47
- export { type OpenAppOptions } from '../ipc/openWindow';
49
+ export type { OpenAppOptions } from '../ipc/openWindow';
50
+ export {
51
+ isOpenAppOptionsDevicePort,
52
+ isOpenAppOptionsDeviceSN,
53
+ } from '../ipc/openWindow';
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- export default () => ({
7
+ export const packageJson = () => ({
8
8
  name: 'mocked-test-app',
9
9
  version: '27.6.72',
10
10
  });
@@ -6,6 +6,7 @@
6
6
 
7
7
  const program = jest.fn();
8
8
  const programBuffer = jest.fn();
9
+ const deviceInfo = jest.fn(() => Promise.resolve({}));
9
10
  const erase = jest.fn();
10
11
  const recover = jest.fn();
11
12
  const reset = jest.fn();
@@ -26,6 +27,7 @@ const getModuleVersion = jest.fn();
26
27
  export default {
27
28
  program,
28
29
  programBuffer,
30
+ deviceInfo,
29
31
  erase,
30
32
  recover,
31
33
  reset,
@@ -16,7 +16,7 @@ import {
16
16
  DeviceTraits,
17
17
  deviceTraitsToArgs,
18
18
  getDeviceSandbox,
19
- NrfutilDeviceWithSerialnumber,
19
+ NrfutilDevice,
20
20
  ResetKind,
21
21
  } from './common';
22
22
  import { DeviceBuffer } from './firmwareRead';
@@ -55,13 +55,7 @@ export class Batch {
55
55
  await box.singleInfoOperationOptionalData<object>(
56
56
  command,
57
57
  undefined,
58
- [
59
- '--serial-number', // this is a workaround this param should now be needed with --generate
60
- '123',
61
- '--generate',
62
- '--core',
63
- core,
64
- ].concat(args)
58
+ ['--generate', '--core', core].concat(args)
65
59
  );
66
60
 
67
61
  return {
@@ -75,6 +69,16 @@ export class Batch {
75
69
  this.operationBatchGeneration.push(getPromise());
76
70
  }
77
71
 
72
+ public getDeviceInfo(core: DeviceCore, callbacks?: Callbacks<FWInfo>) {
73
+ this.enqueueBatchOperationObject(
74
+ 'device-info',
75
+ core,
76
+ callbacks as CallbacksUnknown
77
+ );
78
+
79
+ return this;
80
+ }
81
+
78
82
  public erase(core: DeviceCore, callbacks?: Callbacks) {
79
83
  this.enqueueBatchOperationObject(
80
84
  'erase',
@@ -225,9 +229,15 @@ export class Batch {
225
229
  }
226
230
 
227
231
  public async run(
228
- device: NrfutilDeviceWithSerialnumber,
232
+ device: NrfutilDevice,
229
233
  controller?: AbortController | undefined
230
234
  ): Promise<unknown[]> {
235
+ if (!device.serialNumber) {
236
+ throw new Error(
237
+ `Device does not have a serial number, no device operation is possible`
238
+ );
239
+ }
240
+
231
241
  let currentOperationIndex = -1;
232
242
  let lastCompletedOperationIndex = -1;
233
243
  const results: TaskEnd<unknown>[] = [];
@@ -42,48 +42,25 @@ export interface DeviceLeftEvent {
42
42
  id: number;
43
43
  }
44
44
 
45
- export interface HwInfo {
46
- romSize: number;
47
- ramSize: number;
48
- romPageSize: number;
49
- deviceFamily: string;
50
- deviceVersion: string;
51
- }
52
-
53
- export interface DfuTriggerInfo {
54
- wAddress: number;
55
- wVersionMajor: number;
56
- wVersionMinor: number;
57
- wFirmwareId: number;
58
- wFlashSize: number;
59
- wFlashPageSize: number;
60
- }
61
-
62
- export interface DfuTriggerVersion {
63
- semVer: string;
45
+ export interface NordicDevKit {
46
+ boardVersion?: string;
47
+ deviceFamily?: string;
64
48
  }
65
49
 
66
50
  export interface NrfutilDevice {
67
51
  id: number;
68
- serialNumber?: string; // undefined in case udev is not installed
52
+ devkit?: NordicDevKit;
53
+ serialNumber?: string | null; // undefined in case udev is not installed
69
54
  traits: DeviceTraits;
70
55
  usb?: USB;
71
- jlink?: JLink;
72
56
  // non-Nordic devices may not have serialPorts property at all
73
57
  serialPorts?: Array<SerialPort>;
74
- hwInfo?: HwInfo;
75
- dfuTriggerInfo?: DfuTriggerInfo;
76
- dfuTriggerVersion?: DfuTriggerVersion;
77
58
  broken?: null | {
78
59
  description: string;
79
60
  url: string;
80
61
  };
81
62
  }
82
63
 
83
- export interface NrfutilDeviceWithSerialnumber extends NrfutilDevice {
84
- serialNumber: string;
85
- }
86
-
87
64
  export type DeviceFamily =
88
65
  | 'NRF51_FAMILY'
89
66
  | 'NRF52_FAMILY'
@@ -168,15 +145,6 @@ export interface USBDevice {
168
145
  descriptor: USBDeviceDescriptor;
169
146
  configList: USBConfiguration; // todo: check this prop
170
147
  }
171
-
172
- export interface JLink {
173
- serialNumber: string;
174
- boardVersion: string | null; // can be null for external jLink
175
- jlinkObFirmwareVersion: string | null;
176
- deviceFamily: string | null;
177
- deviceVersion: string | null; // will be null if device is protected
178
- }
179
-
180
148
  export interface SerialPort {
181
149
  serialNumber: string | null;
182
150
  comName: string | null;
@@ -204,26 +172,33 @@ export const getDeviceSandbox = async () => {
204
172
  );
205
173
  deviceSandbox = await promiseDeviceSandbox;
206
174
 
207
- deviceSandbox.onLogging(evt => {
175
+ deviceSandbox.onLogging((evt, pid) => {
208
176
  const deviceLogger = getNrfutilLogger();
177
+ const formatMsg = (msg: string) =>
178
+ `${
179
+ pid && deviceSandbox?.logLevel === 'trace'
180
+ ? `[PID:${pid}] `
181
+ : ''
182
+ }${msg}`;
183
+
209
184
  switch (evt.level) {
210
185
  case 'TRACE':
211
- deviceLogger?.verbose(evt.message);
186
+ deviceLogger?.verbose(formatMsg(evt.message));
212
187
  break;
213
188
  case 'DEBUG':
214
- deviceLogger?.debug(evt.message);
189
+ deviceLogger?.debug(formatMsg(evt.message));
215
190
  break;
216
191
  case 'INFO':
217
- deviceLogger?.info(evt.message);
192
+ deviceLogger?.info(formatMsg(evt.message));
218
193
  break;
219
194
  case 'WARN':
220
- deviceLogger?.warn(evt.message);
195
+ deviceLogger?.warn(formatMsg(evt.message));
221
196
  break;
222
197
  case 'ERROR':
223
- deviceLogger?.error(evt.message);
198
+ deviceLogger?.error(formatMsg(evt.message));
224
199
  break;
225
200
  case 'CRITICAL':
226
- deviceLogger?.error(evt.message);
201
+ deviceLogger?.error(formatMsg(evt.message));
227
202
  break;
228
203
  case 'OFF':
229
204
  default:
@@ -246,12 +221,17 @@ export const getDeviceSandbox = async () => {
246
221
  };
247
222
 
248
223
  export const deviceSingleTaskEndOperation = async <T = void>(
249
- device: NrfutilDeviceWithSerialnumber,
224
+ device: NrfutilDevice,
250
225
  command: string,
251
226
  onProgress?: (progress: Progress) => void,
252
227
  controller?: AbortController,
253
228
  args: string[] = []
254
229
  ) => {
230
+ if (!device.serialNumber) {
231
+ throw new Error(
232
+ `Device does not have a serial number, no device operation is possible`
233
+ );
234
+ }
255
235
  const box = await getDeviceSandbox();
256
236
  return box.singleTaskEndOperationWithData<T>(
257
237
  command,
@@ -262,12 +242,18 @@ export const deviceSingleTaskEndOperation = async <T = void>(
262
242
  };
263
243
 
264
244
  export const deviceSingleTaskEndOperationVoid = async (
265
- device: NrfutilDeviceWithSerialnumber,
245
+ device: NrfutilDevice,
266
246
  command: string,
267
247
  onProgress?: (progress: Progress) => void,
268
248
  controller?: AbortController,
269
249
  args: string[] = []
270
250
  ) => {
251
+ if (!device.serialNumber) {
252
+ throw new Error(
253
+ `Device does not have a serial number, no device operation is possible`
254
+ );
255
+ }
256
+
271
257
  const box = await getDeviceSandbox();
272
258
  await box.singleTaskEndOperationOptionalData(
273
259
  command,
@@ -7,6 +7,7 @@
7
7
  import { LogLevel, LogMessage } from '../sandboxTypes';
8
8
  import { Batch } from './batch';
9
9
  import { getDeviceSandbox } from './common';
10
+ import deviceInfo from './deviceInfo';
10
11
  import erase from './erase';
11
12
  import firmwareRead from './firmwareRead';
12
13
  import getCoreInfo from './getCoreInfo';
@@ -43,6 +44,7 @@ const getModuleVersion = async () => {
43
44
 
44
45
  export default {
45
46
  program,
47
+ deviceInfo,
46
48
  erase,
47
49
  recover,
48
50
  reset,
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Copyright (c) 2023 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import { Progress } from '../sandboxTypes';
8
+ import {
9
+ DeviceCore,
10
+ deviceSingleTaskEndOperation,
11
+ NrfutilDevice,
12
+ } from './common';
13
+
14
+ export interface HwInfo {
15
+ romSize: number;
16
+ ramSize: number;
17
+ romPageSize: number;
18
+ deviceFamily: string;
19
+ deviceVersion: string;
20
+ }
21
+
22
+ export interface JLinkDeviceInfo {
23
+ serialNumber: string;
24
+ boardVersion?: string;
25
+ jlinkObFirmwareVersion: string;
26
+ deviceFamily: string | null;
27
+ deviceVersion?: string | null;
28
+ }
29
+
30
+ export interface DfuTriggerInfo {
31
+ wAddress: number;
32
+ wVersionMajor: number;
33
+ wVersionMinor: number;
34
+ wFirmwareId: number;
35
+ wFlashSize: number;
36
+ wFlashPageSize: number;
37
+ }
38
+ export interface DfuTriggerVersion {
39
+ semVer: string;
40
+ }
41
+
42
+ export interface DeviceInfo {
43
+ hwInfo?: HwInfo;
44
+ jlink?: JLinkDeviceInfo;
45
+ dfuTriggerVersion?: DfuTriggerVersion;
46
+ dfuTriggerInfo?: DfuTriggerInfo;
47
+ }
48
+
49
+ export interface DeviceInfoRaw {
50
+ name: 'device-info';
51
+ deviceInfo: DeviceInfo;
52
+ }
53
+
54
+ export default async (
55
+ device: NrfutilDevice,
56
+ core?: DeviceCore,
57
+ onProgress?: (progress: Progress) => void,
58
+ controller?: AbortController
59
+ ) =>
60
+ device.traits.jlink || device.traits.nordicDfu
61
+ ? (
62
+ await deviceSingleTaskEndOperation<DeviceInfoRaw>(
63
+ device,
64
+ 'device-info',
65
+ onProgress,
66
+ controller,
67
+ core ? ['--core', core] : []
68
+ )
69
+ ).deviceInfo
70
+ : undefined;
@@ -8,11 +8,11 @@ import { Progress } from '../sandboxTypes';
8
8
  import {
9
9
  DeviceCore,
10
10
  deviceSingleTaskEndOperationVoid,
11
- NrfutilDeviceWithSerialnumber,
11
+ NrfutilDevice,
12
12
  } from './common';
13
13
 
14
14
  export default (
15
- device: NrfutilDeviceWithSerialnumber,
15
+ device: NrfutilDevice,
16
16
  core?: DeviceCore,
17
17
  onProgress?: (progress: Progress) => void,
18
18
  controller?: AbortController
@@ -8,7 +8,7 @@ import { Progress } from '../sandboxTypes';
8
8
  import {
9
9
  DeviceCore,
10
10
  deviceSingleTaskEndOperation,
11
- NrfutilDeviceWithSerialnumber,
11
+ NrfutilDevice,
12
12
  } from './common';
13
13
 
14
14
  export interface DeviceBuffer {
@@ -17,7 +17,7 @@ export interface DeviceBuffer {
17
17
  }
18
18
 
19
19
  export default async (
20
- device: NrfutilDeviceWithSerialnumber,
20
+ device: NrfutilDevice,
21
21
  core?: DeviceCore,
22
22
  onProgress?: (progress: Progress) => void,
23
23
  controller?: AbortController
@@ -8,7 +8,7 @@ import { Progress } from '../sandboxTypes';
8
8
  import {
9
9
  DeviceCore,
10
10
  deviceSingleTaskEndOperation,
11
- NrfutilDeviceWithSerialnumber,
11
+ NrfutilDevice,
12
12
  } from './common';
13
13
 
14
14
  export type DeviceCoreInfo = {
@@ -30,7 +30,7 @@ export type DeviceCoreInfo = {
30
30
  };
31
31
 
32
32
  export default (
33
- device: NrfutilDeviceWithSerialnumber,
33
+ device: NrfutilDevice,
34
34
  core?: DeviceCore,
35
35
  onProgress?: (progress: Progress) => void,
36
36
  controller?: AbortController
@@ -8,7 +8,7 @@ import { Progress } from '../sandboxTypes';
8
8
  import {
9
9
  DeviceCore,
10
10
  deviceSingleTaskEndOperation,
11
- NrfutilDeviceWithSerialnumber,
11
+ NrfutilDevice,
12
12
  } from './common';
13
13
 
14
14
  type BootloaderType =
@@ -55,7 +55,7 @@ export interface FWInfo {
55
55
  }
56
56
 
57
57
  export default (
58
- device: NrfutilDeviceWithSerialnumber,
58
+ device: NrfutilDevice,
59
59
  core?: DeviceCore,
60
60
  onProgress?: (progress: Progress) => void,
61
61
  controller?: AbortController
@@ -8,7 +8,7 @@ import { Progress } from '../sandboxTypes';
8
8
  import {
9
9
  DeviceCore,
10
10
  deviceSingleTaskEndOperation,
11
- NrfutilDeviceWithSerialnumber,
11
+ NrfutilDevice,
12
12
  } from './common';
13
13
 
14
14
  type DeviceFamily =
@@ -32,7 +32,7 @@ export interface GetProtectionStatusResult {
32
32
  }
33
33
 
34
34
  export default (
35
- device: NrfutilDeviceWithSerialnumber,
35
+ device: NrfutilDevice,
36
36
  core?: DeviceCore,
37
37
  onProgress?: (progress: Progress) => void,
38
38
  controller?: AbortController
@@ -4,13 +4,11 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- import logger from '../../src/logging';
8
7
  import {
9
8
  DeviceTraits,
10
9
  deviceTraitsToArgs,
11
10
  getDeviceSandbox,
12
11
  NrfutilDevice,
13
- NrfutilDeviceWithSerialnumber,
14
12
  } from './common';
15
13
 
16
14
  export interface HotplugEvent {
@@ -32,10 +30,10 @@ const isHotplugEvent = (
32
30
 
33
31
  export default async (
34
32
  traits: DeviceTraits,
35
- onEnumerated: (devices: NrfutilDeviceWithSerialnumber[]) => void,
36
- onError: (error: Error) => void,
33
+ onEnumerated: (devices: NrfutilDevice[]) => void,
34
+ onError: (error: Error, pid?: number) => void,
37
35
  onHotplugEvent?: {
38
- onDeviceArrived: (device: NrfutilDeviceWithSerialnumber) => void;
36
+ onDeviceArrived: (device: NrfutilDevice) => void;
39
37
  onDeviceLeft: (id: number) => void;
40
38
  },
41
39
  timeout?: number
@@ -53,21 +51,7 @@ export default async (
53
51
 
54
52
  const onData = (data: HotplugEvent | ListEvent) => {
55
53
  if (isListEvent(data)) {
56
- data.devices
57
- .filter(d => !d.serialNumber)
58
- .forEach(d => {
59
- logger.warn(
60
- `Device was skipped as it has no Serial number ${JSON.stringify(
61
- d
62
- )}`
63
- );
64
- });
65
-
66
- onEnumerated(
67
- data.devices.filter(
68
- d => d.serialNumber
69
- ) as NrfutilDeviceWithSerialnumber[]
70
- );
54
+ onEnumerated(data.devices);
71
55
 
72
56
  return;
73
57
  }
@@ -77,17 +61,7 @@ export default async (
77
61
  }
78
62
 
79
63
  if (data.event === 'Arrived' && data.device) {
80
- if (data.device.serialNumber) {
81
- onHotplugEvent.onDeviceArrived(
82
- data.device as NrfutilDeviceWithSerialnumber
83
- );
84
- } else {
85
- logger.warn(
86
- `Device was skipped as it has no Serial number ${JSON.stringify(
87
- data.device
88
- )}`
89
- );
90
- }
64
+ onHotplugEvent.onDeviceArrived(data.device);
91
65
  } else if (data.event === 'Left') {
92
66
  onHotplugEvent.onDeviceLeft(data.id);
93
67
  }
@@ -14,7 +14,7 @@ import {
14
14
  DeviceCore,
15
15
  deviceSingleTaskEndOperationVoid,
16
16
  DeviceTraits,
17
- NrfutilDeviceWithSerialnumber,
17
+ NrfutilDevice,
18
18
  ResetKind,
19
19
  } from './common';
20
20
 
@@ -99,7 +99,7 @@ export const programmingOptionsToArgs = (options?: ProgrammingOptions) => {
99
99
  return args.length > 0 ? ['--options', `${args.join(',')}`] : [];
100
100
  };
101
101
  const program = (
102
- device: NrfutilDeviceWithSerialnumber,
102
+ device: NrfutilDevice,
103
103
  firmwarePath: string,
104
104
  onProgress?: (progress: Progress) => void,
105
105
  core?: DeviceCore,
@@ -121,7 +121,7 @@ const program = (
121
121
  );
122
122
 
123
123
  const programBuffer = async (
124
- device: NrfutilDeviceWithSerialnumber,
124
+ device: NrfutilDevice,
125
125
  firmware: Buffer,
126
126
  type: FileExtensions,
127
127
  onProgress?: (progress: Progress) => void,
@@ -157,7 +157,7 @@ const programBuffer = async (
157
157
  };
158
158
 
159
159
  export default async (
160
- device: NrfutilDeviceWithSerialnumber,
160
+ device: NrfutilDevice,
161
161
  firmware: FirmwareType,
162
162
  onProgress?: (progress: Progress) => void,
163
163
  core?: DeviceCore,