* add @angular/cli to the project * increase nodejs version -> 8.2.1 * add lerna * merge web and shared module * move electron module into packages as uhk-agent Electron agent functionality is not working * delete symlinker * convert private properties to public of component if used in html * revert uhk-message.component * fix component path * fix the correct name of the uhk-message.component.scss * building web and electron module * delete uhk-renderer package * handle device connect disconnect state * add privilege detection * fix set privilege functionality * turn back download keymap functionality * add bootstrap, select2 js and fix null pointer exception * turn back upload data to keyboard * fix send keymap * fix test-serializer * add missing package.json * merging * fix appveyor build * fix linting * turn back electron storage service * commit the missing electron-datastorage-repository * update node to 8.3.0 in .nvmrc and log node version in appveyor build * set exact version number in appveyor build * vertical align privilege and missing device components * set back node version to 8 in appveyor * move node-usb dependency from usb dir to root maybe it is fix the appveyor build * revert usb to root * fix electron builder script * fix electron builder script * turn off electron devtools * remove CTRL+U functionality * fix CTRL+o * fix lint error * turnoff store freeze * start process when got `Error: EPERM: operation not permitted` error * move files from root usb dir -> packages/usb
156 lines
3.8 KiB
JavaScript
Executable File
156 lines
3.8 KiB
JavaScript
Executable File
let usb = require('usb');
|
|
let receiveCallback;
|
|
|
|
function bufferToString(buffer) {
|
|
let str = '';
|
|
for (let i = 0; i < buffer.length; i++) {
|
|
let hex = buffer[i].toString(16) + ' ';
|
|
if (hex.length <= 2) {
|
|
hex = '0' + hex;
|
|
}
|
|
str += hex;
|
|
};
|
|
return str;
|
|
}
|
|
|
|
let usbEndpoints;
|
|
|
|
function getUhkDevice() {
|
|
return usb.findByIds(0x1d50, 0x6122);
|
|
}
|
|
|
|
function getBootloaderDevice() {
|
|
return usb.findByIds(0x1d50, 0x6120);
|
|
}
|
|
|
|
function getUsbEndpoints() {
|
|
let device = getUhkDevice();
|
|
device = getUhkDevice();
|
|
device.open();
|
|
|
|
let usbInterface = device.interface(0);
|
|
|
|
// https://github.com/tessel/node-usb/issues/147
|
|
// The function 'isKernelDriverActive' is not available on Windows and not even needed.
|
|
if (process.platform !== 'win32' && usbInterface.isKernelDriverActive()) {
|
|
usbInterface.detachKernelDriver();
|
|
}
|
|
usbInterface.claim();
|
|
|
|
let endpointIn = usbInterface.endpoints[0];
|
|
let endpointOut = usbInterface.endpoints[1];
|
|
return [endpointIn, endpointOut];
|
|
}
|
|
|
|
class DelayMs {
|
|
constructor(ms) {
|
|
this.ms = ms;
|
|
}
|
|
}
|
|
|
|
function registerReceiveCallback(receiveCallbackParam) {
|
|
receiveCallback = receiveCallbackParam;
|
|
}
|
|
|
|
function sendUsbPacketsByCallback(packetProvider, options={}) {
|
|
let packet = packetProvider()
|
|
|
|
if (packet instanceof DelayMs) {
|
|
setTimeout(() => {
|
|
sendUsbPacketsByCallback(packetProvider);
|
|
}, packet.ms);
|
|
return;
|
|
}
|
|
|
|
if (!(packet instanceof Buffer)) {
|
|
return;
|
|
}
|
|
|
|
if (!moduleExports.silent) {
|
|
console.log('Sending: ', bufferToString(packet));
|
|
}
|
|
|
|
let [endpointIn, endpointOut] = usbEndpoints || getUsbEndpoints();
|
|
endpointOut.transfer(packet, function(err) {
|
|
if (err) {
|
|
console.error("USB error: %s", err);
|
|
process.exit(1);
|
|
}
|
|
|
|
if (options.noReceive) {
|
|
sendUsbPacketsByCallback(packetProvider);
|
|
} else {
|
|
endpointIn.transfer(64, function(err2, receivedBuffer) {
|
|
if (err2) {
|
|
console.error("USB error: %s", err2);
|
|
process.exit(2);
|
|
}
|
|
if (!moduleExports.silent) {
|
|
console.log('Received:', bufferToString(receivedBuffer));
|
|
}
|
|
(receiveCallback || (()=>{}))(receivedBuffer);
|
|
sendUsbPacketsByCallback(packetProvider);
|
|
})
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
function sendUsbPacket(packet, options={}) {
|
|
sendUsbPackets([packet], options);
|
|
}
|
|
|
|
function sendUsbPackets(packets, options={}) {
|
|
sendUsbPacketsByCallback(() => {
|
|
return packets.shift();
|
|
}, options)
|
|
}
|
|
|
|
exports = module.exports = moduleExports = {
|
|
DelayMs,
|
|
bufferToString,
|
|
getUhkDevice,
|
|
getBootloaderDevice,
|
|
getUsbEndpoints,
|
|
registerReceiveCallback,
|
|
sendUsbPacket,
|
|
sendUsbPackets,
|
|
sendUsbPacketsByCallback,
|
|
usbCommands: {
|
|
getProperty: 0,
|
|
jumpToBootloader: 1,
|
|
setTestLed: 2,
|
|
writeLedDriver: 3,
|
|
readLedDriver: 4,
|
|
writeEeprom: 5,
|
|
readEeprom: 6,
|
|
readMergeSensor: 7,
|
|
writeUserConfig: 8,
|
|
applyConfig: 9,
|
|
setLedPwm: 10,
|
|
readAdc: 11,
|
|
launchEepromTransfer: 12,
|
|
readHardwareConfig: 13,
|
|
writeHardwareConfig: 14,
|
|
readUserConfig: 15,
|
|
getKeyboardState: 16,
|
|
readDebugInfo: 17,
|
|
},
|
|
systemPropertyIds: {
|
|
usbProtocolVersion: 0,
|
|
bridgeProtocolVersion: 1,
|
|
dataModelVersion: 2,
|
|
firmwareVersion: 3,
|
|
hardwareConfigSize: 4,
|
|
userConfigSize: 5,
|
|
},
|
|
eepromTransfer: {
|
|
readHardwareConfig: 0,
|
|
writeHardwareConfig: 1,
|
|
readUserConfig: 2,
|
|
writeUserConfig: 3,
|
|
},
|
|
leftLedDriverAddress: 0b1110100,
|
|
rightLedDriverAddress: 0b1110111
|
|
}
|