Stream events from DualShock 4 controllers
JavaScript
Latest commit 659fbd9 Apr 5, 2016 Stephan Seidt 1.0.0-rc1
Failed to load latest commit information.
bin Simplify ds4 dump script Apr 5, 2016
.gitignore Fix Bluetooth Apr 8, 2014
.jshintrc
README.md Update README Nov 26, 2015
index.js Added LED, rumble & flash control Jan 19, 2015
package.json

README.md

node-ds4

Stream events from DualShock 4 controllers. Works for Bluetooth & USB.

Supports:

  • Left & right analog stick
  • D-pad: up, down, left, right (also intermediate positions)
  • Buttons: x, circle, square, triangle, share, options, (DS4) trackpad button
  • Left & right analog triggers
  • (DS4) 2 touches on the trackpad (X, Y, active, ID) & trackpad button
  • Gryoscope (absolute orientation) & accelerometer (relative movement)
  • Activating motors
  • Changing LED color
  • Battery status

Compared to the DS3 the DS4 dropped most pressure sensitive buttons. Only L2 and R2 are still also analog. PEW PEW! I guess someone had to make room for the trackpad...

TODO:

  • Microphone/speaker magic

Install

$ npm install -g ds4

Usage

$ ds4-dump

Will dump decoded events to stdout.

var ds4 = require('ds4');
var through = require('through');

// controller is a node-hid HID object representing the controller
hid.pipe(through(ds4.parseDS4HIDData)).pipe(process.stdout);

Example output frame:

{ leftAnalogX: 128,
  leftAnalogY: 128,
  rightAnalogX: 127,
  rightAnalogY: 127,
  l2Analog: 0,
  r2Analog: 0,
  dPadUp: false,
  dPadRight: false,
  dPadDown: false,
  dPadLeft: false,
  cross: false,
  circle: false,
  square: false,
  triangle: false,
  l1: false,
  l2: false,
  r1: false,
  r2: false,
  l3: false,
  r3: false,
  share: false,
  options: false,
  trackPadButton: false,
  psButton: false,
  motionY: 0,
  motionX: 1,
  motionZ: -2,
  orientationRoll: -145,
  orientationYaw: 8155,
  orientationPitch: 2089,
  trackPadTouch0Id: 4,
  trackPadTouch0Active: false,
  trackPadTouch0X: 1513,
  trackPadTouch0Y: 40,
  trackPadTouch1Id: 0,
  trackPadTouch1Active: false,
  trackPadTouch1X: 0,
  trackPadTouch1Y: 0,
  timestamp: 36,
  batteryLevel: 0 }

Emitting data:

var ds4 = require('ds4');

ds4.emit(hid, {
  rumbleRight: 0, // 0 ... 255
  rumbleLeft:  0, // 0 ... 255
  r:           0, // 0 ... 255
  g:           0, // 0 ... 255
  b:           0, // 0 ... 255
  flashOn:     0, // 0 ... 255  (flash on duration)
  flashOff:    0  // 0 ... 255  (flash off duration)
});

Caveat

As long as this is pre 1.0 I'll rename property names.

¯\_(ツ)_/¯

Thanks & References

LICENSE

MIT