Created
August 14, 2017 03:29
-
-
Save HipsterBrown/d693e6129abc7252f7d9b30009ba44d8 to your computer and use it in GitHub Desktop.
Using node-hid and robotjs to map the Nimbus Bluetooth controller buttons / joystick to keyboard buttons (Node 8)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const HID = require('node-hid') | |
const robot = require('robotjs') | |
const throttle = require('lodash.throttle') | |
const devices = HID.devices() | |
const emptyBuffer = Buffer.allocUnsafe(17).fill(0) | |
const toggleMap = new Map([['LU', false], ['LR', false], ['LD', false], ['LL', false], ['RU', false], ['RR', false], ['RD', false], ['RL', false]]) | |
const nimbusData = devices.filter(({ product }) => product === 'Nimbus')[0] | |
const nimbus = new HID.HID(nimbusData.path) | |
function checkToggle(key, threshold) { | |
const active = toggleMap.get(key) | |
if (active && threshold) { | |
toggleMap.set(key, false) | |
return 'up' | |
} | |
toggleMap.set(key, true) | |
return 'down' | |
} | |
function pickLeftOrRight(key, value) { | |
if (value < 128) { | |
console.log('You hit Analog RIGHT') | |
console.log(value) | |
if (key === 13) { | |
const toggle = checkToggle('LR', value < 75) | |
return robot.keyToggle('z', toggle) | |
} | |
const toggle = checkToggle('RR', value < 75) | |
return robot.keyToggle('n', toggle) | |
} | |
console.log('You hit Analog LEFT') | |
console.log(value) | |
if (key === 13) { | |
const toggle = checkToggle('LL', value > 175) | |
return robot.keyToggle('c', toggle) | |
} | |
const toggle = checkToggle('RL', value > 175) | |
return robot.keyToggle('k', toggle) | |
} | |
function pickUpOrDown(key, value) { | |
if (value < 128) { | |
console.log('You hit Analog UP') | |
console.log(value) | |
if (key === 14) { | |
const toggle = checkToggle('LU', value < 75) | |
return robot.keyToggle('f', toggle) | |
} | |
const toggle = checkToggle('RU', value < 75) | |
return robot.keyToggle('m', toggle) | |
} | |
console.log('You hit Analog DOWN') | |
console.log(value) | |
if (key === 14) { | |
const toggle = checkToggle('LD', value > 175) | |
return robot.keyToggle('v', toggle) | |
} | |
const toggle = checkToggle('RD', value > 175) | |
return robot.keyToggle('l', toggle) | |
} | |
nimbus.readData = function (buffer) { | |
if (buffer.equals(emptyBuffer)) { | |
return | |
} | |
const bufMap = new Map(buffer.entries()) | |
bufMap.forEach((value, key) => { | |
if (value) { | |
switch (key) { | |
case 0: | |
console.log('You pressed UP') | |
robot.keyTap('up') | |
break; | |
case 1: | |
console.log('You pressed RIGHT') | |
robot.keyTap('right') | |
break; | |
case 2: | |
console.log('You pressed DOWN') | |
robot.keyTap('down') | |
break; | |
case 3: | |
console.log('You pressed LEFT') | |
robot.keyTap('left') | |
break; | |
case 4: | |
console.log('You pressed A') | |
robot.keyTap('a') | |
break; | |
case 5: | |
console.log('You pressed B') | |
robot.keyTap('b') | |
break; | |
case 6: | |
console.log('You pressed X') | |
robot.keyTap('x') | |
break; | |
case 7: | |
console.log('You pressed Y') | |
robot.keyTap('y') | |
break; | |
case 8: | |
console.log('You pressed L1') | |
robot.keyTap('q') | |
break; | |
case 9: | |
console.log('You pressed R1') | |
robot.keyTap('e') | |
break; | |
case 10: | |
console.log('You pressed L2') | |
robot.keyTap('w') | |
break; | |
case 11: | |
console.log('You pressed R2') | |
robot.keyTap('r') | |
break; | |
case 12: | |
console.log('You pressed START') | |
robot.keyTap('space') | |
break; | |
case 13: | |
pickLeftOrRight(key, value) | |
break; | |
case 14: | |
pickUpOrDown(key, value) | |
break; | |
case 15: | |
pickLeftOrRight(key, value) | |
break; | |
case 16: | |
pickUpOrDown(key, value) | |
break; | |
default: | |
console.log('Not sure what you pressed: ', key) | |
} | |
} | |
}) | |
} | |
nimbus.on('data', throttle(nimbus.readData, 200)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "nimbus-controller", | |
"version": "1.0.0", | |
"description": "", | |
"main": "nimbus-controller.js", | |
"scripts": { | |
"start": "node nimbus-controller.js" | |
}, | |
"keywords": [], | |
"author": "Hipsterbrown", | |
"license": "MIT", | |
"dependencies": { | |
"lodash.throttle": "^4.1.1", | |
"node-hid": "^0.5.4", | |
"robotjs": "^0.4.7" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment