dualsense-ts 2.2.48 → 3.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +9 -2
  2. package/dist/comparators.d.ts +13 -0
  3. package/dist/comparators.d.ts.map +1 -0
  4. package/dist/comparators.js +27 -0
  5. package/dist/comparators.js.map +1 -0
  6. package/dist/dualsense.d.ts +10 -1
  7. package/dist/dualsense.d.ts.map +1 -1
  8. package/dist/dualsense.js +46 -45
  9. package/dist/dualsense.js.map +1 -1
  10. package/dist/elements/analog.d.ts +12 -7
  11. package/dist/elements/analog.d.ts.map +1 -1
  12. package/dist/elements/analog.js +29 -11
  13. package/dist/elements/analog.js.map +1 -1
  14. package/dist/elements/axis.d.ts +22 -1
  15. package/dist/elements/axis.d.ts.map +1 -1
  16. package/dist/elements/axis.js +24 -4
  17. package/dist/elements/axis.js.map +1 -1
  18. package/dist/elements/dpad.d.ts +1 -1
  19. package/dist/elements/dpad.d.ts.map +1 -1
  20. package/dist/elements/dpad.js +6 -5
  21. package/dist/elements/dpad.js.map +1 -1
  22. package/dist/elements/touch.d.ts +2 -1
  23. package/dist/elements/touch.d.ts.map +1 -1
  24. package/dist/elements/touch.js +1 -0
  25. package/dist/elements/touch.js.map +1 -1
  26. package/dist/elements/touchpad.d.ts +1 -1
  27. package/dist/elements/touchpad.d.ts.map +1 -1
  28. package/dist/elements/touchpad.js.map +1 -1
  29. package/dist/elements/trigger.d.ts.map +1 -1
  30. package/dist/elements/trigger.js +1 -1
  31. package/dist/elements/trigger.js.map +1 -1
  32. package/dist/elements/unisense.d.ts +3 -3
  33. package/dist/elements/unisense.d.ts.map +1 -1
  34. package/dist/elements/unisense.js +13 -5
  35. package/dist/elements/unisense.js.map +1 -1
  36. package/dist/hid/dualsense_hid.d.ts +16 -58
  37. package/dist/hid/dualsense_hid.d.ts.map +1 -1
  38. package/dist/hid/dualsense_hid.js +25 -101
  39. package/dist/hid/dualsense_hid.js.map +1 -1
  40. package/dist/hid/hid_provider.d.ts +86 -0
  41. package/dist/hid/hid_provider.d.ts.map +1 -0
  42. package/dist/hid/hid_provider.js +45 -0
  43. package/dist/hid/hid_provider.js.map +1 -0
  44. package/dist/hid/index.d.ts +4 -1
  45. package/dist/hid/index.d.ts.map +1 -1
  46. package/dist/hid/index.js +4 -1
  47. package/dist/hid/index.js.map +1 -1
  48. package/dist/hid/node_hid_provider.d.ts +11 -0
  49. package/dist/hid/node_hid_provider.d.ts.map +1 -0
  50. package/dist/hid/node_hid_provider.js +97 -0
  51. package/dist/hid/node_hid_provider.js.map +1 -0
  52. package/dist/hid/platform_hid_provider.d.ts +4 -0
  53. package/dist/hid/platform_hid_provider.d.ts.map +1 -0
  54. package/dist/hid/platform_hid_provider.js +7 -0
  55. package/dist/hid/platform_hid_provider.js.map +1 -0
  56. package/dist/hid/web_hid_provider.d.ts +10 -0
  57. package/dist/hid/web_hid_provider.d.ts.map +1 -0
  58. package/dist/hid/web_hid_provider.js +102 -0
  59. package/dist/hid/web_hid_provider.js.map +1 -0
  60. package/dist/{hid/ids.d.ts → id.d.ts} +6 -2
  61. package/dist/id.d.ts.map +1 -0
  62. package/dist/{hid/ids.js → id.js} +1 -1
  63. package/dist/id.js.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/input.d.ts +63 -45
  69. package/dist/input.d.ts.map +1 -1
  70. package/dist/input.js +123 -90
  71. package/dist/input.js.map +1 -1
  72. package/package.json +14 -8
  73. package/src/comparators.ts +26 -0
  74. package/src/dualsense.ts +61 -58
  75. package/src/elements/analog.spec.ts +2 -15
  76. package/src/elements/analog.ts +41 -22
  77. package/src/elements/axis.ts +35 -3
  78. package/src/elements/dpad.ts +7 -6
  79. package/src/elements/touch.ts +2 -1
  80. package/src/elements/touchpad.ts +1 -1
  81. package/src/elements/trigger.ts +1 -1
  82. package/src/elements/unisense.ts +19 -17
  83. package/src/hid/dualsense_hid.ts +25 -156
  84. package/src/hid/{dualsense_hid.spec.ts → hid_provider.spec.ts} +1 -1
  85. package/src/hid/hid_provider.ts +100 -0
  86. package/src/hid/index.ts +4 -1
  87. package/src/hid/node_hid_provider.ts +108 -0
  88. package/src/hid/platform_hid_provider.ts +4 -0
  89. package/src/hid/web_hid_provider.ts +116 -0
  90. package/src/{hid/ids.ts → id.ts} +6 -1
  91. package/src/index.ts +2 -0
  92. package/src/input.ts +156 -138
  93. package/src/readme.spec.ts +6 -8
  94. package/webpack.config.js +42 -0
  95. package/dist/hid/ids.d.ts.map +0 -1
  96. package/dist/hid/ids.js.map +0 -1
package/dist/input.js CHANGED
@@ -1,63 +1,131 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b, _c, _d;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Input = exports.InputIcon = exports.InputName = exports.InputSet = exports.InputChanged = void 0;
5
- const events_1 = require("events");
6
- const util_1 = require("util");
7
- const InputDefaults = {
8
- name: "???",
9
- icon: "???",
10
- threshold: 0,
11
- };
12
- // Private properties
13
- const InputAdopt = Symbol("InputAdopt");
14
- const InputChildless = Symbol("InputChildless");
15
- const InputParent = Symbol("InputParent");
16
- const InputSetComparison = Symbol("InputSetComparison");
17
- const InputChangedPrimitive = Symbol("InputChangedPrimitive");
18
- const InputChangedThreshold = Symbol("InputChangedThreshold");
19
- const InputChangedVirtual = Symbol("InputChangedVirtual");
20
- // Optional abstract properties
4
+ exports.Input = exports.InputIcon = exports.InputName = exports.InputSet = exports.InputChanged = exports.InputSetComparator = void 0;
5
+ const comparators_1 = require("./comparators");
6
+ /**
7
+ * Private utilities
8
+ */
9
+ exports.InputSetComparator = Symbol("InputSetComparator");
21
10
  exports.InputChanged = Symbol("InputChanged");
22
- // Utilities
23
11
  exports.InputSet = Symbol("InputSet");
24
12
  exports.InputName = Symbol("InputName");
25
13
  exports.InputIcon = Symbol("InputIcon");
14
+ /**
15
+ * Private properties
16
+ */
17
+ const InputOns = Symbol("InputOns");
18
+ const InputOnces = Symbol("InputOnces");
19
+ const InputAdopt = Symbol("InputAdopt");
20
+ const InputParents = Symbol("InputParents");
21
+ const InputComparator = Symbol("InputComparator");
26
22
  /**
27
23
  * Input manages the state of a single device input,
28
24
  * a virtual input, or a group of Input children.
29
25
  */
30
- class Input extends events_1.EventEmitter {
31
- constructor(params) {
32
- super();
26
+ class Input {
27
+ constructor(params = {}) {
28
+ this.id = "Unknown" /* InputId.Unknown */;
33
29
  /**
34
- * Timestamp of the last received input that changed the state.
30
+ * For numeric inputs, ignore state changes smaller than this threshold.
35
31
  */
36
- this.lastChange = Date.now();
32
+ this.threshold = 0;
37
33
  /**
38
- * Timestamp of the last received input, even if it didn't change the state.
34
+ * Stores event listeners.
39
35
  */
40
- this.lastInput = Date.now();
36
+ this[_a] = new Map();
41
37
  /**
42
- * For numeric inputs, ignore state changes smaller than this threshold.
38
+ * Stores callbacks waiting for one-time events.
43
39
  */
44
- this.threshold = 0;
45
- this[_a] = true;
46
- const { icon, name, parent, threshold } = {
47
- ...InputDefaults,
48
- ...(params || {}),
40
+ this[_b] = new Map();
41
+ /**
42
+ * Returns true if the provided state is worth an event
43
+ */
44
+ this[_c] = comparators_1.BasicComparator;
45
+ /**
46
+ * Other Inputs that contain this one.
47
+ */
48
+ this[_d] = new Set();
49
+ const { name, icon, threshold } = {
50
+ icon: "???",
51
+ name: "Nameless Input",
52
+ threshold: 0,
53
+ ...params,
49
54
  };
50
55
  this[exports.InputName] = name;
51
56
  this[exports.InputIcon] = icon;
52
- this[InputParent] = parent;
53
57
  this.threshold = threshold;
54
- this.id = Symbol(this[exports.InputName]);
55
- this[exports.InputChanged] = this[InputSetComparison]();
56
- setImmediate(() => {
57
- this[InputAdopt]();
58
- this[exports.InputChanged] = this[InputSetComparison]();
58
+ setTimeout(() => {
59
+ this[exports.InputSetComparator]();
60
+ Object.values(this).forEach((value) => {
61
+ if (value === this)
62
+ return;
63
+ if (value instanceof Input)
64
+ value[InputAdopt](this);
65
+ });
59
66
  });
60
67
  }
68
+ /**
69
+ * Register a callback to recieve state updates from this Input.
70
+ */
71
+ on(event, listener) {
72
+ const listeners = this[InputOns].get(event);
73
+ if (!listeners) {
74
+ this[InputOns].set(event, []);
75
+ return this.on(event, listener);
76
+ }
77
+ listeners.push(listener);
78
+ return this;
79
+ }
80
+ /**
81
+ * Register a callback to recieve the next specified update.
82
+ */
83
+ once(event, listener) {
84
+ const listeners = this[InputOnces].get(event);
85
+ if (!listeners) {
86
+ this[InputOnces].set(event, []);
87
+ return this.once(event, listener);
88
+ }
89
+ listeners.push(listener);
90
+ return this;
91
+ }
92
+ /**
93
+ * Notify listeners and parents of a state change.
94
+ */
95
+ emit(event, changed) {
96
+ const listeners = this[InputOns].get(event) || [];
97
+ listeners.forEach((callback) => {
98
+ callback(this, changed);
99
+ });
100
+ if (event !== "input") {
101
+ this.emitOnce(event, changed);
102
+ this[InputParents].forEach((input) => {
103
+ input.emit(event, changed);
104
+ });
105
+ }
106
+ }
107
+ /**
108
+ * Notify one-time listeners of a state change.
109
+ */
110
+ emitOnce(event, changed = this) {
111
+ const listeners = this[InputOnces].get(event) || [];
112
+ this[InputOnces].set(event, []);
113
+ listeners.forEach((callback) => {
114
+ callback(this, changed);
115
+ });
116
+ }
117
+ /**
118
+ * Register a callback to recieve state updates from this Input.
119
+ */
120
+ addEventListener(event, listener, { once } = { once: false }) {
121
+ if (once) {
122
+ if (event === "input") {
123
+ throw new Error("Can't listen once to `input` events");
124
+ }
125
+ return this.once(event, listener);
126
+ }
127
+ return this.on(event, listener);
128
+ }
61
129
  /**
62
130
  * Resolves on the next change to this input's state.
63
131
  */
@@ -77,18 +145,12 @@ class Input extends events_1.EventEmitter {
77
145
  });
78
146
  }
79
147
  /**
80
- * Render a convenient debugging string.
148
+ * Render a debugging string.
81
149
  */
82
150
  toString() {
83
151
  return `${this[exports.InputIcon]} [${this.active ? "X" : "_"}]`;
84
152
  }
85
- // TODO Support params for nested inputs
86
- [util_1.inspect.custom]() {
87
- return `${this[exports.InputName]} ${this[exports.InputIcon]}: ${JSON.stringify(this.state instanceof Input && this.state.id === this.id
88
- ? "virtual"
89
- : this.state)}`;
90
- }
91
- [Symbol.asyncIterator]() {
153
+ [(_a = InputOns, _b = InputOnces, _c = InputComparator, Symbol.asyncIterator)]() {
92
154
  return this;
93
155
  }
94
156
  [Symbol.toPrimitive](hint) {
@@ -102,65 +164,36 @@ class Input extends events_1.EventEmitter {
102
164
  return this.toString();
103
165
  }
104
166
  /**
105
- * Cascade events from nested Inputs.
106
- * And decide if this is the root Input.
167
+ * Links Inputs to bubble up events.
107
168
  */
108
- [(_a = InputChildless, InputAdopt)]() {
109
- Object.values(this).forEach((value) => {
110
- if (value === this)
111
- return;
112
- if (value instanceof Input) {
113
- this[InputChildless] = false;
114
- if (!value[InputChildless])
115
- return;
116
- value.on("change", (that, value) => {
117
- that;
118
- this.emit("change", this, value);
119
- });
120
- value.on("input", (that, value) => {
121
- that;
122
- this.emit("input", this, value);
123
- });
124
- }
125
- });
169
+ [(_d = InputParents, InputAdopt)](parent) {
170
+ this[InputParents].add(parent);
126
171
  }
127
- [InputChangedVirtual]() {
128
- return true;
129
- }
130
- [InputChangedPrimitive](state, newState) {
131
- return state !== newState;
132
- }
133
- [InputChangedThreshold](state, newState) {
134
- return Math.abs(state - newState) > this.threshold;
135
- }
136
- // Sets a default comparison type for the Input based on the generic type.
137
- [InputSetComparison]() {
172
+ /**
173
+ * Sets a default comparison type for the Input by discovering the generic type.
174
+ */
175
+ [exports.InputSetComparator]() {
138
176
  if (typeof this.state === "number") {
139
- return this[InputChangedThreshold];
177
+ this[InputComparator] = comparators_1.ThresholdComparator.bind(this, this.threshold);
140
178
  }
141
179
  else if (this.state instanceof Input) {
142
- return this[InputChangedVirtual];
180
+ this[InputComparator] = comparators_1.VirtualComparator;
143
181
  }
144
182
  else {
145
- return this[InputChangedPrimitive];
183
+ this[InputComparator] = comparators_1.BasicComparator;
146
184
  }
147
185
  }
148
186
  /**
149
187
  * Update the input's state and trigger all necessary callbacks.
150
188
  */
151
189
  [exports.InputSet](state) {
152
- this.lastInput = Date.now();
153
- if (this[exports.InputChanged](this.state, state)) {
190
+ if (this[InputComparator](this.state, state)) {
154
191
  this.state = state;
155
- this.lastChange = Date.now();
156
- this.emit("change", this, this);
157
- if (typeof state === "boolean") {
158
- state
159
- ? this.emit("press", this, this)
160
- : this.emit("release", this, this);
161
- }
192
+ this.emit("change", this);
193
+ if (typeof state === "boolean")
194
+ this.emit(state ? "press" : "release", this);
162
195
  }
163
- this.emit("input", this, this);
196
+ this.emit("input", this);
164
197
  }
165
198
  }
166
199
  exports.Input = Input;
package/dist/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":";;;;AAAA,mCAAsC;AACtC,+BAA+B;AAS/B,MAAM,aAAa,GAA0C;IAC3D,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,CAAC;CACb,CAAC;AAEF,qBAAqB;AACrB,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAC1C,MAAM,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACxD,MAAM,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAC9D,MAAM,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAC9D,MAAM,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAE1D,+BAA+B;AAClB,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnD,YAAY;AACC,QAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAC9B,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAChC,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAkB7C;;;GAGG;AACH,MAAsB,KACpB,SAAQ,qBAAY;IA6DpB,YAAY,MAAoB;QAC9B,KAAK,EAAE,CAAC;QAzDV;;WAEG;QACI,eAAU,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvC;;WAEG;QACI,cAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAEtC;;WAEG;QACI,cAAS,GAAW,CAAC,CAAC;QA2G7B,QAAgB,GAAY,IAAI,CAAC;QA7D/B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;YACxC,GAAG,aAAa;YAChB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;SAClB,CAAC;QACF,IAAI,CAAC,iBAAS,CAAC,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,iBAAS,CAAC,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAE3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAS,CAAC,CAAC,CAAC;QAElC,IAAI,CAAC,oBAAY,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAChD,YAAY,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,oBAAY,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAlDD;;OAEG;IACI,IAAI,CACT,OAAuC,QAAQ;QAE/C,OAAO,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACnB,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO,CACZ,OAAuC,QAAQ;QAE/C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,GAAG,IAAI,CAAC,iBAAS,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IA4BD,wCAAwC;IACxC,CAAC,cAAO,CAAC,MAAM,CAAC;QACd,OAAO,GAAG,IAAI,CAAC,iBAAS,CAAC,IAAI,IAAI,CAAC,iBAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAC7D,IAAI,CAAC,KAAK,YAAY,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YACtD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,KAAK,CACf,EAAE,CAAC;IACN,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAqC;QACxD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAmBD;;;OAGG;IACH,OANC,cAAc,EAMd,UAAU,EAAC;QACV,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO;YAC3B,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;oBAAE,OAAO;gBACnC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACjC,IAAI,CAAC;oBACL,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBAChC,IAAI,CAAC;oBACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,CAAC,mBAAmB,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,CAAC,qBAAqB,CAAC,CAAC,KAAW,EAAE,QAAc;QACjD,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC5B,CAAC;IAED,CAAC,qBAAqB,CAAC,CAAC,KAAa,EAAE,QAAgB;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACrD,CAAC;IAED,0EAA0E;IAC1E,CAAC,kBAAkB,CAAC;QAClB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;YAClC,OAAO,IAAI,CAAC,qBAAqB,CAGrB,CAAC;SACd;aAAM,IAAI,IAAI,CAAC,KAAK,YAAY,KAAK,EAAE;YACtC,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAClC;aAAM;YACL,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC;SACpC;IACH,CAAC;IAED;;OAEG;IACH,CAAC,gBAAQ,CAAC,CAAC,KAAW;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,oBAAY,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;gBAC9B,KAAK;oBACH,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;oBAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;aACtC;SACF;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAlMD,sBAkMC"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":";;;;AACA,+CAIuB;AAkBvB;;GAEG;AAEU,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAClD,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACtC,QAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAC9B,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAChC,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAE7C;;GAEG;AAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAsB,KAAK;IAuBzB,YAAY,SAAsB,EAAE;QAtBpB,OAAE,mCAA4B;QAE9C;;WAEG;QACI,cAAS,GAAW,CAAC,CAAC;QAO7B;;WAEG;QACK,QAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;QAEtE;;WAEG;QACK,QAAY,GAAG,IAAI,GAAG,EAA0C,CAAC;QAmIzE;;WAEG;QACH,QAAiB,GAA6C,6BAAe,CAAC;QA0B9E;;WAEG;QACK,QAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QAhKjD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG;YAChC,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,CAAC;YACZ,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,iBAAS,CAAC,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,iBAAS,CAAC,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,0BAAkB,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpC,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO;gBAC3B,IAAI,KAAK,YAAY,KAAK;oBAAE,KAAK,CAAC,UAAU,CAAC,CAAC,IAAsB,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAOD;;OAEG;IACI,EAAE,CAAC,KAAqB,EAAE,QAA6B;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACjC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,KAAsB,EAAE,QAA6B;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE;YACd,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACnC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,IAAI,CAAC,KAAqB,EAAE,OAA8B;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,KAAK,OAAO,EAAE;YACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAyB,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAED;;OAEG;IACK,QAAQ,CACd,KAAsB,EACtB,UAAiC,IAAI;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,QAAQ,CAAC,IAAI,EAAE,OAAyB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,gBAAgB,CACrB,KAAqB,EACrB,QAA6B,EAC7B,EAAE,IAAI,KAAwB,EAAE,IAAI,EAAE,KAAK,EAAE;QAE7C,IAAI,IAAI,EAAE;YACR,IAAI,KAAK,KAAK,OAAO,EAAE;gBACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;aACxD;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACnC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAAwB,QAAQ;QAC1C,OAAO,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACnB,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO,CACZ,OAAuC,QAAQ;QAE/C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,GAAG,IAAI,CAAC,iBAAS,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IAOD,OA7IS,QAAQ,OAKR,UAAU,OAsIlB,eAAe,EAEf,MAAM,CAAC,aAAa,EAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAqC;QACxD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAiBD;;OAEG;IACH,OALS,YAAY,EAKpB,UAAU,EAAC,CAAC,MAAsB;QACjC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,CAAC,0BAAkB,CAAC;QAClB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;YAClC,IAAI,CAAC,eAAe,CAAC,GAAG,iCAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACxE;aAAM,IAAI,IAAI,CAAC,KAAK,YAAY,KAAK,EAAE;YACtC,IAAI,CAAC,eAAe,CAAC,GAAG,+BAAiB,CAAC;SAC3C;aAAM;YACL,IAAI,CAAC,eAAe,CAAC,GAAG,6BAAe,CAAC;SACzC;IACH,CAAC;IAED;;OAEG;IACH,CAAC,gBAAQ,CAAC,CAAC,KAAW;QACpB,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,SAAS;gBAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;SAChD;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AA1ND,sBA0NC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dualsense-ts",
3
- "version": "2.2.48",
3
+ "version": "3.1.3",
4
4
  "description": "A natural interface for your DualSense controller, with Typescript",
5
5
  "keywords": [
6
6
  "dualsense",
@@ -29,22 +29,22 @@
29
29
  "license": "GPL-3.0",
30
30
  "private": false,
31
31
  "main": "dist/index.js",
32
+ "browser": "dist/main.js",
32
33
  "types": "dist/index.d.ts",
34
+ "sideEffects": false,
33
35
  "scripts": {
34
36
  "prebuild": "yarn barrels",
35
37
  "build": "tsc --project tsconfig.build.json",
36
38
  "build:watch": "tsc --project tsconfig.build.json --pretty --watch",
39
+ "start": "webpack serve --open",
37
40
  "lint": "eslint src",
38
- "lint:watch": "nodemon eslint src",
39
41
  "test": "jest src --verbose",
40
42
  "test:watch": "jest src --verbose --watch",
41
43
  "coverage": "jest src --coverage --verbose",
42
44
  "coverage:watch": "jest src --coverage --verbose --watch",
43
45
  "barrels": "barrelsby -d src -D -l replace -e 'spec.ts$'",
44
- "barrels:watch": "nodemon yarn barrels",
45
46
  "docs": "typedoc src/index.ts",
46
- "docs:watch": "nodemon yarn docs",
47
- "debug": "nodemon -e ts,json --exec \"node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./util/debug.ts\""
47
+ "debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./util/debug.ts"
48
48
  },
49
49
  "dependencies": {
50
50
  "node-hid": "^2.1.1"
@@ -53,21 +53,26 @@
53
53
  "@types/jest": "^27.5.0",
54
54
  "@types/node": "^18.0.0",
55
55
  "@types/node-hid": "^1.3.1",
56
+ "@types/w3c-web-hid": "^1.0.3",
56
57
  "@typescript-eslint/eslint-plugin": "^5.23.0",
57
58
  "@typescript-eslint/parser": "^5.23.0",
58
59
  "barrelsby": "^2.3.4",
59
60
  "eslint": "^8.15.0",
60
61
  "eslint-config-airbnb-base": "^15.0.0",
61
62
  "eslint-plugin-import": "^2.26.0",
63
+ "html-webpack-plugin": "^5.5.0",
62
64
  "jest": "^27.5.1",
63
- "nodemon": "^2.0.16",
64
65
  "prettier": "^2.3.2",
65
66
  "ts-jest": "^27.1.3",
67
+ "ts-loader": "^9.3.1",
66
68
  "ts-node": "^10.7.0",
67
69
  "typedoc": "^0.23.1",
68
70
  "typedoc-github-wiki-theme": "^1.0.1",
69
71
  "typedoc-plugin-markdown": "^3.12.1",
70
- "typescript": "^4.6.4"
72
+ "typescript": "^4.6.4",
73
+ "webpack": "^5.73.0",
74
+ "webpack-cli": "^4.10.0",
75
+ "webpack-dev-server": "^4.9.3"
71
76
  },
72
77
  "eslintConfig": {
73
78
  "parser": "@typescript-eslint/parser",
@@ -92,7 +97,8 @@
92
97
  "plugin:@typescript-eslint/recommended-requiring-type-checking"
93
98
  ],
94
99
  "rules": {
95
- "@typescript-eslint/no-inferrable-types": 0
100
+ "@typescript-eslint/no-inferrable-types": 0,
101
+ "@typescript-eslint/no-empty-function": 0
96
102
  }
97
103
  },
98
104
  "jest": {
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Input state change checker that always returns true.
3
+ */
4
+ export function VirtualComparator(): boolean {
5
+ return true;
6
+ }
7
+
8
+ /**
9
+ * Input state change checker that considers a numeric threshold.
10
+ */
11
+ export function ThresholdComparator(
12
+ threshold: number,
13
+ state: unknown,
14
+ newState: unknown
15
+ ): boolean {
16
+ if (typeof state !== "number" || typeof newState !== "number")
17
+ throw new Error("Bad threshold comparison");
18
+ return Math.abs(state - newState) > threshold;
19
+ }
20
+
21
+ /**
22
+ * Input state change checker for most values.
23
+ */
24
+ export function BasicComparator(state: unknown, newState: unknown): boolean {
25
+ return state !== newState;
26
+ }
package/src/dualsense.ts CHANGED
@@ -8,12 +8,19 @@ import {
8
8
  Touchpad,
9
9
  } from "./elements";
10
10
  import { Input, InputSet, InputParams } from "./input";
11
- import { DualsenseHID, InputId } from "./hid";
11
+ import {
12
+ DualsenseHIDState,
13
+ DualsenseHID,
14
+ PlatformHIDProvider,
15
+ InputId,
16
+ } from "./hid";
12
17
 
13
18
  export interface DualsenseParams extends InputParams {
19
+ /**
20
+ * Sets the source of HID events for the controller interface.
21
+ */
14
22
  hid?: DualsenseHID | null;
15
23
 
16
- // Input param overrides
17
24
  ps?: InputParams;
18
25
  mute?: InputParams;
19
26
  options?: InputParams;
@@ -28,6 +35,9 @@ export interface DualsenseParams extends InputParams {
28
35
  touchpad?: InputParams;
29
36
  }
30
37
 
38
+ /**
39
+ * Represents a Dualsense controller.
40
+ */
31
41
  export class Dualsense extends Input<Dualsense> {
32
42
  public readonly state: Dualsense = this;
33
43
 
@@ -49,12 +59,11 @@ export class Dualsense extends Input<Dualsense> {
49
59
 
50
60
  public readonly touchpad: Touchpad;
51
61
 
52
- public readonly hid: DualsenseHID | null = null;
62
+ public readonly hid: DualsenseHID;
53
63
 
54
64
  public get active(): boolean {
55
65
  return Object.values(this).some(
56
- (input: unknown) =>
57
- input instanceof Input && input !== this && input.active
66
+ (input) => input !== this && input instanceof Input && input.active
58
67
  );
59
68
  }
60
69
 
@@ -122,61 +131,55 @@ export class Dualsense extends Input<Dualsense> {
122
131
  ...(params.touchpad || {}),
123
132
  });
124
133
 
125
- const { hid } = params;
126
- if (hid !== null) this.hid = hid ? hid : new DualsenseHID();
134
+ this.hid = params.hid || new DualsenseHID(new PlatformHIDProvider());
135
+ this.hid.register((state: DualsenseHIDState) => {
136
+ this.processHID(state);
137
+ });
127
138
 
128
- if (this.hid) {
129
- this.hid.on("input", () => {
130
- this.processHID();
131
- });
132
- }
139
+ if (params.hid !== null) this.hid.provider.connect();
133
140
  }
134
141
 
135
- private processHID() {
136
- if (!this.hid) return;
137
- this.ps[InputSet](this.hid.state[InputId.Playstation]);
138
- this.options[InputSet](this.hid.state[InputId.Options]);
139
- this.create[InputSet](this.hid.state[InputId.Create]);
140
-
141
- this.mute[InputSet](this.hid.state[InputId.Mute]);
142
- this.mute.status[InputSet](this.hid.state[InputId.Status]);
143
-
144
- this.triangle[InputSet](this.hid.state[InputId.Triangle]);
145
- this.circle[InputSet](this.hid.state[InputId.Circle]);
146
- this.cross[InputSet](this.hid.state[InputId.Cross]);
147
- this.square[InputSet](this.hid.state[InputId.Square]);
148
-
149
- this.dpad.up[InputSet](this.hid.state[InputId.Up]);
150
- this.dpad.down[InputSet](this.hid.state[InputId.Down]);
151
- this.dpad.right[InputSet](this.hid.state[InputId.Right]);
152
- this.dpad.left[InputSet](this.hid.state[InputId.Left]);
153
-
154
- this.touchpad.button[InputSet](this.hid.state[InputId.TouchButton]);
155
- this.touchpad.left.x[InputSet](this.hid.state[InputId.TouchX0]);
156
- this.touchpad.left.y[InputSet](this.hid.state[InputId.TouchY0]);
157
- this.touchpad.left.contact[InputSet](this.hid.state[InputId.TouchContact0]);
158
- this.touchpad.left.tracker[InputSet](this.hid.state[InputId.TouchId0]);
159
- this.touchpad.right.x[InputSet](this.hid.state[InputId.TouchX1]);
160
- this.touchpad.right.y[InputSet](this.hid.state[InputId.TouchY1]);
161
- this.touchpad.right.contact[InputSet](
162
- this.hid.state[InputId.TouchContact1]
163
- );
164
- this.touchpad.right.tracker[InputSet](this.hid.state[InputId.TouchId1]);
165
-
166
- this.left.analog.x[InputSet](this.hid.state[InputId.LeftAnalogX]);
167
- this.left.analog.y[InputSet](this.hid.state[InputId.LeftAnalogY]);
168
- this.left.bumper[InputSet](this.hid.state[InputId.LeftBumper]);
169
- this.left.trigger[InputSet](this.hid.state[InputId.LeftTrigger]);
170
- this.left.trigger.button[InputSet](
171
- this.hid.state[InputId.LeftTriggerButton]
172
- );
173
-
174
- this.right.analog.x[InputSet](this.hid.state[InputId.RightAnalogX]);
175
- this.right.analog.y[InputSet](this.hid.state[InputId.RightAnalogY]);
176
- this.right.bumper[InputSet](this.hid.state[InputId.RightBumper]);
177
- this.right.trigger[InputSet](this.hid.state[InputId.RightTrigger]);
178
- this.right.trigger.button[InputSet](
179
- this.hid.state[InputId.RightTriggerButton]
180
- );
142
+ /**
143
+ * Distributes input values to various elements.
144
+ */
145
+ private processHID(state: DualsenseHIDState): void {
146
+ this.ps[InputSet](state[InputId.Playstation]);
147
+ this.options[InputSet](state[InputId.Options]);
148
+ this.create[InputSet](state[InputId.Create]);
149
+
150
+ this.mute[InputSet](state[InputId.Mute]);
151
+ this.mute.status[InputSet](state[InputId.Status]);
152
+
153
+ this.triangle[InputSet](state[InputId.Triangle]);
154
+ this.circle[InputSet](state[InputId.Circle]);
155
+ this.cross[InputSet](state[InputId.Cross]);
156
+ this.square[InputSet](state[InputId.Square]);
157
+
158
+ this.dpad.up[InputSet](state[InputId.Up]);
159
+ this.dpad.down[InputSet](state[InputId.Down]);
160
+ this.dpad.right[InputSet](state[InputId.Right]);
161
+ this.dpad.left[InputSet](state[InputId.Left]);
162
+
163
+ this.touchpad.button[InputSet](state[InputId.TouchButton]);
164
+ this.touchpad.left.x[InputSet](state[InputId.TouchX0]);
165
+ this.touchpad.left.y[InputSet](state[InputId.TouchY0]);
166
+ this.touchpad.left.contact[InputSet](state[InputId.TouchContact0]);
167
+ this.touchpad.left.tracker[InputSet](state[InputId.TouchId0]);
168
+ this.touchpad.right.x[InputSet](state[InputId.TouchX1]);
169
+ this.touchpad.right.y[InputSet](state[InputId.TouchY1]);
170
+ this.touchpad.right.contact[InputSet](state[InputId.TouchContact1]);
171
+ this.touchpad.right.tracker[InputSet](state[InputId.TouchId1]);
172
+
173
+ this.left.analog.x[InputSet](state[InputId.LeftAnalogX]);
174
+ this.left.analog.y[InputSet](state[InputId.LeftAnalogY]);
175
+ this.left.bumper[InputSet](state[InputId.LeftBumper]);
176
+ this.left.trigger[InputSet](state[InputId.LeftTrigger]);
177
+ this.left.trigger.button[InputSet](state[InputId.LeftTriggerButton]);
178
+
179
+ this.right.analog.x[InputSet](state[InputId.RightAnalogX]);
180
+ this.right.analog.y[InputSet](state[InputId.RightAnalogY]);
181
+ this.right.bumper[InputSet](state[InputId.RightBumper]);
182
+ this.right.trigger[InputSet](state[InputId.RightTrigger]);
183
+ this.right.trigger.button[InputSet](state[InputId.RightTriggerButton]);
181
184
  }
182
185
  }
@@ -25,8 +25,8 @@ describe("Analog", () => {
25
25
  expect(analog.active).toEqual(false);
26
26
  });
27
27
 
28
- it("should utilize `threshold`", () => {
29
- const analog = new Analog({ threshold: 0.5 });
28
+ it("should utilize `deadzone`", () => {
29
+ const analog = new Analog({ deadzone: 0.5 });
30
30
  expect(analog.active).toEqual(false);
31
31
  analog.x[InputSet](0.4);
32
32
  expect(analog.active).toEqual(false);
@@ -42,19 +42,6 @@ describe("Analog", () => {
42
42
  expect(analog.active).toEqual(false);
43
43
  });
44
44
 
45
- it("children inherit `threshold`", () => {
46
- const analog = new Analog({ threshold: 0.5 });
47
- expect(analog.x.active).toEqual(false);
48
- analog.x[InputSet](0.4);
49
- expect(analog.x.active).toEqual(false);
50
- analog.x[InputSet](0.5);
51
- expect(analog.x.active).toEqual(false);
52
- analog.x[InputSet](0.6);
53
- expect(analog.x.active).toEqual(true);
54
- analog.x[InputSet](0);
55
- expect(analog.x.active).toEqual(false);
56
- });
57
-
58
45
  it("should return good directions", () => {
59
46
  const analog = new Analog();
60
47
  expect(analog.radians).toBeCloseTo(0);