1
0
tmk_keyboard/tmk_core/protocol/lufa/LUFA-git/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.js

144 lines
4.4 KiB
JavaScript
Executable File

#!/usr/bin/env node
// LUFA Library
// Copyright (C) Dean Camera, 2014.
//
// dean [at] fourwalledcubicle [dot] com
// www.lufa-lib.org
// LUFA Generic HID device demo host test script. This script will send a
// continuous stream of generic reports to the device, to show a variable LED
// pattern on the target board. Send and received report data is printed to
// the terminal.
//
// You have to install the usb and async modules prior to executing this script:
// apt-get install libusb-1.0-0-dev
// npm install usb async sprintf
var usb = require('usb');
var async = require('async');
var sprintf = require('sprintf');
var deviceVid = 0x03EB;
var devicePid = 0x204F;
var reportLength = 8;
function getAndInitHidDeviceAndInterface()
{
device = usb.findByIds(deviceVid, devicePid);
if (!device) {
console.log('No device found');
process.exit(1);
}
device.open();
var hidInterface = device.interface(0);
if (hidInterface.isKernelDriverActive()) {
hidInterface.detachKernelDriver();
}
hidInterface.claim();
async.series([
function(callback) {
setConfiguration(0, function(error, data) {
callback();
});
}
]);
return {hidDevice:device, hidInterface:hidInterface};
}
function read(hidInterface, callback)
{
endpoint = hidInterface.endpoints[0];
endpoint.transfer(reportLength, function(error, data) {
if (error) {
console.log(error)
} else {
console.log("Received LED Pattern:", data.slice(0, 4));
}
callback();
});
}
function write(hidDevice, message, callback)
{
hidDevice.controlTransfer( // Send a Set Report control request
parseInt('00100001', 2), // bmRequestType (constant for this control request)
0x09, // bmRequest (constant for this control request)
0x0809, // wValue (MSB is report type, LSB is report number)
0, // wIndex (interface number)
message, // message to be sent
function(error, data) { // callback to be executed upon finishing the transfer
console.log("Sent LED Pattern:", message.slice(1, 5))
callback();
}
);
}
function setConfiguration(configurationNumber, callback)
{
device.controlTransfer( // Send a Set Configuration control request
parseInt('00000000', 2), // bmRequestType
0x09, // bmRequest
0, // wValue (Configuration value)
0, // wIndex
new Buffer(0), // message to be sent
callback // callback to be executed upon finishing the transfer
);
}
// @TODO: Fix this function because apparently it doesn't work for some reason.
function getStringDescriptor(stringId, languageId, callback)
{
var STRING_DESCRIPTOR_TYPE = 0x03;
var wValue = (STRING_DESCRIPTOR_TYPE << 8) | stringId;
device.controlTransfer( // Send a Get Descriptor control request
parseInt('10000000', 2), // bmRequestType
0x06, // bmRequest
wValue, // wValue
languageId, // wIndex
64, // response length
callback // callback to be executed upon finishing the transfer
);
}
function setNextPattern()
{
var pattern = [
hidInterface.interface,
(p >> 3) & 1,
(p >> 2) & 1,
(p >> 1) & 1,
(p >> 0) & 1
];
async.series([
function(callback) {
write(hidDevice, new Buffer(pattern), callback);
},
function(callback) {
read(hidInterface, callback);
},
function(callback) {
p = (p + 1) % 16
setTimeout(setNextPattern, 200);
callback();
}]);
}
var hidDeviceAndInterface = getAndInitHidDeviceAndInterface();
var hidDevice = hidDeviceAndInterface.hidDevice
var hidInterface = hidDeviceAndInterface.hidInterface;
console.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]",
hidDevice.deviceDescriptor.idVendor,
hidDevice.deviceDescriptor.idProduct,
hidDevice.deviceDescriptor.iProduct,
hidDevice.deviceDescriptor.iManufacturer));
p = 0
setNextPattern();