diff --git a/Changelog.md b/Changelog.md index 5ab4e895c..4536e5870 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,13 @@ This project does _not_ adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) but contrary to it every new version is a new major version. +## 177.0.0 - 2024-05-28 + +### Added + +- Apps can no control better when to auto reconnect after programming with + `sdfuDeviceSetup`. This is optional. Defaults have nit changed + ## 176.0.0 - 2024-05-06 ### Added diff --git a/package.json b/package.json index 56286aed6..d3232e19f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nordicsemiconductor/pc-nrfconnect-shared", - "version": "176.0.0", + "version": "177.0.0", "description": "Shared commodities for developing pc-nrfconnect-* packages", "repository": { "type": "git", diff --git a/scripts/nordic-publish.ts b/scripts/nordic-publish.ts index 67431a267..e90d527c6 100755 --- a/scripts/nordic-publish.ts +++ b/scripts/nordic-publish.ts @@ -17,21 +17,6 @@ import { AppInfo, SourceJson } from '../ipc/MetaFiles'; import { PackageJsonApp } from '../ipc/schema/packageJson'; import checkAppProperties from './check-app-properties'; -interface LegacyAppInfo { - ['dist-tags']?: { - latest?: string; - }; - versions?: { - [version: string]: { - dist: { - publishTimestamp?: string; - tarball: string; - shasum: string; - }; - }; - }; -} - interface App { filename: string; name: string; diff --git a/src/Device/deviceAutoSelectSlice.ts b/src/Device/deviceAutoSelectSlice.ts index dd8fbfd9f..6937a20d2 100644 --- a/src/Device/deviceAutoSelectSlice.ts +++ b/src/Device/deviceAutoSelectSlice.ts @@ -9,14 +9,16 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import type { AppThunk, RootState } from '../store'; import type { Device } from './deviceSlice'; +export type WaitForDeviceWhen = + | 'always' + | 'applicationMode' + | 'dfuBootLoaderMode' + | 'sameTraits' + | ((device: Device) => boolean); + export interface WaitForDevice { timeout: number; - when: - | 'always' - | 'applicationMode' - | 'dfuBootLoaderMode' - | 'sameTraits' - | ((device: Device) => boolean); + when: WaitForDeviceWhen; once: boolean; skipRefetchDeviceInfo?: boolean; onSuccess?: (device: Device) => void; diff --git a/src/Device/deviceLister.ts b/src/Device/deviceLister.ts index 275664d03..143d37fe9 100644 --- a/src/Device/deviceLister.ts +++ b/src/Device/deviceLister.ts @@ -282,6 +282,7 @@ export const startWatchingDevices = (typeof waitForDevice.when === 'function' && waitForDevice.when(device)) ) { + dispatch(setArrivedButWrongWhen(undefined)); dispatch( setLastArrivedDeviceId( deviceWithPersistedData.id diff --git a/src/Device/sdfuOperations.ts b/src/Device/sdfuOperations.ts index f1e60d92c..169c7027a 100644 --- a/src/Device/sdfuOperations.ts +++ b/src/Device/sdfuOperations.ts @@ -14,7 +14,11 @@ import { McuState } from '../../nrfutil/device/setMcuState'; import logger from '../logging'; import { AppThunk, RootState } from '../store'; import { getAppFile } from '../utils/appDirs'; -import { clearWaitForDevice, setWaitForDevice } from './deviceAutoSelectSlice'; +import { + clearWaitForDevice, + setWaitForDevice, + WaitForDeviceWhen, +} from './deviceAutoSelectSlice'; import { DeviceSetup, DfuEntry } from './deviceSetup'; import { openDeviceSetupDialog } from './deviceSetupSlice'; import { Device } from './deviceSlice'; @@ -147,16 +151,20 @@ const switchToDeviceMode = device: Device, mcuState: McuState, onSuccess: (device: Device) => void, - onFail: (reason?: unknown) => void + onFail: (reason?: unknown) => void, + autoReconnectWhen?: WaitForDeviceWhen ): AppThunk => dispatch => { + if (autoReconnectWhen === undefined) { + autoReconnectWhen = + mcuState === 'Application' + ? 'applicationMode' + : 'dfuBootLoaderMode'; + } dispatch( setWaitForDevice({ timeout: 10000, - when: - mcuState === 'Application' - ? 'applicationMode' - : 'dfuBootLoaderMode', + when: autoReconnectWhen, once: true, onSuccess, onFail, @@ -199,7 +207,8 @@ export const switchToApplicationMode = ( device: Device, onSuccess: (device: Device) => void, - onFail: (reason?: unknown) => void + onFail: (reason?: unknown) => void, + autoReconnectWhen?: WaitForDeviceWhen ): AppThunk => dispatch => { if (isDeviceInDFUBootloader(device)) { @@ -216,7 +225,8 @@ export const switchToApplicationMode = ); else onSuccess(d); }, - onFail + onFail, + autoReconnectWhen ) ); } else { @@ -408,7 +418,8 @@ const programInDFUBootloader = dfu: DfuEntry, onProgress: (progress: number, message?: string) => void, onSuccess: (device: Device) => void, - onFail: (reason?: unknown) => void + onFail: (reason?: unknown) => void, + autoReconnectAfterProgrammingWhen: WaitForDeviceWhen = 'applicationMode' ): AppThunk> => async dispatch => { logger.debug(`${device.serialNumber} on is now in DFU-Bootloader...`); @@ -494,7 +505,7 @@ const programInDFUBootloader = dispatch( setWaitForDevice({ timeout: DEFAULT_DEVICE_WAIT_TIME, - when: 'applicationMode', + when: autoReconnectAfterProgrammingWhen, once: true, onSuccess, onFail, @@ -518,7 +529,8 @@ const programDeviceWithFw = ( device: Device, selectedFw: DfuEntry, - onProgress: (progress: number, message?: string) => void + onProgress: (progress: number, message?: string) => void, + autoReconnectAfterProgrammingWhen: WaitForDeviceWhen = 'applicationMode' ): AppThunk> => dispatch => new Promise((resolve, reject) => { @@ -529,7 +541,8 @@ const programDeviceWithFw = selectedFw, onProgress, resolve, - reject + reject, + autoReconnectAfterProgrammingWhen ) ); logger.debug('DFU finished: ', d); @@ -542,7 +555,8 @@ const programDeviceWithFw = export const sdfuDeviceSetup = ( dfuFirmware: DfuEntry[], - needSerialport = false + needSerialport = false, + autoReconnectAfterProgrammingWhen: WaitForDeviceWhen = 'applicationMode' ): DeviceSetup => ({ supportsProgrammingMode: (device, deviceInfo) => ((!!deviceInfo?.dfuTriggerVersion && @@ -555,7 +569,12 @@ export const sdfuDeviceSetup = ( description: firmwareOption.description, programDevice: onProgress => dispatch => dispatch( - programDeviceWithFw(device, firmwareOption, onProgress) + programDeviceWithFw( + device, + firmwareOption, + onProgress, + autoReconnectAfterProgrammingWhen + ) ), })), isExpectedFirmware: (device, deviceInfo) => () => { @@ -580,7 +599,14 @@ export const sdfuDeviceSetup = ( }, tryToSwitchToApplicationMode: device => dispatch => new Promise((resolve, reject) => { - dispatch(switchToApplicationMode(device, resolve, reject)); + dispatch( + switchToApplicationMode( + device, + resolve, + reject, + autoReconnectAfterProgrammingWhen + ) + ); }), });