diff --git a/packages/uhk-agent/src/services/device.service.ts b/packages/uhk-agent/src/services/device.service.ts index 49f2fb1964f..bc8567dc983 100644 --- a/packages/uhk-agent/src/services/device.service.ts +++ b/packages/uhk-agent/src/services/device.service.ts @@ -53,6 +53,7 @@ import { convertBufferToIntArray, DevicePropertyIds, EnumerationModes, + findDeviceConfigInFirmwareJson, getCurrentUhkDeviceProduct, getCurrentUhkDongleHID, getCurrenUhk80LeftHID, @@ -377,6 +378,11 @@ export class DeviceService { response.userConfigSaved = false; response.firmwareDowngraded = false; const data: UpdateFirmwareData = JSON.parse(args[0]); + + if (this.options['ignore-firmware-checksums']) { + data.forceUpgrade = true; + } + let firmwarePathData: TmpFirmware; try { @@ -415,10 +421,15 @@ export class DeviceService { 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] Dongle firmware version:', - versionInfo.firmwareVersion); + this.logService.misc('[DeviceService] Current Dongle firmware checksum:', + versionInfo.firmwareChecksum); + + const deviceConfig = findDeviceConfigInFirmwareJson(UHK_DONGLE, packageJson); - if (data.forceUpgrade || versionInfo.firmwareVersion !== packageJson.firmwareVersion) { + this.logService.misc('[DeviceService] New Dongle firmware checksum:', + deviceConfig.md5); + + if (data.forceUpgrade || versionInfo.firmwareChecksum !== deviceConfig.md5) { event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, UHK_DONGLE.name); await dongleOperations.updateDeviceFirmware(dongleFirmwarePath, UHK_DONGLE); this.logService.misc('[DeviceService] Waiting for keyboard'); @@ -451,9 +462,14 @@ export class DeviceService { JSON.stringify(uhkDeviceProduct, usbDeviceJsonFormatter)); const deviceFirmwarePath = getDeviceFirmwarePath(uhkDeviceProduct, packageJson); - this.logService.misc('[DeviceService] Device right firmware version:', - hardwareModules.rightModuleInfo.firmwareVersion); - if (data.forceUpgrade || hardwareModules.rightModuleInfo.firmwareVersion !== packageJson.firmwareVersion) { + this.logService.misc('[DeviceService] Current Device right firmware checksum:', + hardwareModules.rightModuleInfo.firmwareChecksum); + + const deviceConfig = findDeviceConfigInFirmwareJson(uhkDeviceProduct, packageJson); + this.logService.misc('[DeviceService] New Device right firmware checksum:', + deviceConfig.md5); + + if (data.forceUpgrade || hardwareModules.rightModuleInfo.firmwareChecksum !== 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'); diff --git a/packages/uhk-agent/src/util/command-line.ts b/packages/uhk-agent/src/util/command-line.ts index 4d926ac403f..259c5e63c05 100644 --- a/packages/uhk-agent/src/util/command-line.ts +++ b/packages/uhk-agent/src/util/command-line.ts @@ -7,6 +7,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [ { name: 'devtools', type: Boolean }, { name: 'disable-agent-update-protection', type: Boolean }, { name: 'error-simulation', type: String }, + { name: 'ignore-firmware-checksums', type: Boolean }, { name: 'log', type: String }, { name: 'help', type: Boolean }, { name: 'pid', type: Number }, @@ -48,6 +49,11 @@ const sections: commandLineUsage.Section[] = [ description: 'Simulate an error', typeLabel: 'invalid-user-config' }, + { + name: 'ignore-firmware-checksums', + description: 'Always upgrade firmware of devices and modules even the checksums are same', + type: Boolean + }, { name: 'log', description: 'Set logging categories. --log=misc,usb. Default is "misc"', diff --git a/packages/uhk-common/src/models/command-line-args.ts b/packages/uhk-common/src/models/command-line-args.ts index 0bd688b539b..87030ccf076 100644 --- a/packages/uhk-common/src/models/command-line-args.ts +++ b/packages/uhk-common/src/models/command-line-args.ts @@ -36,6 +36,11 @@ export interface CommandLineArgs extends DeviceIdentifier { */ 'error-simulation'?: string; + /** + * Always upgrade firmware of devices and modules even the checksums are same + */ + 'ignore-firmware-checksums'?: boolean; + /** * logging categories */ diff --git a/packages/uhk-usb/src/utils/find-device-config-in-firmware-json.ts b/packages/uhk-usb/src/utils/find-device-config-in-firmware-json.ts new file mode 100644 index 00000000000..22d16cc3231 --- /dev/null +++ b/packages/uhk-usb/src/utils/find-device-config-in-firmware-json.ts @@ -0,0 +1,11 @@ +import { FirmwareJson, FirmwareJsonDevice, UhkDeviceProduct} from 'uhk-common'; + +export function findDeviceConfigInFirmwareJson(device: UhkDeviceProduct, firmwareJson: FirmwareJson): FirmwareJsonDevice { + const deviceConfig = firmwareJson.devices.find(firmwareDevice => firmwareDevice.deviceId === device.id); + + if (!deviceConfig) { + throw new Error(`The user config does not support: ${device.name}`); + } + + return deviceConfig; +} diff --git a/packages/uhk-usb/src/utils/get-device-user-config-path.ts b/packages/uhk-usb/src/utils/get-device-user-config-path.ts index 3ffbd485a67..e6473e0b80f 100644 --- a/packages/uhk-usb/src/utils/get-device-user-config-path.ts +++ b/packages/uhk-usb/src/utils/get-device-user-config-path.ts @@ -1,12 +1,10 @@ import { dirname, join } from 'path'; import { FirmwareJson, UhkDeviceProduct } from 'uhk-common'; -export function getDeviceUserConfigPath(device: UhkDeviceProduct, firmwareJson: FirmwareJson): string { - const deviceConfig = firmwareJson.devices.find(firmwareDevice => firmwareDevice.deviceId === device.id); +import { findDeviceConfigInFirmwareJson } from './find-device-config-in-firmware-json.js'; - if (!deviceConfig) { - throw new Error(`The user config does not support: ${device.name}`); - } +export function getDeviceUserConfigPath(device: UhkDeviceProduct, firmwareJson: FirmwareJson): string { + const deviceConfig = findDeviceConfigInFirmwareJson(device, firmwareJson); return join(dirname(firmwareJson.path), 'devices', deviceConfig.name, 'config.bin'); } diff --git a/packages/uhk-usb/src/utils/index.ts b/packages/uhk-usb/src/utils/index.ts index 4d60d849604..cf1f0f55085 100644 --- a/packages/uhk-usb/src/utils/index.ts +++ b/packages/uhk-usb/src/utils/index.ts @@ -5,6 +5,7 @@ export * from './convert-ms-to-duration.js'; export * from './convert-slave-i2c-error-buffer.js'; export * from './device-vid-pid-interface-filter.js'; export * from './find-device-by-device-identifier.js'; +export * from './find-device-config-in-firmware-json.js'; export * from './get-current-uhk-device-product.js'; export * from './get-current-uhk-dongle-HID.js'; export * from './get-current-uhk-80-left-HID.js';