Skip to content
This repository was archived by the owner on Dec 20, 2018. It is now read-only.

Commit d4a5077

Browse files
committed
Merge pull request #36 from gordonturner/master
Adding support for multiple devices, serial number constructor and example code
2 parents bbb0f74 + 521ea67 commit d4a5077

File tree

3 files changed

+299
-11
lines changed

3 files changed

+299
-11
lines changed

Readme.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ xbox.on('not-found', function(){
4949
});
5050
```
5151

52+
Also see the `example.js` for usage.
53+
5254
## LEDs
5355

5456
Set LED pattern on controller:
@@ -97,14 +99,26 @@ xbox.within('righttrigger', [50,100], function(err, data){
9799
});
98100
```
99101

100-
## Third Party Controllers
102+
## Multiple Devices
103+
104+
On startup, if a device is in use, it will be skipped and the next available device will be used. The serial number and
105+
path will be printed to the console for debugging.
106+
107+
Use the printed serial number to specifically address devices if required, see Serial Numbers below.
101108

102-
If you have a third party controller with a different name you can specify the name when creating the controller:
109+
## Serial Numbers
110+
111+
Each device has own serial number. On startup, the serial number of the device detected will be printed to the console.
112+
113+
To use a specific serial number, specify it when creating the controller:
103114

104115
```javascript
105-
var xbox = new XboxController('flight stick');
116+
var xbox = new XboxController('9BB004D0');
106117
```
107118

119+
If you have a third party controller without 'controller' in the name, specify the device serial number to use that
120+
device.
121+
108122
## Configuring a Third Party Controller
109123

110124
To configure a third party controller:

example.js

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
2+
var XboxController = require('xbox-controller');
3+
var xbox = new XboxController();
4+
5+
console.log(xbox.serialNumber + ' online');
6+
7+
8+
/*
9+
* A,B,X,Y buttons
10+
*/
11+
12+
xbox.on('a:press', function (key) {
13+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'a', action:'press' });
14+
console.log(message);
15+
});
16+
17+
xbox.on('a:release', function(key) {
18+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'a', action:'release' });
19+
console.log(message);
20+
});
21+
22+
23+
xbox.on('b:press', function(key) {
24+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'b', action:'press' });
25+
console.log(message);
26+
});
27+
28+
xbox.on('b:release', function(key) {
29+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'b', action:'release' });
30+
console.log(message);
31+
});
32+
33+
34+
xbox.on('x:press', function(key) {
35+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'x', action:'press' });
36+
console.log(message);
37+
});
38+
39+
xbox.on('x:release', function(key) {
40+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'x', action:'release' });
41+
console.log(message);
42+
});
43+
44+
45+
xbox.on('y:press', function(key) {
46+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'y', action:'press' });
47+
console.log(message);
48+
});
49+
50+
xbox.on('y:release', function(key) {
51+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'y', action:'release' });
52+
console.log(message);
53+
});
54+
55+
56+
/*
57+
* Triggers
58+
*/
59+
60+
xbox.on('lefttrigger', function(position){
61+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'lefttrigger', action:position });
62+
console.log(message);
63+
64+
xbox.rumble(0,position);
65+
});
66+
67+
xbox.on('righttrigger', function(position){
68+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'righttrigger', action:position });
69+
console.log(message);
70+
71+
xbox.rumble(position,0);
72+
});
73+
74+
75+
76+
/*
77+
* Analog sticks
78+
*/
79+
80+
xbox.on('left:move', function(position){
81+
if(position.x != 0 || position.y != 0) {
82+
83+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'leftmove', action:position });
84+
console.log(message);
85+
}
86+
});
87+
88+
xbox.on('right:move', function(position){
89+
if(position.x != 0 || position.y != 0) {
90+
91+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'rightmove', action:position });
92+
console.log(message);
93+
}
94+
});
95+
96+
97+
xbox.on('leftstick:press', function (key) {
98+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'leftstick', action:'press' });
99+
console.log(message);
100+
});
101+
102+
xbox.on('leftstick:release', function (key) {
103+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'leftstick', action:'release' });
104+
console.log(message);
105+
});
106+
107+
108+
xbox.on('rightstick:press', function (key) {
109+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'rightstick', action:'press' });
110+
console.log(message);
111+
});
112+
113+
xbox.on('rightstick:release', function (key) {
114+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'rightstick', action:'release' });
115+
console.log(message);
116+
});
117+
118+
119+
/*
120+
* Top buttons
121+
*/
122+
123+
xbox.on('back:press', function (key) {
124+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'back', action:'press' });
125+
console.log(message);
126+
});
127+
128+
xbox.on('back:release', function (key) {
129+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'back', action:'release' });
130+
console.log(message);
131+
});
132+
133+
134+
xbox.on('xboxbutton:press', function (key) {
135+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'xboxbutton', action:'press' });
136+
console.log(message);
137+
});
138+
139+
xbox.on('xboxbutton:release', function (key) {
140+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'xboxbutton', action:'release' });
141+
console.log(message);
142+
});
143+
144+
145+
xbox.on('start:press', function (key) {
146+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'start', action:'press' });
147+
console.log(message);
148+
});
149+
150+
xbox.on('start:release', function (key) {
151+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'start', action:'release' });
152+
console.log(message);
153+
});
154+
155+
156+
/*
157+
* D pad
158+
*/
159+
160+
xbox.on('dup:press', function (key) {
161+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dup', action:'press' });
162+
console.log(message);
163+
});
164+
165+
xbox.on('dup:release', function(key) {
166+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dup', action:'release' });
167+
console.log(message);
168+
});
169+
170+
171+
xbox.on('ddown:press', function (key) {
172+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'ddown', action:'press' });
173+
console.log(message);
174+
});
175+
176+
xbox.on('ddown:release', function(key) {
177+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'ddown', action:'release' });
178+
console.log(message);
179+
});
180+
181+
182+
xbox.on('dleft:press', function (key) {
183+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dleft', action:'press' });
184+
console.log(message);
185+
});
186+
187+
xbox.on('dleft:release', function(key) {
188+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dleft', action:'release' });
189+
console.log(message);
190+
});
191+
192+
193+
xbox.on('dright:press', function (key) {
194+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dright', action:'press' });
195+
console.log(message);
196+
});
197+
198+
xbox.on('dright:release', function(key) {
199+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'dright', action:'release' });
200+
console.log(message);
201+
});
202+
203+
204+
/*
205+
* Shoulder
206+
*/
207+
208+
xbox.on('rightshoulder:press', function (key) {
209+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'rightshoulder', action:'press' });
210+
console.log(message);
211+
});
212+
213+
xbox.on('rightshoulder:release', function(key) {
214+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'rightshoulder', action:'release' });
215+
console.log(message);
216+
});
217+
218+
219+
xbox.on('leftshoulder:press', function (key) {
220+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'leftshoulder', action:'press' });
221+
console.log(message);
222+
});
223+
224+
xbox.on('leftshoulder:release', function(key) {
225+
var message = JSON.stringify({ serialNumber: xbox.serialNumber, button: 'leftshoulder', action:'release' });
226+
console.log(message);
227+
});
228+
229+
230+
231+
232+
233+
/*
234+
* Setup
235+
*/
236+
237+
xbox.on('connected', function() {
238+
console.log('Xbox controller connected');
239+
xbox.setLed(LED)
240+
});
241+
242+
xbox.on('not-found', function() {
243+
console.log('Xbox controller could not be found');
244+
});

lib/xbox.js

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ function uint8Toint16(low, high) {
2323
return int16View[0];
2424
}
2525

26-
function XboxController(name) {
27-
this.name = name || 'controller';
26+
function XboxController(serialNumber) {
27+
28+
if( serialNumber) {
29+
this.serialNumber = serialNumber.toUpperCase();
30+
}
31+
2832
this.position = 0;
2933

3034
for (var button in buttons) {
@@ -263,13 +267,39 @@ util.inherits(XboxController, events.EventEmitter);
263267
XboxController.prototype.loadController = function () {
264268

265269
HID.devices().forEach((function (d) {
266-
var product = (typeof d === 'object' && d.product) || '';
267-
if (product.toLowerCase().indexOf(this.name.toLowerCase()) !== -1) {
268-
this.hid = new HID.HID(d.path);
269-
console.log(chalk.green('notice: '), 'Xbox controller connected.');
270-
this.emit('connected');
271-
location = this.hid;
270+
271+
272+
try {
273+
if( this.serialNumber )
274+
{
275+
// If the serial number is set, look for device with that serial number.
276+
var deviceSerialNumber = (typeof d === 'object' && d.serialNumber) || '';
277+
278+
if (deviceSerialNumber.indexOf(this.serialNumber) !== -1) {
279+
console.log(chalk.green('notice: '), 'serial number found.');
280+
this.hid = new HID.HID(d.path);
281+
console.log(chalk.green('notice: '), 'Xbox controller connected (serial number: '
282+
+ d.serialNumber + ', path: ' + d.path + ')');
283+
this.emit('connected');
284+
location = this.hid;
285+
}
286+
} else {
287+
// The serial number is not set, grab the first device.
288+
var product = (typeof d === 'object' && d.product) || '';
289+
if (product.toLowerCase().indexOf('controller') !== -1) {
290+
this.hid = new HID.HID(d.path);
291+
console.log(chalk.green('notice: '), 'Xbox controller connected (serial number: '
292+
+ d.serialNumber + ', path: ' + d.path + ')');
293+
this.serialNumber = d.serialNumber;
294+
this.emit('connected');
295+
location = this.hid;
296+
}
272297
}
298+
} catch (ex) {
299+
console.log(chalk.green('notice: '), 'Xbox controller already in use (serial number: '
300+
+ d.serialNumber + ', path: ' + d.path + ')' );
301+
}
302+
273303
}).bind(this));
274304

275305
if (this.hid === false && !this._controllerLoadingInterval) {

0 commit comments

Comments
 (0)