feat(device): Make Agent able to unbrick bricked modules (#577)

This commit is contained in:
Róbert Kiss
2018-02-13 02:11:27 +01:00
committed by László Monda
parent 65fc8b5efb
commit 6c7232a5ba
2 changed files with 36 additions and 3 deletions

View File

@@ -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 {

View File

@@ -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