diff --git a/packages/uhk-agent/src/services/device.service.ts b/packages/uhk-agent/src/services/device.service.ts
index 6ef5893300a..3cecddc5748 100644
--- a/packages/uhk-agent/src/services/device.service.ts
+++ b/packages/uhk-agent/src/services/device.service.ts
@@ -10,6 +10,7 @@ import {
ConfigurationReply,
convertBleAddressArrayToString,
convertBleStringToNumberArray,
+ CurrentlyUpdatingModuleInfo,
DeviceConnectionState,
disableAgentUpgradeProtection,
findUhkModuleById,
@@ -31,6 +32,8 @@ import {
LeftSlotModules,
LogService,
mapObjectToUserConfigBinaryBuffer,
+ ModuleFirmwareUpgradeSkipInfo,
+ ModuleFirmwareUpgradeSkipReason,
ModuleInfo,
ModuleSlotToId,
RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
@@ -431,7 +434,11 @@ export class DeviceService {
deviceConfig.md5);
if (data.forceUpgrade || versionInfo.builtFirmwareChecksum !== deviceConfig.md5) {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, UHK_DONGLE.name);
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, {
+ forceUpgraded: versionInfo.builtFirmwareChecksum === deviceConfig.md5,
+ moduleName: UHK_DONGLE.name,
+ newFirmwareChecksum: deviceConfig.md5,
+ } as CurrentlyUpdatingModuleInfo);
await dongleOperations.updateDeviceFirmware(dongleFirmwarePath, UHK_DONGLE);
this.logService.misc('[DeviceService] Waiting for keyboard');
await waitForDevices(UHK_DONGLE.keyboard);
@@ -446,6 +453,11 @@ export class DeviceService {
}
}
else {
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: UHK_DONGLE.name,
+ newFirmwareChecksum: deviceConfig?.md5,
+ reason: ModuleFirmwareUpgradeSkipReason.DeviceChecksumMatches,
+ } as ModuleFirmwareUpgradeSkipInfo);
this.logService.misc('Skip dongle firmware upgrade.');
}
}
@@ -471,7 +483,11 @@ export class DeviceService {
deviceConfig.md5);
if (data.forceUpgrade || hardwareModules.rightModuleInfo.builtFirmwareChecksum !== deviceConfig.md5) {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME);
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, {
+ forceUpgraded: hardwareModules.rightModuleInfo.builtFirmwareChecksum === deviceConfig.md5,
+ newFirmwareChecksum: deviceConfig.md5,
+ moduleName: RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
+ } as CurrentlyUpdatingModuleInfo);
await this.operations.updateDeviceFirmware(deviceFirmwarePath, uhkDeviceProduct);
this.logService.misc('[DeviceService] Waiting for keyboard');
await waitForDevices(uhkDeviceProduct.keyboard);
@@ -490,6 +506,11 @@ export class DeviceService {
response.userConfigSaved = true;
}
} else {
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
+ newFirmwareChecksum: deviceConfig?.md5,
+ reason: ModuleFirmwareUpgradeSkipReason.DeviceChecksumMatches,
+ } as ModuleFirmwareUpgradeSkipInfo);
this.logService.misc('Skip right firmware upgrade.');
}
@@ -515,7 +536,13 @@ export class DeviceService {
);
if (data.forceUpgrade || !isLeftModuleFirmwareSame) {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, leftModuleInfo.module.name);
+ const moduleConfig = packageJson.modules.find(firmwareDevice => firmwareDevice.moduleId === leftModuleInfo.module.id);
+
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, {
+ forceUpgraded: isLeftModuleFirmwareSame,
+ moduleName: leftModuleInfo.module.name,
+ newFirmwareChecksum: moduleConfig.md5,
+ } as CurrentlyUpdatingModuleInfo);
if(uhkDeviceProduct.firmwareUpgradeMethod === FIRMWARE_UPGRADE_METHODS.MCUBOOT) {
if (!(await isUhkDeviceConnected(UHK_80_DEVICE_LEFT))) {
@@ -542,51 +569,84 @@ export class DeviceService {
);
}
} else {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, leftModuleInfo.module.name);
+ const moduleConfig = packageJson.modules.find(firmwareDevice => firmwareDevice.moduleId === leftModuleInfo.module.id);
+
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: leftModuleInfo.module.name,
+ newFirmwareChecksum: moduleConfig?.md5,
+ reason: ModuleFirmwareUpgradeSkipReason.ModuleChecksumMatches,
+ } as ModuleFirmwareUpgradeSkipInfo);
this.logService.misc('[DeviceService] Skip left firmware upgrade.');
}
- // TODO: implement MCUBOOT version
- if (uhkDeviceProduct.firmwareUpgradeMethod === FIRMWARE_UPGRADE_METHODS.KBOOT) {
- for (const moduleInfo of hardwareModules.moduleInfos) {
- if (moduleInfo.module.slotId === ModuleSlotToId.leftHalf) {
- // Left half upgrade mandatory, it is running before the other modules upgrade.
- } else if (moduleInfo.module.firmwareUpgradeSupported) {
- this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" firmware version:`, moduleInfo.info.firmwareVersion);
- this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" current remote firmware checksum:`, moduleInfo.info.remoteFirmwareChecksum);
-
- const moduleFirmwareInfo = hardwareModules.rightModuleInfo.modules[moduleInfo.module.id];
- if (moduleFirmwareInfo) {
- this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" new built firmware checksum:`, moduleFirmwareInfo.builtFirmwareChecksum);
- }
+ for (const moduleInfo of hardwareModules.moduleInfos) {
+ if (moduleInfo.module.slotId === ModuleSlotToId.leftHalf) {
+ // Left half upgrade mandatory, it is running before the other modules upgrade.
+ continue;
+ }
+ // TODO: implement MCUBOOT version
+ if (uhkDeviceProduct.firmwareUpgradeMethod === FIRMWARE_UPGRADE_METHODS.MCUBOOT) {
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: moduleInfo.module.name,
+ newFirmwareChecksum: '',
+ reason: ModuleFirmwareUpgradeSkipReason.Uhk80Limitation,
+ } as ModuleFirmwareUpgradeSkipInfo);
+
+ continue;
+ }
- const isModuleFirmwareSame = isSameFirmware(
- {
- firmwareChecksum: moduleInfo.info.remoteFirmwareChecksum,
- firmwareVersion: moduleInfo.info.firmwareVersion
- },
- {
- firmwareChecksum: moduleFirmwareInfo?.builtFirmwareChecksum,
- firmwareVersion: packageJson.firmwareVersion
- }
- );
+ if (moduleInfo.module.firmwareUpgradeSupported) {
+ this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" firmware version:`, moduleInfo.info.firmwareVersion);
+ this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" current remote firmware checksum:`, moduleInfo.info.remoteFirmwareChecksum);
- if (data.forceUpgrade || !isModuleFirmwareSame) {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, moduleInfo.module.name);
- await this.operations
- .updateModuleWithKboot(
- getModuleFirmwarePath(moduleInfo.module, packageJson),
- uhkDeviceProduct,
- moduleInfo.module
- );
- this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" firmware update done.`);
- } else {
- event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, moduleInfo.module.name);
- this.logService.misc(`[DeviceService] Skip "${moduleInfo.module.name}" firmware upgrade.`);
+ const moduleFirmwareInfo = hardwareModules.rightModuleInfo.modules[moduleInfo.module.id];
+ if (moduleFirmwareInfo) {
+ this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" new built firmware checksum:`, moduleFirmwareInfo.builtFirmwareChecksum);
+ }
+
+ const isModuleFirmwareSame = isSameFirmware(
+ {
+ firmwareChecksum: moduleInfo.info.remoteFirmwareChecksum,
+ firmwareVersion: moduleInfo.info.firmwareVersion
+ },
+ {
+ firmwareChecksum: moduleFirmwareInfo?.builtFirmwareChecksum,
+ firmwareVersion: packageJson.firmwareVersion
}
+ );
+
+ if (data.forceUpgrade || !isModuleFirmwareSame) {
+ const moduleConfig = packageJson.modules.find(firmwareDevice => firmwareDevice.moduleId === moduleInfo.module.id);
+
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, {
+ forceUpgraded: isModuleFirmwareSame,
+ moduleName: moduleInfo.module.name,
+ newFirmwareChecksum: moduleConfig.md5,
+ } as CurrentlyUpdatingModuleInfo);
+ await this.operations
+ .updateModuleWithKboot(
+ getModuleFirmwarePath(moduleInfo.module, packageJson),
+ uhkDeviceProduct,
+ moduleInfo.module
+ );
+ this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" firmware update done.`);
} else {
- this.logService.misc(`[DeviceService] Skip "${moduleInfo.module.name}" firmware upgrade. Currently not supported`);
+ const moduleConfig = packageJson.modules.find(firmwareDevice => firmwareDevice.moduleId === moduleInfo.module.id);
+
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: moduleInfo.module.name,
+ newFirmwareChecksum: moduleConfig?.md5,
+ reason: ModuleFirmwareUpgradeSkipReason.ModuleChecksumMatches,
+ } as ModuleFirmwareUpgradeSkipInfo);
+ this.logService.misc(`[DeviceService] Skip "${moduleInfo.module.name}" firmware upgrade.`);
}
+ } else {
+ event.sender.send(IpcEvents.device.moduleFirmwareUpgradeSkip, {
+ moduleName: moduleInfo.module.name,
+ newFirmwareChecksum: '',
+ reason: ModuleFirmwareUpgradeSkipReason.NotSupported,
+ } as ModuleFirmwareUpgradeSkipInfo);
+ this.logService.misc(`[DeviceService] Skip "${moduleInfo.module.name}" firmware upgrade. Currently not supported`);
}
}
diff --git a/packages/uhk-common/src/models/currently-updating-module-info.ts b/packages/uhk-common/src/models/currently-updating-module-info.ts
new file mode 100644
index 00000000000..6de43234352
--- /dev/null
+++ b/packages/uhk-common/src/models/currently-updating-module-info.ts
@@ -0,0 +1,5 @@
+export interface CurrentlyUpdatingModuleInfo {
+ forceUpgraded: boolean;
+ moduleName: string;
+ newFirmwareChecksum: string;
+}
diff --git a/packages/uhk-common/src/models/index.ts b/packages/uhk-common/src/models/index.ts
index dfd878522b6..fa8e5a45258 100644
--- a/packages/uhk-common/src/models/index.ts
+++ b/packages/uhk-common/src/models/index.ts
@@ -4,6 +4,7 @@ export * from './backup-user-configuration-info.js';
export * from './ble-address-pair.js';
export * from './command-line-args.js';
export * from './config-sizes-info.js';
+export * from './currently-updating-module-info.js';
export * from './device-module-record.js';
export * from './device-version-information.js';
export * from './dongle.js';
@@ -22,6 +23,7 @@ export * from './app-start-info.js';
export * from './configuration-reply.js';
export * from './version-information.js';
export * from './device-connection-state.js';
+export * from './module-firmware-upgrade-skip-info.js';
export * from './module-slot-to-i2c-adress.js';
export * from './module-slot-id.js';
export * from './module-version-info.js';
diff --git a/packages/uhk-common/src/models/module-firmware-upgrade-skip-info.ts b/packages/uhk-common/src/models/module-firmware-upgrade-skip-info.ts
new file mode 100644
index 00000000000..1d9586c8bae
--- /dev/null
+++ b/packages/uhk-common/src/models/module-firmware-upgrade-skip-info.ts
@@ -0,0 +1,24 @@
+export enum ModuleFirmwareUpgradeSkipReason {
+ /**
+ * The actually running firmware checksum of the right half or the dongle is matching with the firmware tarball checksum.
+ */
+ DeviceChecksumMatches = 'DeviceChecksumMatches',
+ /**
+ * The actually running firmware checksum of the module is matching with the expected firmware checksum by right half device.
+ */
+ ModuleChecksumMatches = 'ModuleChecksumMatches',
+ /**
+ * The module does not support the firmware upgrade like touchpad.
+ */
+ NotSupported = 'NotSupported',
+ /**
+ * UHK 80 currently does not support the firmware upgrades of the modules.
+ */
+ Uhk80Limitation = 'Uhk80Limitation',
+}
+
+export interface ModuleFirmwareUpgradeSkipInfo {
+ moduleName: string;
+ newFirmwareChecksum: string;
+ reason: ModuleFirmwareUpgradeSkipReason;
+}
diff --git a/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.html b/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.html
index 318f1b487f1..6af4df4c1ab 100644
--- a/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.html
+++ b/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.html
@@ -9,10 +9,17 @@
-
-
+
+
+
+
-
+
{{ state.moduleName }}
firmware:
diff --git a/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.ts b/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.ts
index 8dc5f43b3c0..47274bda87d 100644
--- a/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.ts
+++ b/packages/uhk-web/src/app/components/device/firmware/device-firmware.component.ts
@@ -1,7 +1,13 @@
import { ChangeDetectorRef, Component, OnDestroy, ViewChild } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable, Subscription } from 'rxjs';
-import { faCheck, faExclamation, faLongArrowAltRight, faSlidersH, faSpinner } from '@fortawesome/free-solid-svg-icons';
+import {
+ faCheck,
+ faExclamation,
+ faLongArrowAltRight,
+ faSlidersH,
+ faSpinner,
+} from '@fortawesome/free-solid-svg-icons';
import { FirmwareUpgradeFailReason, UhkModule, VersionInformation } from 'uhk-common';
import {
@@ -18,7 +24,7 @@ import {
import { RecoveryModuleAction, UpdateFirmwareAction, UpdateFirmwareWithAction } from '../../../store/actions/device';
import { XtermLog } from '../../../models/xterm-log';
import { XtermComponent } from '../../xterm/xterm.component';
-import { FirmwareUpgradeState, HistoryFileInfo, ModuleFirmwareUpgradeState, UpdateFirmwareWithPayload } from '../../../models';
+import { FirmwareUpgradeState, ModuleFirmwareUpgradeState, UpdateFirmwareWithPayload } from '../../../models';
@Component({
selector: 'device-firmware',
@@ -36,7 +42,6 @@ export class DeviceFirmwareComponent implements OnDestroy {
runningOnNotSupportedWindows$: Observable;
firmwareUpgradeAllowed$: Observable;
- firmwareGithubIssueUrl: string;
firmwareUpgradeFailed: boolean;
firmwareUpgradeFailReasons = FirmwareUpgradeFailReason;
firmwareUpgradeSuccess: boolean;
diff --git a/packages/uhk-web/src/app/models/firmware-upgrade-state.ts b/packages/uhk-web/src/app/models/firmware-upgrade-state.ts
index eb9af2eceab..2a15f754115 100644
--- a/packages/uhk-web/src/app/models/firmware-upgrade-state.ts
+++ b/packages/uhk-web/src/app/models/firmware-upgrade-state.ts
@@ -1,22 +1,29 @@
-import { FirmwareUpgradeFailReason, UhkModule } from 'uhk-common';
+import { FirmwareUpgradeFailReason, ModuleFirmwareUpgradeSkipReason, UhkModule } from 'uhk-common';
export enum ModuleFirmwareUpgradeStates {
Idle = 'Idle',
Upgrading = 'Upgrading',
+ Skipped = 'Skipped',
Success = 'Success',
Failed = 'Failed'
}
export interface ModuleFirmwareUpgradeState {
+ beforeFirmwareUpgradeChecksum?: string;
firmwareUpgradeSupported: boolean;
+ forceUpgraded: boolean;
isOfficialFirmware?: boolean;
gitRepo?: string;
gitTag?: string;
moduleName: string;
+ currentFirmwareChecksum: string;
currentFirmwareVersion: string;
newFirmwareVersion?: string;
+ newFirmwareChecksum?: string;
state: ModuleFirmwareUpgradeStates;
+ skipReason?: ModuleFirmwareUpgradeSkipReason;
tooltip?: string;
+ checksumTooltip?: string;
}
export interface FirmwareUpgradeState {
diff --git a/packages/uhk-web/src/app/services/device-renderer.service.ts b/packages/uhk-web/src/app/services/device-renderer.service.ts
index c5d836b17f2..194b0c94021 100644
--- a/packages/uhk-web/src/app/services/device-renderer.service.ts
+++ b/packages/uhk-web/src/app/services/device-renderer.service.ts
@@ -3,6 +3,7 @@ import { Action, Store } from '@ngrx/store';
import {
ChangeKeyboardLayoutIpcResponse,
+ CurrentlyUpdatingModuleInfo,
DeviceConnectionState,
DeviceVersionInformation,
FirmwareJson,
@@ -13,6 +14,7 @@ import {
IpcResponse,
KeyboardLayout,
LogService,
+ ModuleFirmwareUpgradeSkipInfo,
SaveUserConfigurationData,
UHK_DEVICE_IDS_TYPE,
UpdateFirmwareData,
@@ -193,11 +195,11 @@ export class DeviceRendererService {
this.dispachStoreAction(new UpdateFirmwareJsonAction(data));
});
- this.ipcRenderer.on(IpcEvents.device.moduleFirmwareUpgradeSkip, (event: string, response: string) => {
+ this.ipcRenderer.on(IpcEvents.device.moduleFirmwareUpgradeSkip, (event: string, response: ModuleFirmwareUpgradeSkipInfo) => {
this.dispachStoreAction(new CurrentlyUpdateSkipModuleAction(response));
});
- this.ipcRenderer.on(IpcEvents.device.moduleFirmwareUpgrading, (event: string, response: string) => {
+ this.ipcRenderer.on(IpcEvents.device.moduleFirmwareUpgrading, (event: string, response: CurrentlyUpdatingModuleInfo) => {
this.dispachStoreAction(new CurrentlyUpdatingModuleAction(response));
});
diff --git a/packages/uhk-web/src/app/store/actions/device.ts b/packages/uhk-web/src/app/store/actions/device.ts
index 0fadf100f70..107238b4ef3 100644
--- a/packages/uhk-web/src/app/store/actions/device.ts
+++ b/packages/uhk-web/src/app/store/actions/device.ts
@@ -3,6 +3,7 @@ import {
BackupUserConfiguration,
ChangeKeyboardLayoutIpcResponse,
ConfigSizesInfo,
+ CurrentlyUpdatingModuleInfo,
DeviceConnectionState,
DeviceVersionInformation,
FirmwareJson,
@@ -11,6 +12,7 @@ import {
HardwareModules,
IpcResponse,
KeyboardLayout,
+ ModuleFirmwareUpgradeSkipInfo,
UHK_DEVICE_IDS_TYPE,
} from 'uhk-common';
import { FirmwareUpgradeError } from '../../models/firmware-upgrade-error';
@@ -136,14 +138,14 @@ export class ResetUserConfigurationAction implements Action {
export class CurrentlyUpdatingModuleAction implements Action {
type = ActionTypes.CurrentlyUpdatingModule;
- constructor(public payload: string) {
+ constructor(public payload: CurrentlyUpdatingModuleInfo) {
}
}
export class CurrentlyUpdateSkipModuleAction implements Action {
type = ActionTypes.CurrentlyUpdateSkipModule;
- constructor(public payload: string) {
+ constructor(public payload: ModuleFirmwareUpgradeSkipInfo) {
}
}
diff --git a/packages/uhk-web/src/app/store/index.ts b/packages/uhk-web/src/app/store/index.ts
index 7ee9a9b4c1b..e5fe0fbeab7 100644
--- a/packages/uhk-web/src/app/store/index.ts
+++ b/packages/uhk-web/src/app/store/index.ts
@@ -711,7 +711,9 @@ export const getFirmwareUpgradeState = createSelector(runningInElectron, getStat
firmwareUpgradeSupported: true,
gitRepo: UHK_OFFICIAL_FIRMWARE_REPO,
isOfficialFirmware: true,
+ currentFirmwareChecksum: '',
currentFirmwareVersion: agentVersionInfo.firmwareVersion,
+ forceUpgraded: false,
newFirmwareVersion: undefined,
state: ModuleFirmwareUpgradeStates.Idle
},
@@ -720,7 +722,9 @@ export const getFirmwareUpgradeState = createSelector(runningInElectron, getStat
firmwareUpgradeSupported: true,
gitRepo: UHK_OFFICIAL_FIRMWARE_REPO,
isOfficialFirmware: true,
+ currentFirmwareChecksum: '',
currentFirmwareVersion: agentVersionInfo.firmwareVersion,
+ forceUpgraded: false,
newFirmwareVersion: undefined,
state: ModuleFirmwareUpgradeStates.Idle
}
diff --git a/packages/uhk-web/src/app/store/reducers/firmware-upgrade.reducer.ts b/packages/uhk-web/src/app/store/reducers/firmware-upgrade.reducer.ts
index 9b7dd23e6c1..6549c6381f4 100644
--- a/packages/uhk-web/src/app/store/reducers/firmware-upgrade.reducer.ts
+++ b/packages/uhk-web/src/app/store/reducers/firmware-upgrade.reducer.ts
@@ -1,13 +1,16 @@
import { Action } from '@ngrx/store';
import {
+ CurrentlyUpdatingModuleInfo,
Dongle,
FirmwareJson,
FirmwareUpgradeFailReason,
HardwareModules,
isOfficialUhkFirmware,
+ ModuleFirmwareUpgradeSkipReason,
ModuleInfo,
ModuleSlotToId,
RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
+ UhkDeviceProduct,
UHK_DONGLE,
UHK_MODULES,
UhkModule
@@ -46,6 +49,7 @@ const FIRMWARE_NOT_FORCE_UPGRADING = [
];
export interface State {
+ connectedDevice?: UhkDeviceProduct;
dongle?: Dongle;
firmwareJson?: FirmwareJson;
hardwareModules: HardwareModules;
@@ -83,6 +87,7 @@ export function reducer(state = initialState, action: Action): State {
newState.modules = newState.modules.map(module => {
return {
...module,
+ checksumTooltip: '',
newFirmwareVersion: firmwareJson?.firmwareVersion,
state: firmwareJson?.firmwareVersion === module.currentFirmwareVersion
&& FIRMWARE_NOT_FORCE_UPGRADING.includes(state.upgradeState)
@@ -100,9 +105,10 @@ export function reducer(state = initialState, action: Action): State {
return {
...state,
+ connectedDevice: payload.connectedDevice,
dongle: payload.dongle,
hardwareModules,
- modules: mapModules(state.firmwareJson, hardwareModules, state.modules, payload.dongle),
+ modules: mapModules(state.firmwareJson, hardwareModules, state.modules, payload.dongle, state.connectedDevice),
recoveryModules: calculateRecoveryModules(hardwareModules.moduleInfos)
};
}
@@ -116,9 +122,30 @@ export function reducer(state = initialState, action: Action): State {
}
case Device.ActionTypes.CurrentlyUpdateSkipModule: {
+ const payload = (action as Device.CurrentlyUpdateSkipModuleAction).payload;
+
return {
...state,
- modules: setUpdatingModuleState(state, (action as Device.CurrentlyUpdateSkipModuleAction).payload),
+ modules: state.modules.map(module => {
+ if (module.moduleName === payload.moduleName) {
+ const newState = {
+ ...module,
+ beforeFirmwareUpgradeChecksum: module.currentFirmwareChecksum,
+ newFirmwareChecksum: payload.newFirmwareChecksum,
+ state: ModuleFirmwareUpgradeStates.Skipped,
+ skipReason: payload.reason,
+ }
+ newState.checksumTooltip = calculateChecksumTooltip(newState)
+
+ return newState;
+ }
+
+ if (module.state === ModuleFirmwareUpgradeStates.Upgrading) {
+ return updateUpgradingModuleState(state, module, payload);
+ }
+
+ return module;
+ }),
};
}
@@ -133,7 +160,7 @@ export function reducer(state = initialState, action: Action): State {
return {
...state,
dongle,
- modules: mapModules(state.firmwareJson, state.hardwareModules, state.modules, state.dongle),
+ modules: mapModules(state.firmwareJson, state.hardwareModules, state.modules, state.dongle, state.connectedDevice),
};
}
@@ -143,7 +170,7 @@ export function reducer(state = initialState, action: Action): State {
return {
...state,
hardwareModules,
- modules: mapModules(state.firmwareJson, hardwareModules, state.modules, state.dongle),
+ modules: mapModules(state.firmwareJson, hardwareModules, state.modules, state.dongle, state.connectedDevice),
};
}
@@ -295,7 +322,7 @@ export const firmwareUpgradeState = (state: State): FirmwareUpgradeState => ({
recoveryModules: state.recoveryModules
});
-function mapModules(firmwareJson: FirmwareJson, hardwareModules: HardwareModules, stateModules: Array = [], dongle: Dongle): Array {
+function mapModules(firmwareJson: FirmwareJson, hardwareModules: HardwareModules, stateModules: Array = [], dongle: Dongle, connectedDevice: UhkDeviceProduct): Array {
const modules: Array = [];
function findStateModule(name: string): ModuleFirmwareUpgradeState {
@@ -303,60 +330,98 @@ function mapModules(firmwareJson: FirmwareJson, hardwareModules: HardwareModules
}
if (dongle?.versionInfo) {
- modules.push({
+ const stateModule = findStateModule(UHK_DONGLE.name)
+ const dongleState: ModuleFirmwareUpgradeState = {
moduleName: UHK_DONGLE.name,
firmwareUpgradeSupported: true,
gitRepo: dongle.versionInfo.firmwareGitRepo,
gitTag: dongle.versionInfo.firmwareGitTag,
isOfficialFirmware: isOfficialUhkFirmware(dongle.versionInfo.firmwareGitRepo),
+ currentFirmwareChecksum: dongle.versionInfo?.builtFirmwareChecksum,
currentFirmwareVersion: dongle.versionInfo?.firmwareVersion,
newFirmwareVersion: dongle.versionInfo?.firmwareVersion,
- state: findStateModule(UHK_DONGLE.name)?.state ?? ModuleFirmwareUpgradeStates.Idle
- });
+ beforeFirmwareUpgradeChecksum: stateModule?.beforeFirmwareUpgradeChecksum,
+ newFirmwareChecksum: stateModule?.newFirmwareChecksum,
+ forceUpgraded: stateModule?.forceUpgraded,
+ skipReason: stateModule?.skipReason,
+ state: stateModule?.state ?? ModuleFirmwareUpgradeStates.Idle,
+ }
+ dongleState.checksumTooltip = calculateChecksumTooltip(dongleState)
+
+ modules.push(dongleState);
}
- modules.push({
- moduleName: RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
- firmwareUpgradeSupported: true,
- gitRepo: hardwareModules.rightModuleInfo.firmwareGitRepo,
- gitTag: hardwareModules.rightModuleInfo.firmwareGitTag,
- isOfficialFirmware: isOfficialUhkFirmware(hardwareModules.rightModuleInfo.firmwareGitRepo),
- currentFirmwareVersion: hardwareModules.rightModuleInfo?.firmwareVersion,
- newFirmwareVersion: firmwareJson?.firmwareVersion,
- state: findStateModule(RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME)?.state ?? ModuleFirmwareUpgradeStates.Idle
- });
+ if (connectedDevice) {
+ const stateModule = findStateModule(RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME)
+ const rightDeviceState: ModuleFirmwareUpgradeState = {
+ moduleName: RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME,
+ firmwareUpgradeSupported: true,
+ gitRepo: hardwareModules.rightModuleInfo.firmwareGitRepo,
+ gitTag: hardwareModules.rightModuleInfo.firmwareGitTag,
+ isOfficialFirmware: isOfficialUhkFirmware(hardwareModules.rightModuleInfo.firmwareGitRepo),
+ currentFirmwareChecksum: hardwareModules.rightModuleInfo.builtFirmwareChecksum,
+ currentFirmwareVersion: hardwareModules.rightModuleInfo?.firmwareVersion,
+ beforeFirmwareUpgradeChecksum: stateModule?.beforeFirmwareUpgradeChecksum,
+ newFirmwareVersion: firmwareJson?.firmwareVersion,
+ newFirmwareChecksum: stateModule?.newFirmwareChecksum,
+ forceUpgraded: stateModule?.forceUpgraded,
+ skipReason: stateModule?.skipReason,
+ state: stateModule?.state ?? ModuleFirmwareUpgradeStates.Idle,
+ }
+ rightDeviceState.checksumTooltip = calculateChecksumTooltip(rightDeviceState)
+
+ modules.push(rightDeviceState);
+ }
if (hardwareModules.moduleInfos) {
for (let i = 0; i < hardwareModules.moduleInfos?.length; i++) {
const moduleInfo = hardwareModules.moduleInfos[i];
const firmwareModuleInfo = hardwareModules.rightModuleInfo.modules[moduleInfo.module.id];
const stateModule = findStateModule(moduleInfo.module.name);
+ let moduleState: ModuleFirmwareUpgradeState;
+
if (!firmwareModuleInfo || moduleInfo.info.firmwareVersion === hardwareModules.rightModuleInfo?.firmwareVersion || firmwareModuleInfo.builtFirmwareChecksum !== moduleInfo.info.remoteFirmwareChecksum) {
- modules.push({
+ moduleState = {
moduleName: moduleInfo.module.name,
firmwareUpgradeSupported: moduleInfo.module.firmwareUpgradeSupported,
gitRepo: moduleInfo.info.firmwareGitRepo,
gitTag: moduleInfo.info.firmwareGitTag,
isOfficialFirmware: isOfficialUhkFirmware(moduleInfo.info.firmwareGitRepo),
+ currentFirmwareChecksum: moduleInfo.info.remoteFirmwareChecksum,
currentFirmwareVersion: moduleInfo.info.firmwareVersion,
newFirmwareVersion: firmwareJson?.firmwareVersion,
+ beforeFirmwareUpgradeChecksum: stateModule?.beforeFirmwareUpgradeChecksum,
+ newFirmwareChecksum: stateModule?.newFirmwareChecksum,
+ forceUpgraded: stateModule?.forceUpgraded,
+ skipReason: stateModule?.skipReason,
state: stateModule?.state ?? ModuleFirmwareUpgradeStates.Idle,
- tooltip: ''
- });
+ tooltip: '',
+ }
+
+ modules.push(moduleState);
} else {
- modules.push({
+ moduleState = {
moduleName: moduleInfo.module.name,
firmwareUpgradeSupported: moduleInfo.module.firmwareUpgradeSupported,
gitRepo: hardwareModules.rightModuleInfo.firmwareGitRepo,
gitTag: hardwareModules.rightModuleInfo.firmwareGitTag,
isOfficialFirmware: isOfficialUhkFirmware(moduleInfo.info.firmwareGitRepo),
+ currentFirmwareChecksum: moduleInfo.info.remoteFirmwareChecksum,
currentFirmwareVersion: hardwareModules.rightModuleInfo?.firmwareVersion,
newFirmwareVersion: '',
+ beforeFirmwareUpgradeChecksum: stateModule?.beforeFirmwareUpgradeChecksum,
+ newFirmwareChecksum: stateModule?.newFirmwareChecksum,
+ forceUpgraded: stateModule?.forceUpgraded,
+ skipReason: stateModule?.skipReason,
state: stateModule?.state ?? ModuleFirmwareUpgradeStates.Idle,
- tooltip: `This module runs firmware ${hardwareModules.rightModuleInfo?.firmwareVersion} (binary identical to previously installed firmware ${moduleInfo.info.firmwareVersion}); no update needed.`
- });
+ tooltip: `This module runs firmware ${hardwareModules.rightModuleInfo?.firmwareVersion} (binary identical to previously installed firmware ${moduleInfo.info.firmwareVersion}); no update needed.`,
+ }
+
+ modules.push(moduleState);
}
+
+ moduleState.checksumTooltip = calculateChecksumTooltip(moduleState);
}
}
@@ -395,24 +460,78 @@ function calculateRecoveryModules(moduleInfos: Array): Array {
+function setUpdatingModuleState(state: State, payload: CurrentlyUpdatingModuleInfo): Array {
return state.modules.map(module => {
- if (module.moduleName === moduleName) {
- return {
- ...module,
- state: ModuleFirmwareUpgradeStates.Upgrading
- };
- } else if (module.state === ModuleFirmwareUpgradeStates.Upgrading) {
- return {
+ if (module.moduleName === payload.moduleName) {
+ const newState = {
...module,
- state: ModuleFirmwareUpgradeStates.Success,
- newFirmwareVersion: state.firmwareJson?.firmwareVersion,
- currentFirmwareVersion: state.firmwareJson?.firmwareVersion,
- gitRepo: state.firmwareJson?.gitInfo?.repo,
- gitTag: state.firmwareJson?.gitInfo?.tag,
+ beforeFirmwareUpgradeChecksum: module.currentFirmwareChecksum,
+ forceUpgraded: payload.forceUpgraded,
+ newFirmwareChecksum: payload.newFirmwareChecksum,
+ state: ModuleFirmwareUpgradeStates.Upgrading,
};
+ newState.checksumTooltip = calculateChecksumTooltip(newState);
+
+ return newState;
+ }
+
+ if (module.state === ModuleFirmwareUpgradeStates.Upgrading) {
+ return updateUpgradingModuleState(state, module, payload);
}
return module;
});
}
+
+function updateUpgradingModuleState(state: State, module: ModuleFirmwareUpgradeState, payload: {newFirmwareChecksum: string}): ModuleFirmwareUpgradeState {
+ const newState = {
+ ...module,
+ state: ModuleFirmwareUpgradeStates.Success,
+ newFirmwareChecksum: payload.newFirmwareChecksum,
+ newFirmwareVersion: state.firmwareJson?.firmwareVersion,
+ currentFirmwareVersion: state.firmwareJson?.firmwareVersion,
+ gitRepo: state.firmwareJson?.gitInfo?.repo,
+ gitTag: state.firmwareJson?.gitInfo?.tag,
+ };
+ newState.checksumTooltip = calculateChecksumTooltip(newState);
+
+ return newState;
+}
+
+function calculateChecksumTooltip(upgradeState: ModuleFirmwareUpgradeState): string {
+ if (upgradeState.state === ModuleFirmwareUpgradeStates.Upgrading) {
+ if (upgradeState.forceUpgraded) {
+ return `Force upgrading, even though expected checksum (${upgradeState.newFirmwareChecksum}) is equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ else {
+ return `Upgrading, because expected checksum (${upgradeState.newFirmwareChecksum}) is not equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ }
+ else if (upgradeState.state === ModuleFirmwareUpgradeStates.Skipped) {
+ if (upgradeState.skipReason === ModuleFirmwareUpgradeSkipReason.ModuleChecksumMatches || upgradeState.skipReason === ModuleFirmwareUpgradeSkipReason.DeviceChecksumMatches) {
+ return `Not upgraded, because expected checksum (${upgradeState.newFirmwareChecksum}) was equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+
+ if (upgradeState.skipReason === ModuleFirmwareUpgradeSkipReason.Uhk80Limitation) {
+ return 'The UHK 80 firmware can\'t update module firmwares yet, but it\'s not a problem because module firmwares haven\'t changed.';
+ }
+ }
+ else if (upgradeState.state === ModuleFirmwareUpgradeStates.Success) {
+ if (upgradeState.forceUpgraded) {
+ return `Force upgraded, even though expected checksum (${upgradeState.newFirmwareChecksum}) was equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ else {
+ return `Upgraded, because expected checksum (${upgradeState.newFirmwareChecksum}) was not equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ }
+ else if (upgradeState.state === ModuleFirmwareUpgradeStates.Failed) {
+ if (upgradeState.forceUpgraded) {
+ return `Force upgrade failed, expected checksum (${upgradeState.newFirmwareChecksum}) is equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ else {
+ return `Upgrade failed, expected checksum (${upgradeState.newFirmwareChecksum}) is not equal with actual (${upgradeState.beforeFirmwareUpgradeChecksum})`;
+ }
+ }
+
+ return;
+}
diff --git a/packages/uhk-web/src/styles/_global.scss b/packages/uhk-web/src/styles/_global.scss
index 0d189662260..b47f9b1b58c 100644
--- a/packages/uhk-web/src/styles/_global.scss
+++ b/packages/uhk-web/src/styles/_global.scss
@@ -264,6 +264,11 @@ kbd {
max-width: 100%;
}
+.tooltip-firmware-checksum .tooltip-inner {
+ width: 300px;
+ max-width: 300px;
+}
+
.tooltip-firmware-version .tooltip-inner {
width: 350px;
max-width: 350px;