From d621b1e5e6ee6bf3559ab2f51e4b82dc825dffd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Kiss?= Date: Fri, 15 Sep 2017 00:13:00 +0200 Subject: [PATCH] feat(device): Write user configuration into the eeprom (#411) * feat(device): Write user configuration into the eeprom * when save user config settings wait until is not keyboard busy --- .../uhk-agent/src/services/device.service.ts | 73 ++++++++++++++----- packages/usb/eeprom.js | 18 ++++- 2 files changed, 72 insertions(+), 19 deletions(-) diff --git a/packages/uhk-agent/src/services/device.service.ts b/packages/uhk-agent/src/services/device.service.ts index e877de6b..4488fe75 100644 --- a/packages/uhk-agent/src/services/device.service.ts +++ b/packages/uhk-agent/src/services/device.service.ts @@ -19,9 +19,20 @@ import { UhkHidDeviceService } from './uhk-hid-device.service'; */ enum Command { UploadConfig = 8, - ApplyConfig = 9 + ApplyConfig = 9, + LaunchEepromTransfer = 12, + GetKeyboardState = 16 } +enum EepromTransfer { + ReadHardwareConfig = 0, + WriteHardwareConfig = 1, + ReadUserConfig = 2, + WriteUserConfig = 3 +} + +const snooze = ms => new Promise(resolve => setTimeout(resolve, ms)); + /** * IpcMain pair of the UHK Communication * Functionality: @@ -70,28 +81,16 @@ export class DeviceService { .subscribe(); } - /** - * IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result. - * @param {Electron.Event} event - ipc event - * @param {string} json - UserConfiguration in JSON format - * @returns {Promise} - * @private - */ private async saveUserConfiguration(event: Electron.Event, json: string): Promise { const response = new IpcResponse(); try { - const buffer: Buffer = new Buffer(JSON.parse(json).data); - const fragments = this.getTransferBuffers(buffer); - for (const fragment of fragments) { - await this.device.write(fragment); - } - - const applyBuffer = new Buffer([Command.ApplyConfig]); - await this.device.write(applyBuffer); + this.sendUserConfigToKeyboard(json); + await this.writeUserConfigToEeprom(); this.device.close(); + response.success = true; - this.logService.info('[DeviceService] Transferring finished'); + this.logService.info('transferring finished'); } catch (error) { this.logService.error('[DeviceService] Transferring error', error); @@ -99,6 +98,46 @@ export class DeviceService { } event.sender.send(IpcEvents.device.saveUserConfigurationReply, response); + + return Promise.resolve(); + } + + /** + * IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result. + * @param {string} json - UserConfiguration in JSON format + * @returns {Promise} + * @private + */ + private async sendUserConfigToKeyboard(json: string): Promise { + const buffer: Buffer = new Buffer(JSON.parse(json).data); + const fragments = this.getTransferBuffers(buffer); + for (const fragment of fragments) { + await this.device.write(fragment); + } + + const applyBuffer = new Buffer([Command.ApplyConfig]); + await this.device.write(applyBuffer); + this.logService.info('[DeviceService] Transferring finished'); + } + + private async writeUserConfigToEeprom(): Promise { + this.logService.info('[DeviceService] Start write user configuration to eeprom'); + + const buffer = await this.device.write(new Buffer([Command.LaunchEepromTransfer, EepromTransfer.WriteUserConfig])); + await this.waitUntilKeyboardBusy(); + + this.logService.info('[DeviceService] End write user configuration to eeprom'); + } + + private async waitUntilKeyboardBusy(): Promise { + while (true) { + const buffer = await this.device.write(new Buffer([Command.GetKeyboardState])); + if (buffer[1] === 0) { + break; + } + this.logService.debug('Keyboard is busy, wait...'); + await snooze(200); + } } /** diff --git a/packages/usb/eeprom.js b/packages/usb/eeprom.js index ba760d73..8920ff83 100755 --- a/packages/usb/eeprom.js +++ b/packages/usb/eeprom.js @@ -12,6 +12,20 @@ if (eepromTransferId === undefined) { const device = uhk.getUhkDevice(); device.write(uhk.getTransferData(new Buffer([uhk.usbCommands.launchEepromTransfer, eepromTransferId]))); const buffer = Buffer.from(device.readSync()); -if(buffer[1] === 1) { - device.write(uhk.getTransferData(new Buffer([uhk.usbCommands.getKeyboardState]))); +const responseCode = buffer[0]; +if (responseCode !== 0) { + console.error(`Write user config to eeprom failed. Response code: ${responseCode}`); + process.exit(1); } + +function waitUntilKeyboardBusy() { + + device.write(uhk.getTransferData(new Buffer([uhk.usbCommands.getKeyboardState]))); + const keyboardStateBuffer = Buffer.from(device.readSync()); + + if (keyboardStateBuffer[1] === 1) { + setTimeout(waitUntilKeyboardBusy, 200); + } +} + +waitUntilKeyboardBusy();