From 07af142718bb67ef428ebea351564644e9ebc2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Mon, 26 Sep 2016 23:36:36 +0200 Subject: [PATCH 01/16] Transfer the actual payload to be sent. Read and display response. --- usb/blink-test-led.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/usb/blink-test-led.js b/usb/blink-test-led.js index bef0fcf6..1ede9997 100755 --- a/usb/blink-test-led.js +++ b/usb/blink-test-led.js @@ -22,13 +22,19 @@ var endpointOut = usbInterface.endpoints[1]; var state = 1; setInterval(function() { - console.log('Sending ', state); state = state ? 0 : 1 - console.log(state) + console.log('Sending ', state); endpointOut.transfer(new Buffer([test_led_command_id, state]), function(err) { if (err) { console.error("USB error: %s", err); process.exit(1); } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', receivedBuffer, receivedBuffer.length); + }) }); }, 500) From fcd1bc4f5848e7544ef149d3f68797a9c5e3d2a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 27 Sep 2016 00:13:03 +0200 Subject: [PATCH 02/16] Update command id according to the changed firmware. --- usb/blink-test-led.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usb/blink-test-led.js b/usb/blink-test-led.js index 1ede9997..7499d455 100755 --- a/usb/blink-test-led.js +++ b/usb/blink-test-led.js @@ -5,7 +5,7 @@ var usb = require('usb'); var vid = 0x16d3; var pid = 0x05ea; -var test_led_command_id = 1; +var test_led_command_id = 2; var device = usb.findByIds(vid, pid); device.open(); From 67695151aa35ff5318e355b5f739113c0602fadc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 27 Sep 2016 16:08:00 +0200 Subject: [PATCH 03/16] Add util.js featuring bufferToString() --- usb/blink-test-led.js | 3 ++- usb/util.js | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100755 usb/util.js diff --git a/usb/blink-test-led.js b/usb/blink-test-led.js index 7499d455..13bf8868 100755 --- a/usb/blink-test-led.js +++ b/usb/blink-test-led.js @@ -2,6 +2,7 @@ 'use strict'; var usb = require('usb'); +var util = require('./util'); var vid = 0x16d3; var pid = 0x05ea; @@ -34,7 +35,7 @@ setInterval(function() { console.error("USB error: %s", err2); process.exit(2); } - console.log('Received', receivedBuffer, receivedBuffer.length); + console.log('Received', util.bufferToString(receivedBuffer)); }) }); }, 500) diff --git a/usb/util.js b/usb/util.js new file mode 100755 index 00000000..b9da78e0 --- /dev/null +++ b/usb/util.js @@ -0,0 +1,13 @@ +exports = module.exports = { + bufferToString: function(buffer) { + var str = ''; + for (var i = 0; i < buffer.length; i++) { + var hex = buffer[i].toString(16) + ' '; + if (hex.length <= 2) { + hex = '0' + hex; + } + str += hex; + }; + return str; + } +} From 0fead7b556457d08dea39acfa177af4e7e97001e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 27 Sep 2016 17:11:42 +0200 Subject: [PATCH 04/16] Add new script that is partially working. --- usb/pulse-leds.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 usb/pulse-leds.js diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js new file mode 100755 index 00000000..038a47f4 --- /dev/null +++ b/usb/pulse-leds.js @@ -0,0 +1,78 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var ledMatrixSize = 144; +var ledCountToUpdatePerCommand = ledMatrixSize / 3; +var writeLedDriverCommandId = 3; +var leftLedDriverAddress = 0b1110100; +var rightLedDriverAddress = 0b1110111; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; + +var state = 1; + +var ledsLeft = new Buffer(ledMatrixSize); +var ledsRight = new Buffer(ledMatrixSize); + +var ledIndex = 0; +var matrixId = 0; + +function updateLeds() { + console.log('update') + endpointOut.transfer(Buffer.concat([ + new Buffer([ + writeLedDriverCommandId, + matrixId ? rightLedDriverAddress : leftLedDriverAddress, + ledCountToUpdatePerCommand, + 0x24 + ledIndex + ]), + (matrixId ? ledsRight : ledsLeft).slice(ledIndex, ledCountToUpdatePerCommand) + ]), function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + console.log('update success') + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + + ledIndex += ledCountToUpdatePerCommand; + if (ledIndex >= ledMatrixSize) { + ledIndex = 0; + } + matrixId = matrixId ? 0 : 1; + + updateLeds(); + }) + }); +} + +updateLeds(); +var i = 0; +setInterval(function() { + console.log('iter') + ledsLeft.fill(0) + ledsLeft[i] = 0xff; + if (++i >= ledMatrixSize) { + i = 0; + } +}, 100) From dc4aa9648270a7abf3b419f795acb5c8d9959bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 29 Sep 2016 01:48:41 +0200 Subject: [PATCH 05/16] Add letter definitions and letter drawing function. --- usb/pulse-leds.js | 115 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 12 deletions(-) diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js index 038a47f4..fb9028f9 100755 --- a/usb/pulse-leds.js +++ b/usb/pulse-leds.js @@ -28,51 +28,142 @@ var state = 1; var ledsLeft = new Buffer(ledMatrixSize); var ledsRight = new Buffer(ledMatrixSize); +ledsLeft.fill(0) +ledsRight.fill(0) var ledIndex = 0; var matrixId = 0; +function disableUnusedLeds() { + var buffer = new Buffer([ + writeLedDriverCommandId, + leftLedDriverAddress, + 19, + 0, + 0, 0b00111111, + 0, 0b00111111, + 0, 0b00111111, + 0, 0b00011111, + 0, 0b00011111, + 0, 0b00011111, + 0, 0b00011111, + 0, 0b00011111, + 0, 0b00011111, + ]); + + endpointOut.transfer(buffer, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + updateLeds(); + }); +} + function updateLeds() { - console.log('update') - endpointOut.transfer(Buffer.concat([ +// console.log('update') + var buffer = Buffer.concat([ new Buffer([ writeLedDriverCommandId, matrixId ? rightLedDriverAddress : leftLedDriverAddress, ledCountToUpdatePerCommand, 0x24 + ledIndex ]), - (matrixId ? ledsRight : ledsLeft).slice(ledIndex, ledCountToUpdatePerCommand) - ]), function(err) { + (matrixId ? ledsRight : ledsLeft).slice(ledIndex, ledIndex + ledCountToUpdatePerCommand) + ]); + console.log('iter: '+i+' out:', util.bufferToString(buffer)) + endpointOut.transfer(buffer, function(err) { if (err) { console.error("USB error: %s", err); process.exit(1); } - console.log('update success') +// console.log('update success') endpointIn.transfer(64, function(err2, receivedBuffer) { if (err2) { console.error("USB error: %s", err2); process.exit(2); } - console.log('Received', util.bufferToString(receivedBuffer)); +// console.log('Received', util.bufferToString(receivedBuffer)); ledIndex += ledCountToUpdatePerCommand; if (ledIndex >= ledMatrixSize) { ledIndex = 0; + matrixId = matrixId ? 0 : 1; } - matrixId = matrixId ? 0 : 1; updateLeds(); }) }); } -updateLeds(); +disableUnusedLeds(); + var i = 0; -setInterval(function() { - console.log('iter') - ledsLeft.fill(0) + +var lettersLeds = { + 0: [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], + 1: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0], + 2: [1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], + 3: [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1], + 4: [0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0], + 5: [1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1], + 6: [1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1], + 7: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0], + 8: [1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1], + 9: [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1], + A: [1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0], + B: [1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1], + C: [1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + D: [1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1], + E: [1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1], + F: [1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], + G: [1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1], + H: [0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0], + I: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + J: [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1], + K: [0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0], + L: [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + M: [0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0], + N: [0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0], + O: [1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1], + P: [1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], + Q: [1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1], + R: [1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0], + S: [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1], + T: [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + U: [0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1], + V: [0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0], + W: [0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0], + X: [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0], + Y: [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0], + Z: [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1], +} + +var iconLedsToLedMatrix = [0x08, 0x09, 0x0a]; +var layerLedsToLedMatrix = [0x0d, 0x1d, 0x2d]; + +var characterLedsToLedMatrix = [ + [0x0b, 0x1b, 0x29, 0x2a, 0x2b, 0x0c, 0x1c, 0x28, 0x1a, 0x2c, 0x38, 0x39, 0x18, 0x19], + [0x3a, 0x4a, 0x58, 0x59, 0x5a, 0x3b, 0x4b, 0x4c, 0x49, 0x5b, 0x5c, 0x68, 0x3c, 0x48], + [0x69, 0x79, 0x7c, 0x88, 0x89, 0x6a, 0x7a, 0x7b, 0x78, 0x8a, 0x8b, 0x8c, 0x6b, 0x6c] +] + +function setLetter(letterLeds, position) { + for (var i=0; i<14; i++) { + ledsLeft[characterLedsToLedMatrix[position][i]] = letterLeds[i] ? 0xff : 0; + } +} + +setLetter(lettersLeds['A'], 0); +setLetter(lettersLeds['B'], 1); +setLetter(lettersLeds['C'], 2); + +/*setInterval(function() { +// console.log('iter', i); + ledsLeft.fill(0); ledsLeft[i] = 0xff; if (++i >= ledMatrixSize) { i = 0; } -}, 100) +}, 100); +*/ \ No newline at end of file From ac5bab2ced381d4ec3f9ab357ff1f933669b80d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 29 Sep 2016 02:33:49 +0200 Subject: [PATCH 06/16] Iterate over the alphabet and layer icons. --- usb/pulse-leds.js | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js index fb9028f9..53c23ca1 100755 --- a/usb/pulse-leds.js +++ b/usb/pulse-leds.js @@ -71,7 +71,7 @@ function updateLeds() { ]), (matrixId ? ledsRight : ledsLeft).slice(ledIndex, ledIndex + ledCountToUpdatePerCommand) ]); - console.log('iter: '+i+' out:', util.bufferToString(buffer)) + console.log('iter: '+letterIdx+' out:', util.bufferToString(buffer)) endpointOut.transfer(buffer, function(err) { if (err) { console.error("USB error: %s", err); @@ -98,7 +98,7 @@ function updateLeds() { disableUnusedLeds(); -var i = 0; +var letterIdx = 0; var lettersLeds = { 0: [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], @@ -148,22 +148,37 @@ var characterLedsToLedMatrix = [ [0x69, 0x79, 0x7c, 0x88, 0x89, 0x6a, 0x7a, 0x7b, 0x78, 0x8a, 0x8b, 0x8c, 0x6b, 0x6c] ] +function setIcons(iconStates) { + for (var i=0; i= ledMatrixSize) { - i = 0; +setIcons([1, 1, 1]); + +var letterIdx = 0; +var layerLedIdx = 0; +setInterval(function() { + for (var i=0; i<3; i++) { + setLetter(lettersLeds[digitsAndLetters[(letterIdx+i) % digitsAndLetters.length]], i); } -}, 100); -*/ \ No newline at end of file + setLayerLed(layerLedIdx); + if (++letterIdx >= digitsAndLetters.length) { + letterIdx = 0; + } + layerLedIdx = ++layerLedIdx % layerLedsToLedMatrix.length; +}, 200); From a43d17f497dd332efed1e123eb64db3985f0aadf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Mon, 10 Oct 2016 01:30:44 +0200 Subject: [PATCH 07/16] Extend the script to be able to send commands upon initialization. Enable the ghost image prevention bit which doesn't seem to fix the ghosting issue. --- usb/pulse-leds.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js index 53c23ca1..097a4682 100755 --- a/usb/pulse-leds.js +++ b/usb/pulse-leds.js @@ -34,8 +34,8 @@ ledsRight.fill(0) var ledIndex = 0; var matrixId = 0; -function disableUnusedLeds() { - var buffer = new Buffer([ +var initLedCommands = [ + [ // only enable the LEDs that are actually in the matrix writeLedDriverCommandId, leftLedDriverAddress, 19, @@ -49,14 +49,29 @@ function disableUnusedLeds() { 0, 0b00011111, 0, 0b00011111, 0, 0b00011111, - ]); + ], + [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xfd, 0x0b], // switch to function page + [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xc2, 0xff], // enable the ghost image prevention bit + [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xfd, 0x00], // switch to page 0 +] + +var ledCommandId = 0; + +function initLeds() { + var ledCommand = initLedCommands[ledCommandId++]; + console.log('initLeds', ledCommand); + var buffer = new Buffer(ledCommand); endpointOut.transfer(buffer, function(err) { if (err) { console.error("USB error: %s", err); process.exit(1); } - updateLeds(); + if (ledCommandId < initLedCommands.length) { + initLeds(); + } else { + updateLeds(); + } }); } @@ -96,7 +111,7 @@ function updateLeds() { }); } -disableUnusedLeds(); +initLeds(); var letterIdx = 0; @@ -168,11 +183,11 @@ function setLetter(letterLeds, position) { var digitsAndLetters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; -setIcons([1, 1, 1]); var letterIdx = 0; var layerLedIdx = 0; setInterval(function() { +setIcons([1, 1, 1]); for (var i=0; i<3; i++) { setLetter(lettersLeds[digitsAndLetters[(letterIdx+i) % digitsAndLetters.length]], i); } From 272663b2753c28ee8d459822c56a60b7eb4172d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Wed, 12 Oct 2016 12:51:50 +0200 Subject: [PATCH 08/16] Add read-eeprom.js and write-eeprom.js --- usb/read-eeprom.js | 37 +++++++++++++++++++++++++++++++++++++ usb/write-eeprom.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100755 usb/read-eeprom.js create mode 100755 usb/write-eeprom.js diff --git a/usb/read-eeprom.js b/usb/read-eeprom.js new file mode 100755 index 00000000..48d48b0f --- /dev/null +++ b/usb/read-eeprom.js @@ -0,0 +1,37 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var readEepromCommandId = 6; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; + +var payload = new Buffer([readEepromCommandId, 63, 0x00, 0x00]); +console.log('Sending ', util.bufferToString(payload)); +endpointOut.transfer(payload, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + }) +}); diff --git a/usb/write-eeprom.js b/usb/write-eeprom.js new file mode 100755 index 00000000..8db73e8e --- /dev/null +++ b/usb/write-eeprom.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var writeEepromCommandId = 5; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; +var arg = process.argv[2] || ''; + +if (arg.length === 0) { + console.log('Gotta specify a string to be written to the EEPROM as the argument of this script'); + process.exit(1); +} + +var payload = Buffer.concat([new Buffer([writeEepromCommandId, arg.length+2, 0x00, 0x00]), new Buffer(arg, 'utf8')]); +console.log('Sending ', util.bufferToString(payload)); +endpointOut.transfer(payload, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + }) +}); From fec68d8931140b859cfff93a4e6f5f3748234255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Mon, 17 Oct 2016 02:55:49 +0200 Subject: [PATCH 09/16] Light up the SW11 LEDs of the left and right keyboard halves. --- usb/pulse-leds.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js index 097a4682..352041f4 100755 --- a/usb/pulse-leds.js +++ b/usb/pulse-leds.js @@ -28,8 +28,8 @@ var state = 1; var ledsLeft = new Buffer(ledMatrixSize); var ledsRight = new Buffer(ledMatrixSize); -ledsLeft.fill(0) -ledsRight.fill(0) +ledsLeft.fill(0xff) +ledsRight.fill(0xff) var ledIndex = 0; var matrixId = 0; @@ -40,7 +40,7 @@ var initLedCommands = [ leftLedDriverAddress, 19, 0, - 0, 0b00111111, + 0b00000001, 0b00111111, 0, 0b00111111, 0, 0b00111111, 0, 0b00011111, @@ -50,6 +50,21 @@ var initLedCommands = [ 0, 0b00011111, 0, 0b00011111, ], + [ // only enable the LEDs that are actually in the matrix + writeLedDriverCommandId, + leftLedDriverAddress, + 19, + 0, + 0b00000001, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + ], [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xfd, 0x0b], // switch to function page [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xc2, 0xff], // enable the ghost image prevention bit [writeLedDriverCommandId, leftLedDriverAddress, 2, 0xfd, 0x00], // switch to page 0 From c59900f9b212d0ab64c58098b1a03899b1ebeb4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Mon, 17 Oct 2016 23:22:03 +0200 Subject: [PATCH 10/16] Add script to test the merge sensor. --- usb/read-merge-sensor.js | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 usb/read-merge-sensor.js diff --git a/usb/read-merge-sensor.js b/usb/read-merge-sensor.js new file mode 100755 index 00000000..7acd21a2 --- /dev/null +++ b/usb/read-merge-sensor.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var readMergeSensorCommandId = 7; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; +var arg = process.argv[2] || ''; + + +function readMergeSensor() { + var payload = new Buffer([readMergeSensorCommandId]); + console.log('Sending ', util.bufferToString(payload)); + endpointOut.transfer(payload, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + setTimeout(readMergeSensor, 500) + }) + }); +} + +readMergeSensor(); From e44d53f4f383f6a127966ab2f9ee370f262f25b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Tue, 18 Oct 2016 18:58:50 +0200 Subject: [PATCH 11/16] Add script to test the LED jumper. --- usb/read-led-jumper.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 usb/read-led-jumper.js diff --git a/usb/read-led-jumper.js b/usb/read-led-jumper.js new file mode 100755 index 00000000..184d20e0 --- /dev/null +++ b/usb/read-led-jumper.js @@ -0,0 +1,42 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var readLedJumperCommandId = 8; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; + +function readLedJumper() { + var payload = new Buffer([readLedJumperCommandId]); + console.log('Sending ', util.bufferToString(payload)); + endpointOut.transfer(payload, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + setTimeout(readLedJumper, 500) + }) + }); +} + +readLedJumper(); From f1525679ef7c227e314e8ee052a11e9807867936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 20 Oct 2016 00:18:37 +0200 Subject: [PATCH 12/16] Add script for detecting the state of the ISO jumper. --- usb/read-iso-jumper.js | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 usb/read-iso-jumper.js diff --git a/usb/read-iso-jumper.js b/usb/read-iso-jumper.js new file mode 100755 index 00000000..543192f3 --- /dev/null +++ b/usb/read-iso-jumper.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +'use strict'; + +var usb = require('usb'); +var util = require('./util'); + +var vid = 0x16d3; +var pid = 0x05ea; +var readIsoJumperCommandId = 9; + +var device = usb.findByIds(vid, pid); +device.open(); + +var usbInterface = device.interface(0); +if (usbInterface.isKernelDriverActive()) { + usbInterface.detachKernelDriver(); +} +usbInterface.claim(); + +var endpointIn = usbInterface.endpoints[0]; +var endpointOut = usbInterface.endpoints[1]; + +function readLedJumper() { + var payload = new Buffer([readIsoJumperCommandId]); + console.log('Sending ', util.bufferToString(payload)); + endpointOut.transfer(payload, function(err) { + if (err) { + console.error("USB error: %s", err); + process.exit(1); + } + endpointIn.transfer(64, function(err2, receivedBuffer) { + if (err2) { + console.error("USB error: %s", err2); + process.exit(2); + } + console.log('Received', util.bufferToString(receivedBuffer)); + var isIso = receivedBuffer[1] === 0; + console.log('This means that the ISO jumper is ' + (isIso ? 'closed' : 'open') + ' so the detected layout is ' + (isIso ? 'ISO' : 'ANSI')); + console.log('Restart the UHK after switching the switch for the change to take effect!'); + }) + }); +} + +readLedJumper(); From ee404fe09eae80d8b6df74a31393ac52be865577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 20 Oct 2016 00:20:54 +0200 Subject: [PATCH 13/16] Display text about the state of the LED jumper. --- usb/read-led-jumper.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/usb/read-led-jumper.js b/usb/read-led-jumper.js index 184d20e0..694c563e 100755 --- a/usb/read-led-jumper.js +++ b/usb/read-led-jumper.js @@ -34,6 +34,8 @@ function readLedJumper() { process.exit(2); } console.log('Received', util.bufferToString(receivedBuffer)); + var isLedJumperOn = receivedBuffer[1] === 0; + console.log('This means that the LED jumper is ' + (isLedJumperOn ? 'on' : 'off')) setTimeout(readLedJumper, 500) }) }); From 729d7b22979fd28038e7cd47f858d228f7a02c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 20 Oct 2016 00:26:30 +0200 Subject: [PATCH 14/16] Output text of whether the keyboard halves are merged or split. --- usb/read-merge-sensor.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/usb/read-merge-sensor.js b/usb/read-merge-sensor.js index 7acd21a2..56ffe182 100755 --- a/usb/read-merge-sensor.js +++ b/usb/read-merge-sensor.js @@ -37,6 +37,8 @@ function readMergeSensor() { } console.log('Received', util.bufferToString(receivedBuffer)); setTimeout(readMergeSensor, 500) + var areHalvesMerged = receivedBuffer[1] === 1; + console.log('The keyboards halves are ' + (areHalvesMerged ? 'merged' : 'split')) }) }); } From f33f1d71ea22b7700099609fd7a287dc6a6b8af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 20 Oct 2016 00:28:00 +0200 Subject: [PATCH 15/16] Make texts less redundant. --- usb/read-iso-jumper.js | 2 +- usb/read-led-jumper.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/usb/read-iso-jumper.js b/usb/read-iso-jumper.js index 543192f3..91ae11ba 100755 --- a/usb/read-iso-jumper.js +++ b/usb/read-iso-jumper.js @@ -35,7 +35,7 @@ function readLedJumper() { } console.log('Received', util.bufferToString(receivedBuffer)); var isIso = receivedBuffer[1] === 0; - console.log('This means that the ISO jumper is ' + (isIso ? 'closed' : 'open') + ' so the detected layout is ' + (isIso ? 'ISO' : 'ANSI')); + console.log('ISO jumper is ' + (isIso ? 'closed' : 'open') + ' so the detected layout is ' + (isIso ? 'ISO' : 'ANSI')); console.log('Restart the UHK after switching the switch for the change to take effect!'); }) }); diff --git a/usb/read-led-jumper.js b/usb/read-led-jumper.js index 694c563e..fd442a7d 100755 --- a/usb/read-led-jumper.js +++ b/usb/read-led-jumper.js @@ -35,7 +35,7 @@ function readLedJumper() { } console.log('Received', util.bufferToString(receivedBuffer)); var isLedJumperOn = receivedBuffer[1] === 0; - console.log('This means that the LED jumper is ' + (isLedJumperOn ? 'on' : 'off')) + console.log('LED jumper is ' + (isLedJumperOn ? 'on' : 'off')) setTimeout(readLedJumper, 500) }) }); From c1290d36868e52f0aab2d58688a6a68f85cf398a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Fri, 21 Oct 2016 02:41:33 +0200 Subject: [PATCH 16/16] Don't disable the LEDs of the LED display. --- usb/pulse-leds.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usb/pulse-leds.js b/usb/pulse-leds.js index 352041f4..737fd1a2 100755 --- a/usb/pulse-leds.js +++ b/usb/pulse-leds.js @@ -52,7 +52,7 @@ var initLedCommands = [ ], [ // only enable the LEDs that are actually in the matrix writeLedDriverCommandId, - leftLedDriverAddress, + rightLedDriverAddress, 19, 0, 0b00000001, 0,