64 lines
2.2 KiB
JavaScript
Executable File
64 lines
2.2 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
const HID = require('node-hid');
|
|
let uhk = require('./uhk');
|
|
var program = require('commander');
|
|
|
|
program
|
|
.option('-dt, --polling-timeout <n>', 'Polling timeout (ms)')
|
|
.option('-bt, --bootloader-timeout <n>', 'Bootloader timeout (ms)')
|
|
.option('-f, --force', 'Force reenumeration')
|
|
.parse(process.argv);
|
|
|
|
let pollingTimeoutMs = 10000;
|
|
const pollingIntervalMs = 100;
|
|
const bootloaderTimeoutMs = 5000;
|
|
let jumped = false;
|
|
|
|
const enumerationMode = program.args[0];
|
|
const enumerationModeId = uhk.enumerationModes[enumerationMode];
|
|
|
|
if (enumerationModeId === undefined) {
|
|
const enumerationModes = Object.keys(uhk.enumerationModes).join(', ');
|
|
console.log(`Invalid enumeration mode '${enumerationMode}' is not one of: ${enumerationModes}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
function reenumerate(enumerationModeId, bootloaderTimeoutMs) {
|
|
return new Promise((resolve, reject) => {
|
|
console.log(`Trying to reenumerate as ${enumerationMode}...`);
|
|
const intervalId = setInterval(() => {
|
|
pollingTimeoutMs -= pollingIntervalMs;
|
|
|
|
const foundDevice = HID.devices().find(device =>
|
|
device.vendorId === uhk.vendorId && device.productId === uhk.enumerationModeIdToProductId[enumerationModeId]);
|
|
|
|
if (foundDevice) {
|
|
console.log(`${enumerationMode} is up`);
|
|
resolve();
|
|
clearInterval(intervalId);
|
|
return;
|
|
}
|
|
|
|
if (pollingTimeoutMs <= 0) {
|
|
console.log(`Couldn't reenumerate as ${enumerationMode}`);
|
|
reject();
|
|
clearInterval(intervalId);
|
|
return;
|
|
}
|
|
|
|
let device = uhk.getUhkDevice();
|
|
if (device && !jumped) {
|
|
console.log(`UHK found, reenumerating as ${enumerationMode}`);
|
|
let message = new Buffer([uhk.usbCommands.reenumerate, enumerationModeId, ...uhk.uint32ToArray(bootloaderTimeoutMs)]);
|
|
device.write(uhk.getTransferData(message));
|
|
jumped = true;
|
|
}
|
|
|
|
}, pollingIntervalMs);
|
|
})
|
|
};
|
|
|
|
(async function() {
|
|
await reenumerate(enumerationModeId, bootloaderTimeoutMs);
|
|
})();
|