Comparing version 1.1.0 to 1.1.1
{ | ||
"name": "gamepad-ts", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"description": "gamepad contoller in typescript", | ||
@@ -29,3 +29,6 @@ "main": "src/index.js", | ||
"@types/node-hid": "^1.3.1", | ||
"rimraf": "^3.0.2" | ||
"@types/throttle-debounce": "^2.1.0", | ||
"picocolors": "^1.0.0", | ||
"rimraf": "^3.0.2", | ||
"throttle-debounce": "^4.0.0" | ||
}, | ||
@@ -32,0 +35,0 @@ "files": [ |
@@ -0,1 +1,3 @@ | ||
/// <reference types="node" /> | ||
import { Device } from "node-hid"; | ||
export declare const xboxButton: readonly ["X", "A", "B", "Y", "start", "back", "LStickBt", "RStickBt", "LB", "RB", "LT", "RT"]; | ||
@@ -20,6 +22,8 @@ export declare const nintendoButton: readonly ["Y", "B", "A", "X", "+", "-", "LStickBt", "RStickBt", "L", "R", "ZL", "ZR"]; | ||
export interface JoyPadMapping { | ||
axes: { | ||
LStick: [number, number]; | ||
RStick: [number, number]; | ||
}; | ||
axes: Array<{ | ||
offset: number; | ||
rest?: number; | ||
name: string; | ||
pos?: number; | ||
}>; | ||
buttons: Array<{ | ||
@@ -36,2 +40,19 @@ offset: number; | ||
} | ||
export declare const dualShock: JoyPadMapping; | ||
export declare const DualShockBT: JoyPadMapping; | ||
/** | ||
* 'Sony Interactive Entertainment', | ||
* product: 'Wireless Controller', | ||
*/ | ||
export declare const dualShockUSB: JoyPadMapping; | ||
export declare const dualShockUSBLT: JoyPadMapping; | ||
export interface CommonEmissions { | ||
error: (data: Error) => void; | ||
scan: (sns: Array<Device>) => void; | ||
connected: () => void; | ||
LStick: (x: number, y: number) => void; | ||
RStick: (x: number, y: number) => void; | ||
dpad: (x: number, y: number) => void; | ||
LStickBt: (pressed: boolean) => void; | ||
RStickBt: (pressed: boolean) => void; | ||
raw: (buffer: Buffer) => void; | ||
} |
116
src/data.js
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.dualShock = exports.ALL_BUTTONS = exports.genericButton = exports.playStationButton = exports.nintendoButton = exports.xboxButton = void 0; | ||
exports.dualShockUSBLT = exports.dualShockUSB = exports.DualShockBT = exports.ALL_BUTTONS = exports.genericButton = exports.playStationButton = exports.nintendoButton = exports.xboxButton = void 0; | ||
exports.xboxButton = ['X', 'A', 'B', 'Y', 'start', 'back', 'LStickBt', 'RStickBt', 'LB', 'RB', 'LT', 'RT']; | ||
@@ -25,8 +25,10 @@ exports.nintendoButton = ['Y', 'B', 'A', 'X', '+', '-', 'LStickBt', 'RStickBt', 'L', 'R', 'ZL', 'ZR']; | ||
}; | ||
exports.dualShock = { | ||
exports.DualShockBT = { | ||
// 0-255 1 byte value | ||
axes: { | ||
LStick: [3, 4], | ||
RStick: [5, 6], // X, Y | ||
}, | ||
axes: [ | ||
{ offset: 3, rest: 0x80, name: 'LStick', pos: 0 }, | ||
{ offset: 4, rest: 0x80, name: 'LStick', pos: 1 }, | ||
{ offset: 5, rest: 0x80, name: 'RStick', pos: 0 }, | ||
{ offset: 6, rest: 0x80, name: 'RStick', pos: 1 }, | ||
], | ||
buttons: [ | ||
@@ -60,2 +62,104 @@ { offset: 7, mask: 0x10, names: exports.ALL_BUTTONS.BL }, | ||
}; | ||
// 64 Byle length | ||
/** | ||
* 'Sony Interactive Entertainment', | ||
* product: 'Wireless Controller', | ||
*/ | ||
exports.dualShockUSB = { | ||
// 0-255 1 byte value | ||
axes: [ | ||
{ offset: 1, name: 'LStick', pos: 0 }, | ||
{ offset: 2, name: 'LStick', pos: 1 }, | ||
{ offset: 3, name: 'RStick', pos: 0 }, | ||
{ offset: 4, name: 'RStick', pos: 1 }, | ||
{ offset: 8, name: 'L2', pos: 0 }, | ||
{ offset: 9, name: 'R2', pos: 0 }, | ||
], | ||
buttons: [ | ||
{ offset: 5, mask: 0x10, names: exports.ALL_BUTTONS.BL }, | ||
{ offset: 5, mask: 0x20, names: exports.ALL_BUTTONS.BD }, | ||
{ offset: 5, mask: 0x40, names: exports.ALL_BUTTONS.BR }, | ||
{ offset: 5, mask: 0x80, names: exports.ALL_BUTTONS.BT }, | ||
{ offset: 6, mask: 0x10, names: exports.ALL_BUTTONS.BML }, | ||
{ offset: 6, mask: 0x20, names: exports.ALL_BUTTONS.BMR }, | ||
{ offset: 6, mask: 0x01, names: exports.ALL_BUTTONS.L1 }, | ||
{ offset: 6, mask: 0x02, names: exports.ALL_BUTTONS.R1 }, | ||
{ offset: 6, mask: 0x40, names: exports.ALL_BUTTONS.LStickBt }, | ||
{ offset: 6, mask: 0x80, names: exports.ALL_BUTTONS.RStickBt }, | ||
{ offset: 6, mask: 0x04, names: exports.ALL_BUTTONS.L2 }, | ||
{ offset: 6, mask: 0x08, names: exports.ALL_BUTTONS.R2 }, | ||
], | ||
dpadOffset: 5, | ||
dpadBitShift: 0, | ||
dpad: { | ||
0b0000: [0x80, 0xFF], | ||
0b0001: [0xFF, 0xFF], | ||
0b0010: [0xFF, 0x80], | ||
0b0011: [0xFF, 0x00], | ||
0b0100: [0x80, 0x00], | ||
0b0101: [0x00, 0x00], | ||
0b0110: [0x00, 0x80], | ||
0b0111: [0x00, 0xFF], | ||
0b1000: [0x80, 0x80], // neutral | ||
} | ||
// offset: 7 => timmer +4 | ||
// offset: 19 => noise | ||
// offset: 20 => roll | ||
// offset: 21 => noise | ||
// offset: 22 => roll | ||
// offset: 23 => roll little part | ||
// offset: 24 => roll | ||
// offset: 24 => roll | ||
// offset: 25--29 RAS | ||
// offset: 30 0xF0 => flg micro | ||
// offset: 31--33 RAS | ||
// offset: 34 => time town | ||
// offset: 35 => touch ID | ||
// offset: 36 => X position | ||
// offset: 37 => Y position | ||
// offset: 38 => Y position | ||
// offset: 39 => 2nd finger | ||
// offset: 40 => 2nd finger | ||
// offset: 41 => 2nd finger | ||
// offset: 42 => 2nd finger | ||
// RAS ... END | ||
}; | ||
exports.dualShockUSBLT = { | ||
// 0-255 1 byte value | ||
axes: [ | ||
{ offset: 1, name: 'LStick', pos: 0 }, | ||
{ offset: 3, name: 'LStick', pos: 1 }, | ||
{ offset: 5, name: 'RStick', pos: 0 }, | ||
{ offset: 7, name: 'RStick', pos: 1 }, | ||
{ offset: 8, name: 'L1' }, | ||
{ offset: 9, name: 'L2' }, // ZL | ||
], | ||
buttons: [ | ||
{ offset: 10, mask: 0x04, names: exports.ALL_BUTTONS.BL }, | ||
{ offset: 10, mask: 0x01, names: exports.ALL_BUTTONS.BD }, | ||
{ offset: 10, mask: 0x02, names: exports.ALL_BUTTONS.BR }, | ||
{ offset: 10, mask: 0x08, names: exports.ALL_BUTTONS.BT }, | ||
{ offset: 10, mask: 0x40, names: exports.ALL_BUTTONS.BML }, | ||
{ offset: 10, mask: 0x80, names: exports.ALL_BUTTONS.BMR }, | ||
{ offset: 10, mask: 0x10, names: exports.ALL_BUTTONS.L1 }, | ||
{ offset: 10, mask: 0x20, names: exports.ALL_BUTTONS.R1 }, | ||
{ offset: 11, mask: 0x01, names: exports.ALL_BUTTONS.LStickBt }, | ||
{ offset: 11, mask: 0x02, names: exports.ALL_BUTTONS.RStickBt }, // ZR | ||
// { offset: 8, mask: 0x04, names: ALL_BUTTONS.L2 }, | ||
// { offset: 8, mask: 0x08, names: ALL_BUTTONS.R2 }, | ||
], | ||
dpadOffset: 11, | ||
dpadBitShift: 2, | ||
dpad: { | ||
0b0000: [0x80, 0x80], | ||
0b0001: [0x80, 0xFF], | ||
0b0010: [0xFF, 0xFF], | ||
0b0011: [0xFF, 0x80], | ||
0b0100: [0xFF, 0x00], | ||
0b0101: [0x80, 0x00], | ||
0b0110: [0x00, 0x00], | ||
0b0111: [0x00, 0x80], | ||
0b1000: [0x00, 0xFF], // left up | ||
} | ||
}; | ||
//# sourceMappingURL=data.js.map |
@@ -20,6 +20,5 @@ /// <reference types="node" /> | ||
private productId?; | ||
private LStick; | ||
private RStick; | ||
private dpadPos; | ||
private buttonStats; | ||
private axisStat; | ||
constructor(options?: { | ||
@@ -26,0 +25,0 @@ brand?: ContollerBrand; |
@@ -24,4 +24,2 @@ "use strict"; | ||
// hid?: HID.HID; | ||
this.LStick = [0x80, 0x80]; // X, Y | ||
this.RStick = [0x80, 0x80]; // X, Y | ||
this.dpadPos = [0x80, 0x80]; // X, Y | ||
@@ -35,4 +33,11 @@ options = options || {}; | ||
this.brand = options.brand || 'xbox'; | ||
this.mapping = options.mapping || data_1.dualShock; | ||
this.mapping = options.mapping || data_1.DualShockBT; | ||
this.buttonStats = new Array(this.mapping.buttons.length).fill(false); | ||
this.axisStat = {}; | ||
for (const axis of this.mapping.axes) { | ||
if (!this.axisStat[axis.name]) { | ||
this.axisStat[axis.name] = []; | ||
} | ||
this.axisStat[axis.name][axis.pos || 0] = axis.rest || 0x80; | ||
} | ||
} | ||
@@ -44,5 +49,6 @@ start() { | ||
let devices = node_hid_1.default.devices().filter(d => d.path); | ||
if (!this.serialNumber && !this.product && !this.path && !this.vendorId && !this.productId) | ||
devices = devices.filter(d => d.product && d.product.toLowerCase().includes('controller')); | ||
if (this.serialNumber) | ||
devices = devices.filter(d => d.serialNumber && d.serialNumber.includes(this.serialNumber)); | ||
// devices = devices.filter(d => d.product && d.product.toLowerCase().includes('controller')); | ||
if (this.product) | ||
@@ -84,2 +90,3 @@ devices = devices.filter(d => d.product && this.product.test(d.product)); | ||
digest(data) { | ||
this.emit('raw', data); | ||
const { buttons, axes, dpadOffset, dpadBitShift, dpad } = this.mapping; | ||
@@ -91,3 +98,3 @@ // buttons | ||
if (status != this.buttonStats[i]) { | ||
this.emit(bt.names[this.brand], status); | ||
this.emit(bt.names[this.brand], status ? 0xff : 0); | ||
this.buttonStats[i] = status; | ||
@@ -97,11 +104,21 @@ } | ||
// Annalogic Pad | ||
for (const name of Object.keys(axes)) { | ||
const stick = axes[name]; | ||
const current = [data[stick[0]], data[stick[1]]]; | ||
const previous = this[name]; | ||
if (previous[0] !== current[0] || previous[1] !== current[1]) { | ||
this[name] = current; | ||
this.emit(name, current); | ||
// const toEmit: {[key: string]: number[]} = {}; | ||
const newAxis = {}; | ||
for (const { name, pos, offset } of axes) { | ||
if (!newAxis[name]) { | ||
newAxis[name] = []; | ||
} | ||
newAxis[name][pos || 0] = data[offset]; | ||
} | ||
for (const name in newAxis) { | ||
const oldV = this.axisStat[name]; | ||
const newV = newAxis[name]; | ||
for (let i = 0; i < oldV.length; i++) { | ||
if (oldV[i] != newV[i]) { | ||
this.emit(name, ...newV); | ||
this.axisStat[name] = newV; | ||
break; | ||
} | ||
} | ||
} | ||
// Digital Pad | ||
@@ -112,3 +129,3 @@ const dpadState = data[dpadOffset] >> dpadBitShift; | ||
this.dpadPos = dpadNewPos; | ||
this.emit('dpad', dpadNewPos); | ||
this.emit('dpad', ...dpadNewPos); | ||
} | ||
@@ -115,0 +132,0 @@ } |
@@ -1,27 +0,14 @@ | ||
import { Device } from "node-hid"; | ||
import { JoyPadMapping } from "./data"; | ||
import { CommonEmissions, JoyPadMapping } from "./data"; | ||
import GamePadController from "./GamePadController"; | ||
interface IEmissions { | ||
error: (data: Error) => void; | ||
scan: (sns: Array<Device>) => void; | ||
LStick: (pos: [number, number]) => void; | ||
RStick: (pos: [number, number]) => void; | ||
dpad: (pos: [number, number]) => void; | ||
LStickBt: (pressed: boolean) => void; | ||
RStickBt: (pressed: boolean) => void; | ||
BL: (pressed: boolean) => void; | ||
BD: (pressed: boolean) => void; | ||
BR: (pressed: boolean) => void; | ||
BT: (pressed: boolean) => void; | ||
X: (pressed: boolean) => void; | ||
A: (pressed: boolean) => void; | ||
B: (pressed: boolean) => void; | ||
Y: (pressed: boolean) => void; | ||
L1: (pressed: boolean) => void; | ||
R1: (pressed: boolean) => void; | ||
L2: (pressed: boolean) => void; | ||
R2: (pressed: boolean) => void; | ||
BMR: (pressed: boolean) => void; | ||
BML: (pressed: boolean) => void; | ||
connected: () => void; | ||
interface IEmissions extends CommonEmissions { | ||
BL: (pressed: number) => void; | ||
BD: (pressed: number) => void; | ||
BR: (pressed: number) => void; | ||
BT: (pressed: number) => void; | ||
L1: (pressed: number) => void; | ||
R1: (pressed: number) => void; | ||
L2: (pressed: number) => void; | ||
R2: (pressed: number) => void; | ||
BMR: (pressed: number) => void; | ||
BML: (pressed: number) => void; | ||
} | ||
@@ -28,0 +15,0 @@ export default class GenericController extends GamePadController { |
@@ -5,2 +5,2 @@ export { default as GenericController } from './GenericController'; | ||
export { default as XBoxController } from './XBoxController'; | ||
export { ContollerBrand, ButtonsNames, ALL_BUTTONS, JoyPadMapping, dualShock } from './data'; | ||
export { ContollerBrand, ButtonsNames, ALL_BUTTONS, JoyPadMapping, dualShockUSB, dualShockUSBLT, DualShockBT } from './data'; |
@@ -6,3 +6,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.dualShock = exports.ALL_BUTTONS = exports.XBoxController = exports.PlayStationController = exports.NintendoController = exports.GenericController = void 0; | ||
exports.DualShockBT = exports.dualShockUSBLT = exports.dualShockUSB = exports.ALL_BUTTONS = exports.XBoxController = exports.PlayStationController = exports.NintendoController = exports.GenericController = void 0; | ||
var GenericController_1 = require("./GenericController"); | ||
@@ -18,3 +18,5 @@ Object.defineProperty(exports, "GenericController", { enumerable: true, get: function () { return __importDefault(GenericController_1).default; } }); | ||
Object.defineProperty(exports, "ALL_BUTTONS", { enumerable: true, get: function () { return data_1.ALL_BUTTONS; } }); | ||
Object.defineProperty(exports, "dualShock", { enumerable: true, get: function () { return data_1.dualShock; } }); | ||
Object.defineProperty(exports, "dualShockUSB", { enumerable: true, get: function () { return data_1.dualShockUSB; } }); | ||
Object.defineProperty(exports, "dualShockUSBLT", { enumerable: true, get: function () { return data_1.dualShockUSBLT; } }); | ||
Object.defineProperty(exports, "DualShockBT", { enumerable: true, get: function () { return data_1.DualShockBT; } }); | ||
//# sourceMappingURL=index.js.map |
@@ -1,23 +0,14 @@ | ||
import { Device } from "node-hid"; | ||
import { JoyPadMapping } from "./data"; | ||
import { CommonEmissions, JoyPadMapping } from "./data"; | ||
import GamePadController from "./GamePadController"; | ||
interface IEmissions { | ||
error: (data: Error) => void; | ||
scan: (sns: Array<Device>) => void; | ||
LStick: (pos: [number, number]) => void; | ||
RStick: (pos: [number, number]) => void; | ||
dpad: (pos: [number, number]) => void; | ||
LStickBt: (pressed: boolean) => void; | ||
RStickBt: (pressed: boolean) => void; | ||
X: (pressed: boolean) => void; | ||
A: (pressed: boolean) => void; | ||
B: (pressed: boolean) => void; | ||
Y: (pressed: boolean) => void; | ||
L: (pressed: boolean) => void; | ||
R: (pressed: boolean) => void; | ||
ZL: (pressed: boolean) => void; | ||
ZR: (pressed: boolean) => void; | ||
'+': (pressed: boolean) => void; | ||
'-': (pressed: boolean) => void; | ||
connected: () => void; | ||
interface IEmissions extends CommonEmissions { | ||
X: (pressed: number) => void; | ||
A: (pressed: number) => void; | ||
B: (pressed: number) => void; | ||
Y: (pressed: number) => void; | ||
L: (pressed: number) => void; | ||
R: (pressed: number) => void; | ||
ZL: (pressed: number) => void; | ||
ZR: (pressed: number) => void; | ||
'+': (pressed: number) => void; | ||
'-': (pressed: number) => void; | ||
} | ||
@@ -24,0 +15,0 @@ export default class NintendoController extends GamePadController { |
@@ -1,22 +0,14 @@ | ||
import { Device } from "node-hid"; | ||
import { CommonEmissions } from "./data"; | ||
import GamePadController, { GamePadOptions } from "./GamePadController"; | ||
interface IEmissions { | ||
error: (data: Error) => void; | ||
scan: (sns: Array<Device>) => void; | ||
LStick: (pos: [number, number]) => void; | ||
RStick: (pos: [number, number]) => void; | ||
dpad: (pos: [number, number]) => void; | ||
LStickBt: (pressed: boolean) => void; | ||
RStickBt: (pressed: boolean) => void; | ||
L1: (pressed: boolean) => void; | ||
R1: (pressed: boolean) => void; | ||
L2: (pressed: boolean) => void; | ||
R2: (pressed: boolean) => void; | ||
square: (pressed: boolean) => void; | ||
cross: (pressed: boolean) => void; | ||
circle: (pressed: boolean) => void; | ||
triangle: (pressed: boolean) => void; | ||
share: (pressed: boolean) => void; | ||
options: (pressed: boolean) => void; | ||
connected: () => void; | ||
interface IEmissions extends CommonEmissions { | ||
L1: (pressed: number) => void; | ||
R1: (pressed: number) => void; | ||
L2: (pressed: number) => void; | ||
R2: (pressed: number) => void; | ||
square: (pressed: number) => void; | ||
cross: (pressed: number) => void; | ||
circle: (pressed: number) => void; | ||
triangle: (pressed: number) => void; | ||
share: (pressed: number) => void; | ||
options: (pressed: number) => void; | ||
} | ||
@@ -23,0 +15,0 @@ export default class PlaystationController extends GamePadController { |
@@ -1,23 +0,14 @@ | ||
import { Device } from "node-hid"; | ||
import { JoyPadMapping } from "./data"; | ||
import { CommonEmissions, JoyPadMapping } from "./data"; | ||
import GamePadController from "./GamePadController"; | ||
interface IEmissions { | ||
error: (data: Error) => void; | ||
scan: (sns: Array<Device>) => void; | ||
LStick: (pos: [number, number]) => void; | ||
RStick: (pos: [number, number]) => void; | ||
dpad: (pos: [number, number]) => void; | ||
LStickBt: (pressed: boolean) => void; | ||
RStickBt: (pressed: boolean) => void; | ||
X: (pressed: boolean) => void; | ||
A: (pressed: boolean) => void; | ||
B: (pressed: boolean) => void; | ||
Y: (pressed: boolean) => void; | ||
start: (pressed: boolean) => void; | ||
back: (pressed: boolean) => void; | ||
LB: (pressed: boolean) => void; | ||
RB: (pressed: boolean) => void; | ||
LT: (pressed: boolean) => void; | ||
RT: (pressed: boolean) => void; | ||
connected: () => void; | ||
interface IEmissions extends CommonEmissions { | ||
X: (pressed: number) => void; | ||
A: (pressed: number) => void; | ||
B: (pressed: number) => void; | ||
Y: (pressed: number) => void; | ||
start: (pressed: number) => void; | ||
back: (pressed: number) => void; | ||
LB: (pressed: number) => void; | ||
RB: (pressed: number) => void; | ||
LT: (pressed: number) => void; | ||
RT: (pressed: number) => void; | ||
} | ||
@@ -24,0 +15,0 @@ export default class XBoxController extends GamePadController { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
56912
576
0
6