@nordicsemiconductor/pc-nrfconnect-shared 89.0.0 → 91.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 (161) hide show
  1. package/Changelog.md +54 -0
  2. package/config/jest.config.js +0 -1
  3. package/config/tsconfig.json +1 -1
  4. package/coverage/cobertura-coverage.xml +2166 -1086
  5. package/ipc/MetaFiles.ts +26 -8
  6. package/nrfutil/device/__mocks__/device.ts +43 -0
  7. package/nrfutil/device/batch.ts +219 -0
  8. package/nrfutil/device/batchTypes.ts +133 -0
  9. package/nrfutil/device/common.ts +274 -0
  10. package/nrfutil/device/device.ts +62 -0
  11. package/nrfutil/device/erase.ts +26 -0
  12. package/nrfutil/device/eraseBatch.ts +28 -0
  13. package/nrfutil/device/firmwareRead.ts +34 -0
  14. package/nrfutil/device/firmwareReadBatch.ts +42 -0
  15. package/nrfutil/device/getCoreInfo.ts +44 -0
  16. package/nrfutil/device/getCoreInfoBatch.ts +29 -0
  17. package/nrfutil/device/getFwInfo.ts +69 -0
  18. package/nrfutil/device/getFwInfoBatch.ts +29 -0
  19. package/nrfutil/device/getProtectionStatus.ts +46 -0
  20. package/nrfutil/device/getProtectionStatusBatch.ts +32 -0
  21. package/nrfutil/device/list.ts +81 -0
  22. package/nrfutil/device/program.ts +186 -0
  23. package/nrfutil/device/programBatch.ts +69 -0
  24. package/nrfutil/device/recover.ts +26 -0
  25. package/nrfutil/device/recoverBatch.ts +28 -0
  26. package/nrfutil/device/reset.ts +41 -0
  27. package/nrfutil/device/resetBatch.ts +30 -0
  28. package/nrfutil/device/setMcuState.ts +27 -0
  29. package/nrfutil/device/setProtectionStatus.ts +27 -0
  30. package/nrfutil/index.ts +25 -0
  31. package/nrfutil/moduleVersion.ts +57 -0
  32. package/nrfutil/nrfutilLogger.ts +15 -0
  33. package/nrfutil/sandbox.ts +504 -0
  34. package/nrfutil/sandboxTypes.ts +178 -0
  35. package/package.json +1 -4
  36. package/scripts/check-app-properties.ts +49 -22
  37. package/scripts/esbuild-renderer.js +0 -1
  38. package/scripts/nordic-publish.js +6 -6
  39. package/scripts/nordic-publish.ts +11 -2
  40. package/src/About/SupportCard.tsx +6 -9
  41. package/src/App/App.test.tsx +4 -0
  42. package/src/App/App.tsx +13 -2
  43. package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +1 -1
  44. package/src/Device/DeviceSelector/DeviceSelector.test.tsx +39 -31
  45. package/src/Device/DeviceSelector/DeviceSelector.tsx +3 -12
  46. package/src/Device/deviceInfo/deviceInfo.ts +2 -3
  47. package/src/Device/deviceLister.test.ts +1 -2
  48. package/src/Device/deviceLister.ts +169 -215
  49. package/src/Device/deviceSlice.ts +2 -16
  50. package/src/Device/jprogOperations.ts +21 -69
  51. package/src/Device/sdfuOperations.ts +77 -93
  52. package/src/ErrorBoundary/ErrorBoundary.tsx +1 -1
  53. package/src/Log/LogViewer.tsx +0 -4
  54. package/src/Log/logSlice.ts +4 -7
  55. package/src/index.ts +0 -1
  56. package/src/logging/sendInitialLogMessages.ts +7 -8
  57. package/src/utils/appDirs.ts +6 -11
  58. package/src/utils/logLibVersions.ts +12 -14
  59. package/src/utils/packageJson.ts +11 -1
  60. package/src/utils/systemReport.ts +11 -17
  61. package/src/utils/usageData.ts +14 -9
  62. package/tsconfig.json +1 -0
  63. package/typings/generated/ipc/MetaFiles.d.ts +21 -8
  64. package/typings/generated/ipc/MetaFiles.d.ts.map +1 -1
  65. package/typings/generated/nrfutil/device/__mocks__/device.d.ts +23 -0
  66. package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -0
  67. package/typings/generated/nrfutil/device/batch.d.ts +26 -0
  68. package/typings/generated/nrfutil/device/batch.d.ts.map +1 -0
  69. package/typings/generated/nrfutil/device/batchTypes.d.ts +78 -0
  70. package/typings/generated/nrfutil/device/batchTypes.d.ts.map +1 -0
  71. package/typings/generated/nrfutil/device/common.d.ts +125 -0
  72. package/typings/generated/nrfutil/device/common.d.ts.map +1 -0
  73. package/typings/generated/nrfutil/device/device.d.ts +30 -0
  74. package/typings/generated/nrfutil/device/device.d.ts.map +1 -0
  75. package/typings/generated/nrfutil/device/erase.d.ts +5 -0
  76. package/typings/generated/nrfutil/device/erase.d.ts.map +1 -0
  77. package/typings/generated/nrfutil/device/eraseBatch.d.ts +7 -0
  78. package/typings/generated/nrfutil/device/eraseBatch.d.ts.map +1 -0
  79. package/typings/generated/nrfutil/device/firmwareRead.d.ts +10 -0
  80. package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -0
  81. package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts +9 -0
  82. package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts.map +1 -0
  83. package/typings/generated/nrfutil/device/getCoreInfo.d.ts +22 -0
  84. package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -0
  85. package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts +8 -0
  86. package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts.map +1 -0
  87. package/typings/generated/nrfutil/device/getFwInfo.d.ts +31 -0
  88. package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -0
  89. package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts +8 -0
  90. package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts.map +1 -0
  91. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +13 -0
  92. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -0
  93. package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts +8 -0
  94. package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts.map +1 -0
  95. package/typings/generated/nrfutil/device/list.d.ts +19 -0
  96. package/typings/generated/nrfutil/device/list.d.ts.map +1 -0
  97. package/typings/generated/nrfutil/device/program.d.ts +27 -0
  98. package/typings/generated/nrfutil/device/program.d.ts.map +1 -0
  99. package/typings/generated/nrfutil/device/programBatch.d.ts +9 -0
  100. package/typings/generated/nrfutil/device/programBatch.d.ts.map +1 -0
  101. package/typings/generated/nrfutil/device/recover.d.ts +5 -0
  102. package/typings/generated/nrfutil/device/recover.d.ts.map +1 -0
  103. package/typings/generated/nrfutil/device/recoverBatch.d.ts +7 -0
  104. package/typings/generated/nrfutil/device/recoverBatch.d.ts.map +1 -0
  105. package/typings/generated/nrfutil/device/reset.d.ts +5 -0
  106. package/typings/generated/nrfutil/device/reset.d.ts.map +1 -0
  107. package/typings/generated/nrfutil/device/resetBatch.d.ts +8 -0
  108. package/typings/generated/nrfutil/device/resetBatch.d.ts.map +1 -0
  109. package/typings/generated/nrfutil/device/setMcuState.d.ts +6 -0
  110. package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -0
  111. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +5 -0
  112. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -0
  113. package/typings/generated/nrfutil/index.d.ts +11 -0
  114. package/typings/generated/nrfutil/index.d.ts.map +1 -0
  115. package/typings/generated/nrfutil/moduleVersion.d.ts +6 -0
  116. package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -0
  117. package/typings/generated/nrfutil/nrfutilLogger.d.ts +4 -0
  118. package/typings/generated/nrfutil/nrfutilLogger.d.ts.map +1 -0
  119. package/typings/generated/nrfutil/sandbox.d.ts +36 -0
  120. package/typings/generated/nrfutil/sandbox.d.ts.map +1 -0
  121. package/typings/generated/nrfutil/sandboxTypes.d.ts +135 -0
  122. package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -0
  123. package/typings/generated/src/About/SupportCard.d.ts.map +1 -1
  124. package/typings/generated/src/App/App.d.ts.map +1 -1
  125. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +2 -6
  126. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
  127. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +2 -2
  128. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -1
  129. package/typings/generated/src/Device/deviceLister.d.ts +11 -16
  130. package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
  131. package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -1
  132. package/typings/generated/src/Device/deviceSlice.d.ts +3 -3
  133. package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -1
  134. package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -1
  135. package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -1
  136. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -1
  137. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
  138. package/typings/generated/src/Log/LogViewer.d.ts.map +1 -1
  139. package/typings/generated/src/Log/logSlice.d.ts +2 -3
  140. package/typings/generated/src/Log/logSlice.d.ts.map +1 -1
  141. package/typings/generated/src/index.d.ts +0 -1
  142. package/typings/generated/src/index.d.ts.map +1 -1
  143. package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
  144. package/typings/generated/src/utils/appDirs.d.ts +4 -4
  145. package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
  146. package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -1
  147. package/typings/generated/src/utils/packageJson.d.ts.map +1 -1
  148. package/typings/generated/src/utils/systemReport.d.ts +1 -1
  149. package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
  150. package/typings/generated/src/utils/usageData.d.ts +2 -0
  151. package/typings/generated/src/utils/usageData.d.ts.map +1 -1
  152. package/mocks/deviceLibMock.ts +0 -21
  153. package/src/Device/deviceLibWrapper.test.ts +0 -97
  154. package/src/Device/deviceLibWrapper.ts +0 -132
  155. package/src/utils/describeVersion.ts +0 -21
  156. package/typings/generated/src/Device/deviceLibWrapper.d.ts +0 -9
  157. package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +0 -1
  158. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +0 -2
  159. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts.map +0 -1
  160. package/typings/generated/src/utils/describeVersion.d.ts +0 -4
  161. package/typings/generated/src/utils/describeVersion.d.ts.map +0 -1
@@ -4,12 +4,12 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- import nrfDeviceLib, {
8
- Device as NrfdlDevice,
7
+ import {
9
8
  DeviceTraits,
10
- HotplugEvent,
11
- } from '@nordicsemiconductor/nrf-device-lib-js';
12
-
9
+ NrfutilDevice,
10
+ NrfutilDeviceWithSerialnumber,
11
+ } from '../../nrfutil/device/common';
12
+ import NrfutilDeviceLib from '../../nrfutil/device/device';
13
13
  import logger from '../logging';
14
14
  import type { AppThunk, RootState } from '../store';
15
15
  import {
@@ -21,11 +21,11 @@ import {
21
21
  setWaitForDeviceTimeout,
22
22
  WaitForDevice,
23
23
  } from './deviceAutoSelectSlice';
24
- import { getDeviceLibContext } from './deviceLibWrapper';
25
24
  import { closeDeviceSetupDialog } from './deviceSetupSlice';
26
- import { addDevice, Device, removeDevice, setDevices } from './deviceSlice';
25
+ import { addDevice, Device, removeDevice } from './deviceSlice';
27
26
  import { isDeviceInDFUBootloader } from './sdfuOperations';
28
27
 
28
+ let stopNrfutilDevice: (callback?: () => void) => void;
29
29
  let autoSelectDeviceCLISerialUsed = false;
30
30
 
31
31
  const hasSameDeviceTraits = (
@@ -99,15 +99,13 @@ const initAutoReconnectTimeout =
99
99
  );
100
100
  };
101
101
 
102
- let hotplugTaskId: bigint | null = null;
103
-
104
102
  /**
105
- * Wrap the device form nrf-device-lib to make the Device type consistent
103
+ * Wrap the device form nrfutil-device to make the Device type consistent
106
104
  *
107
- * @param {Device} device The input device from nrf-device-lib
108
- * @returns {Device} The updated device
105
+ * @param {NrfutilDevice} device The input device from nrfutil-device
106
+ * @returns {NrfutilDevice} The updated device
109
107
  */
110
- export const wrapDeviceFromNrfdl = (device: NrfdlDevice): Device => ({
108
+ export const wrapDeviceFromNrfdl = (device: NrfutilDevice): Device => ({
111
109
  ...device,
112
110
  boardVersion: device.jlink?.boardVersion ?? undefined,
113
111
  serialport: device.serialPorts?.[0] ?? undefined,
@@ -115,12 +113,12 @@ export const wrapDeviceFromNrfdl = (device: NrfdlDevice): Device => ({
115
113
  });
116
114
 
117
115
  /**
118
- * Wrap the device form nrf-device-lib to make the Device type consistent
116
+ * Wrap the device form nrfutil-device to make the Device type consistent
119
117
  *
120
- * @param {Device[]} devices The input devices from nrf-device-lib
121
- * @returns {Device[]} The updated devices
118
+ * @param {NrfutilDevice[]} devices The input devices from nrfutil-device
119
+ * @returns {NrfutilDevice[]} The updated devices
122
120
  */
123
- export const wrapDevicesFromNrfdl = (devices: NrfdlDevice[]): Device[] =>
121
+ export const wrapDevicesFromNrfdl = (devices: NrfutilDevice[]): Device[] =>
124
122
  devices.map(wrapDeviceFromNrfdl);
125
123
 
126
124
  export const hasValidDeviceTraits = (
@@ -164,7 +162,7 @@ const removeDeviceFromList =
164
162
  }
165
163
  };
166
164
  /*
167
- * Starts watching for devices with the given traits. See the nrf-device-lib
165
+ * Starts watching for devices with the given traits. See the nrfutil-device
168
166
  * library for available traits. Whenever devices are attached/detached, this
169
167
  * will dispatch AddDevice or removeDevice and trigger events.
170
168
  */
@@ -175,197 +173,176 @@ export const startWatchingDevices =
175
173
  onDeviceDisconnected: (device: Device) => void,
176
174
  onDeviceDeselected: () => void,
177
175
  doSelectDevice: (device: Device, autoReselected: boolean) => void
178
- ): AppThunk<RootState, Promise<void>> =>
179
- async (dispatch, getState) => {
180
- const updateDeviceList = (event: HotplugEvent) => {
181
- switch (event.event_type) {
182
- case 'NRFDL_DEVICE_EVENT_ARRIVED':
183
- if (!event.device) {
184
- return;
185
- }
176
+ ): AppThunk<RootState, void> =>
177
+ (dispatch, getState) => {
178
+ const onDeviceArrived = (device: NrfutilDeviceWithSerialnumber) => {
179
+ if (hasValidDeviceTraits(device.traits, deviceListing)) {
180
+ device = wrapDeviceFromNrfdl(device);
181
+ if (
182
+ device.serialNumber &&
183
+ !getState().device.devices.has(device.serialNumber)
184
+ ) {
185
+ onDeviceConnected(device);
186
+ }
187
+
188
+ const sn = getState().device.selectedSerialNumber;
189
+ const disconnectionTime =
190
+ getState().deviceAutoSelect.disconnectionTime;
191
+ const autoSelectDevice = getState().deviceAutoSelect.device;
192
+ const selectedDevice =
193
+ sn !== null ? getState().device.devices.get(sn) : undefined;
194
+
195
+ const result = shouldAutoReselect(
196
+ device,
197
+ getState().deviceAutoSelect.autoReselect,
198
+ autoSelectDevice,
199
+ disconnectionTime,
200
+ selectedDevice
201
+ );
202
+
203
+ dispatch(addDevice(device));
204
+ const deviceWithPersistedData = getState().device.devices.get(
205
+ device.serialNumber
206
+ );
207
+
208
+ if (!deviceWithPersistedData) return;
209
+
210
+ if (result) {
211
+ logger.info(
212
+ `Auto Reconnecting Device SN: ${deviceWithPersistedData.serialNumber}`
213
+ );
214
+ doSelectDevice(deviceWithPersistedData, true);
215
+ } else if (
216
+ deviceWithPersistedData.serialNumber ===
217
+ getState().deviceAutoSelect.device?.serialNumber
218
+ ) {
219
+ const waitForDevice =
220
+ getState().deviceAutoSelect.waitForDevice;
221
+
222
+ // Device lib might fail to advertise that a device has left before it rejoins (Mainly OSx)
223
+ // but we still need to trigger the onSuccess if a device 'reappeared' with a different 'id'
224
+ // and there is an outstanding waitForDevice Request. In this case the disconnectionTime was
225
+ // never set (as NRFDL_DEVICE_EVENT_LEFT was never sent) This created an additional problem as device
226
+ // lib may advertise the the same device with a single connect event. Hance we are keeping track of
227
+ // the device ID which is guaranteed to be change if a is disconnected and reconnected (for the
228
+ // same hotplug event listener) to ensure we only call the onSuccess once for every reconnect event.
229
+ // This is mostly relevant when 'when' is always
230
+
231
+ // Device is to be reconnected as timeout is provided
186
232
  if (
187
- hasValidDeviceTraits(
188
- event.device?.traits,
189
- deviceListing
190
- )
233
+ waitForDevice &&
234
+ ((disconnectionTime === undefined &&
235
+ getState().deviceAutoSelect.lastArrivedDeviceId !==
236
+ deviceWithPersistedData.id) ||
237
+ (disconnectionTime ?? 0) + waitForDevice.timeout >=
238
+ Date.now())
191
239
  ) {
192
- const device = wrapDeviceFromNrfdl(event.device);
193
240
  if (
194
- !getState().device.devices.has(device.serialNumber)
241
+ waitForDevice.when === 'always' ||
242
+ (waitForDevice.when === 'dfuBootLoaderMode' &&
243
+ isDeviceInDFUBootloader(
244
+ deviceWithPersistedData
245
+ )) ||
246
+ (waitForDevice.when === 'applicationMode' &&
247
+ deviceWithPersistedData.dfuTriggerInfo !==
248
+ null) ||
249
+ (selectedDevice &&
250
+ waitForDevice.when === 'sameTraits' &&
251
+ hasSameDeviceTraits(
252
+ device.traits,
253
+ selectedDevice.traits
254
+ )) ||
255
+ (typeof waitForDevice.when === 'function' &&
256
+ waitForDevice.when(device))
195
257
  ) {
196
- onDeviceConnected(device);
197
- }
198
-
199
- const sn = getState().device.selectedSerialNumber;
200
- const disconnectionTime =
201
- getState().deviceAutoSelect.disconnectionTime;
202
- const autoSelectDevice =
203
- getState().deviceAutoSelect.device;
204
- const selectedDevice =
205
- sn !== null
206
- ? getState().device.devices.get(sn)
207
- : undefined;
208
-
209
- const result = shouldAutoReselect(
210
- device,
211
- getState().deviceAutoSelect.autoReselect,
212
- autoSelectDevice,
213
- disconnectionTime,
214
- selectedDevice
215
- );
216
-
217
- dispatch(addDevice(device));
218
- const deviceWithPersistedData =
219
- getState().device.devices.get(device.serialNumber);
258
+ dispatch(
259
+ setLastArrivedDeviceId(
260
+ deviceWithPersistedData.id
261
+ )
262
+ );
263
+ dispatch(setDisconnectedTime(undefined));
220
264
 
221
- if (!deviceWithPersistedData) return;
265
+ logger.info('Wait For Device was successfully');
222
266
 
223
- if (result) {
224
- logger.info(
225
- `Auto Reconnecting Device SN: ${deviceWithPersistedData.serialNumber}`
267
+ dispatch(
268
+ clearWaitForDeviceTimeout(waitForDevice.once)
226
269
  );
227
- doSelectDevice(deviceWithPersistedData, true);
228
- } else if (
229
- deviceWithPersistedData.serialNumber ===
230
- getState().deviceAutoSelect.device?.serialNumber
231
- ) {
232
- const waitForDevice =
233
- getState().deviceAutoSelect.waitForDevice;
234
-
235
- // Device lib might fail to advertise that a device has left before it rejoins (Mainly OSx)
236
- // but we still need to trigger the onSuccess if a device 'reappeared' with a different 'id'
237
- // and there is an outstanding waitForDevice Request. In this case the disconnectionTime was
238
- // never set (as NRFDL_DEVICE_EVENT_LEFT was never sent) This created an additional problem as device
239
- // lib may advertise the the same device with a single connect event. Hance we are keeping track of
240
- // the device ID which is guaranteed to be change if a is disconnected and reconnected (for the
241
- // same hotplug event listener) to ensure we only call the onSuccess once for every reconnect event.
242
- // This is mostly relevant when 'when' is always
243
-
244
- // Device is to be reconnected as timeout is provided
245
- if (
246
- waitForDevice &&
247
- ((disconnectionTime === undefined &&
248
- getState().deviceAutoSelect
249
- .lastArrivedDeviceId !==
250
- deviceWithPersistedData.id) ||
251
- (disconnectionTime ?? 0) +
252
- waitForDevice.timeout >=
253
- Date.now())
254
- ) {
255
- if (
256
- waitForDevice.when === 'always' ||
257
- (waitForDevice.when ===
258
- 'dfuBootLoaderMode' &&
259
- isDeviceInDFUBootloader(
260
- deviceWithPersistedData
261
- )) ||
262
- (waitForDevice.when === 'applicationMode' &&
263
- deviceWithPersistedData.dfuTriggerInfo !==
264
- null) ||
265
- (selectedDevice &&
266
- waitForDevice.when === 'sameTraits' &&
267
- hasSameDeviceTraits(
268
- device.traits,
269
- selectedDevice.traits
270
- )) ||
271
- (typeof waitForDevice.when === 'function' &&
272
- waitForDevice.when(device))
273
- ) {
274
- dispatch(
275
- setLastArrivedDeviceId(
276
- deviceWithPersistedData.id
277
- )
278
- );
279
- dispatch(setDisconnectedTime(undefined));
280
-
281
- logger.info(
282
- 'Wait For Device was successfully'
283
- );
284
-
285
- dispatch(
286
- clearWaitForDeviceTimeout(
287
- waitForDevice.once
288
- )
289
- );
290
-
291
- if (waitForDevice.onSuccess)
292
- waitForDevice.onSuccess(
293
- deviceWithPersistedData
294
- );
295
- } else {
296
- dispatch(setArrivedButWrongWhen(true));
297
- }
298
- }
270
+
271
+ if (waitForDevice.onSuccess)
272
+ waitForDevice.onSuccess(
273
+ deviceWithPersistedData
274
+ );
275
+ } else {
276
+ dispatch(setArrivedButWrongWhen(true));
299
277
  }
300
278
  }
301
- break;
302
- case 'NRFDL_DEVICE_EVENT_LEFT':
303
- {
304
- const devices = getState().device.devices;
305
-
306
- devices.forEach(device => {
307
- if (device.id === event.device_id) {
308
- const waitForDevice =
309
- getState().deviceAutoSelect.waitForDevice;
310
- if (
311
- device.serialNumber ===
312
- getState().deviceAutoSelect.device
313
- ?.serialNumber
314
- ) {
315
- if (waitForDevice) {
316
- dispatch(
317
- setArrivedButWrongWhen(undefined)
318
- );
279
+ }
280
+ }
281
+ };
282
+ const onDeviceLeft = (id: number) => {
283
+ const devices = getState().device.devices;
319
284
 
320
- dispatch(
321
- initAutoReconnectTimeout(
322
- () =>
323
- dispatch(
324
- removeDeviceFromList(
325
- device,
326
- onDeviceDeselected,
327
- onDeviceDisconnected
328
- )
329
- ),
330
- waitForDevice
331
- )
332
- );
333
- } else {
285
+ devices.forEach(device => {
286
+ if (device.id === id) {
287
+ const waitForDevice =
288
+ getState().deviceAutoSelect.waitForDevice;
289
+ if (
290
+ device.serialNumber ===
291
+ getState().deviceAutoSelect.device?.serialNumber
292
+ ) {
293
+ if (waitForDevice) {
294
+ dispatch(setArrivedButWrongWhen(undefined));
295
+
296
+ dispatch(
297
+ initAutoReconnectTimeout(
298
+ () =>
334
299
  dispatch(
335
300
  removeDeviceFromList(
336
301
  device,
337
302
  onDeviceDeselected,
338
303
  onDeviceDisconnected
339
304
  )
340
- );
341
- }
342
-
343
- dispatch(setDisconnectedTime(Date.now()));
344
- } else {
345
- dispatch(
346
- removeDeviceFromList(
347
- device,
348
- onDeviceDeselected,
349
- onDeviceDisconnected
350
- )
351
- );
352
- }
353
- }
354
- });
305
+ ),
306
+ waitForDevice
307
+ )
308
+ );
309
+ } else {
310
+ dispatch(
311
+ removeDeviceFromList(
312
+ device,
313
+ onDeviceDeselected,
314
+ onDeviceDisconnected
315
+ )
316
+ );
317
+ }
318
+
319
+ dispatch(setDisconnectedTime(Date.now()));
320
+ } else {
321
+ dispatch(
322
+ removeDeviceFromList(
323
+ device,
324
+ onDeviceDeselected,
325
+ onDeviceDisconnected
326
+ )
327
+ );
355
328
  }
356
- break;
357
- }
329
+ }
330
+ });
358
331
  };
359
332
 
360
- try {
361
- stopWatchingDevices();
362
- const nrfdlDevices = await nrfDeviceLib.enumerate(
363
- getDeviceLibContext(),
364
- deviceListing
333
+ stopWatchingDevices(async () => {
334
+ const operation = await NrfutilDeviceLib.list(
335
+ deviceListing,
336
+ d => d.forEach(onDeviceArrived),
337
+ logger.error,
338
+ { onDeviceArrived, onDeviceLeft }
365
339
  );
366
340
 
367
- const currentDevices = wrapDevicesFromNrfdl(nrfdlDevices);
368
- dispatch(setDevices(currentDevices));
341
+ stopNrfutilDevice = (callback?: () => void) => {
342
+ operation.stop(() => {
343
+ callback?.();
344
+ });
345
+ };
369
346
 
370
347
  if (!autoSelectDeviceCLISerialUsed) {
371
348
  const autoSelectSN = getAutoSelectDeviceCLISerial();
@@ -379,18 +356,7 @@ export const startWatchingDevices =
379
356
  }
380
357
  autoSelectDeviceCLISerialUsed = true;
381
358
  }
382
-
383
- hotplugTaskId = nrfDeviceLib.startHotplugEvents(
384
- getDeviceLibContext(),
385
- () => {},
386
- updateDeviceList
387
- );
388
- } catch (error) {
389
- logger.logError(
390
- 'Error while probing devices, more details in the debug log',
391
- error
392
- );
393
- }
359
+ });
394
360
  };
395
361
 
396
362
  const getAutoSelectDeviceCLISerial = () => {
@@ -406,19 +372,7 @@ export const clearWaitForDevice = (): AppThunk => (dispatch, getState) => {
406
372
  dispatch(clearWaitForDeviceTimeout(true));
407
373
  };
408
374
 
409
- /**
410
- * Stops watching for devices.
411
- *
412
- * @returns {undefined}
413
- */
414
- export const stopWatchingDevices = () => {
415
- // Not sure, if this guard clause is really needed
416
- if (getDeviceLibContext() && hotplugTaskId !== null) {
417
- try {
418
- nrfDeviceLib.stopHotplugEvents(hotplugTaskId);
419
- hotplugTaskId = null;
420
- } catch (error) {
421
- logger.logError('Error while stopping to watch devices', error);
422
- }
423
- }
375
+ export const stopWatchingDevices = (callback?: () => void) => {
376
+ if (stopNrfutilDevice) stopNrfutilDevice(callback);
377
+ else callback?.();
424
378
  };
@@ -4,14 +4,11 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- import type {
8
- Device as NrfdlDevice,
9
- SerialPort,
10
- } from '@nordicsemiconductor/nrf-device-lib-js';
11
7
  import { createSlice, PayloadAction } from '@reduxjs/toolkit';
12
8
  import type { AutoDetectTypes } from '@serialport/bindings-cpp';
13
9
  import { SerialPortOpenOptions } from 'serialport';
14
10
 
11
+ import { NrfutilDevice, SerialPort } from '../../nrfutil/device/common';
15
12
  import type { RootState } from '../store';
16
13
  import {
17
14
  getPersistedIsFavorite,
@@ -22,7 +19,7 @@ import {
22
19
  persistSerialPortSettings as persistSerialPortSettingsToStore,
23
20
  } from '../utils/persistentStore';
24
21
 
25
- export interface Device extends NrfdlDevice {
22
+ export interface Device extends NrfutilDevice {
26
23
  serialNumber: string;
27
24
  boardVersion?: string;
28
25
  nickname?: string;
@@ -104,16 +101,6 @@ const slice = createSlice({
104
101
  state.readbackProtection = 'unknown';
105
102
  },
106
103
 
107
- setDevices: (state, action: PayloadAction<Device[]>) => {
108
- state.devices.clear();
109
- action.payload.forEach(device => {
110
- state.devices.set(
111
- device.serialNumber,
112
- setPersistedData(device)
113
- );
114
- });
115
- },
116
-
117
104
  addDevice: (state, action: PayloadAction<Device>) => {
118
105
  state.devices.set(
119
106
  action.payload.serialNumber,
@@ -219,7 +206,6 @@ export const {
219
206
  selectDevice,
220
207
  addDevice,
221
208
  removeDevice,
222
- setDevices,
223
209
  setDeviceNickname,
224
210
  toggleDeviceFavorited,
225
211
  setReadbackProtected,
@@ -4,77 +4,23 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- import nrfDeviceLib, {
8
- deviceControlRecover,
9
- deviceControlReset,
10
- Error as nrfError,
11
- firmwareProgram,
12
- FirmwareStreamType,
13
- readFwInfo,
14
- } from '@nordicsemiconductor/nrf-device-lib-js';
15
-
7
+ import NrfutilDeviceLib from '../../nrfutil/device/device';
8
+ import { FWInfo } from '../../nrfutil/device/getFwInfo';
16
9
  import logger from '../logging';
17
10
  import type { AppThunk, RootState } from '../store';
18
- import { getDeviceLibContext } from './deviceLibWrapper';
19
11
  import { DeviceSetup, JprogEntry } from './deviceSetup';
20
12
  import { Device, setReadbackProtected } from './deviceSlice';
21
13
 
22
- const program = (
23
- deviceId: number,
24
- firmware: string | Buffer,
25
- onProgress: (progress: number, message?: string) => void
26
- ) => {
27
- let fwFormat: FirmwareStreamType;
28
- if (firmware instanceof Buffer) {
29
- fwFormat = 'NRFDL_FW_BUFFER';
30
- } else {
31
- fwFormat = 'NRFDL_FW_FILE';
32
- }
33
- return new Promise<void>((resolve, reject) => {
34
- onProgress(0, 'Preparing to program');
35
- firmwareProgram(
36
- getDeviceLibContext(),
37
- deviceId,
38
- fwFormat,
39
- 'NRFDL_FW_INTEL_HEX',
40
- firmware,
41
- (error?: nrfError) => {
42
- if (error) reject(error);
43
- logger.info('Device programming completed.');
44
- resolve();
45
- },
46
- progress => {
47
- onProgress(
48
- progress.progressJson.progressPercentage,
49
- progress.progressJson.message ?? 'programming'
50
- );
51
- },
52
- null,
53
- 'NRFDL_DEVICE_CORE_APPLICATION'
54
- );
55
- });
56
- };
57
-
58
- /**
59
- * Reset the device after programming
60
- *
61
- * @param {Number} deviceId The Id of the device.
62
- * @returns {Promise} Promise that resolves if successful or rejects with error.
63
- */
64
- const reset = async (deviceId: number) => {
65
- await deviceControlReset(getDeviceLibContext(), deviceId);
66
- };
67
-
68
14
  const getDeviceReadProtection = async (
69
15
  device: Device
70
16
  ): Promise<{
71
- fwInfo: nrfDeviceLib.FWInfo.ReadResult | null;
17
+ fwInfo: FWInfo | null;
72
18
  readbackProtection: 'unknown' | 'protected' | 'unprotected';
73
19
  }> => {
74
20
  try {
75
- const fwInfo = await readFwInfo(getDeviceLibContext(), device.id);
21
+ const info = await NrfutilDeviceLib.getFwInfo(device);
76
22
  return {
77
- fwInfo,
23
+ fwInfo: info,
78
24
  readbackProtection: 'unprotected',
79
25
  };
80
26
  } catch (error) {
@@ -106,20 +52,26 @@ const programDeviceWithFw =
106
52
  if (getState().device.readbackProtection === 'protected') {
107
53
  logger.info('Recovering device');
108
54
  onProgress(0, 'Recovering device');
109
- await deviceControlRecover(
110
- getDeviceLibContext(),
111
- device.id,
112
- 'NRFDL_DEVICE_CORE_APPLICATION'
113
- );
55
+ await NrfutilDeviceLib.recover(device, 'Application');
114
56
  }
115
57
 
116
58
  logger.debug(
117
59
  `Programming ${device.serialNumber} with ${selectedFw.fw}`
118
60
  );
119
- await program(device.id, selectedFw.fw, onProgress);
61
+ await NrfutilDeviceLib.program(
62
+ device,
63
+ selectedFw.fw,
64
+ progress => {
65
+ onProgress(
66
+ progress.progressPercentage,
67
+ progress.message ?? 'programming'
68
+ );
69
+ },
70
+ 'Application'
71
+ );
120
72
  logger.debug(`Resetting ${device.serialNumber}`);
121
73
  onProgress(100, 'Resetting device');
122
- await reset(device.id);
74
+ await NrfutilDeviceLib.reset(device);
123
75
  const { readbackProtection } = await getDeviceReadProtection(
124
76
  device
125
77
  );
@@ -178,11 +130,11 @@ export const jprogDeviceSetup = (
178
130
  }
179
131
 
180
132
  return getDeviceReadProtection(device).then(
181
- ({ fwInfo, readbackProtection }) => {
133
+ ({ fwInfo: info, readbackProtection }) => {
182
134
  dispatch(setReadbackProtected(readbackProtection));
183
- if (fwInfo && fwInfo.imageInfoList.length > 0) {
135
+ if (info && info.imageInfoList.length > 0) {
184
136
  const fw = fwVersions.find(version =>
185
- fwInfo.imageInfoList.find(
137
+ info.imageInfoList.find(
186
138
  imageInfo =>
187
139
  typeof imageInfo.version === 'string' &&
188
140
  imageInfo.version.includes(version.fwVersion)