@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.
- package/Changelog.md +85 -0
- package/coverage/cobertura-coverage.xml +2276 -1778
- package/ipc/launcherConfig.ts +25 -0
- package/ipc/openWindow.ts +17 -1
- package/ipc/schema/packageJson.ts +26 -22
- package/main/index.ts +11 -5
- package/mocks/packageJsonMock.ts +1 -1
- package/nrfutil/device/__mocks__/device.ts +2 -0
- package/nrfutil/device/batch.ts +19 -9
- package/nrfutil/device/common.ts +32 -46
- package/nrfutil/device/device.ts +2 -0
- package/nrfutil/device/deviceInfo.ts +70 -0
- package/nrfutil/device/erase.ts +2 -2
- package/nrfutil/device/firmwareRead.ts +2 -2
- package/nrfutil/device/getCoreInfo.ts +2 -2
- package/nrfutil/device/getFwInfo.ts +2 -2
- package/nrfutil/device/getProtectionStatus.ts +2 -2
- package/nrfutil/device/list.ts +5 -31
- package/nrfutil/device/program.ts +4 -4
- package/nrfutil/device/recover.ts +2 -2
- package/nrfutil/device/reset.ts +2 -2
- package/nrfutil/device/setMcuState.ts +2 -5
- package/nrfutil/device/setProtectionStatus.ts +2 -2
- package/nrfutil/index.ts +1 -1
- package/nrfutil/moduleVersion.ts +22 -2
- package/nrfutil/sandbox.ts +52 -32
- package/nrfutil/sandboxTypes.ts +15 -1
- package/package.json +3 -2
- package/scripts/check-app-properties.ts +6 -6
- package/scripts/esbuild.ts +3 -3
- package/scripts/nordic-publish.js +23 -23
- package/scripts/nordic-publish.ts +3 -3
- package/scripts/release-shared.ts +2 -2
- package/src/About/ApplicationCard.tsx +3 -5
- package/src/About/DeviceCard.tsx +6 -5
- package/src/About/SupportCard.tsx +2 -2
- package/src/App/App.test.tsx +7 -0
- package/src/App/App.tsx +14 -27
- package/src/Device/DeviceSelector/BasicDeviceInfo.tsx +12 -6
- package/src/Device/DeviceSelector/DeviceList/AnimatedList.tsx +1 -1
- package/src/Device/DeviceSelector/DeviceList/Device.tsx +7 -5
- package/src/Device/DeviceSelector/DeviceList/DeviceList.tsx +23 -5
- package/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.tsx +7 -6
- package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +26 -30
- package/src/Device/DeviceSelector/DeviceList/edit-device-buttons.scss +1 -2
- package/src/Device/DeviceSelector/DeviceSelector.test.tsx +17 -37
- package/src/Device/DeviceSelector/DeviceSelector.tsx +64 -21
- package/src/Device/DeviceSelector/Favorite.tsx +10 -10
- package/src/Device/DeviceSelector/basic-device-info.scss +0 -12
- package/src/Device/deviceInfo/deviceInfo.ts +2 -2
- package/src/Device/deviceLister.ts +111 -59
- package/src/Device/deviceSetup.ts +30 -13
- package/src/Device/deviceSlice.ts +157 -84
- package/src/Device/jprogOperations.ts +56 -27
- package/src/Device/sdfuOperations.ts +25 -31
- package/src/ErrorBoundary/ErrorBoundary.tsx +7 -13
- package/src/Feedback/sendFeedback.ts +2 -4
- package/src/InlineInput/NumberInlineInput.tsx +1 -1
- package/src/InlineInput/NumberInputWithDropdown.tsx +1 -2
- package/src/index.ts +4 -0
- package/src/logging/sendInitialLogMessages.ts +15 -13
- package/src/utils/appDetails.ts +22 -0
- package/src/utils/appDirs.ts +4 -4
- package/src/utils/launcherConfig.ts +17 -0
- package/src/utils/logLibVersions.ts +1 -1
- package/src/utils/packageJson.ts +52 -10
- package/src/utils/persistentStore.ts +21 -14
- package/src/utils/systemReport.ts +4 -6
- package/src/utils/usageData.ts +75 -167
- package/src/utils/usageDataCommon.ts +59 -0
- package/src/utils/usageDataMain.ts +117 -0
- package/src/utils/usageDataRenderer.ts +126 -0
- package/src/utils/useHotKey.ts +2 -2
- package/typings/generated/ipc/launcherConfig.d.ts +14 -0
- package/typings/generated/ipc/launcherConfig.d.ts.map +1 -0
- package/typings/generated/ipc/openWindow.d.ts +10 -4
- package/typings/generated/ipc/openWindow.d.ts.map +1 -1
- package/typings/generated/ipc/schema/packageJson.d.ts +34 -52
- package/typings/generated/ipc/schema/packageJson.d.ts.map +1 -1
- package/typings/generated/main/index.d.ts +8 -2
- package/typings/generated/main/index.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts +1 -0
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/batch.d.ts +3 -2
- package/typings/generated/nrfutil/device/batch.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/common.d.ts +7 -34
- package/typings/generated/nrfutil/device/common.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/device.d.ts +14 -13
- package/typings/generated/nrfutil/device/device.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/deviceInfo.d.ts +40 -0
- package/typings/generated/nrfutil/device/deviceInfo.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/erase.d.ts +2 -2
- package/typings/generated/nrfutil/device/erase.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/firmwareRead.d.ts +2 -2
- package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts +2 -2
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/getFwInfo.d.ts +2 -2
- package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +2 -2
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/list.d.ts +3 -3
- package/typings/generated/nrfutil/device/list.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/program.d.ts +2 -2
- package/typings/generated/nrfutil/device/program.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/recover.d.ts +2 -2
- package/typings/generated/nrfutil/device/recover.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/reset.d.ts +2 -2
- package/typings/generated/nrfutil/device/reset.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/setMcuState.d.ts +2 -2
- package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +2 -2
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -1
- package/typings/generated/nrfutil/index.d.ts +2 -1
- package/typings/generated/nrfutil/index.d.ts.map +1 -1
- package/typings/generated/nrfutil/moduleVersion.d.ts +4 -0
- package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -1
- package/typings/generated/nrfutil/sandbox.d.ts +2 -2
- package/typings/generated/nrfutil/sandbox.d.ts.map +1 -1
- package/typings/generated/nrfutil/sandboxTypes.d.ts +10 -1
- package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -1
- package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -1
- package/typings/generated/src/About/DeviceCard.d.ts.map +1 -1
- package/typings/generated/src/App/App.d.ts +0 -1
- package/typings/generated/src/App/App.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +0 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +0 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +0 -1
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLister.d.ts +1 -15
- package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceSetup.d.ts +7 -6
- package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceSlice.d.ts +16 -15
- 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.map +1 -1
- package/typings/generated/src/Feedback/sendFeedback.d.ts.map +1 -1
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -1
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -1
- package/typings/generated/src/InlineInput/NumberInputWithDropdown.d.ts.map +1 -1
- package/typings/generated/src/index.d.ts +3 -1
- package/typings/generated/src/index.d.ts.map +1 -1
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
- package/typings/generated/src/utils/appDetails.d.ts +4 -0
- package/typings/generated/src/utils/appDetails.d.ts.map +1 -0
- package/typings/generated/src/utils/appDirs.d.ts +1 -1
- package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
- package/typings/generated/src/utils/launcherConfig.d.ts +4 -0
- package/typings/generated/src/utils/launcherConfig.d.ts.map +1 -0
- package/typings/generated/src/utils/packageJson.d.ts +30 -7
- package/typings/generated/src/utils/packageJson.d.ts.map +1 -1
- package/typings/generated/src/utils/persistentStore.d.ts +3 -2
- package/typings/generated/src/utils/persistentStore.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 +8 -65
- package/typings/generated/src/utils/usageData.d.ts.map +1 -1
- package/typings/generated/src/utils/usageDataCommon.d.ts +27 -0
- package/typings/generated/src/utils/usageDataCommon.d.ts.map +1 -0
- package/typings/generated/src/utils/usageDataMain.d.ts +10 -0
- package/typings/generated/src/utils/usageDataMain.d.ts.map +1 -0
- package/typings/generated/src/utils/usageDataRenderer.d.ts +10 -0
- package/typings/generated/src/utils/usageDataRenderer.d.ts.map +1 -0
- package/src/Device/DeviceSelector/DeviceList/device.scss +0 -28
- package/src/Device/DeviceSelector/DeviceList/more-device-info.scss +0 -33
- 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?:
|
|
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
|
|
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
|
|
57
|
+
export type PackageJsonApp = z.infer<typeof packageJsonApp>;
|
|
52
58
|
|
|
53
|
-
export const
|
|
54
|
-
parseWithPrettifiedErrorMessage<
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
})
|
|
64
|
-
);
|
|
64
|
+
const packageJsonLegacyApp = packageJsonApp.extend({
|
|
65
|
+
nrfConnectForDesktop: nrfConnectForDesktop
|
|
66
|
+
.partial({ html: true })
|
|
67
|
+
.optional(),
|
|
68
|
+
});
|
|
65
69
|
|
|
66
|
-
export type
|
|
70
|
+
export type PackageJsonLegacyApp = z.infer<typeof packageJsonLegacyApp>;
|
|
67
71
|
|
|
68
|
-
export const
|
|
69
|
-
parseWithPrettifiedErrorMessage<
|
|
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
|
|
41
|
-
type
|
|
42
|
-
|
|
43
|
-
|
|
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 {
|
|
49
|
+
export type { OpenAppOptions } from '../ipc/openWindow';
|
|
50
|
+
export {
|
|
51
|
+
isOpenAppOptionsDevicePort,
|
|
52
|
+
isOpenAppOptionsDeviceSN,
|
|
53
|
+
} from '../ipc/openWindow';
|
package/mocks/packageJsonMock.ts
CHANGED
|
@@ -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,
|
package/nrfutil/device/batch.ts
CHANGED
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
DeviceTraits,
|
|
17
17
|
deviceTraitsToArgs,
|
|
18
18
|
getDeviceSandbox,
|
|
19
|
-
|
|
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:
|
|
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>[] = [];
|
package/nrfutil/device/common.ts
CHANGED
|
@@ -42,48 +42,25 @@ export interface DeviceLeftEvent {
|
|
|
42
42
|
id: number;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export interface
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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,
|
package/nrfutil/device/device.ts
CHANGED
|
@@ -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;
|
package/nrfutil/device/erase.ts
CHANGED
|
@@ -8,11 +8,11 @@ import { Progress } from '../sandboxTypes';
|
|
|
8
8
|
import {
|
|
9
9
|
DeviceCore,
|
|
10
10
|
deviceSingleTaskEndOperationVoid,
|
|
11
|
-
|
|
11
|
+
NrfutilDevice,
|
|
12
12
|
} from './common';
|
|
13
13
|
|
|
14
14
|
export default (
|
|
15
|
-
device:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
35
|
+
device: NrfutilDevice,
|
|
36
36
|
core?: DeviceCore,
|
|
37
37
|
onProgress?: (progress: Progress) => void,
|
|
38
38
|
controller?: AbortController
|
package/nrfutil/device/list.ts
CHANGED
|
@@ -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:
|
|
36
|
-
onError: (error: Error) => void,
|
|
33
|
+
onEnumerated: (devices: NrfutilDevice[]) => void,
|
|
34
|
+
onError: (error: Error, pid?: number) => void,
|
|
37
35
|
onHotplugEvent?: {
|
|
38
|
-
onDeviceArrived: (device:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
160
|
+
device: NrfutilDevice,
|
|
161
161
|
firmware: FirmwareType,
|
|
162
162
|
onProgress?: (progress: Progress) => void,
|
|
163
163
|
core?: DeviceCore,
|