Skip to content

Instantly share code, notes, and snippets.

@zevisert
Last active April 15, 2018 07:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zevisert/f0bc9b3c979e013e004884dfd8b6e4e5 to your computer and use it in GitHub Desktop.
Save zevisert/f0bc9b3c979e013e004884dfd8b6e4e5 to your computer and use it in GitHub Desktop.
Demo code for sending UDP datagrams from a Logitech Attack 3 joystick to a Roomba iRobot Create
var GamePad = require( 'node-gamepad' );
var dgram = require( 'dgram' );
var controller = new GamePad('logitech/attack3');
controller.connect();
var socket = dgram.createSocket('udp4');
socket.on('listening', function(){
socket.setBroadcast(true);
});
socket.bind(9000);
function map_u(x, in_min, in_max, out_min, out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
function constrain_u(x, min, max) {
if (x < min) return min;
else if (x > max) return max;
return x;
}
function cmap_u(x, in_min, in_max, out_min, out_max) {
return constrain_u(map_u(x, in_min, in_max, out_min, out_max), out_min, out_max);
}
function fletcher16(buf) {
var sum1 = 0xff, sum2 = 0xff;
var i = 0;
var len = buf.length - 2;
while (len) {
var tlen = len > 20 ? 20 : len;
len -= tlen;
do {
sum2 += sum1 += buf[i++];
} while (--tlen);
sum1 = (sum1 & 0xff) + (sum1 >> 8);
sum2 = (sum2 & 0xff) + (sum2 >> 8);
}
/* Second reduction step to reduce sums to 8 bits */
sum1 = (sum1 & 0xff) + (sum1 >> 8);
sum2 = (sum2 & 0xff) + (sum2 >> 8);
return sum2 << 8 | sum1;
}
// Buffer for packet data
var buf = new Uint8Array(14);
// Initialize
buf[0] = 0xFE;
buf[1] = 0xED;
buf[2] = 0x02; buf[3] = 0x00;
buf[4] = 0x02; buf[5] = 0x00;
buf[6] = 0x02; buf[7] = 0x00;
buf[8] = 0x02; buf[9] = 0x00;
buf[10] = 0x00;
buf[11] = 0x00;
buf[12] = 0;
buf[13] = 0;
controller.on('stick:move', function(obj) {
var valx = 1023 - cmap_u(obj.x, 0, 255, 0, 1023);
var valy = cmap_u(obj.y, 0, 255, 0, 1023);
buf[2] = (valx & 0xFF00) >> 8;
buf[3] = (valx & 0x00FF);
buf[4] = (valy & 0xFF00) >> 8;
buf[5] = (valy & 0x00FF);
} );
controller.on( '1:press', function() {
buf[10] = 0xFF;
} );
controller.on( '1:release', function() {
buf[10] = 0x00;
} );
controller.on( '2:press', function() {
buf[11] = 0xFF;
} );
controller.on( '2:release', function() {
buf[11] = 0x00;
} );
setInterval(function () {
var checksum = fletcher16(buf);
buf[12] = (checksum & 0xFF00) >> 8;
buf[13] = checksum & 0x00FF;
buf[0] = 0xFE;
buf[1] = 0xED;
out = Array(14);
for (i = 0; i < buf.length; i ++) {
out[i] = Number(buf[i]).toString(16);
}
console.log(out);
socket.send(buf, 0, buf.length, 9000, "192.168.0.255");
}, 100)
{
"vendorID": 1133,
"productID": 49684,
"joysticks": [
{
"name": "stick",
"x": {
"pin": 0
},
"y": {
"pin": 1
}
}
],
"buttons": [
{
"value": 1,
"pin": 3,
"name": "1"
},
{
"value": 2,
"pin": 3,
"name": "2"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment