@nordicsemiconductor/pc-nrfconnect-shared 89.0.0 → 90.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.
- package/Changelog.md +28 -0
- package/config/tsconfig.json +1 -1
- package/coverage/cobertura-coverage.xml +2216 -1061
- package/ipc/MetaFiles.ts +17 -7
- package/nrfutil/device/__mocks__/device.ts +43 -0
- package/nrfutil/device/batch.ts +219 -0
- package/nrfutil/device/batchTypes.ts +133 -0
- package/nrfutil/device/common.ts +274 -0
- package/nrfutil/device/device.ts +62 -0
- package/nrfutil/device/erase.ts +26 -0
- package/nrfutil/device/eraseBatch.ts +28 -0
- package/nrfutil/device/firmwareRead.ts +34 -0
- package/nrfutil/device/firmwareReadBatch.ts +42 -0
- package/nrfutil/device/getCoreInfo.ts +44 -0
- package/nrfutil/device/getCoreInfoBatch.ts +29 -0
- package/nrfutil/device/getFwInfo.ts +69 -0
- package/nrfutil/device/getFwInfoBatch.ts +29 -0
- package/nrfutil/device/getProtectionStatus.ts +46 -0
- package/nrfutil/device/getProtectionStatusBatch.ts +32 -0
- package/nrfutil/device/list.ts +81 -0
- package/nrfutil/device/program.ts +186 -0
- package/nrfutil/device/programBatch.ts +69 -0
- package/nrfutil/device/recover.ts +26 -0
- package/nrfutil/device/recoverBatch.ts +28 -0
- package/nrfutil/device/reset.ts +41 -0
- package/nrfutil/device/resetBatch.ts +30 -0
- package/nrfutil/device/setMcuState.ts +27 -0
- package/nrfutil/device/setProtectionStatus.ts +27 -0
- package/nrfutil/index.ts +25 -0
- package/nrfutil/moduleVersion.ts +57 -0
- package/nrfutil/nrfutilLogger.ts +15 -0
- package/nrfutil/sandbox.ts +504 -0
- package/nrfutil/sandboxTypes.ts +178 -0
- package/package.json +1 -1
- package/scripts/nordic-publish.js +1 -1
- package/scripts/nordic-publish.ts +11 -2
- package/src/About/SupportCard.tsx +6 -9
- package/src/App/App.test.tsx +4 -0
- package/src/App/App.tsx +13 -2
- package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +1 -1
- package/src/Device/DeviceSelector/DeviceSelector.test.tsx +39 -31
- package/src/Device/DeviceSelector/DeviceSelector.tsx +3 -12
- package/src/Device/deviceInfo/deviceInfo.ts +2 -3
- package/src/Device/deviceLibWrapper.ts +0 -66
- package/src/Device/deviceLister.test.ts +1 -2
- package/src/Device/deviceLister.ts +169 -215
- package/src/Device/deviceSlice.ts +2 -16
- package/src/Device/jprogOperations.ts +21 -69
- package/src/Device/sdfuOperations.ts +77 -93
- package/src/ErrorBoundary/ErrorBoundary.tsx +1 -1
- package/src/Log/LogViewer.tsx +0 -4
- package/src/Log/logSlice.ts +4 -7
- package/src/logging/sendInitialLogMessages.ts +7 -8
- package/src/utils/appDirs.ts +6 -11
- package/src/utils/logLibVersions.ts +12 -14
- package/src/utils/systemReport.ts +11 -17
- package/src/utils/usageData.ts +14 -9
- package/tsconfig.json +1 -0
- package/typings/generated/ipc/MetaFiles.d.ts +14 -7
- package/typings/generated/ipc/MetaFiles.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts +23 -0
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/batch.d.ts +26 -0
- package/typings/generated/nrfutil/device/batch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/batchTypes.d.ts +78 -0
- package/typings/generated/nrfutil/device/batchTypes.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/common.d.ts +125 -0
- package/typings/generated/nrfutil/device/common.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/device.d.ts +30 -0
- package/typings/generated/nrfutil/device/device.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/erase.d.ts +5 -0
- package/typings/generated/nrfutil/device/erase.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/eraseBatch.d.ts +7 -0
- package/typings/generated/nrfutil/device/eraseBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/firmwareRead.d.ts +10 -0
- package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts +9 -0
- package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts +22 -0
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getFwInfo.d.ts +31 -0
- package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +13 -0
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/list.d.ts +19 -0
- package/typings/generated/nrfutil/device/list.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/program.d.ts +27 -0
- package/typings/generated/nrfutil/device/program.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/programBatch.d.ts +9 -0
- package/typings/generated/nrfutil/device/programBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/recover.d.ts +5 -0
- package/typings/generated/nrfutil/device/recover.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/recoverBatch.d.ts +7 -0
- package/typings/generated/nrfutil/device/recoverBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/reset.d.ts +5 -0
- package/typings/generated/nrfutil/device/reset.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/resetBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/resetBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/setMcuState.d.ts +6 -0
- package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +5 -0
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -0
- package/typings/generated/nrfutil/index.d.ts +11 -0
- package/typings/generated/nrfutil/index.d.ts.map +1 -0
- package/typings/generated/nrfutil/moduleVersion.d.ts +6 -0
- package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -0
- package/typings/generated/nrfutil/nrfutilLogger.d.ts +4 -0
- package/typings/generated/nrfutil/nrfutilLogger.d.ts.map +1 -0
- package/typings/generated/nrfutil/sandbox.d.ts +36 -0
- package/typings/generated/nrfutil/sandbox.d.ts.map +1 -0
- package/typings/generated/nrfutil/sandboxTypes.d.ts +135 -0
- package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -0
- package/typings/generated/src/About/SupportCard.d.ts.map +1 -1
- package/typings/generated/src/App/App.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +2 -6
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +2 -2
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -4
- package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLister.d.ts +11 -16
- package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceSlice.d.ts +3 -3
- package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -1
- package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -1
- package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -1
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -1
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
- package/typings/generated/src/Log/LogViewer.d.ts.map +1 -1
- package/typings/generated/src/Log/logSlice.d.ts +2 -3
- package/typings/generated/src/Log/logSlice.d.ts.map +1 -1
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
- package/typings/generated/src/utils/appDirs.d.ts +4 -4
- package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
- package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -1
- package/typings/generated/src/utils/systemReport.d.ts +1 -1
- package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
- package/typings/generated/src/utils/usageData.d.ts +2 -0
- package/typings/generated/src/utils/usageData.d.ts.map +1 -1
- package/src/utils/describeVersion.ts +0 -21
- package/typings/generated/src/utils/describeVersion.d.ts +0 -4
- 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
|
|
8
|
-
Device as NrfdlDevice,
|
|
7
|
+
import {
|
|
9
8
|
DeviceTraits,
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
103
|
+
* Wrap the device form nrfutil-device to make the Device type consistent
|
|
106
104
|
*
|
|
107
|
-
* @param {
|
|
108
|
-
* @returns {
|
|
105
|
+
* @param {NrfutilDevice} device The input device from nrfutil-device
|
|
106
|
+
* @returns {NrfutilDevice} The updated device
|
|
109
107
|
*/
|
|
110
|
-
export const wrapDeviceFromNrfdl = (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
|
|
116
|
+
* Wrap the device form nrfutil-device to make the Device type consistent
|
|
119
117
|
*
|
|
120
|
-
* @param {
|
|
121
|
-
* @returns {
|
|
118
|
+
* @param {NrfutilDevice[]} devices The input devices from nrfutil-device
|
|
119
|
+
* @returns {NrfutilDevice[]} The updated devices
|
|
122
120
|
*/
|
|
123
|
-
export const wrapDevicesFromNrfdl = (devices:
|
|
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
|
|
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,
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
265
|
+
logger.info('Wait For Device was successfully');
|
|
222
266
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
`Auto Reconnecting Device SN: ${deviceWithPersistedData.serialNumber}`
|
|
267
|
+
dispatch(
|
|
268
|
+
clearWaitForDeviceTimeout(waitForDevice.once)
|
|
226
269
|
);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
357
|
-
}
|
|
329
|
+
}
|
|
330
|
+
});
|
|
358
331
|
};
|
|
359
332
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
368
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
8
|
-
|
|
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:
|
|
17
|
+
fwInfo: FWInfo | null;
|
|
72
18
|
readbackProtection: 'unknown' | 'protected' | 'unprotected';
|
|
73
19
|
}> => {
|
|
74
20
|
try {
|
|
75
|
-
const
|
|
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
|
|
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(
|
|
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
|
|
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 (
|
|
135
|
+
if (info && info.imageInfoList.length > 0) {
|
|
184
136
|
const fw = fwVersions.find(version =>
|
|
185
|
-
|
|
137
|
+
info.imageInfoList.find(
|
|
186
138
|
imageInfo =>
|
|
187
139
|
typeof imageInfo.version === 'string' &&
|
|
188
140
|
imageInfo.version.includes(version.fwVersion)
|