dualsense-ts 5.5.0 → 6.1.0

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 (110) hide show
  1. package/MIGRATION_GUIDE.md +19 -0
  2. package/README.md +168 -22
  3. package/dist/dualsense.d.ts +15 -1
  4. package/dist/dualsense.d.ts.map +1 -1
  5. package/dist/dualsense.js +94 -10
  6. package/dist/dualsense.js.map +1 -1
  7. package/dist/elements/battery.d.ts +28 -0
  8. package/dist/elements/battery.d.ts.map +1 -0
  9. package/dist/elements/battery.js +49 -0
  10. package/dist/elements/battery.js.map +1 -0
  11. package/dist/elements/index.d.ts +4 -0
  12. package/dist/elements/index.d.ts.map +1 -1
  13. package/dist/elements/index.js +4 -0
  14. package/dist/elements/index.js.map +1 -1
  15. package/dist/elements/lightbar.d.ts +26 -0
  16. package/dist/elements/lightbar.d.ts.map +1 -0
  17. package/dist/elements/lightbar.js +44 -0
  18. package/dist/elements/lightbar.js.map +1 -0
  19. package/dist/elements/mute.d.ts +1 -1
  20. package/dist/elements/mute.d.ts.map +1 -1
  21. package/dist/elements/mute.js +2 -2
  22. package/dist/elements/mute.js.map +1 -1
  23. package/dist/elements/player_leds.d.ts +23 -0
  24. package/dist/elements/player_leds.d.ts.map +1 -0
  25. package/dist/elements/player_leds.js +52 -0
  26. package/dist/elements/player_leds.js.map +1 -0
  27. package/dist/elements/trigger.d.ts +3 -0
  28. package/dist/elements/trigger.d.ts.map +1 -1
  29. package/dist/elements/trigger.js +3 -0
  30. package/dist/elements/trigger.js.map +1 -1
  31. package/dist/elements/trigger_feedback.d.ts +109 -0
  32. package/dist/elements/trigger_feedback.d.ts.map +1 -0
  33. package/dist/elements/trigger_feedback.js +168 -0
  34. package/dist/elements/trigger_feedback.js.map +1 -0
  35. package/dist/hid/battery_state.d.ts +10 -0
  36. package/dist/hid/battery_state.d.ts.map +1 -0
  37. package/dist/hid/battery_state.js +14 -0
  38. package/dist/hid/battery_state.js.map +1 -0
  39. package/dist/hid/bt_checksum.d.ts +2 -0
  40. package/dist/hid/bt_checksum.d.ts.map +1 -0
  41. package/dist/hid/bt_checksum.js +60 -0
  42. package/dist/hid/bt_checksum.js.map +1 -0
  43. package/dist/hid/command.d.ts +11 -21
  44. package/dist/hid/command.d.ts.map +1 -1
  45. package/dist/hid/command.js +21 -0
  46. package/dist/hid/command.js.map +1 -1
  47. package/dist/hid/dualsense_hid.d.ts +12 -9
  48. package/dist/hid/dualsense_hid.d.ts.map +1 -1
  49. package/dist/hid/dualsense_hid.js +68 -26
  50. package/dist/hid/dualsense_hid.js.map +1 -1
  51. package/dist/hid/hid_provider.d.ts +10 -0
  52. package/dist/hid/hid_provider.d.ts.map +1 -1
  53. package/dist/hid/hid_provider.js +18 -3
  54. package/dist/hid/hid_provider.js.map +1 -1
  55. package/dist/hid/index.d.ts +2 -0
  56. package/dist/hid/index.d.ts.map +1 -1
  57. package/dist/hid/index.js +2 -0
  58. package/dist/hid/index.js.map +1 -1
  59. package/dist/hid/node_hid_provider.d.ts +1 -0
  60. package/dist/hid/node_hid_provider.d.ts.map +1 -1
  61. package/dist/hid/web_hid_provider.d.ts.map +1 -1
  62. package/dist/hid/web_hid_provider.js +3 -1
  63. package/dist/hid/web_hid_provider.js.map +1 -1
  64. package/dist/id.d.ts +3 -0
  65. package/dist/id.d.ts.map +1 -1
  66. package/nodehid_example/debug.ts +183 -41
  67. package/package.json +5 -5
  68. package/src/dualsense.ts +118 -13
  69. package/src/elements/battery.ts +54 -0
  70. package/src/elements/index.ts +4 -0
  71. package/src/elements/lightbar.ts +52 -0
  72. package/src/elements/mute.ts +2 -2
  73. package/src/elements/player_leds.ts +52 -0
  74. package/src/elements/trigger.ts +4 -0
  75. package/src/elements/trigger_feedback.ts +267 -0
  76. package/src/hid/battery_state.ts +9 -0
  77. package/src/hid/bt_checksum.spec.ts +15 -0
  78. package/src/hid/bt_checksum.ts +58 -0
  79. package/src/hid/command.ts +27 -37
  80. package/src/hid/dualsense_hid.ts +89 -29
  81. package/src/hid/hid_provider.ts +20 -2
  82. package/src/hid/index.ts +2 -0
  83. package/src/hid/web_hid_provider.ts +3 -1
  84. package/src/id.ts +4 -0
  85. package/webhid_example/build/asset-manifest.json +6 -6
  86. package/webhid_example/build/index.html +1 -1
  87. package/webhid_example/build/static/css/{main.237f8cfa.css → main.9393bbb9.css} +2 -2
  88. package/webhid_example/build/static/css/main.9393bbb9.css.map +1 -0
  89. package/webhid_example/build/static/js/main.53ce5f89.js +3 -0
  90. package/webhid_example/build/static/js/main.53ce5f89.js.map +1 -0
  91. package/webhid_example/src/App.tsx +63 -12
  92. package/webhid_example/src/Controller.tsx +19 -0
  93. package/webhid_example/src/hud/BatteryIndicator.tsx +78 -0
  94. package/webhid_example/src/hud/ControllerConnection.tsx +59 -57
  95. package/webhid_example/src/hud/Debugger.tsx +93 -79
  96. package/webhid_example/src/hud/Gyro.tsx +48 -53
  97. package/webhid_example/src/hud/HUDLayout.tsx +2 -10
  98. package/webhid_example/src/hud/LightbarControls.tsx +82 -0
  99. package/webhid_example/src/hud/MuteLedControls.tsx +28 -0
  100. package/webhid_example/src/hud/PlayerLedControls.tsx +87 -0
  101. package/webhid_example/src/hud/Reticle.tsx +12 -62
  102. package/webhid_example/src/hud/RightStick.tsx +26 -0
  103. package/webhid_example/src/hud/StickVisualization.tsx +81 -0
  104. package/webhid_example/src/hud/TriggerEffectControls.tsx +417 -0
  105. package/webhid_example/src/hud/index.tsx +7 -0
  106. package/webhid_example/src/index.css +20 -1
  107. package/webhid_example/build/static/css/main.237f8cfa.css.map +0 -1
  108. package/webhid_example/build/static/js/main.0432376e.js +0 -3
  109. package/webhid_example/build/static/js/main.0432376e.js.map +0 -1
  110. /package/webhid_example/build/static/js/{main.0432376e.js.LICENSE.txt → main.53ce5f89.js.LICENSE.txt} +0 -0
@@ -1,5 +1,24 @@
1
1
  # Migration Guide
2
2
 
3
+ ### v5 to v6
4
+
5
+ `TriggerMode` is deprecated. The low-level `DualsenseHID` methods for setting trigger effects now accept 11-byte effect blocks instead of individual mode/value pairs.
6
+
7
+ Use the new element-based API instead:
8
+
9
+ ```typescript
10
+ import { TriggerEffect } from "dualsense-ts";
11
+
12
+ controller.right.trigger.feedback.set({
13
+ effect: TriggerEffect.Weapon,
14
+ start: 0.2,
15
+ end: 0.6,
16
+ strength: 0.9,
17
+ });
18
+
19
+ controller.right.trigger.feedback.reset();
20
+ ```
21
+
3
22
  ### v4 to v5
4
23
 
5
24
  `node-hid` is now an optional peer dependency, simplifying the use of this library in the browser.
package/README.md CHANGED
@@ -1,18 +1,24 @@
1
1
  # dualsense-ts
2
2
 
3
- This module provides a natural interface for your DualSense controller.
3
+ `dualsense-ts` is the natural interface for your DualSense controller. It's fully-typed, fully-featured, easy to use, and supports wired and wireless connections in both node.js and the browser.
4
+
5
+ **[Live demo](https://nsfm.github.io/dualsense-ts/)** - connect a controller and try it out!
4
6
 
5
7
  ## Getting started
6
8
 
7
9
  ### Installation
8
10
 
9
- [This package is distributed via npm](https://npmjs.org/package.dualsense-ts). Install it the usual way:
11
+ [This package is distributed via npm](https://www.npmjs.com/package/dualsense-ts). Install it the usual way:
10
12
 
11
13
  - `npm add dualsense-ts`
12
14
 
13
- In the browser, `dualsense-ts` has zero dependencies and relies on the [WebHID API](https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API). At this time, only Chrome, Edge, and Opera are compatible.
15
+ #### In the browser
16
+
17
+ `dualsense-ts` has zero dependencies and relies on the [WebHID API](https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API). At this time, only Chrome, Edge, and Opera are compatible.
14
18
 
15
- In node.js, `dualsense-ts` relies on `node-hid` as a peer dependency, so you'll need to add it as well:
19
+ #### In node.js
20
+
21
+ `dualsense-ts` relies on `node-hid` as a peer dependency, so you'll need to add it to your project as well:
16
22
 
17
23
  - `npm add node-hid`
18
24
 
@@ -30,18 +36,19 @@ const controller = new Dualsense();
30
36
  If the device disconnects, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection status with `controller.connection` using any of the Input APIs listed in the next section.
31
37
 
32
38
  ```typescript
33
- const connected = controller.connection.active
34
-
35
- controller.connection.on("change", ({ active }) = > {
39
+ controller.connection.on("change", ({ active }) => {
36
40
  console.log(`controller ${active ? '' : 'dis'}connected`)
37
41
  });
42
+
43
+ controller.connection.active // returns true while the controller is available
44
+ controller.wireless // returns true while connected over bluetooth
38
45
  ```
39
46
 
40
47
  ### Input APIs
41
48
 
42
49
  `dualsense-ts` provides several interfaces for reading input:
43
50
 
44
- - _Synchronous_: It's safe to read the current input state at any time
51
+ - _Synchronous_: It's safe to read the current input state at any time. When the controller disconnects, these all reset to their neutral states.
45
52
 
46
53
  ```typescript
47
54
  // Buttons
@@ -60,10 +67,10 @@ controller.left.analog.magnitude; // 0.23, 0 to 1
60
67
 
61
68
  // Touchpad - each touch point works like an analog input
62
69
  controller.touchpad.right.contact.state; // false
63
- +controller.touchpad.right.x; // -0.44, -1 to 1
70
+ controller.touchpad.right.x.state; // -0.44, -1 to 1
64
71
  ```
65
72
 
66
- - _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events
73
+ - _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events:
67
74
 
68
75
  ```typescript
69
76
  // Change events are triggered only when an input's value changes
@@ -89,7 +96,7 @@ controller.dpad.on("press", (dpad, input) =>
89
96
  controller.left.analog.x.on("input", console.log)
90
97
  ```
91
98
 
92
- - _Promises_: Wait for one-off inputs using `await`
99
+ - _Promises_: Wait for one-off inputs using `await`:
93
100
 
94
101
  ```typescript
95
102
  // Resolves next time `dpad up` is released
@@ -102,7 +109,7 @@ const { left, up, down, right } = await controller.dpad.promise("press");
102
109
  await controller.promise();
103
110
  ```
104
111
 
105
- - _Async Iterators_: Each input is an async iterator that provides state changes
112
+ - _Async Iterators_: Each input is an async iterator that provides state changes:
106
113
 
107
114
  ```typescript
108
115
  for await (const { pressure } of controller.left.trigger) {
@@ -114,6 +121,8 @@ for await (const { pressure } of controller.left.trigger) {
114
121
 
115
122
  #### Motion Control
116
123
 
124
+ You can access raw gyroscope and accelerometer readings from the device:
125
+
117
126
  ```typescript
118
127
  controller.gyroscope.on("change", ({ x, y, z }) => {
119
128
  console.log(`Gyroscope: \n\t${x}\n\t${y}\n\t${z}`)
@@ -123,14 +132,47 @@ controller.accelerometer.on("change", ({ x, y, z }) => {
123
132
  console.log(`Accelerometer: \n\t${x}\n\t${y}\n\t${z}`)
124
133
  }
125
134
 
126
- controller.accelerometer.z.on("change", ({ force }) => {
127
- if (force > 0.3) console.log('Controller moving')
135
+ controller.accelerometer.z.on("change", ({ magnitude }) => {
136
+ if (magnitude > 0.3) console.log('Controller is moving!')
128
137
  })
129
138
  ```
130
139
 
140
+ You'll need to perform additional processing to get the most use out of them - for example, by buffering accelerometer inputs and using a rolling Fourier transform to detect shaking.
141
+
142
+ #### Battery
143
+
144
+ The controller provides its current battery level and charging status:
145
+
146
+ ```typescript
147
+ // Check charging status
148
+ import { ChargeStatus } from "dualsense-ts";
149
+
150
+ controller.battery.status.on("change", ({ state }) => {
151
+ switch (state) {
152
+ case ChargeStatus.Charging:
153
+ console.log("Charging");
154
+ break;
155
+ case ChargeStatus.Discharging:
156
+ console.log("On battery");
157
+ break;
158
+ case ChargeStatus.Full:
159
+ console.log("Fully charged");
160
+ break;
161
+ }
162
+ });
163
+
164
+ // React to battery level changes
165
+ controller.battery.level.on("change", ({ state }) => {
166
+ console.log(`Battery: ${Math.round(state * 100)}%`);
167
+ if (state < 0.2) console.log("Low battery!");
168
+ });
169
+ ```
170
+
171
+ After connection it may take a second for these values to populate. Please note that the battery level is not a precise reading - it changes in 10% increments and is prone to flip-flopping. `dualsense-ts` makes an attempt to buffer and normalize these values.
172
+
131
173
  #### Rumble
132
174
 
133
- Only supported in node.js over USB at this time.
175
+ The controller has two haptic rumbles. The left motor produces a stronger, lower-frequency rumble, while the right actuator produces a lighter, higher-frequency vibration. They are controlled independently:
134
176
 
135
177
  ```typescript
136
178
  controller.rumble(1.0); // 100% rumble intensity
@@ -144,10 +186,105 @@ controller.rumble(false); // Another way to stop rumbling
144
186
 
145
187
  // Control right rumble intensity with the right trigger
146
188
  controller.right.trigger.on("change", (trigger) => {
147
- controller.right.rumble(trigger.magnitude);
189
+ controller.right.rumble(trigger.pressure);
190
+ });
191
+ ```
192
+
193
+ #### Adaptive Triggers
194
+
195
+ Adaptive trigger feedback is controlled via `controller.left.trigger.feedback` / `controller.right.trigger.feedback`.
196
+
197
+ ```typescript
198
+ import { Dualsense, TriggerEffect } from "dualsense-ts";
199
+
200
+ const controller = new Dualsense();
201
+
202
+ // Continuous resistance starting at 30% travel
203
+ controller.right.trigger.feedback.set({
204
+ effect: TriggerEffect.Feedback,
205
+ position: 0.3, // 0 - 1
206
+ strength: 0.8,
148
207
  });
208
+
209
+ // Weapon trigger — resistance with snap release
210
+ controller.right.trigger.feedback.set({
211
+ effect: TriggerEffect.Weapon,
212
+ start: 0.2,
213
+ end: 0.6,
214
+ strength: 0.9,
215
+ });
216
+
217
+ // Vibration with frequency
218
+ controller.right.trigger.feedback.set({
219
+ effect: TriggerEffect.Vibration,
220
+ position: 0.1,
221
+ amplitude: 0.7,
222
+ frequency: 40, // in Hz, 0 - 255
223
+ });
224
+
225
+ // Reset to default linear feel
226
+ controller.right.trigger.feedback.reset();
227
+
228
+ // Reset both triggers
229
+ controller.resetTriggerFeedback();
230
+
231
+ // Read current config
232
+ console.log(controller.right.trigger.feedback.config);
233
+ console.log(controller.right.trigger.feedback.effect); // TriggerEffect.Off
149
234
  ```
150
235
 
236
+ Feedback state is automatically restored if the controller disconnects and reconnects — no handling required on your end.
237
+
238
+ #### Trigger effects
239
+
240
+ | Effect | Description |
241
+ | ------------------------- | ---------------------------------------------------------- |
242
+ | `TriggerEffect.Off` | No resistance (default linear feel) |
243
+ | `TriggerEffect.Feedback` | Zone-based continuous resistance from a start position |
244
+ | `TriggerEffect.Weapon` | Resistance with a snap release point |
245
+ | `TriggerEffect.Bow` | Weapon feel with snap-back force |
246
+ | `TriggerEffect.Galloping` | Rhythmic two-stroke oscillation |
247
+ | `TriggerEffect.Vibration` | Zone-based oscillation with amplitude and frequency |
248
+ | `TriggerEffect.Machine` | Dual-amplitude vibration with frequency and period control |
249
+
250
+ Each effect accepts a unique set of configuration options — your editor's type hints will guide you through the available parameters for each effect. The [interactive demo](https://nsfm.github.io/dualsense-ts/) includes full slider controls for every effect and parameter, making it a great tool for finding the right values.
251
+
252
+ Effect names are based on [Nielk1's DualSense trigger effect documentation](https://gist.github.com/Nielk1/6d54cc2c00d2201ccb8c2720ad7538db).
253
+
254
+ #### Lights
255
+
256
+ You can control the controller's lightbar as well as the player indicator LEDs:
257
+
258
+ ```typescript
259
+ import { PlayerID, Brightness } from "dualsense-ts";
260
+
261
+ // Light bar — set color with {r, g, b} (0–255 per channel)
262
+ controller.lightbar.set({ r: 255, g: 0, b: 128 });
263
+ controller.lightbar.color; // { r: 255, g: 0, b: 128 }
264
+
265
+ // Light bar pulse effects — firmware-driven one-shot animations
266
+ // This overrides your custom color
267
+ controller.lightbar.fadeBlue(); // Fades to blue and holds
268
+ // You must call `fadeOut()` to restore custom lightbar colors
269
+ controller.lightbar.fadeOut(); // Fades to black, then returns to set color
270
+
271
+ // Player indicator LEDs — 5 white LEDs, individually addressable
272
+ controller.playerLeds.set(PlayerID.Player1); // Use a preset pattern
273
+ controller.playerLeds.setLed(0, true); // Toggle individual LEDs (0–4)
274
+ controller.playerLeds.setLed(4, true);
275
+ controller.playerLeds.clear(); // All off
276
+ controller.playerLeds.setBrightness(Brightness.Medium); // High, Medium, or Low
277
+
278
+ // Mute LED — read-only, reflects controller firmware state
279
+ controller.mute.status.on("change", ({ state }) => {
280
+ console.log(`Mute: ${state ? "muted" : "unmuted"}`);
281
+ });
282
+ ```
283
+
284
+ The `{r, g, b}` format is directly compatible with popular color libraries — pass the output of `colord().toRgb()`, `tinycolor().toRgb()`, or `Color().object()` straight to `lightbar.set()`.
285
+
286
+ The mute LED cannot be controlled (the firmware toggles it on and off with the button) but you can read its current state. `controller.mute` allows you to read the button like a normal input, while `controller.mute.status` is a toggle input tied to the LED's state.
287
+
151
288
  ### With React
152
289
 
153
290
  Check out [the example app](./webhid_example/) for more details.
@@ -184,10 +321,9 @@ import { DualsenseContext } from "./DualsenseContext";
184
321
  export const RequestController = () => {
185
322
  const controller = useContext(DualsenseContext);
186
323
  return (
187
- <button
188
- text="Grant Permission"
189
- onClick={controller.hid.provider.getRequest()}
190
- />
324
+ <button onClick={controller.hid.provider.getRequest()}>
325
+ Grant Permission
326
+ </button>
191
327
  );
192
328
  };
193
329
  ```
@@ -211,7 +347,7 @@ export const ControllerConnection = () => {
211
347
 
212
348
  return (
213
349
  <p dir={triangle ? "ltr" : "rtl"}>{`Controller ${
214
- state ? "" : "dis"
350
+ connected ? "" : "dis"
215
351
  }connected`}</p>
216
352
  );
217
353
  };
@@ -221,7 +357,17 @@ export const ControllerConnection = () => {
221
357
 
222
358
  Try out the [example app](https://nsfm.github.io/dualsense-ts/)'s debugger to look for clues. Please open an issue on Github if you have questions or something doesn't seem right.
223
359
 
224
- If inputs are not working or wrong, use the debugger to view the report buffer and include this with your issue to help us reproduce the problem.
360
+ If something seems wrong, use the debugger to view the report buffer. Collect a few buffers in different states if possible. Please provide your controller's model number in the report - it's located on the back. Some versions have unique quirks.
361
+
362
+ ## Other Dualsense Variants
363
+
364
+ The Dualsense FlexStrike and Dualsense Access controllers are not yet supported. This functionality is on the roadmap.
365
+
366
+ The PS4 Dualshock controller is not supported.
367
+
368
+ ## Multiplayer
369
+
370
+ Multiple controllers are not yet supported. This functionality is coming soon.
225
371
 
226
372
  ## Migration Guide
227
373
 
@@ -1,4 +1,4 @@
1
- import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams } from "./elements";
1
+ import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams, Battery, BatteryParams, Lightbar, PlayerLeds } from "./elements";
2
2
  import { Input, InputParams } from "./input";
3
3
  import { DualsenseHID } from "./hid";
4
4
  import { Intensity } from "./math";
@@ -34,6 +34,8 @@ export interface DualsenseParams extends InputParams {
34
34
  gyroscope?: GyroscopeParams;
35
35
  /** Settings for the accelerometer */
36
36
  accelerometer?: AccelerometerParams;
37
+ /** Settings for the battery */
38
+ battery?: BatteryParams;
37
39
  }
38
40
  /** Represents a Dualsense controller */
39
41
  export declare class Dualsense extends Input<Dualsense> {
@@ -66,13 +68,25 @@ export declare class Dualsense extends Input<Dualsense> {
66
68
  readonly gyroscope: Gyroscope;
67
69
  /** Tracks the controller's linear acceleration */
68
70
  readonly accelerometer: Accelerometer;
71
+ /** Battery level and charging status */
72
+ readonly battery: Battery;
73
+ /** The RGB light bar at the top of the controller */
74
+ readonly lightbar: Lightbar;
75
+ /** The 5 white player indicator LEDs */
76
+ readonly playerLeds: PlayerLeds;
77
+ /** Buffered battery reading, sampled on a slow cadence */
78
+ private readonly pendingBattery;
69
79
  /** Represents the underlying HID device. Provides input events */
70
80
  readonly hid: DualsenseHID;
71
81
  /** A virtual button representing whether or not a controller is connected */
72
82
  readonly connection: Momentary;
73
83
  get active(): boolean;
84
+ /** Returns `true` if the controller is connected via Bluetooth */
85
+ get wireless(): boolean;
74
86
  constructor(params?: DualsenseParams);
75
87
  private get rumbleIntensity();
88
+ /** Reset adaptive trigger feedback on both sides to the default linear feel */
89
+ resetTriggerFeedback(): void;
76
90
  /** Check or adjust rumble intensity evenly across both sides of the controller */
77
91
  rumble(intensity?: Intensity): number;
78
92
  /** Distributes HID event values to the controller's inputs */
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAGb,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,oEAAoE;AACpE,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,oEAAoE;IACpE,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,iCAAiC;IACjC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,qCAAqC;IACrC,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,wCAAwC;AACxC,qBAAa,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC7C,SAAgB,KAAK,EAAE,SAAS,CAAQ;IAExC,6BAA6B;IAC7B,SAAgB,EAAE,EAAE,SAAS,CAAC;IAC9B,uCAAuC;IACvC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,yBAAyB;IACzB,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,0BAA0B;IAC1B,SAAgB,QAAQ,EAAE,SAAS,CAAC;IACpC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,6BAA6B;IAC7B,SAAgB,KAAK,EAAE,SAAS,CAAC;IACjC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,0CAA0C;IAC1C,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,gDAAgD;IAChD,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAC/B,iDAAiD;IACjD,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAChC,uDAAuD;IACvD,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IACnC,+CAA+C;IAC/C,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,kDAAkD;IAClD,SAAgB,aAAa,EAAE,aAAa,CAAC;IAE7C,kEAAkE;IAClE,SAAgB,GAAG,EAAE,YAAY,CAAC;IAElC,6EAA6E;IAC7E,SAAgB,UAAU,EAAE,SAAS,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAI3B;gBAEW,MAAM,GAAE,eAAoB;IAiHxC,OAAO,KAAK,eAAe,GAE1B;IAED,kFAAkF;IAC3E,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM;IAM5C,8DAA8D;IAC9D,OAAO,CAAC,UAAU;CAiDnB"}
1
+ {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
package/dist/dualsense.js CHANGED
@@ -9,9 +9,22 @@ class Dualsense extends input_1.Input {
9
9
  get active() {
10
10
  return Object.values(this).some((input) => input !== this && input instanceof input_1.Input && input.active);
11
11
  }
12
+ /** Returns `true` if the controller is connected via Bluetooth */
13
+ get wireless() {
14
+ return this.hid.wireless;
15
+ }
12
16
  constructor(params = {}) {
13
17
  super(params);
14
18
  this.state = this;
19
+ /** The RGB light bar at the top of the controller */
20
+ this.lightbar = new elements_1.Lightbar();
21
+ /** The 5 white player indicator LEDs */
22
+ this.playerLeds = new elements_1.PlayerLeds();
23
+ /** Buffered battery reading, sampled on a slow cadence */
24
+ this.pendingBattery = {
25
+ peakLevel: 0,
26
+ status: hid_1.ChargeStatus.Discharging,
27
+ };
15
28
  this.ps = new elements_1.Momentary({
16
29
  icon: "㎰",
17
30
  name: "Home",
@@ -89,34 +102,100 @@ class Dualsense extends input_1.Input {
89
102
  threshold: 0.01,
90
103
  ...(params.accelerometer ?? {}),
91
104
  });
105
+ this.battery = new elements_1.Battery({
106
+ icon: "🔋",
107
+ name: "Battery",
108
+ ...(params.battery ?? {}),
109
+ });
92
110
  this.connection[input_1.InputSet](false);
93
111
  this.hid = params.hid ?? new hid_1.DualsenseHID(new hid_1.PlatformHIDProvider());
94
112
  this.hid.register((state) => {
95
113
  this.processHID(state);
96
114
  });
115
+ const rumbleMemo = { left: -1, right: -1 };
116
+ const triggerFeedbackMemo = { left: "", right: "" };
117
+ const lightbarMemo = { key: "" };
118
+ const playerLedsMemo = { key: "" };
97
119
  /** Refresh connection state */
120
+ let lastConnected = false;
98
121
  setInterval(() => {
99
122
  const { provider: { connected }, } = this.hid;
100
123
  this.connection[input_1.InputSet](connected);
124
+ if (connected && !lastConnected) {
125
+ // Invalidate memos so the output loop restores desired state on reconnect.
126
+ triggerFeedbackMemo.left = "";
127
+ triggerFeedbackMemo.right = "";
128
+ lightbarMemo.key = "";
129
+ playerLedsMemo.key = "";
130
+ }
131
+ lastConnected = connected;
101
132
  if (!connected)
102
133
  this.hid.provider.connect();
103
134
  }, 200);
104
- /** Refresh rumble state */
105
- const rumbleMemo = { left: -1, right: -1 };
135
+ /** Refresh battery state on a slow cadence to filter transient glitches */
136
+ setInterval(() => {
137
+ if (!this.connection.active)
138
+ return;
139
+ this.battery.level[input_1.InputSet](this.pendingBattery.peakLevel);
140
+ this.battery.status[input_1.InputSet](this.pendingBattery.status);
141
+ this.pendingBattery.peakLevel = 0;
142
+ }, 1000);
143
+ /** Refresh output state (rumble + trigger feedback) */
106
144
  setInterval(() => {
107
- const left = this.left.rumble();
108
- const right = this.right.rumble();
109
- if (this.connection.active &&
110
- (left !== rumbleMemo.left || right !== rumbleMemo.right)) {
111
- this.hid.setRumble(left * 255, right * 255);
112
- rumbleMemo.left = left;
113
- rumbleMemo.right = right;
145
+ if (!this.connection.active)
146
+ return;
147
+ const leftRumble = this.left.rumble();
148
+ const rightRumble = this.right.rumble();
149
+ if (leftRumble !== rumbleMemo.left || rightRumble !== rumbleMemo.right) {
150
+ this.hid.setRumble(leftRumble * 255, rightRumble * 255);
151
+ rumbleMemo.left = leftRumble;
152
+ rumbleMemo.right = rightRumble;
153
+ }
154
+ const leftFeedback = this.left.trigger.feedback;
155
+ const rightFeedback = this.right.trigger.feedback;
156
+ const leftKey = leftFeedback.toKey();
157
+ const rightKey = rightFeedback.toKey();
158
+ const feedbackChanged = leftKey !== triggerFeedbackMemo.left ||
159
+ rightKey !== triggerFeedbackMemo.right;
160
+ if (feedbackChanged) {
161
+ // Force rumble into the same batch so MotorPower scope bit is always present.
162
+ this.hid.setRumble(leftRumble * 255, rightRumble * 255);
163
+ rumbleMemo.left = leftRumble;
164
+ rumbleMemo.right = rightRumble;
165
+ }
166
+ if (leftKey !== triggerFeedbackMemo.left) {
167
+ this.hid.setLeftTriggerFeedback(leftFeedback.toBytes());
168
+ triggerFeedbackMemo.left = leftKey;
169
+ }
170
+ if (rightKey !== triggerFeedbackMemo.right) {
171
+ this.hid.setRightTriggerFeedback(rightFeedback.toBytes());
172
+ triggerFeedbackMemo.right = rightKey;
173
+ }
174
+ const lightbarKey = this.lightbar.toKey();
175
+ if (lightbarKey !== lightbarMemo.key) {
176
+ const { r, g, b } = this.lightbar.color;
177
+ this.hid.setLightbar(r, g, b);
178
+ lightbarMemo.key = lightbarKey;
179
+ }
180
+ const pulse = this.lightbar.consumePulse();
181
+ if (pulse !== hid_1.PulseOptions.Off) {
182
+ this.hid.setLightbar(0, 0, 0, pulse);
183
+ }
184
+ const playerLedsKey = this.playerLeds.toKey();
185
+ if (playerLedsKey !== playerLedsMemo.key) {
186
+ this.hid.setPlayerLeds(this.playerLeds.bitmask, this.playerLeds.brightness);
187
+ playerLedsMemo.key = playerLedsKey;
114
188
  }
115
189
  }, 1000 / 30);
116
190
  }
117
191
  get rumbleIntensity() {
118
192
  return (this.left.rumble() + this.right.rumble()) / 2;
119
193
  }
194
+ /** Reset adaptive trigger feedback on both sides to the default linear feel */
195
+ resetTriggerFeedback() {
196
+ this.left.trigger.feedback.reset();
197
+ this.right.trigger.feedback.reset();
198
+ }
120
199
  /** Check or adjust rumble intensity evenly across both sides of the controller */
121
200
  rumble(intensity) {
122
201
  this.left.rumble(intensity);
@@ -129,7 +208,7 @@ class Dualsense extends input_1.Input {
129
208
  this.options[input_1.InputSet](state["Options" /* InputId.Options */]);
130
209
  this.create[input_1.InputSet](state["Create" /* InputId.Create */]);
131
210
  this.mute[input_1.InputSet](state["Mute" /* InputId.Mute */]);
132
- this.mute.status[input_1.InputSet](state["Status" /* InputId.Status */]);
211
+ this.mute.status[input_1.InputSet](state["MuteLed" /* InputId.MuteLed */]);
133
212
  this.triangle[input_1.InputSet](state["Triangle" /* InputId.Triangle */]);
134
213
  this.circle[input_1.InputSet](state["Circle" /* InputId.Circle */]);
135
214
  this.cross[input_1.InputSet](state["Cross" /* InputId.Cross */]);
@@ -165,6 +244,11 @@ class Dualsense extends input_1.Input {
165
244
  this.accelerometer.x[input_1.InputSet](state["AccelX" /* InputId.AccelX */]);
166
245
  this.accelerometer.y[input_1.InputSet](state["AccelY" /* InputId.AccelY */]);
167
246
  this.accelerometer.z[input_1.InputSet](state["AccelZ" /* InputId.AccelZ */]);
247
+ const level = state["BatteryLevel" /* InputId.BatteryLevel */];
248
+ if (level > this.pendingBattery.peakLevel) {
249
+ this.pendingBattery.peakLevel = level;
250
+ }
251
+ this.pendingBattery.status = state["BatteryStatus" /* InputId.BatteryStatus */];
168
252
  }
169
253
  }
170
254
  exports.Dualsense = Dualsense;
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Input, InputParams } from "../input";
2
+ import { Intensity } from "../math";
3
+ import { ChargeStatus } from "../hid/battery_state";
4
+ /** Tracks the controller's battery charge level as a 0–1 intensity */
5
+ export declare class BatteryLevel extends Input<Intensity> {
6
+ state: Intensity;
7
+ get active(): boolean;
8
+ }
9
+ /** Tracks the controller's charging status */
10
+ export declare class BatteryStatus extends Input<ChargeStatus> {
11
+ state: ChargeStatus;
12
+ get active(): boolean;
13
+ }
14
+ export interface BatteryParams extends InputParams {
15
+ level?: InputParams;
16
+ status?: InputParams;
17
+ }
18
+ /** Groups battery level and charging status */
19
+ export declare class Battery extends Input<Battery> {
20
+ readonly state: Battery;
21
+ /** Battery charge level, normalized 0–1 */
22
+ readonly level: BatteryLevel;
23
+ /** Current charging status */
24
+ readonly status: BatteryStatus;
25
+ get active(): boolean;
26
+ constructor(params?: BatteryParams);
27
+ }
28
+ //# sourceMappingURL=battery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"battery.d.ts","sourceRoot":"","sources":["../../src/elements/battery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,KAAK,CAAC,SAAS,CAAC;IACzC,KAAK,EAAE,SAAS,CAAK;IAE5B,IAAW,MAAM,IAAI,OAAO,CAE3B;CACF;AAED,8CAA8C;AAC9C,qBAAa,aAAc,SAAQ,KAAK,CAAC,YAAY,CAAC;IAC7C,KAAK,EAAE,YAAY,CAA4B;IAEtD,IAAW,MAAM,IAAI,OAAO,CAE3B;CACF;AAED,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,+CAA+C;AAC/C,qBAAa,OAAQ,SAAQ,KAAK,CAAC,OAAO,CAAC;IACzC,SAAgB,KAAK,EAAE,OAAO,CAAQ;IAEtC,2CAA2C;IAC3C,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,8BAA8B;IAC9B,SAAgB,MAAM,EAAE,aAAa,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAE3B;gBAEW,MAAM,GAAE,aAAkB;CAavC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Battery = exports.BatteryStatus = exports.BatteryLevel = void 0;
4
+ const input_1 = require("../input");
5
+ const battery_state_1 = require("../hid/battery_state");
6
+ /** Tracks the controller's battery charge level as a 0–1 intensity */
7
+ class BatteryLevel extends input_1.Input {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.state = 0;
11
+ }
12
+ get active() {
13
+ return this.state > 0;
14
+ }
15
+ }
16
+ exports.BatteryLevel = BatteryLevel;
17
+ /** Tracks the controller's charging status */
18
+ class BatteryStatus extends input_1.Input {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.state = battery_state_1.ChargeStatus.Discharging;
22
+ }
23
+ get active() {
24
+ return this.state === battery_state_1.ChargeStatus.Charging;
25
+ }
26
+ }
27
+ exports.BatteryStatus = BatteryStatus;
28
+ /** Groups battery level and charging status */
29
+ class Battery extends input_1.Input {
30
+ get active() {
31
+ return this.level.active || this.status.active;
32
+ }
33
+ constructor(params = {}) {
34
+ super(params);
35
+ this.state = this;
36
+ this.level = new BatteryLevel({
37
+ icon: "🔋",
38
+ name: "BatteryLevel",
39
+ ...(params.level ?? {}),
40
+ });
41
+ this.status = new BatteryStatus({
42
+ icon: "🔌",
43
+ name: "BatteryStatus",
44
+ ...(params.status ?? {}),
45
+ });
46
+ }
47
+ }
48
+ exports.Battery = Battery;
49
+ //# sourceMappingURL=battery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"battery.js","sourceRoot":"","sources":["../../src/elements/battery.ts"],"names":[],"mappings":";;;AAAA,oCAA8C;AAE9C,wDAAoD;AAEpD,sEAAsE;AACtE,MAAa,YAAa,SAAQ,aAAgB;IAAlD;;QACS,UAAK,GAAc,CAAC,CAAC;IAK9B,CAAC;IAHC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;CACF;AAND,oCAMC;AAED,8CAA8C;AAC9C,MAAa,aAAc,SAAQ,aAAmB;IAAtD;;QACS,UAAK,GAAiB,4BAAY,CAAC,WAAW,CAAC;IAKxD,CAAC;IAHC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,KAAK,4BAAY,CAAC,QAAQ,CAAC;IAC9C,CAAC;CACF;AAND,sCAMC;AAOD,+CAA+C;AAC/C,MAAa,OAAQ,SAAQ,aAAc;IAQzC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,YAAY,SAAwB,EAAE;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;QAZA,UAAK,GAAY,IAAI,CAAC;QAapC,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC;YAC5B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,cAAc;YACpB,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,eAAe;YACrB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAzBD,0BAyBC"}