Skip to content
This repository was archived by the owner on Dec 15, 2024. It is now read-only.

Commit 90c46df

Browse files
authored
feat: ignore-firmware-checksums command line argument (#2365)
Use checksum to identify installed firmware on UHK devices
1 parent 1726718 commit 90c46df

File tree

6 files changed

+48
-11
lines changed

6 files changed

+48
-11
lines changed

packages/uhk-agent/src/services/device.service.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import {
5353
convertBufferToIntArray,
5454
DevicePropertyIds,
5555
EnumerationModes,
56+
findDeviceConfigInFirmwareJson,
5657
getCurrentUhkDeviceProduct,
5758
getCurrentUhkDongleHID,
5859
getCurrenUhk80LeftHID,
@@ -377,6 +378,11 @@ export class DeviceService {
377378
response.userConfigSaved = false;
378379
response.firmwareDowngraded = false;
379380
const data: UpdateFirmwareData = JSON.parse(args[0]);
381+
382+
if (this.options['ignore-firmware-checksums']) {
383+
data.forceUpgrade = true;
384+
}
385+
380386
let firmwarePathData: TmpFirmware;
381387

382388
try {
@@ -415,10 +421,15 @@ export class DeviceService {
415421
dongleUhkDevice = new UhkHidDevice(this.logService, this.options, this.rootDir, dongleHid);
416422
let dongleOperations = new UhkOperations(this.logService, dongleUhkDevice);
417423
let versionInfo = await dongleOperations.getDeviceVersionInfo();
418-
this.logService.misc('[DeviceService] Dongle firmware version:',
419-
versionInfo.firmwareVersion);
424+
this.logService.misc('[DeviceService] Current Dongle firmware checksum:',
425+
versionInfo.firmwareChecksum);
426+
427+
const deviceConfig = findDeviceConfigInFirmwareJson(UHK_DONGLE, packageJson);
420428

421-
if (data.forceUpgrade || versionInfo.firmwareVersion !== packageJson.firmwareVersion) {
429+
this.logService.misc('[DeviceService] New Dongle firmware checksum:',
430+
deviceConfig.md5);
431+
432+
if (data.forceUpgrade || versionInfo.firmwareChecksum !== deviceConfig.md5) {
422433
event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, UHK_DONGLE.name);
423434
await dongleOperations.updateDeviceFirmware(dongleFirmwarePath, UHK_DONGLE);
424435
this.logService.misc('[DeviceService] Waiting for keyboard');
@@ -451,9 +462,14 @@ export class DeviceService {
451462
JSON.stringify(uhkDeviceProduct, usbDeviceJsonFormatter));
452463
const deviceFirmwarePath = getDeviceFirmwarePath(uhkDeviceProduct, packageJson);
453464

454-
this.logService.misc('[DeviceService] Device right firmware version:',
455-
hardwareModules.rightModuleInfo.firmwareVersion);
456-
if (data.forceUpgrade || hardwareModules.rightModuleInfo.firmwareVersion !== packageJson.firmwareVersion) {
465+
this.logService.misc('[DeviceService] Current Device right firmware checksum:',
466+
hardwareModules.rightModuleInfo.firmwareChecksum);
467+
468+
const deviceConfig = findDeviceConfigInFirmwareJson(uhkDeviceProduct, packageJson);
469+
this.logService.misc('[DeviceService] New Device right firmware checksum:',
470+
deviceConfig.md5);
471+
472+
if (data.forceUpgrade || hardwareModules.rightModuleInfo.firmwareChecksum !== deviceConfig.md5) {
457473
event.sender.send(IpcEvents.device.moduleFirmwareUpgrading, RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME);
458474
await this.operations.updateDeviceFirmware(deviceFirmwarePath, uhkDeviceProduct);
459475
this.logService.misc('[DeviceService] Waiting for keyboard');

packages/uhk-agent/src/util/command-line.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [
77
{ name: 'devtools', type: Boolean },
88
{ name: 'disable-agent-update-protection', type: Boolean },
99
{ name: 'error-simulation', type: String },
10+
{ name: 'ignore-firmware-checksums', type: Boolean },
1011
{ name: 'log', type: String },
1112
{ name: 'help', type: Boolean },
1213
{ name: 'pid', type: Number },
@@ -48,6 +49,11 @@ const sections: commandLineUsage.Section[] = [
4849
description: 'Simulate an error',
4950
typeLabel: 'invalid-user-config'
5051
},
52+
{
53+
name: 'ignore-firmware-checksums',
54+
description: 'Always upgrade firmware of devices and modules even the checksums are same',
55+
type: Boolean
56+
},
5157
{
5258
name: 'log',
5359
description: 'Set logging categories. --log=misc,usb. Default is "misc"',

packages/uhk-common/src/models/command-line-args.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ export interface CommandLineArgs extends DeviceIdentifier {
3636
*/
3737
'error-simulation'?: string;
3838

39+
/**
40+
* Always upgrade firmware of devices and modules even the checksums are same
41+
*/
42+
'ignore-firmware-checksums'?: boolean;
43+
3944
/**
4045
* logging categories
4146
*/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { FirmwareJson, FirmwareJsonDevice, UhkDeviceProduct} from 'uhk-common';
2+
3+
export function findDeviceConfigInFirmwareJson(device: UhkDeviceProduct, firmwareJson: FirmwareJson): FirmwareJsonDevice {
4+
const deviceConfig = firmwareJson.devices.find(firmwareDevice => firmwareDevice.deviceId === device.id);
5+
6+
if (!deviceConfig) {
7+
throw new Error(`The user config does not support: ${device.name}`);
8+
}
9+
10+
return deviceConfig;
11+
}
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { dirname, join } from 'path';
22
import { FirmwareJson, UhkDeviceProduct } from 'uhk-common';
33

4-
export function getDeviceUserConfigPath(device: UhkDeviceProduct, firmwareJson: FirmwareJson): string {
5-
const deviceConfig = firmwareJson.devices.find(firmwareDevice => firmwareDevice.deviceId === device.id);
4+
import { findDeviceConfigInFirmwareJson } from './find-device-config-in-firmware-json.js';
65

7-
if (!deviceConfig) {
8-
throw new Error(`The user config does not support: ${device.name}`);
9-
}
6+
export function getDeviceUserConfigPath(device: UhkDeviceProduct, firmwareJson: FirmwareJson): string {
7+
const deviceConfig = findDeviceConfigInFirmwareJson(device, firmwareJson);
108

119
return join(dirname(firmwareJson.path), 'devices', deviceConfig.name, 'config.bin');
1210
}

packages/uhk-usb/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export * from './convert-ms-to-duration.js';
55
export * from './convert-slave-i2c-error-buffer.js';
66
export * from './device-vid-pid-interface-filter.js';
77
export * from './find-device-by-device-identifier.js';
8+
export * from './find-device-config-in-firmware-json.js';
89
export * from './get-current-uhk-device-product.js';
910
export * from './get-current-uhk-dongle-HID.js';
1011
export * from './get-current-uhk-80-left-HID.js';

0 commit comments

Comments
 (0)