Skip to content

Instantly share code, notes, and snippets.

@HipsterBrown
Created August 14, 2017 03:29
Show Gist options
  • Save HipsterBrown/d693e6129abc7252f7d9b30009ba44d8 to your computer and use it in GitHub Desktop.
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)
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))
{
"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