dualsense-ts 6.11.0 → 6.13.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 (53) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +53 -4
  3. package/dist/dualsense.d.ts +26 -1
  4. package/dist/dualsense.d.ts.map +1 -1
  5. package/dist/dualsense.js +40 -0
  6. package/dist/dualsense.js.map +1 -1
  7. package/dist/hid/calibration.d.ts +102 -0
  8. package/dist/hid/calibration.d.ts.map +1 -0
  9. package/dist/hid/calibration.js +164 -0
  10. package/dist/hid/calibration.js.map +1 -0
  11. package/dist/hid/dualsense_hid.d.ts +6 -0
  12. package/dist/hid/dualsense_hid.d.ts.map +1 -1
  13. package/dist/hid/dualsense_hid.js +7 -0
  14. package/dist/hid/dualsense_hid.js.map +1 -1
  15. package/dist/hid/hid_provider.d.ts +3 -0
  16. package/dist/hid/hid_provider.d.ts.map +1 -1
  17. package/dist/hid/hid_provider.js +16 -12
  18. package/dist/hid/hid_provider.js.map +1 -1
  19. package/dist/hid/index.d.ts +1 -0
  20. package/dist/hid/index.d.ts.map +1 -1
  21. package/dist/hid/index.js +1 -0
  22. package/dist/hid/index.js.map +1 -1
  23. package/dist/hid/node_hid_provider.d.ts.map +1 -1
  24. package/dist/hid/node_hid_provider.js +7 -2
  25. package/dist/hid/node_hid_provider.js.map +1 -1
  26. package/dist/hid/web_hid_provider.d.ts.map +1 -1
  27. package/dist/hid/web_hid_provider.js +8 -2
  28. package/dist/hid/web_hid_provider.js.map +1 -1
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/motion/index.d.ts +8 -0
  34. package/dist/motion/index.d.ts.map +1 -0
  35. package/dist/motion/index.js +24 -0
  36. package/dist/motion/index.js.map +1 -0
  37. package/dist/motion/madgwick.d.ts +41 -0
  38. package/dist/motion/madgwick.d.ts.map +1 -0
  39. package/dist/motion/madgwick.js +95 -0
  40. package/dist/motion/madgwick.js.map +1 -0
  41. package/dist/motion/orientation.d.ts +62 -0
  42. package/dist/motion/orientation.d.ts.map +1 -0
  43. package/dist/motion/orientation.js +106 -0
  44. package/dist/motion/orientation.js.map +1 -0
  45. package/dist/motion/quaternion.d.ts +30 -0
  46. package/dist/motion/quaternion.d.ts.map +1 -0
  47. package/dist/motion/quaternion.js +44 -0
  48. package/dist/motion/quaternion.js.map +1 -0
  49. package/dist/motion/shake.d.ts +132 -0
  50. package/dist/motion/shake.d.ts.map +1 -0
  51. package/dist/motion/shake.js +254 -0
  52. package/dist/motion/shake.js.map +1 -0
  53. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  All notable changes to `dualsense-ts` are documented here. This project uses [Semantic Versioning](https://semver.org/).
4
4
 
5
+ ## [6.13.0] - 2026-04-13
6
+
7
+ ### Added
8
+
9
+ - **Orientation tracking**: `controller.orientation` provides fused 3D orientation (pitch, yaw, roll, quaternion) via a zero-dependency Madgwick AHRS filter, plus accelerometer-only `tiltPitch`/`tiltRoll` for drift-free gravity-reference applications. Filter gain (`beta`) is tunable at runtime
10
+ - **Shake detection**: `controller.shake` detects shake intensity, frequency, and active state using per-axis Goertzel frequency analysis on first-difference signals. Reports both `frequency` (reversal rate) and `fundamental` (oscillation frequency), with a live `spectrum` of frequency bin powers. Configurable `threshold`, `windowSize`, `sustain`, `freqStep`, `freqMin`, and `freqMax` — all tunable at runtime
11
+ - Axis remapping from DualSense Y-up to Madgwick Z-up convention for correct symmetric tilt behavior
12
+ - Zero-gradient guard in the Madgwick filter to prevent NaN when gravity is already aligned
13
+ - New `motion/` module: `Orientation`, `ShakeDetector`, `MadgwickFilter`, quaternion math — all zero-dependency
14
+
15
+ ## [6.12.0] - 2026-04-14
16
+
17
+ ### Added
18
+
19
+ - **IMU calibration**:gyroscope and accelerometer readings now use per-unit factory calibration data (Feature Report 0x05) read automatically on connection. Removes gyro bias drift, corrects accelerometer zero-point offset, and normalises per-axis sensitivity so all three axes report consistent values for the same physical input
20
+ - `controller.calibration` exposes the resolved calibration factors for inspection and diagnostics
21
+
5
22
  ## [6.11.0] - 2026-04-13
6
23
 
7
24
  ### Added
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `dualsense-ts` is the natural interface for your DualSense controller. Simple to use, fully-typed, fully-featured, and supports wired and wireless connections in both node.js and the browser.
4
4
 
5
- Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Connect a controller and try every feature with live demos, or explore the [playground](https://nsfm.github.io/dualsense-ts/playground).
5
+ Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Connect a controller (or a few!) and try every feature with live demos. Or, explore the [playground](https://nsfm.github.io/dualsense-ts/playground) to check all of your controller functionality in one place.
6
6
 
7
7
  ## Features
8
8
 
@@ -13,7 +13,7 @@ Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Conn
13
13
  - **Lighting control** covering [RGB light bars](https://nsfm.github.io/dualsense-ts/outputs/lightbar), [player LEDs](https://nsfm.github.io/dualsense-ts/outputs/player-leds), and [mute button](https://nsfm.github.io/dualsense-ts/outputs/mute-led)
14
14
  - **Full haptics control** over independent [left/right rumble](https://nsfm.github.io/dualsense-ts/outputs/rumble) plus complete [trigger haptics](https://nsfm.github.io/dualsense-ts/outputs/trigger-effects)
15
15
  - **[Touchpad support](https://nsfm.github.io/dualsense-ts/inputs/touchpad)** with full multi-touch handling
16
- - **[Motion tracking](https://nsfm.github.io/dualsense-ts/inputs/motion)** via gyroscope and accelerometer readings
16
+ - **[Motion tracking](https://nsfm.github.io/dualsense-ts/inputs/motion)** via factory-calibrated gyroscope and accelerometer, with built-in [orientation tracking](https://nsfm.github.io/dualsense-ts/api/orientation) and [shake detection](https://nsfm.github.io/dualsense-ts/api/shake-detector)
17
17
  - **[Battery status](https://nsfm.github.io/dualsense-ts/inputs/battery)** including level and charging state
18
18
  - **[Audio controls](https://nsfm.github.io/dualsense-ts/outputs/audio)** for speaker, headphone, and microphone volume, routing, and muting
19
19
  - **Peripheral status** for connected headphones and microphone
@@ -180,7 +180,7 @@ Each touch point also exposes a `tracker` ([Increment](src/elements/increment.ts
180
180
 
181
181
  #### [Motion Control](https://nsfm.github.io/dualsense-ts/inputs/motion)
182
182
 
183
- You can access raw gyroscope and accelerometer readings from the device:
183
+ Raw values from the controller's 6-axis IMU are provided:
184
184
 
185
185
  ```typescript
186
186
  controller.gyroscope.on("change", ({ x, y, z }) => {
@@ -196,7 +196,56 @@ controller.accelerometer.z.on("change", ({ magnitude }) => {
196
196
  });
197
197
  ```
198
198
 
199
- 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.
199
+ Gyroscope and accelerometer readings are automatically calibrated using each controller's factory calibration data, which removes gyro bias drift and accelerometer zero-point offset. Calibration is applied transparently — you can inspect the resolved factors via `controller.calibration`. See [Factory Calibration](https://nsfm.github.io/dualsense-ts/inputs/motion) in the docs for details on bias removal, zero-point correction, and per-axis sensitivity normalization.
200
+
201
+ #### [Orientation Tracking](https://nsfm.github.io/dualsense-ts/api/orientation)
202
+
203
+ Built-in sensor fusion provides a stable 3D orientation from the raw IMU data, powered by a zero-dependency [Madgwick AHRS](https://nsfm.github.io/dualsense-ts/api/orientation) filter:
204
+
205
+ ```typescript
206
+ // Fused Euler angles (radians), updated every IMU sample
207
+ const { pitch, yaw, roll } = controller.orientation;
208
+
209
+ // Quaternion for 3D rendering
210
+ const [w, x, y, z] = controller.orientation.quaternion;
211
+
212
+ // Accelerometer-only tilt — no drift, no yaw
213
+ const steer = controller.orientation.tiltRoll;
214
+
215
+ // Tune the filter: lower beta = smoother, higher = less drift
216
+ controller.orientation.beta = 0.02;
217
+
218
+ // Reset to identity (e.g. on button press)
219
+ controller.orientation.reset();
220
+ ```
221
+
222
+ #### [Shake Detection](https://nsfm.github.io/dualsense-ts/api/shake-detector)
223
+
224
+ The built-in shake detector uses [Goertzel frequency analysis](https://nsfm.github.io/dualsense-ts/api/shake-detector) to detect shake intensity, frequency, and direction-reversal rate:
225
+
226
+ ```typescript
227
+ // Simple shake detection
228
+ if (controller.shake.active) {
229
+ triggerEffect();
230
+ }
231
+
232
+ // Proportional response
233
+ controller.left.rumble = controller.shake.intensity;
234
+
235
+ // Frequency-based mechanics
236
+ if (controller.shake.frequency > 4) {
237
+ baby.soothe(controller.shake.intensity);
238
+ }
239
+
240
+ // Tune sensitivity and analysis window at runtime
241
+ controller.shake.threshold = 0.05;
242
+ controller.shake.windowSize = 128;
243
+
244
+ // Access raw spectrum for custom visualization
245
+ for (const bin of controller.shake.spectrum) {
246
+ drawBar(bin.freq, bin.power);
247
+ }
248
+ ```
200
249
 
201
250
  #### [Battery](https://nsfm.github.io/dualsense-ts/inputs/battery)
202
251
 
@@ -1,7 +1,8 @@
1
1
  import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams, Battery, BatteryParams, Lightbar, PlayerLeds, Audio, PowerSaveControl } from "./elements";
2
2
  import { Input, InputParams } from "./input";
3
- import { DualsenseHID, FirmwareInfo, FactoryInfo, DualsenseColor } from "./hid";
3
+ import { DualsenseHID, FirmwareInfo, FactoryInfo, DualsenseColor, ResolvedCalibration } from "./hid";
4
4
  import { Intensity } from "./math";
5
+ import { Orientation, type OrientationParams, ShakeDetector, type ShakeDetectorParams } from "./motion";
5
6
  /** Settings for your Dualsense controller and each of its inputs */
6
7
  export interface DualsenseParams extends InputParams {
7
8
  /** Sets the source for HID events. Default: decide automatically */
@@ -36,6 +37,10 @@ export interface DualsenseParams extends InputParams {
36
37
  accelerometer?: AccelerometerParams;
37
38
  /** Settings for the battery */
38
39
  battery?: BatteryParams;
40
+ /** Settings for the orientation tracker (Madgwick AHRS) */
41
+ orientation?: OrientationParams;
42
+ /** Settings for the shake detector */
43
+ shake?: ShakeDetectorParams;
39
44
  }
40
45
  /** Represents a Dualsense controller */
41
46
  export declare class Dualsense extends Input<Dualsense> {
@@ -82,10 +87,24 @@ export declare class Dualsense extends Input<Dualsense> {
82
87
  readonly audio: Audio;
83
88
  /** Per-subsystem power save controls (disable touch, motion, haptics, audio) */
84
89
  readonly powerSave: PowerSaveControl;
90
+ /**
91
+ * Fused orientation from Madgwick AHRS sensor fusion.
92
+ * Provides pitch, yaw, roll (radians), quaternion, and
93
+ * accelerometer-only tilt. Updated automatically each HID report.
94
+ */
95
+ readonly orientation: Orientation;
96
+ /**
97
+ * Shake detector with frequency analysis.
98
+ * Provides intensity (0–1), dominant frequency (Hz), and an
99
+ * active flag. Updated automatically each HID report.
100
+ */
101
+ readonly shake: ShakeDetector;
85
102
  /** Monotonic sensor timestamp in microseconds from the controller's clock.
86
103
  * Updated with each input report — useful for correlating motion sensor
87
104
  * readings with other inputs across frames. Wraps at 2^32 (~71.6 minutes). */
88
105
  sensorTimestamp: number;
106
+ /** Previous sensor timestamp for computing dt (microseconds). */
107
+ private prevSensorTimestamp;
89
108
  /** Active interval timers, cleared on dispose */
90
109
  private readonly timers;
91
110
  /**
@@ -105,6 +124,12 @@ export declare class Dualsense extends Input<Dualsense> {
105
124
  * Contains sensible defaults until the device reports its actual values.
106
125
  */
107
126
  get factoryInfo(): FactoryInfo;
127
+ /**
128
+ * IMU calibration factors derived from the controller's factory calibration
129
+ * data (Feature Report 0x05). Applied automatically to gyroscope and
130
+ * accelerometer readings — exposed here for inspection and diagnostics.
131
+ */
132
+ get calibration(): ResolvedCalibration;
108
133
  /** A virtual button representing whether or not a controller is connected */
109
134
  readonly connection: Momentary;
110
135
  /** True if any input at all is active or changing */
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
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,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,UAAU,EACV,KAAK,EACL,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAMZ,YAAY,EACZ,WAAW,EACX,cAAc,EAGd,mBAAmB,EACpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,aAAa,EACb,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAElB,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;IACpC,+BAA+B;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,sCAAsC;IACtC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;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;IAC7C,wCAAwC;IACxC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,sEAAsE;IACtE,SAAgB,UAAU,EAAE,SAAS,CAAC;IACtC,sEAAsE;IACtE,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,qDAAqD;IACrD,SAAgB,QAAQ,WAAkB;IAC1C,wCAAwC;IACxC,SAAgB,UAAU,aAAoB;IAC9C,qDAAqD;IACrD,SAAgB,KAAK,QAAe;IACpC,gFAAgF;IAChF,SAAgB,SAAS,mBAA0B;IAEnD;;;;OAIG;IACH,SAAgB,WAAW,EAAE,WAAW,CAAC;IAEzC;;;;OAIG;IACH,SAAgB,KAAK,EAAE,aAAa,CAAC;IAErC;;mFAE+E;IACxE,eAAe,EAAE,MAAM,CAAK;IAEnC,iEAAiE;IACjE,OAAO,CAAC,mBAAmB,CAAK;IAEhC,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG7B;IAEF,mEAAmE;IACnE,SAAgB,GAAG,EAAE,YAAY,CAAC;IAElC;;;OAGG;IACH,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,WAAW,CAEpC;IAED;;;;OAIG;IACH,IAAW,WAAW,IAAI,mBAAmB,CAE5C;IAED,6EAA6E;IAC7E,SAAgB,UAAU,EAAE,SAAS,CAAC;IAEtC,qDAAqD;IACrD,IAAW,MAAM,IAAI,OAAO,CAI3B;IAED,kEAAkE;IAClE,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,mCAAmC;IACnC,IAAW,KAAK,IAAI,cAAc,CAIjC;IAED,sDAAsD;IACtD,IAAW,YAAY,IAAI,MAAM,CAEhC;gBAEW,MAAM,GAAE,eAAoB;IAiQxC,sDAAsD;IAC/C,OAAO,IAAI,IAAI;IAMtB,oEAAoE;IACpE,OAAO,KAAK,eAAe,GAE1B;IAED,+EAA+E;IACxE,oBAAoB,IAAI,IAAI;IAKnC;;;;;OAKG;IACU,aAAa,CACxB,MAAM,GAAE,SAAS,GAAG,WAAuB,EAC3C,IAAI,GAAE,MAAM,GAAG,OAAO,GAAG,MAAe,GACvC,OAAO,CAAC,IAAI,CAAC;IAIhB,6BAA6B;IAChB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C,kFAAkF;IAC3E,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM;IAM5C,sEAAsE;IACtE,OAAO,CAAC,UAAU;CAmFnB"}
package/dist/dualsense.js CHANGED
@@ -4,6 +4,7 @@ exports.Dualsense = void 0;
4
4
  const elements_1 = require("./elements");
5
5
  const input_1 = require("./input");
6
6
  const hid_1 = require("./hid");
7
+ const motion_1 = require("./motion");
7
8
  /** Represents a Dualsense controller */
8
9
  class Dualsense extends input_1.Input {
9
10
  /**
@@ -20,6 +21,14 @@ class Dualsense extends input_1.Input {
20
21
  get factoryInfo() {
21
22
  return this.hid.factoryInfo;
22
23
  }
24
+ /**
25
+ * IMU calibration factors derived from the controller's factory calibration
26
+ * data (Feature Report 0x05). Applied automatically to gyroscope and
27
+ * accelerometer readings — exposed here for inspection and diagnostics.
28
+ */
29
+ get calibration() {
30
+ return this.hid.calibration;
31
+ }
23
32
  /** True if any input at all is active or changing */
24
33
  get active() {
25
34
  return Object.values(this).some((input) => input !== this && input instanceof input_1.Input && input.active);
@@ -54,6 +63,8 @@ class Dualsense extends input_1.Input {
54
63
  * Updated with each input report — useful for correlating motion sensor
55
64
  * readings with other inputs across frames. Wraps at 2^32 (~71.6 minutes). */
56
65
  this.sensorTimestamp = 0;
66
+ /** Previous sensor timestamp for computing dt (microseconds). */
67
+ this.prevSensorTimestamp = 0;
57
68
  /** Active interval timers, cleared on dispose */
58
69
  this.timers = [];
59
70
  /**
@@ -148,6 +159,8 @@ class Dualsense extends input_1.Input {
148
159
  name: "Battery",
149
160
  ...(params.battery ?? {}),
150
161
  });
162
+ this.orientation = new motion_1.Orientation(params.orientation);
163
+ this.shake = new motion_1.ShakeDetector(params.shake);
151
164
  this.connection[input_1.InputSet](false);
152
165
  // If a HID instance was supplied externally (e.g. by DualsenseManager),
153
166
  // the owner is responsible for driving discovery + reconnection.
@@ -189,6 +202,11 @@ class Dualsense extends input_1.Input {
189
202
  if (audioMemo.userChanged)
190
203
  audioMemo.key = "";
191
204
  }
205
+ // Reset motion helpers on both connect and disconnect so
206
+ // orientation doesn't carry stale state across sessions.
207
+ this.orientation.reset();
208
+ this.shake.reset();
209
+ this.prevSensorTimestamp = 0;
192
210
  });
193
211
  // Seed the initial state in case the provider was already attached.
194
212
  this.connection[input_1.InputSet](this.hid.provider.connected);
@@ -367,6 +385,28 @@ class Dualsense extends input_1.Input {
367
385
  this.accelerometer.x[input_1.InputSet](state[hid_1.InputId.AccelX]);
368
386
  this.accelerometer.y[input_1.InputSet](state[hid_1.InputId.AccelY]);
369
387
  this.accelerometer.z[input_1.InputSet](state[hid_1.InputId.AccelZ]);
388
+ // Compute dt from the controller's hardware clock (microseconds).
389
+ // The timestamp wraps at 2^32 (~71.6 minutes).
390
+ const ts = state[hid_1.InputId.SensorTimestamp];
391
+ if (this.prevSensorTimestamp !== 0 && ts !== 0) {
392
+ const dtMicro = ts >= this.prevSensorTimestamp
393
+ ? ts - this.prevSensorTimestamp
394
+ : 0xFFFFFFFF - this.prevSensorTimestamp + ts + 1;
395
+ const dt = dtMicro / 1000000;
396
+ // Sanity check: skip if dt is unreasonable (>0.5s means we
397
+ // probably missed reports or just reconnected).
398
+ if (dt > 0 && dt < 0.5) {
399
+ const gx = state[hid_1.InputId.GyroX];
400
+ const gy = state[hid_1.InputId.GyroY];
401
+ const gz = state[hid_1.InputId.GyroZ];
402
+ const ax = state[hid_1.InputId.AccelX];
403
+ const ay = state[hid_1.InputId.AccelY];
404
+ const az = state[hid_1.InputId.AccelZ];
405
+ this.orientation.update(gx, gy, gz, ax, ay, az, dt);
406
+ this.shake.update(ax, ay, az, dt);
407
+ }
408
+ }
409
+ this.prevSensorTimestamp = ts;
370
410
  const level = state[hid_1.InputId.BatteryLevel];
371
411
  if (level > this.pendingBattery.peakLevel) {
372
412
  this.pendingBattery.peakLevel = level;
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":";;;AAAA,yCAkBoB;AACpB,mCAAuD;AACvD,+BAae;AAuCf,wCAAwC;AACxC,MAAa,SAAU,SAAQ,aAAgB;IAkE7C;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IAC9B,CAAC;IAKD,qDAAqD;IACrD,IAAW,MAAM;QACf,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,aAAK,IAAI,KAAK,CAAC,MAAM,CACpE,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,mCAAmC;IACnC,IAAW,KAAK;QACd,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;QAC3C,IAAI,SAAS,IAAI,uBAAiB;YAAE,OAAO,uBAAiB,CAAC,SAAS,CAAC,CAAC;QACxE,OAAO,oBAAc,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,sDAAsD;IACtD,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,YAAY,SAA0B,EAAE;QACtC,KAAK,CAAC,MAAM,CAAC,CAAC;QA7GA,UAAK,GAAc,IAAI,CAAC;QAoCxC,qDAAqD;QACrC,aAAQ,GAAG,IAAI,mBAAQ,EAAE,CAAC;QAC1C,wCAAwC;QACxB,eAAU,GAAG,IAAI,qBAAU,EAAE,CAAC;QAC9C,qDAAqD;QACrC,UAAK,GAAG,IAAI,gBAAK,EAAE,CAAC;QACpC,gFAAgF;QAChE,cAAS,GAAG,IAAI,2BAAgB,EAAE,CAAC;QAEnD;;uFAE+E;QACxE,oBAAe,GAAW,CAAC,CAAC;QAEnC,iDAAiD;QAChC,WAAM,GAAqC,EAAE,CAAC;QAE/D;;;WAGG;QACc,mBAAc,GAAG;YAChC,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,kBAAY,CAAC,WAA2B;SACjD,CAAC;QAmDA,IAAI,CAAC,EAAE,GAAG,IAAI,oBAAS,CAAC;YACtB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,eAAI,CAAC;YACnB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,MAAM;YACZ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAS,CAAC;YAC3B,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,SAAS;YACf,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAS,CAAC;YAC1B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAS,CAAC;YAC5B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,UAAU;YAChB,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAS,CAAC;YAC1B,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,oBAAS,CAAC;YACzB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAS,CAAC;YAC1B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,eAAI,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAQ,CAAC;YACvB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,mBAAQ,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC;YAC3B,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,UAAU;YAChB,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAS,CAAC;YAC9B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;YACjB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC7B,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI;YACf,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,wBAAa,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,IAAI;YACf,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC;YACzB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;QACjC,wEAAwE;QACxE,iEAAiE;QACjE,wEAAwE;QACxE,oEAAoE;QACpE,mEAAmE;QACnE,kBAAkB;QAClB,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC;QACnD,IAAI,CAAC,GAAG;YACN,MAAM,CAAC,GAAG,KAAK,IAAI;gBACjB,CAAC,CAAC,IAAI,kBAAY,CAAC,IAAI,qBAAe,EAAE,CAAC;gBACzC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,kBAAY,CAAC,IAAI,yBAAmB,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAwB,EAAE,EAAE;YAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QACnC,MAAM,WAAW,GAAsC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC3E,kEAAkE;QAClE,mEAAmE;QACnE,4DAA4D;QAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAC/D,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAElC,2EAA2E;QAC3E,wEAAwE;QACxE,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,EAAE;YACxC,IAAI,CAAC,UAAU,CAAC,gBAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,SAAS,EAAE,CAAC;gBACd,mBAAmB,CAAC,IAAI,GAAG,EAAE,CAAC;gBAC9B,mBAAmB,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC/B,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC;gBACtB,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC;gBAC7B,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC;gBACvB,IAAI,SAAS,CAAC,WAAW;oBAAE,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,oEAAoE;QACpE,IAAI,CAAC,UAAU,CAAC,gBAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEvD,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACjC,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC3D,0BAA0B;oBAC5B,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACX,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;QACpC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAEV,uDAAuD;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,sEAAsE;YACtE,kEAAkE;YAClE,IACE,UAAU,GAAG,CAAC;gBACd,WAAW,GAAG,CAAC;gBACf,UAAU,KAAK,UAAU,CAAC,IAAI;gBAC9B,WAAW,KAAK,UAAU,CAAC,KAAK,EAChC,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;gBACxD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC;gBAC7B,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC;YACjC,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,eAAe,GACnB,OAAO,KAAK,mBAAmB,CAAC,IAAI;gBACpC,QAAQ,KAAK,mBAAmB,CAAC,KAAK,CAAC;YAEzC,IAAI,eAAe,EAAE,CAAC;gBACpB,8EAA8E;gBAC9E,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;gBACxD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC;gBAC7B,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC;YACjC,CAAC;YAED,IAAI,OAAO,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxD,mBAAmB,CAAC,IAAI,GAAG,OAAO,CAAC;YACrC,CAAC;YACD,IAAI,QAAQ,KAAK,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,mBAAmB,CAAC,KAAK,GAAG,QAAQ,CAAC;YACvC,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,WAAW,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9B,YAAY,CAAC,GAAG,GAAG,WAAW,CAAC;YACjC,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,KAAK,KAAK,kBAAY,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC9C,IAAI,aAAa,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,aAAa,CACpB,IAAI,CAAC,UAAU,CAAC,OAAO,EACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAC3B,CAAC;gBACF,cAAc,CAAC,GAAG,GAAG,aAAa,CAAC;YACrC,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,IAAI,WAAW,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACzC,CAAC;gBACD,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC;YACjC,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,QAAQ,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;gBAC/B,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC3D,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACvD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CACvB,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,IAAI,CAAC,KAAK,CAAC,WAAW,CACvB,CAAC;gBACF,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC;YAC3B,CAAC;YAED,6EAA6E;YAC7E,mCAAmC;YACnC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;YACvE,IAAI,KAAK,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxE,aAAa,CAAC,GAAG,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,sDAAsD;IAC/C,OAAO;QACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,oEAAoE;IACpE,IAAY,eAAe;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,+EAA+E;IACxE,oBAAoB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,aAAa,CACxB,SAAkC,SAAS,EAC3C,OAAkC,MAAM;QAExC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,6BAA6B;IACtB,KAAK,CAAC,YAAY;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC;IAED,kFAAkF;IAC3E,MAAM,CAAC,SAAqB;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,sEAAsE;IAC9D,UAAU,CAAC,KAAwB;QACzC,IAAI,CAAC,EAAE,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAEnD,IAAI,CAAC,QAAQ,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEvE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,aAAO,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAQ,CAAC,CAAC,KAAK,CAAC,aAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtD,MAAM,KAAK,GAAG,KAAK,CAAC,aAAO,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,KAAK,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,aAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;CACF;AA7cD,8BA6cC"}
1
+ {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * IMU calibration data from Feature Report 0x05.
3
+ *
4
+ * The DualSense stores per-unit factory calibration for the gyroscope and
5
+ * accelerometer. Reading and applying these offsets and scale factors
6
+ * removes bias drift and normalises per-axis sensitivity, giving more
7
+ * accurate motion data than the hardcoded mapping.
8
+ *
9
+ * Layout mirrors the Linux kernel hid-playstation.c interpretation of
10
+ * Feature Report 0x05 (41 bytes including the report-ID prefix).
11
+ */
12
+ import type { HIDProvider } from "./hid_provider";
13
+ /** Per-axis calibration parameters for one gyro axis */
14
+ export interface GyroAxisCalibration {
15
+ /** Resting-state bias (raw int16 counts) */
16
+ bias: number;
17
+ /** Raw count at +reference rotation rate */
18
+ plus: number;
19
+ /** Raw count at −reference rotation rate */
20
+ minus: number;
21
+ }
22
+ /** Per-axis calibration parameters for one accelerometer axis */
23
+ export interface AccelAxisCalibration {
24
+ /** Raw count at +1 g */
25
+ plus: number;
26
+ /** Raw count at −1 g */
27
+ minus: number;
28
+ }
29
+ /** Full IMU calibration data parsed from Feature Report 0x05 */
30
+ export interface IMUCalibration {
31
+ gyro: {
32
+ pitch: GyroAxisCalibration;
33
+ yaw: GyroAxisCalibration;
34
+ roll: GyroAxisCalibration;
35
+ /** Reference rotation-rate magnitude (positive direction) */
36
+ speedPlus: number;
37
+ /** Reference rotation-rate magnitude (negative direction) */
38
+ speedMinus: number;
39
+ };
40
+ accel: {
41
+ x: AccelAxisCalibration;
42
+ y: AccelAxisCalibration;
43
+ z: AccelAxisCalibration;
44
+ };
45
+ }
46
+ /** Precomputed bias + scale for a single axis */
47
+ export interface AxisCalibrationFactors {
48
+ /** Value to subtract from the raw int16 */
49
+ bias: number;
50
+ /** Multiplier: calibrated = (raw − bias) × scale, then clamp to [−1, 1] */
51
+ scale: number;
52
+ }
53
+ /**
54
+ * Precomputed calibration factors for all six IMU axes.
55
+ *
56
+ * Per-sample application: `calibrated = clamp((raw − bias) × scale, −1, 1)`
57
+ */
58
+ export interface ResolvedCalibration {
59
+ gyroPitch: AxisCalibrationFactors;
60
+ gyroYaw: AxisCalibrationFactors;
61
+ gyroRoll: AxisCalibrationFactors;
62
+ accelX: AxisCalibrationFactors;
63
+ accelY: AxisCalibrationFactors;
64
+ accelZ: AxisCalibrationFactors;
65
+ }
66
+ /** Identity calibration: zero bias, uniform 1/32767 scale */
67
+ export declare const DefaultResolvedCalibration: ResolvedCalibration;
68
+ /**
69
+ * Parse Feature Report 0x05 into an {@link IMUCalibration}.
70
+ *
71
+ * The report may or may not include the report-ID byte as the first
72
+ * element depending on platform — the parser auto-detects.
73
+ */
74
+ export declare function parseIMUCalibration(buf: Uint8Array): IMUCalibration;
75
+ /**
76
+ * Precompute per-axis bias and scale from raw calibration data.
77
+ *
78
+ * **Gyroscope:** Removes resting-state bias and normalises per-axis
79
+ * sensitivity so that the same physical rotation rate produces the same
80
+ * numeric value on all three axes. The most-sensitive axis (largest
81
+ * raw range) maps exactly to [-1, 1] at full scale; less-sensitive
82
+ * axes are boosted to match, with ≤ 4% clipping at extreme values.
83
+ *
84
+ * **Accelerometer:** Removes the zero-point offset (manufacturing
85
+ * tolerance) and normalises per-axis sensitivity the same way.
86
+ */
87
+ export declare function resolveCalibration(cal: IMUCalibration): ResolvedCalibration;
88
+ /**
89
+ * Read and parse IMU calibration from a connected controller.
90
+ * Returns undefined if the report cannot be read.
91
+ */
92
+ export declare function readIMUCalibration(provider: HIDProvider): Promise<IMUCalibration | undefined>;
93
+ /**
94
+ * Assemble two raw report bytes into a signed int16.
95
+ */
96
+ export declare function rawInt16(lo: number, hi: number): number;
97
+ /**
98
+ * Apply precomputed calibration to a single axis sample.
99
+ * `calibrated = clamp((raw − bias) × scale, −1, 1)`
100
+ */
101
+ export declare function applyCal(raw: number, factors: AxisCalibrationFactors): number;
102
+ //# sourceMappingURL=calibration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration.d.ts","sourceRoot":"","sources":["../../src/hid/calibration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,mBAAmB,CAAC;QAC3B,GAAG,EAAE,mBAAmB,CAAC;QACzB,IAAI,EAAE,mBAAmB,CAAC;QAC1B,6DAA6D;QAC7D,SAAS,EAAE,MAAM,CAAC;QAClB,6DAA6D;QAC7D,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,EAAE,oBAAoB,CAAC;QACxB,CAAC,EAAE,oBAAoB,CAAC;QACxB,CAAC,EAAE,oBAAoB,CAAC;KACzB,CAAC;CACH;AAMD,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAMD,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,EAAE,mBAOxC,CAAC;AAeF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc,CA6BnE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,mBAAmB,CA2C3E;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAQrC;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAG7E"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ /**
3
+ * IMU calibration data from Feature Report 0x05.
4
+ *
5
+ * The DualSense stores per-unit factory calibration for the gyroscope and
6
+ * accelerometer. Reading and applying these offsets and scale factors
7
+ * removes bias drift and normalises per-axis sensitivity, giving more
8
+ * accurate motion data than the hardcoded mapping.
9
+ *
10
+ * Layout mirrors the Linux kernel hid-playstation.c interpretation of
11
+ * Feature Report 0x05 (41 bytes including the report-ID prefix).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.DefaultResolvedCalibration = void 0;
15
+ exports.parseIMUCalibration = parseIMUCalibration;
16
+ exports.resolveCalibration = resolveCalibration;
17
+ exports.readIMUCalibration = readIMUCalibration;
18
+ exports.rawInt16 = rawInt16;
19
+ exports.applyCal = applyCal;
20
+ // ---------------------------------------------------------------------------
21
+ // Defaults
22
+ // ---------------------------------------------------------------------------
23
+ /** Identity calibration: zero bias, uniform 1/32767 scale */
24
+ exports.DefaultResolvedCalibration = {
25
+ gyroPitch: { bias: 0, scale: 1 / 32767 },
26
+ gyroYaw: { bias: 0, scale: 1 / 32767 },
27
+ gyroRoll: { bias: 0, scale: 1 / 32767 },
28
+ accelX: { bias: 0, scale: 1 / 32767 },
29
+ accelY: { bias: 0, scale: 1 / 32767 },
30
+ accelZ: { bias: 0, scale: 1 / 32767 },
31
+ };
32
+ // ---------------------------------------------------------------------------
33
+ // Parsing
34
+ // ---------------------------------------------------------------------------
35
+ const REPORT_ID = 0x05;
36
+ const REPORT_LENGTH = 41;
37
+ function readInt16LE(buf, offset) {
38
+ let v = buf[offset] | (buf[offset + 1] << 8);
39
+ if (v > 0x7fff)
40
+ v -= 0x10000;
41
+ return v;
42
+ }
43
+ /**
44
+ * Parse Feature Report 0x05 into an {@link IMUCalibration}.
45
+ *
46
+ * The report may or may not include the report-ID byte as the first
47
+ * element depending on platform — the parser auto-detects.
48
+ */
49
+ function parseIMUCalibration(buf) {
50
+ const off = buf[0] === REPORT_ID ? 1 : 0;
51
+ return {
52
+ gyro: {
53
+ pitch: {
54
+ bias: readInt16LE(buf, off + 0),
55
+ plus: readInt16LE(buf, off + 6),
56
+ minus: readInt16LE(buf, off + 8),
57
+ },
58
+ yaw: {
59
+ bias: readInt16LE(buf, off + 2),
60
+ plus: readInt16LE(buf, off + 10),
61
+ minus: readInt16LE(buf, off + 12),
62
+ },
63
+ roll: {
64
+ bias: readInt16LE(buf, off + 4),
65
+ plus: readInt16LE(buf, off + 14),
66
+ minus: readInt16LE(buf, off + 16),
67
+ },
68
+ speedPlus: readInt16LE(buf, off + 18),
69
+ speedMinus: readInt16LE(buf, off + 20),
70
+ },
71
+ accel: {
72
+ x: { plus: readInt16LE(buf, off + 22), minus: readInt16LE(buf, off + 24) },
73
+ y: { plus: readInt16LE(buf, off + 26), minus: readInt16LE(buf, off + 28) },
74
+ z: { plus: readInt16LE(buf, off + 30), minus: readInt16LE(buf, off + 32) },
75
+ },
76
+ };
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Resolution: raw calibration → precomputed factors
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * Precompute per-axis bias and scale from raw calibration data.
83
+ *
84
+ * **Gyroscope:** Removes resting-state bias and normalises per-axis
85
+ * sensitivity so that the same physical rotation rate produces the same
86
+ * numeric value on all three axes. The most-sensitive axis (largest
87
+ * raw range) maps exactly to [-1, 1] at full scale; less-sensitive
88
+ * axes are boosted to match, with ≤ 4% clipping at extreme values.
89
+ *
90
+ * **Accelerometer:** Removes the zero-point offset (manufacturing
91
+ * tolerance) and normalises per-axis sensitivity the same way.
92
+ */
93
+ function resolveCalibration(cal) {
94
+ const pitchRange = cal.gyro.pitch.plus - cal.gyro.pitch.minus;
95
+ const yawRange = cal.gyro.yaw.plus - cal.gyro.yaw.minus;
96
+ const rollRange = cal.gyro.roll.plus - cal.gyro.roll.minus;
97
+ const maxGyroRange = Math.max(Math.abs(pitchRange), Math.abs(yawRange), Math.abs(rollRange));
98
+ const xRange = cal.accel.x.plus - cal.accel.x.minus;
99
+ const yRange = cal.accel.y.plus - cal.accel.y.minus;
100
+ const zRange = cal.accel.z.plus - cal.accel.z.minus;
101
+ const maxAccelRange = Math.max(Math.abs(xRange), Math.abs(yRange), Math.abs(zRange));
102
+ function gyroScale(range) {
103
+ return range !== 0 ? maxGyroRange / range / 32767 : 1 / 32767;
104
+ }
105
+ function accelScale(range) {
106
+ return range !== 0 ? maxAccelRange / range / 32767 : 1 / 32767;
107
+ }
108
+ return {
109
+ gyroPitch: { bias: cal.gyro.pitch.bias, scale: gyroScale(pitchRange) },
110
+ gyroYaw: { bias: cal.gyro.yaw.bias, scale: gyroScale(yawRange) },
111
+ gyroRoll: { bias: cal.gyro.roll.bias, scale: gyroScale(rollRange) },
112
+ accelX: {
113
+ bias: (cal.accel.x.plus + cal.accel.x.minus) / 2,
114
+ scale: accelScale(xRange),
115
+ },
116
+ accelY: {
117
+ bias: (cal.accel.y.plus + cal.accel.y.minus) / 2,
118
+ scale: accelScale(yRange),
119
+ },
120
+ accelZ: {
121
+ bias: (cal.accel.z.plus + cal.accel.z.minus) / 2,
122
+ scale: accelScale(zRange),
123
+ },
124
+ };
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Reading from device
128
+ // ---------------------------------------------------------------------------
129
+ /**
130
+ * Read and parse IMU calibration from a connected controller.
131
+ * Returns undefined if the report cannot be read.
132
+ */
133
+ async function readIMUCalibration(provider) {
134
+ try {
135
+ const buf = await provider.readFeatureReport(REPORT_ID, REPORT_LENGTH);
136
+ if (!buf || buf.length < 35)
137
+ return undefined;
138
+ return parseIMUCalibration(buf);
139
+ }
140
+ catch {
141
+ return undefined;
142
+ }
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // Per-sample helpers
146
+ // ---------------------------------------------------------------------------
147
+ /**
148
+ * Assemble two raw report bytes into a signed int16.
149
+ */
150
+ function rawInt16(lo, hi) {
151
+ let v = (hi << 8) | lo;
152
+ if (v > 0x7fff)
153
+ v -= 0x10000;
154
+ return v;
155
+ }
156
+ /**
157
+ * Apply precomputed calibration to a single axis sample.
158
+ * `calibrated = clamp((raw − bias) × scale, −1, 1)`
159
+ */
160
+ function applyCal(raw, factors) {
161
+ const v = (raw - factors.bias) * factors.scale;
162
+ return v > 1 ? 1 : v < -1 ? -1 : v;
163
+ }
164
+ //# sourceMappingURL=calibration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration.js","sourceRoot":"","sources":["../../src/hid/calibration.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAuGH,kDA6BC;AAkBD,gDA2CC;AAUD,gDAUC;AASD,4BAIC;AAMD,4BAGC;AArKD,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,6DAA6D;AAChD,QAAA,0BAA0B,GAAwB;IAC7D,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;IACxC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;IACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;IACvC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;IACrC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;IACrC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE;CACtC,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,SAAS,WAAW,CAAC,GAAe,EAAE,MAAc;IAClD,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,MAAM;QAAE,CAAC,IAAI,OAAO,CAAC;IAC7B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,GAAe;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC/B,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC/B,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;aACjC;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC/B,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;gBAChC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;aAClC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC/B,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;gBAChC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;aAClC;YACD,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;YACrC,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;SACvC;QACD,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE;YAC1E,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE;YAC1E,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE;SAC3E;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,SAAgB,kBAAkB,CAAC,GAAmB;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EACpB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAClB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CACpB,CAAC;IAEF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAChB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAChB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CACjB,CAAC;IAEF,SAAS,SAAS,CAAC,KAAa;QAC9B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAChE,CAAC;IACD,SAAS,UAAU,CAAC,KAAa;QAC/B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACjE,CAAC;IAED,OAAO;QACL,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE;QACtE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAChE,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE;QACnE,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YAChD,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;SAC1B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YAChD,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;SAC1B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YAChD,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,QAAqB;IAErB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,SAAgB,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC7C,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,MAAM;QAAE,CAAC,IAAI,OAAO,CAAC;IAC7B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,GAAW,EAAE,OAA+B;IACnE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC"}
@@ -2,6 +2,7 @@ import { PulseOptions, Brightness, MuteLedMode } from "./command";
2
2
  import { HIDProvider, DualsenseHIDState } from "./hid_provider";
3
3
  import { FirmwareInfo } from "./firmware_info";
4
4
  import { FactoryInfo } from "./factory_info";
5
+ import type { ResolvedCalibration } from "./calibration";
5
6
  export type HIDCallback = (state: DualsenseHIDState) => void;
6
7
  export type ErrorCallback = (error: Error) => void;
7
8
  export type ReadyCallback = () => void;
@@ -33,6 +34,11 @@ export declare class DualsenseHID {
33
34
  factoryInfo: FactoryInfo;
34
35
  /** Bluetooth MAC address from Feature Report 0x09, populated after connection */
35
36
  macAddress?: string;
37
+ /**
38
+ * Precomputed IMU calibration factors, populated during provider connection.
39
+ * Applied automatically to gyro and accelerometer readings in each input report.
40
+ */
41
+ get calibration(): ResolvedCalibration;
36
42
  /** Active interval timer for the command flush loop */
37
43
  private commandTimer?;
38
44
  constructor(provider: HIDProvider, refreshRate?: number);