feat(device): Make Agent able to unbrick bricked modules (#577)
This commit is contained in:
committed by
László Monda
parent
65fc8b5efb
commit
6c7232a5ba
@@ -39,7 +39,8 @@ export enum ConfigBufferId {
|
|||||||
export enum DevicePropertyIds {
|
export enum DevicePropertyIds {
|
||||||
DeviceProtocolVersion = 0,
|
DeviceProtocolVersion = 0,
|
||||||
ProtocolVersions = 1,
|
ProtocolVersions = 1,
|
||||||
ConfigSizes = 2
|
ConfigSizes = 2,
|
||||||
|
CurrentKbootCommand = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum EnumerationModes {
|
export enum EnumerationModes {
|
||||||
|
|||||||
@@ -5,8 +5,13 @@ import * as fs from 'fs';
|
|||||||
import { UhkBlhost } from './uhk-blhost';
|
import { UhkBlhost } from './uhk-blhost';
|
||||||
import { UhkHidDevice } from './uhk-hid-device';
|
import { UhkHidDevice } from './uhk-hid-device';
|
||||||
import { snooze } from './util';
|
import { snooze } from './util';
|
||||||
import { convertBufferToIntArray, getTransferBuffers, DevicePropertyIds, UsbCommand, ConfigBufferId
|
import {
|
||||||
} from '../index';
|
convertBufferToIntArray,
|
||||||
|
getTransferBuffers,
|
||||||
|
DevicePropertyIds,
|
||||||
|
UsbCommand,
|
||||||
|
ConfigBufferId
|
||||||
|
} from '../index';
|
||||||
import { LoadConfigurationsResult } from './models/load-configurations-result';
|
import { LoadConfigurationsResult } from './models/load-configurations-result';
|
||||||
|
|
||||||
export class UhkOperations {
|
export class UhkOperations {
|
||||||
@@ -42,6 +47,13 @@ export class UhkOperations {
|
|||||||
await snooze(1000);
|
await snooze(1000);
|
||||||
await this.device.jumpToBootloaderModule(ModuleSlotToId.leftHalf);
|
await this.device.jumpToBootloaderModule(ModuleSlotToId.leftHalf);
|
||||||
this.device.close();
|
this.device.close();
|
||||||
|
|
||||||
|
const leftModuleBricked = await this.waitForKbootIdle();
|
||||||
|
if (!leftModuleBricked) {
|
||||||
|
this.logService.error('[UhkOperations] Couldn\'t connect to the left keyboard half.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await this.device.reenumerate(EnumerationModes.Buspal);
|
await this.device.reenumerate(EnumerationModes.Buspal);
|
||||||
this.device.close();
|
this.device.close();
|
||||||
await this.blhost.runBlhostCommandRetry([...buspalPrefix, 'get-property', '1']);
|
await this.blhost.runBlhostCommandRetry([...buspalPrefix, 'get-property', '1']);
|
||||||
@@ -161,6 +173,26 @@ export class UhkOperations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async waitForKbootIdle(): Promise<boolean> {
|
||||||
|
const timeoutTime = new Date(new Date().getTime() + 30000);
|
||||||
|
|
||||||
|
while (new Date() < timeoutTime) {
|
||||||
|
const buffer = await this.device.write(new Buffer([UsbCommand.GetProperty, DevicePropertyIds.CurrentKbootCommand]));
|
||||||
|
this.device.close();
|
||||||
|
|
||||||
|
if (buffer[1] === 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// tslint:disable-next-line: max-line-length
|
||||||
|
this.logService.info('[DeviceOperation] Cannot ping the bootloader. Please reconnect the left keyboard half. It probably needs several tries, so keep reconnecting until you see this message.');
|
||||||
|
|
||||||
|
await snooze(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result.
|
* IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result.
|
||||||
* @param {string} json - UserConfiguration in JSON format
|
* @param {string} json - UserConfiguration in JSON format
|
||||||
|
|||||||
Reference in New Issue
Block a user