From 03315576edb3f48d6fcc937bb8e8c2c12dfd48c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sat, 1 Feb 2025 15:48:06 +0100 Subject: [PATCH] fix: compare checksum of UHK80 and dongle devices --- .../uhk-agent/src/services/device.service.ts | 46 +++++++++++-------- .../src/models/device-module-record.ts | 2 +- .../src/models/device-version-information.ts | 5 +- .../src/models/firmware-version-info.ts | 2 +- .../src/models/module-version-info.ts | 5 +- .../uhk-common/src/models/uhk-module-ids.ts | 2 + packages/uhk-usb/src/constants.ts | 4 +- packages/uhk-usb/src/uhk-hid-device.ts | 2 +- packages/uhk-usb/src/uhk-operations.ts | 17 +++++-- .../reducers/firmware-upgrade.reducer.ts | 2 +- 10 files changed, 52 insertions(+), 35 deletions(-) diff --git a/packages/uhk-agent/src/services/device.service.ts b/packages/uhk-agent/src/services/device.service.ts index 83b8ab0992b..6ef5893300a 100644 --- a/packages/uhk-agent/src/services/device.service.ts +++ b/packages/uhk-agent/src/services/device.service.ts @@ -42,6 +42,7 @@ import { UHK_80_DEVICE_LEFT, UHK_DEVICE_IDS, UHK_DONGLE, + UHK_MODULE_IDS, UHK_MODULES, UpdateFirmwareData, UploadFileData, @@ -342,9 +343,9 @@ export class DeviceService { if (isFirmwareChecksumSupported) { for (const moduleInfo of hardwareModules.moduleInfos) { const moduleId = moduleInfo.module.id; - const md5 = readUhkResponseAs0EndString(await this.operations.getRightModuleProperty(DevicePropertyIds.FirmwareChecksum, [moduleId])); + const builtFirmwareChecksum = readUhkResponseAs0EndString(await this.operations.getRightModuleProperty(DevicePropertyIds.BuiltFirmwareChecksumByModuleId, [moduleId])); hardwareModules.rightModuleInfo.modules[moduleId] = { - md5 + builtFirmwareChecksum }; } } @@ -420,16 +421,16 @@ export class DeviceService { try { dongleUhkDevice = new UhkHidDevice(this.logService, this.options, this.rootDir, dongleHid); let dongleOperations = new UhkOperations(this.logService, dongleUhkDevice); - let versionInfo = await dongleOperations.getDeviceVersionInfo(); - this.logService.misc('[DeviceService] Current Dongle firmware checksum:', - versionInfo.firmwareChecksum); + let versionInfo = await dongleOperations.getDeviceVersionInfo(UHK_MODULE_IDS.DONGLE); + this.logService.misc('[DeviceService] Current Dongle built firmware checksum:', + versionInfo.builtFirmwareChecksum); const deviceConfig = findDeviceConfigInFirmwareJson(UHK_DONGLE, packageJson); this.logService.misc('[DeviceService] New Dongle firmware checksum:', deviceConfig.md5); - if (data.forceUpgrade || versionInfo.firmwareChecksum !== deviceConfig.md5) { + if (data.forceUpgrade || versionInfo.builtFirmwareChecksum !== deviceConfig.md5) { event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, UHK_DONGLE.name); await dongleOperations.updateDeviceFirmware(dongleFirmwarePath, UHK_DONGLE); this.logService.misc('[DeviceService] Waiting for keyboard'); @@ -440,7 +441,7 @@ export class DeviceService { if (dongleHid) { dongleUhkDevice = new UhkHidDevice(this.logService, this.options, this.rootDir, dongleHid); dongleOperations = new UhkOperations(this.logService, dongleUhkDevice); - versionInfo = await dongleOperations.getDeviceVersionInfo(); + versionInfo = await dongleOperations.getDeviceVersionInfo(UHK_MODULE_IDS.DONGLE); event.sender.send(IpcEvents.device.dongleVersionInfoLoaded, versionInfo); } } @@ -462,14 +463,14 @@ export class DeviceService { JSON.stringify(uhkDeviceProduct, usbDeviceJsonFormatter)); const deviceFirmwarePath = getDeviceFirmwarePath(uhkDeviceProduct, packageJson); - this.logService.misc('[DeviceService] Current Device right firmware checksum:', - hardwareModules.rightModuleInfo.firmwareChecksum); + this.logService.misc('[DeviceService] Current Device right built firmware checksum:', + hardwareModules.rightModuleInfo.builtFirmwareChecksum); const deviceConfig = findDeviceConfigInFirmwareJson(uhkDeviceProduct, packageJson); this.logService.misc('[DeviceService] New Device right firmware checksum:', deviceConfig.md5); - if (data.forceUpgrade || hardwareModules.rightModuleInfo.firmwareChecksum !== deviceConfig.md5) { + if (data.forceUpgrade || hardwareModules.rightModuleInfo.builtFirmwareChecksum !== deviceConfig.md5) { event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME); await this.operations.updateDeviceFirmware(deviceFirmwarePath, uhkDeviceProduct); this.logService.misc('[DeviceService] Waiting for keyboard'); @@ -497,15 +498,18 @@ export class DeviceService { const leftModuleFirmwareInfo = hardwareModules.rightModuleInfo.modules[leftModuleInfo.module.id]; this.logService.misc('[DeviceService] Left module firmware version: ', leftModuleInfo.info.firmwareVersion); - this.logService.misc('[DeviceService] Current left module firmware checksum: ', leftModuleInfo.info.firmwareChecksum); + this.logService.misc('[DeviceService] Left module remote firmware checksum: ', leftModuleInfo.info.remoteFirmwareChecksum); if (leftModuleFirmwareInfo) { - this.logService.misc('[DeviceService] New left module firmware checksum: ', leftModuleFirmwareInfo.md5); + this.logService.misc('[DeviceService] Left module built firmware checksum: ', leftModuleFirmwareInfo.builtFirmwareChecksum); } const isLeftModuleFirmwareSame = isSameFirmware( - leftModuleInfo.info, { - firmwareChecksum: leftModuleFirmwareInfo?.md5, + firmwareChecksum: leftModuleInfo.info.remoteFirmwareChecksum, + firmwareVersion: leftModuleInfo.info.firmwareVersion + }, + { + firmwareChecksum: leftModuleFirmwareInfo?.builtFirmwareChecksum, firmwareVersion: packageJson.firmwareVersion } ); @@ -549,17 +553,20 @@ export class DeviceService { // 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 firmware checksum:`, moduleInfo.info.firmwareChecksum); + 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 firmware checksum:`, moduleFirmwareInfo.md5); + this.logService.misc(`[DeviceService] "${moduleInfo.module.name}" new built firmware checksum:`, moduleFirmwareInfo.builtFirmwareChecksum); } const isModuleFirmwareSame = isSameFirmware( - moduleInfo.info, { - firmwareChecksum: moduleFirmwareInfo?.md5, + firmwareChecksum: moduleInfo.info.remoteFirmwareChecksum, + firmwareVersion: moduleInfo.info.firmwareVersion + }, + { + firmwareChecksum: moduleFirmwareInfo?.builtFirmwareChecksum, firmwareVersion: packageJson.firmwareVersion } ); @@ -942,8 +949,7 @@ export class DeviceService { if (isDeviceSupportWirelessUSBCommands && !state.dongle.multiDevice && !state.dongle.bootloaderActive - && state.dongle.serialNumber - && state.dongle.serialNumber !== this.savedState?.dongle?.serialNumber) { + && state.dongle.serialNumber) { const dongle = await getCurrentUhkDongleHID(); let dongleUhkDevice: UhkHidDevice; diff --git a/packages/uhk-common/src/models/device-module-record.ts b/packages/uhk-common/src/models/device-module-record.ts index ae183d4d016..f6ba8f7ad71 100644 --- a/packages/uhk-common/src/models/device-module-record.ts +++ b/packages/uhk-common/src/models/device-module-record.ts @@ -1,5 +1,5 @@ export interface DeviceModule { - md5: string; + builtFirmwareChecksum: string; } export interface DeviceModuleRecord extends Record{ diff --git a/packages/uhk-common/src/models/device-version-information.ts b/packages/uhk-common/src/models/device-version-information.ts index ecdd6c8ee29..1c0cd83183d 100644 --- a/packages/uhk-common/src/models/device-version-information.ts +++ b/packages/uhk-common/src/models/device-version-information.ts @@ -1,6 +1,7 @@ import { FirmwareRepoInfo } from './firmware-repo-info.js'; -import { FirmwareVersionInfo } from './firmware-version-info.js'; +import { FirmwareVersion } from './firmware-version.js'; import { ProtocolVersions } from './protocol-versions.js'; -export interface DeviceVersionInformation extends FirmwareRepoInfo, FirmwareVersionInfo, ProtocolVersions { +export interface DeviceVersionInformation extends FirmwareRepoInfo, FirmwareVersion, ProtocolVersions { + builtFirmwareChecksum?: string; } diff --git a/packages/uhk-common/src/models/firmware-version-info.ts b/packages/uhk-common/src/models/firmware-version-info.ts index 671dcd98389..52527b72f19 100644 --- a/packages/uhk-common/src/models/firmware-version-info.ts +++ b/packages/uhk-common/src/models/firmware-version-info.ts @@ -1,5 +1,5 @@ import { FirmwareVersion } from './firmware-version.js'; export interface FirmwareVersionInfo extends FirmwareVersion { - firmwareChecksum?: string; + firmwareChecksum: string; } diff --git a/packages/uhk-common/src/models/module-version-info.ts b/packages/uhk-common/src/models/module-version-info.ts index 4d27ef97f8c..fc4b7482ea1 100644 --- a/packages/uhk-common/src/models/module-version-info.ts +++ b/packages/uhk-common/src/models/module-version-info.ts @@ -1,6 +1,7 @@ import { FirmwareRepoInfo } from './firmware-repo-info.js'; -import { FirmwareVersionInfo } from './firmware-version-info.js'; +import { FirmwareVersion } from './firmware-version.js'; -export interface ModuleVersionInfo extends FirmwareRepoInfo, FirmwareVersionInfo { +export interface ModuleVersionInfo extends FirmwareRepoInfo, FirmwareVersion { moduleProtocolVersion?: string; + remoteFirmwareChecksum?: string; } diff --git a/packages/uhk-common/src/models/uhk-module-ids.ts b/packages/uhk-common/src/models/uhk-module-ids.ts index 3a1222f2cdb..c648ec98bfe 100644 --- a/packages/uhk-common/src/models/uhk-module-ids.ts +++ b/packages/uhk-common/src/models/uhk-module-ids.ts @@ -1,9 +1,11 @@ export const UHK_MODULE_IDS = Object.freeze({ + RIGHT_HALF: 0, LEFT_HALF: 1, LEFT_KEY_CLUSTER: 2, RIGHT_TRACKBALL: 3, RIGHT_TRACKPOINT: 4, RIGHT_TOUCHPAD: 5, + DONGLE: 254 }); export type UHK_MODULE_IDS_KEY_TYPE = keyof typeof UHK_MODULE_IDS; diff --git a/packages/uhk-usb/src/constants.ts b/packages/uhk-usb/src/constants.ts index 8dffc9bcbca..0743769e621 100644 --- a/packages/uhk-usb/src/constants.ts +++ b/packages/uhk-usb/src/constants.ts @@ -55,7 +55,7 @@ export enum DevicePropertyIds { Uptime = 5, GitTag = 6, GitRepo = 7, - FirmwareChecksum = 8, + BuiltFirmwareChecksumByModuleId = 8, BleAddress = 9, PairedRightPeerBleAddress = 10, PairingStatus = 11, @@ -79,7 +79,7 @@ export enum ModulePropertyId { protocolVersions = 0, GitTag = 1, GitRepo = 2, - FirmwareChecksum = 3 + RemoteFirmwareChecksumBySlotId = 3 } export enum PairIds { diff --git a/packages/uhk-usb/src/uhk-hid-device.ts b/packages/uhk-usb/src/uhk-hid-device.ts index ea2094b46d6..85c29dc0fd6 100644 --- a/packages/uhk-usb/src/uhk-hid-device.ts +++ b/packages/uhk-usb/src/uhk-hid-device.ts @@ -736,7 +736,7 @@ export class UhkHidDevice { smartMacrosVersion: `${uhkBuffer.readUInt16()}.${uhkBuffer.readUInt16()}.${uhkBuffer.readUInt16()}` }; - this.logService.misc('[UhkHidDevice] protocol versions: ' + JSON.stringify(this._protocolVersions)); + this.logService.misc(`[UhkHidDevice] productId: ${this._deviceInfo.productId} protocol versions: ${JSON.stringify(this._protocolVersions)}`); return this._protocolVersions; } diff --git a/packages/uhk-usb/src/uhk-operations.ts b/packages/uhk-usb/src/uhk-operations.ts index 995576dba43..0f0a126f45e 100644 --- a/packages/uhk-usb/src/uhk-operations.ts +++ b/packages/uhk-usb/src/uhk-operations.ts @@ -21,9 +21,12 @@ import { UhkBuffer, UhkDeviceProduct, UhkModule, + UHK_MODULE_IDS_TYPE, + UHK_MODULE_IDS, UNKNOWN_DEVICE, } from 'uhk-common'; import { promisify } from 'util'; +import semver from 'semver'; import { ConfigBufferId, DevicePropertyIds, @@ -448,11 +451,11 @@ export class UhkOperations { return this.getModuleProperty(arg).then(readUhkResponseAs0EndString); } - public async getModuleFirmwareChecksum(module: ModuleSlotToId): Promise { + public async getModuleRemoteFirmwareChecksum(module: ModuleSlotToId): Promise { const moduleSlotName = getSlotIdName(module); this.logService.misc(`[DeviceOperation] Read "${moduleSlotName}" firmware checksum`); - return this.getModulePropertyAsString({ module, property: ModulePropertyId.FirmwareChecksum }); + return this.getModulePropertyAsString({ module, property: ModulePropertyId.RemoteFirmwareChecksumBySlotId }); } public async getModuleFirmwareRepoInfo(module: ModuleSlotToId): Promise { @@ -490,7 +493,7 @@ export class UhkOperations { if (includeFirmwareChecksum) { moduleVersionInfo = { ...moduleVersionInfo, - firmwareChecksum: await this.getModuleFirmwareChecksum(module), + remoteFirmwareChecksum: await this.getModuleRemoteFirmwareChecksum(module), }; } @@ -522,7 +525,7 @@ export class UhkOperations { }; } - public async getDeviceVersionInfo(): Promise { + public async getDeviceVersionInfo(moduleId: UHK_MODULE_IDS_TYPE = UHK_MODULE_IDS.RIGHT_HALF): Promise { // TODO: read device name from UHK Device this.logService.usbOps('[DeviceOperation] USB[T]: Device information'); @@ -539,9 +542,13 @@ export class UhkOperations { }; if (isDeviceProtocolSupportFirmwareChecksum(deviceVersionInformation.deviceProtocolVersion)) { + if (semver.lt(deviceVersionInformation.deviceProtocolVersion, '4.14.1')) { + moduleId = UHK_MODULE_IDS.RIGHT_HALF; + } + deviceVersionInformation = { ...deviceVersionInformation, - firmwareChecksum: readUhkResponseAs0EndString(await this.getRightModuleProperty(DevicePropertyIds.FirmwareChecksum, [0])), + builtFirmwareChecksum: readUhkResponseAs0EndString(await this.getRightModuleProperty(DevicePropertyIds.BuiltFirmwareChecksumByModuleId, [moduleId])), }; } 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 d5bdffdeb7a..9b7dd23e6c1 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 @@ -332,7 +332,7 @@ function mapModules(firmwareJson: FirmwareJson, hardwareModules: HardwareModules const firmwareModuleInfo = hardwareModules.rightModuleInfo.modules[moduleInfo.module.id]; const stateModule = findStateModule(moduleInfo.module.name); - if (!firmwareModuleInfo || moduleInfo.info.firmwareVersion === hardwareModules.rightModuleInfo?.firmwareVersion || firmwareModuleInfo.md5 !== moduleInfo.info.firmwareChecksum) { + if (!firmwareModuleInfo || moduleInfo.info.firmwareVersion === hardwareModules.rightModuleInfo?.firmwareVersion || firmwareModuleInfo.builtFirmwareChecksum !== moduleInfo.info.remoteFirmwareChecksum) { modules.push({ moduleName: moduleInfo.module.name, firmwareUpgradeSupported: moduleInfo.module.firmwareUpgradeSupported,