parent
e7a8fd6033
commit
9d6303cead
@ -0,0 +1,143 @@ |
||||
#!/usr/bin/env node
|
||||
|
||||
// LUFA Library
|
||||
// Copyright (C) Dean Camera, 2013.
|
||||
//
|
||||
// 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(); |
Loading…
Reference in new issue