dualsense-ts 6.12.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
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
+
5
15
  ## [6.12.0] - 2026-04-14
6
16
 
7
17
  ### 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 factory-calibrated 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
- Values from the controller's 6-axis IMU are provided:
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,10 +196,57 @@ 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 the raw readings — for example, by buffering accelerometer inputs and using a rolling Fourier transform to detect shaking.
200
-
201
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.
202
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
+ ```
249
+
203
250
  #### [Battery](https://nsfm.github.io/dualsense-ts/inputs/battery)
204
251
 
205
252
  The controller provides its current battery level and charging status:
@@ -2,6 +2,7 @@ import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad,
2
2
  import { Input, InputParams } from "./input";
3
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
  /**
@@ -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
  /**
@@ -62,6 +63,8 @@ class Dualsense extends input_1.Input {
62
63
  * Updated with each input report — useful for correlating motion sensor
63
64
  * readings with other inputs across frames. Wraps at 2^32 (~71.6 minutes). */
64
65
  this.sensorTimestamp = 0;
66
+ /** Previous sensor timestamp for computing dt (microseconds). */
67
+ this.prevSensorTimestamp = 0;
65
68
  /** Active interval timers, cleared on dispose */
66
69
  this.timers = [];
67
70
  /**
@@ -156,6 +159,8 @@ class Dualsense extends input_1.Input {
156
159
  name: "Battery",
157
160
  ...(params.battery ?? {}),
158
161
  });
162
+ this.orientation = new motion_1.Orientation(params.orientation);
163
+ this.shake = new motion_1.ShakeDetector(params.shake);
159
164
  this.connection[input_1.InputSet](false);
160
165
  // If a HID instance was supplied externally (e.g. by DualsenseManager),
161
166
  // the owner is responsible for driving discovery + reconnection.
@@ -197,6 +202,11 @@ class Dualsense extends input_1.Input {
197
202
  if (audioMemo.userChanged)
198
203
  audioMemo.key = "";
199
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;
200
210
  });
201
211
  // Seed the initial state in case the provider was already attached.
202
212
  this.connection[input_1.InputSet](this.hid.provider.connected);
@@ -375,6 +385,28 @@ class Dualsense extends input_1.Input {
375
385
  this.accelerometer.x[input_1.InputSet](state[hid_1.InputId.AccelX]);
376
386
  this.accelerometer.y[input_1.InputSet](state[hid_1.InputId.AccelY]);
377
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;
378
410
  const level = state[hid_1.InputId.BatteryLevel];
379
411
  if (level > this.pendingBattery.peakLevel) {
380
412
  this.pendingBattery.peakLevel = level;
@@ -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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"}
package/dist/index.d.ts CHANGED
@@ -10,4 +10,5 @@ export * from "./manager";
10
10
  export * from "./math";
11
11
  export * from "./elements/index";
12
12
  export * from "./hid/index";
13
+ export * from "./motion/index";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -26,4 +26,5 @@ __exportStar(require("./manager"), exports);
26
26
  __exportStar(require("./math"), exports);
27
27
  __exportStar(require("./elements/index"), exports);
28
28
  __exportStar(require("./hid/index"), exports);
29
+ __exportStar(require("./motion/index"), exports);
29
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAC5B,uCAAqB;AACrB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,mDAAiC;AACjC,8CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAC5B,uCAAqB;AACrB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,mDAAiC;AACjC,8CAA4B;AAC5B,iDAA+B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file Automatically generated by barrelsby.
3
+ */
4
+ export * from "./madgwick";
5
+ export * from "./orientation";
6
+ export * from "./quaternion";
7
+ export * from "./shake";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/motion/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * @file Automatically generated by barrelsby.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./madgwick"), exports);
21
+ __exportStar(require("./orientation"), exports);
22
+ __exportStar(require("./quaternion"), exports);
23
+ __exportStar(require("./shake"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/motion/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,gDAA8B;AAC9B,+CAA6B;AAC7B,0CAAwB"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Madgwick AHRS (Attitude and Heading Reference System) filter.
3
+ *
4
+ * Fuses 3-axis gyroscope and 3-axis accelerometer data into a stable
5
+ * orientation quaternion using gradient-descent-based correction.
6
+ *
7
+ * Reference: Sebastian Madgwick, "An efficient orientation filter for
8
+ * inertial and inertial/magnetic sensor arrays" (2010).
9
+ *
10
+ * Zero dependencies. The algorithm is ~40 lines of arithmetic.
11
+ */
12
+ import { type Quaternion } from "./quaternion";
13
+ export declare class MadgwickFilter {
14
+ /** Current orientation estimate. */
15
+ q: Quaternion;
16
+ /**
17
+ * Filter gain. Higher values trust the accelerometer more — less
18
+ * drift but more high-frequency noise. Lower values give smoother
19
+ * tracking but allow more gyro drift.
20
+ *
21
+ * Typical range: 0.01 (very smooth) to 0.5 (aggressive correction).
22
+ * Default 0.1 is a good general-purpose starting point.
23
+ */
24
+ beta: number;
25
+ constructor(beta?: number);
26
+ /** Reset to identity orientation. */
27
+ reset(): void;
28
+ /**
29
+ * Incorporate one IMU sample.
30
+ *
31
+ * @param gx Gyroscope X (pitch) in **rad/s**
32
+ * @param gy Gyroscope Y (yaw) in **rad/s**
33
+ * @param gz Gyroscope Z (roll) in **rad/s**
34
+ * @param ax Accelerometer X (any consistent unit — normalized internally)
35
+ * @param ay Accelerometer Y
36
+ * @param az Accelerometer Z
37
+ * @param dt Time delta in **seconds** since last sample
38
+ */
39
+ update(gx: number, gy: number, gz: number, ax: number, ay: number, az: number, dt: number): void;
40
+ }
41
+ //# sourceMappingURL=madgwick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"madgwick.d.ts","sourceRoot":"","sources":["../../src/motion/madgwick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAC;AAEzD,qBAAa,cAAc;IACzB,oCAAoC;IACpC,CAAC,EAAE,UAAU,CAAiB;IAE9B;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,SAAM;IAItB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb;;;;;;;;;;OAUG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI;CAkER"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Madgwick AHRS (Attitude and Heading Reference System) filter.
4
+ *
5
+ * Fuses 3-axis gyroscope and 3-axis accelerometer data into a stable
6
+ * orientation quaternion using gradient-descent-based correction.
7
+ *
8
+ * Reference: Sebastian Madgwick, "An efficient orientation filter for
9
+ * inertial and inertial/magnetic sensor arrays" (2010).
10
+ *
11
+ * Zero dependencies. The algorithm is ~40 lines of arithmetic.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.MadgwickFilter = void 0;
15
+ const quaternion_1 = require("./quaternion");
16
+ class MadgwickFilter {
17
+ constructor(beta = 0.1) {
18
+ /** Current orientation estimate. */
19
+ this.q = [...quaternion_1.IDENTITY];
20
+ this.beta = beta;
21
+ }
22
+ /** Reset to identity orientation. */
23
+ reset() {
24
+ this.q = [...quaternion_1.IDENTITY];
25
+ }
26
+ /**
27
+ * Incorporate one IMU sample.
28
+ *
29
+ * @param gx Gyroscope X (pitch) in **rad/s**
30
+ * @param gy Gyroscope Y (yaw) in **rad/s**
31
+ * @param gz Gyroscope Z (roll) in **rad/s**
32
+ * @param ax Accelerometer X (any consistent unit — normalized internally)
33
+ * @param ay Accelerometer Y
34
+ * @param az Accelerometer Z
35
+ * @param dt Time delta in **seconds** since last sample
36
+ */
37
+ update(gx, gy, gz, ax, ay, az, dt) {
38
+ let [q0, q1, q2, q3] = this.q;
39
+ // ---- Normalize accelerometer ----
40
+ let norm = Math.sqrt(ax * ax + ay * ay + az * az);
41
+ if (norm === 0)
42
+ return; // free-fall or no data — gyro only would diverge
43
+ norm = 1 / norm;
44
+ ax *= norm;
45
+ ay *= norm;
46
+ az *= norm;
47
+ // ---- Precomputed terms ----
48
+ const _2q0 = 2 * q0;
49
+ const _2q1 = 2 * q1;
50
+ const _2q2 = 2 * q2;
51
+ const _2q3 = 2 * q3;
52
+ const _4q0 = 4 * q0;
53
+ const _4q1 = 4 * q1;
54
+ const _4q2 = 4 * q2;
55
+ const _8q1 = 8 * q1;
56
+ const _8q2 = 8 * q2;
57
+ const q0q0 = q0 * q0;
58
+ const q1q1 = q1 * q1;
59
+ const q2q2 = q2 * q2;
60
+ const q3q3 = q3 * q3;
61
+ // ---- Gradient descent corrective step ----
62
+ // Objective: align estimated gravity direction with measured gravity.
63
+ let s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay;
64
+ let s1 = _4q1 * q3q3 - _2q3 * ax + 4 * q0q0 * q1 - _2q0 * ay - _4q1 +
65
+ _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az;
66
+ let s2 = 4 * q0q0 * q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 +
67
+ _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az;
68
+ let s3 = 4 * q1q1 * q3 - _2q1 * ax + 4 * q2q2 * q3 - _2q2 * ay;
69
+ const sNorm = s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3;
70
+ if (sNorm > 0) {
71
+ norm = 1 / Math.sqrt(sNorm);
72
+ s0 *= norm;
73
+ s1 *= norm;
74
+ s2 *= norm;
75
+ s3 *= norm;
76
+ }
77
+ // When sNorm ≈ 0, the accel already matches the estimated gravity
78
+ // direction — no correction needed, just integrate gyro.
79
+ // ---- Quaternion rate from gyroscope ----
80
+ const qDot0 = 0.5 * (-q1 * gx - q2 * gy - q3 * gz);
81
+ const qDot1 = 0.5 * (q0 * gx + q2 * gz - q3 * gy);
82
+ const qDot2 = 0.5 * (q0 * gy - q1 * gz + q3 * gx);
83
+ const qDot3 = 0.5 * (q0 * gz + q1 * gy - q2 * gx);
84
+ // ---- Fuse: gyro integration minus gradient correction ----
85
+ q0 += (qDot0 - (sNorm > 0 ? this.beta * s0 : 0)) * dt;
86
+ q1 += (qDot1 - (sNorm > 0 ? this.beta * s1 : 0)) * dt;
87
+ q2 += (qDot2 - (sNorm > 0 ? this.beta * s2 : 0)) * dt;
88
+ q3 += (qDot3 - (sNorm > 0 ? this.beta * s3 : 0)) * dt;
89
+ // ---- Re-normalize ----
90
+ norm = 1 / Math.sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
91
+ this.q = [q0 * norm, q1 * norm, q2 * norm, q3 * norm];
92
+ }
93
+ }
94
+ exports.MadgwickFilter = MadgwickFilter;
95
+ //# sourceMappingURL=madgwick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"madgwick.js","sourceRoot":"","sources":["../../src/motion/madgwick.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * High-level orientation tracker for the DualSense controller.
3
+ *
4
+ * Wraps the Madgwick AHRS filter and provides:
5
+ * - Fused orientation as Euler angles and quaternion
6
+ * - Accelerometer-only tilt (no drift, no yaw — useful for
7
+ * gravity-reference applications like steering)
8
+ * - Automatic unit conversion from the library's [-1, 1] calibrated
9
+ * values to the rad/s and g units the filter expects
10
+ *
11
+ * DualSense IMU hardware constants:
12
+ * Gyroscope: ±2000 deg/s full scale → 1.0 = 2000 deg/s
13
+ * Accelerometer: ±4 g full scale → 0.25 ≈ 1 g
14
+ */
15
+ import { type Quaternion } from "./quaternion";
16
+ export interface OrientationParams {
17
+ /**
18
+ * Madgwick filter gain. Higher = more accelerometer trust (less drift,
19
+ * more noise). Lower = smoother but driftier.
20
+ *
21
+ * - 0.01–0.04: very smooth, noticeable drift over minutes
22
+ * - 0.05–0.15: general purpose (default 0.1)
23
+ * - 0.2–0.5: aggressive correction, jittery under vibration
24
+ */
25
+ beta?: number;
26
+ }
27
+ export declare class Orientation {
28
+ /** Fused orientation as Euler angles (radians, updated each sample). */
29
+ pitch: number;
30
+ yaw: number;
31
+ roll: number;
32
+ /** Fused orientation as a unit quaternion [w, x, y, z]. */
33
+ quaternion: Quaternion;
34
+ /**
35
+ * Tilt derived from the accelerometer gravity vector alone.
36
+ * No drift, but also no yaw — only pitch and roll.
37
+ * Noisy during motion; best used when the controller is relatively still.
38
+ */
39
+ tiltPitch: number;
40
+ tiltRoll: number;
41
+ /** Madgwick filter gain. Can be adjusted at runtime. */
42
+ get beta(): number;
43
+ set beta(v: number);
44
+ private readonly filter;
45
+ constructor(params?: OrientationParams);
46
+ /** Reset to identity orientation (call when zeroing the view). */
47
+ reset(): void;
48
+ /**
49
+ * Incorporate one IMU sample. Called automatically by the Dualsense
50
+ * class on each HID report — you don't normally call this yourself.
51
+ *
52
+ * @param gx Calibrated gyro X (pitch), [-1, 1]
53
+ * @param gy Calibrated gyro Y (yaw), [-1, 1]
54
+ * @param gz Calibrated gyro Z (roll), [-1, 1]
55
+ * @param ax Calibrated accel X, [-1, 1]
56
+ * @param ay Calibrated accel Y, [-1, 1]
57
+ * @param az Calibrated accel Z, [-1, 1]
58
+ * @param dt Time delta in seconds
59
+ */
60
+ update(gx: number, gy: number, gz: number, ax: number, ay: number, az: number, dt: number): void;
61
+ }
62
+ //# sourceMappingURL=orientation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orientation.d.ts","sourceRoot":"","sources":["../../src/motion/orientation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAuC,MAAM,cAAc,CAAC;AAQpF,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IAGtB,wEAAwE;IACxE,KAAK,SAAK;IACV,GAAG,SAAK;IACR,IAAI,SAAK;IAET,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAiB;IAEvC;;;;OAIG;IACH,SAAS,SAAK;IACd,QAAQ,SAAK;IAIb,wDAAwD;IACxD,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAGD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,CAAC,EAAE,iBAAiB;IAItC,kEAAkE;IAClE,KAAK,IAAI,IAAI;IAUb;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI;CAmCR"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * High-level orientation tracker for the DualSense controller.
4
+ *
5
+ * Wraps the Madgwick AHRS filter and provides:
6
+ * - Fused orientation as Euler angles and quaternion
7
+ * - Accelerometer-only tilt (no drift, no yaw — useful for
8
+ * gravity-reference applications like steering)
9
+ * - Automatic unit conversion from the library's [-1, 1] calibrated
10
+ * values to the rad/s and g units the filter expects
11
+ *
12
+ * DualSense IMU hardware constants:
13
+ * Gyroscope: ±2000 deg/s full scale → 1.0 = 2000 deg/s
14
+ * Accelerometer: ±4 g full scale → 0.25 ≈ 1 g
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.Orientation = void 0;
18
+ const madgwick_1 = require("./madgwick");
19
+ const quaternion_1 = require("./quaternion");
20
+ /**
21
+ * Convert our [-1, 1] calibrated gyro value to rad/s.
22
+ * Full scale is ±2000 deg/s = ±34.9066 rad/s.
23
+ */
24
+ const GYRO_SCALE = 2000 * (Math.PI / 180); // ≈ 34.9066
25
+ class Orientation {
26
+ // ---- Configuration ----
27
+ /** Madgwick filter gain. Can be adjusted at runtime. */
28
+ get beta() {
29
+ return this.filter.beta;
30
+ }
31
+ set beta(v) {
32
+ this.filter.beta = v;
33
+ }
34
+ constructor(params) {
35
+ // ---- Public state (read these in your game loop) ----
36
+ /** Fused orientation as Euler angles (radians, updated each sample). */
37
+ this.pitch = 0;
38
+ this.yaw = 0;
39
+ this.roll = 0;
40
+ /** Fused orientation as a unit quaternion [w, x, y, z]. */
41
+ this.quaternion = [...quaternion_1.IDENTITY];
42
+ /**
43
+ * Tilt derived from the accelerometer gravity vector alone.
44
+ * No drift, but also no yaw — only pitch and roll.
45
+ * Noisy during motion; best used when the controller is relatively still.
46
+ */
47
+ this.tiltPitch = 0;
48
+ this.tiltRoll = 0;
49
+ this.filter = new madgwick_1.MadgwickFilter(params?.beta ?? 0.1);
50
+ }
51
+ /** Reset to identity orientation (call when zeroing the view). */
52
+ reset() {
53
+ this.filter.reset();
54
+ this.pitch = 0;
55
+ this.yaw = 0;
56
+ this.roll = 0;
57
+ this.quaternion = [...quaternion_1.IDENTITY];
58
+ this.tiltPitch = 0;
59
+ this.tiltRoll = 0;
60
+ }
61
+ /**
62
+ * Incorporate one IMU sample. Called automatically by the Dualsense
63
+ * class on each HID report — you don't normally call this yourself.
64
+ *
65
+ * @param gx Calibrated gyro X (pitch), [-1, 1]
66
+ * @param gy Calibrated gyro Y (yaw), [-1, 1]
67
+ * @param gz Calibrated gyro Z (roll), [-1, 1]
68
+ * @param ax Calibrated accel X, [-1, 1]
69
+ * @param ay Calibrated accel Y, [-1, 1]
70
+ * @param az Calibrated accel Z, [-1, 1]
71
+ * @param dt Time delta in seconds
72
+ */
73
+ update(gx, gy, gz, ax, ay, az, dt) {
74
+ // Remap DualSense axes to Madgwick's Z-up convention.
75
+ // DualSense: X = right, Y = up (gravity), Z = forward
76
+ // Madgwick: X = right, Y = forward, Z = up (gravity)
77
+ // Mapping: filter(X, Y, Z) = DS(X, -Z, Y)
78
+ this.filter.update(gx * GYRO_SCALE, // filter X = DS X (pitch axis)
79
+ -gz * GYRO_SCALE, // filter Y = -DS Z (negated forward)
80
+ gy * GYRO_SCALE, // filter Z = DS Y (gravity axis → up)
81
+ ax, // accel X unchanged
82
+ -az, // accel Y = -DS Z
83
+ ay, // accel Z = DS Y (gravity)
84
+ dt);
85
+ // Extract Euler angles and remap back to DualSense frame
86
+ this.quaternion = this.filter.q;
87
+ const euler = (0, quaternion_1.toEuler)(this.quaternion);
88
+ this.pitch = euler.pitch; // filter X rotation → DS pitch (forward/back)
89
+ this.yaw = euler.roll; // filter Z rotation → DS yaw (left/right turn)
90
+ this.roll = -euler.yaw; // filter Y rotation → DS roll (side tilt, negated)
91
+ // Accelerometer-only tilt (gravity reference)
92
+ // DualSense axes: X = lateral, Y = vertical (up at rest), Z = forward
93
+ // Pitch = forward/back tilt (around X): gravity shifts from Y toward Z
94
+ // Roll = side-to-side tilt (around Z): gravity shifts from Y toward X
95
+ const aNorm = Math.sqrt(ax * ax + ay * ay + az * az);
96
+ if (aNorm > 0) {
97
+ const nax = ax / aNorm;
98
+ const nay = ay / aNorm;
99
+ const naz = az / aNorm;
100
+ this.tiltPitch = Math.atan2(-naz, nay);
101
+ this.tiltRoll = Math.atan2(nax, Math.sqrt(nay * nay + naz * naz));
102
+ }
103
+ }
104
+ }
105
+ exports.Orientation = Orientation;
106
+ //# sourceMappingURL=orientation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/motion/orientation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Minimal quaternion math for AHRS sensor fusion.
3
+ *
4
+ * Quaternions are represented as [w, x, y, z] tuples where w is the
5
+ * scalar part. All functions are pure — no mutations, no allocations
6
+ * beyond the returned tuple.
7
+ */
8
+ /** A unit quaternion [w, x, y, z] representing a 3D orientation. */
9
+ export type Quaternion = [number, number, number, number];
10
+ /** Euler angles in radians, extracted from a quaternion. */
11
+ export interface EulerAngles {
12
+ /** Rotation around X axis (radians, -PI to PI) */
13
+ pitch: number;
14
+ /** Rotation around Y axis (radians, -PI to PI) */
15
+ yaw: number;
16
+ /** Rotation around Z axis (radians, -PI to PI) */
17
+ roll: number;
18
+ }
19
+ /** Identity quaternion — no rotation. */
20
+ export declare const IDENTITY: Quaternion;
21
+ /** Normalize a quaternion to unit length. */
22
+ export declare function normalize(q: Quaternion): Quaternion;
23
+ /**
24
+ * Extract Euler angles (Tait-Bryan ZYX intrinsic) from a unit quaternion.
25
+ *
26
+ * Convention: pitch = X-axis, yaw = Y-axis, roll = Z-axis.
27
+ * All angles in radians, range (-PI, PI].
28
+ */
29
+ export declare function toEuler(q: Quaternion): EulerAngles;
30
+ //# sourceMappingURL=quaternion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternion.d.ts","sourceRoot":"","sources":["../../src/motion/quaternion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,eAAO,MAAM,QAAQ,EAAE,UAAyB,CAAC;AAEjD,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAInD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,CAqBlD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal quaternion math for AHRS sensor fusion.
4
+ *
5
+ * Quaternions are represented as [w, x, y, z] tuples where w is the
6
+ * scalar part. All functions are pure — no mutations, no allocations
7
+ * beyond the returned tuple.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.IDENTITY = void 0;
11
+ exports.normalize = normalize;
12
+ exports.toEuler = toEuler;
13
+ /** Identity quaternion — no rotation. */
14
+ exports.IDENTITY = [1, 0, 0, 0];
15
+ /** Normalize a quaternion to unit length. */
16
+ function normalize(q) {
17
+ const [w, x, y, z] = q;
18
+ const invNorm = 1 / Math.sqrt(w * w + x * x + y * y + z * z);
19
+ return [w * invNorm, x * invNorm, y * invNorm, z * invNorm];
20
+ }
21
+ /**
22
+ * Extract Euler angles (Tait-Bryan ZYX intrinsic) from a unit quaternion.
23
+ *
24
+ * Convention: pitch = X-axis, yaw = Y-axis, roll = Z-axis.
25
+ * All angles in radians, range (-PI, PI].
26
+ */
27
+ function toEuler(q) {
28
+ const [w, x, y, z] = q;
29
+ // Roll (Z-axis)
30
+ const sinr = 2 * (w * z + x * y);
31
+ const cosr = 1 - 2 * (y * y + z * z);
32
+ const roll = Math.atan2(sinr, cosr);
33
+ // Pitch (X-axis)
34
+ const sinp = 2 * (w * x - y * z);
35
+ const pitch = Math.abs(sinp) >= 1
36
+ ? Math.sign(sinp) * (Math.PI / 2) // gimbal lock
37
+ : Math.asin(sinp);
38
+ // Yaw (Y-axis)
39
+ const siny = 2 * (w * y + z * x);
40
+ const cosy = 1 - 2 * (x * x + y * y);
41
+ const yaw = Math.atan2(siny, cosy);
42
+ return { pitch, yaw, roll };
43
+ }
44
+ //# sourceMappingURL=quaternion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternion.js","sourceRoot":"","sources":["../../src/motion/quaternion.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAmBH,8BAIC;AAQD,0BAqBC;AArCD,yCAAyC;AAC5B,QAAA,QAAQ,GAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjD,6CAA6C;AAC7C,SAAgB,SAAS,CAAC,CAAa;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,CAAa;IACnC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAEvB,gBAAgB;IAChB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEpC,iBAAiB;IACjB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;QAChD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtB,eAAe;IACf,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Shake detector with frequency-band energy analysis.
3
+ *
4
+ * Maintains circular buffers of per-axis acceleration samples. Shake
5
+ * intensity is computed via RMS of the acceleration magnitude deviation
6
+ * from its mean (high-pass to remove gravity). The dominant shake
7
+ * frequency is identified using the Goertzel algorithm — a single-bin
8
+ * DFT that's far cheaper than a full FFT — applied to the first-
9
+ * difference of individual axis signals:
10
+ *
11
+ * - Per-axis preserves the fundamental frequency (magnitude would
12
+ * full-wave-rectify the signal, doubling the apparent frequency).
13
+ * - First-difference acts as a high-pass filter, removing DC (gravity)
14
+ * and low-frequency drift from arm movement. Its gain is proportional
15
+ * to frequency, so the Goertzel output naturally favors oscillatory
16
+ * shake signals over slow drift — no ad-hoc weighting needed.
17
+ *
18
+ * A 1/freq compensation is applied so the net effective weighting is
19
+ * proportional to freq (diff-filter gain² ∝ freq², divided by freq),
20
+ * giving moderate preference to actual shake frequencies without
21
+ * completely suppressing sub-1 Hz rocking.
22
+ *
23
+ * `.frequency` reports the **reversal rate** (2× fundamental) — how many
24
+ * direction changes per second. This matches the intuitive "how fast am
25
+ * I shaking it?" mental model. `.fundamental` reports the true oscillation
26
+ * frequency (one full back-and-forth cycle).
27
+ *
28
+ * The active flag uses a sustain counter to require several consecutive
29
+ * frames above threshold before triggering, preventing transient jolts
30
+ * from registering as shakes.
31
+ */
32
+ /** A single frequency bin with its associated power level. */
33
+ export interface FrequencyBin {
34
+ /** Frequency in Hz. */
35
+ freq: number;
36
+ /** Weighted power (arbitrary units, relative within the array). */
37
+ power: number;
38
+ }
39
+ /** Configuration for the shake detector. */
40
+ export interface ShakeDetectorParams {
41
+ /** Intensity (0–1) above which `.active` becomes true. Default 0.15. */
42
+ threshold?: number;
43
+ /** Number of samples in the analysis window. Default 256 (~1s at 250 Hz, ~3s at 84 Hz in browser). */
44
+ windowSize?: number;
45
+ /**
46
+ * Number of consecutive above-threshold frames required before `.active`
47
+ * becomes true. Also the number of below-threshold frames required to
48
+ * deactivate. Default 15 (~60 ms at 250 Hz).
49
+ */
50
+ sustain?: number;
51
+ /** Frequency bin resolution in Hz. Default 0.25. Smaller = finer but more bins to compute. */
52
+ freqStep?: number;
53
+ /** Minimum detectable frequency in Hz. Default 0.25. */
54
+ freqMin?: number;
55
+ /** Maximum detectable frequency in Hz. Default 15. */
56
+ freqMax?: number;
57
+ }
58
+ export declare class ShakeDetector {
59
+ /** Whether the controller is currently being shaken (sustained). */
60
+ active: boolean;
61
+ /** Shake intensity from 0 (still) to 1 (violent shake). */
62
+ intensity: number;
63
+ /**
64
+ * Dominant shake frequency in Hz as a **reversal rate** — how many
65
+ * direction changes per second (2× the fundamental oscillation
66
+ * frequency). 0 when not shaking.
67
+ */
68
+ frequency: number;
69
+ /**
70
+ * Fundamental oscillation frequency in Hz — one complete back-and-forth
71
+ * cycle. Equal to `frequency / 2`. 0 when not shaking.
72
+ */
73
+ fundamental: number;
74
+ /** Intensity threshold for `active`. */
75
+ threshold: number;
76
+ /** Estimated sample rate in Hz (derived from dt). Useful for diagnostics. */
77
+ get inputRate(): number;
78
+ /** Number of samples in the analysis window. Can be changed at runtime (resets state). */
79
+ get windowSize(): number;
80
+ set windowSize(n: number);
81
+ /**
82
+ * Current frequency spectrum — weighted power at each probed bin.
83
+ * Updated every frame when intensity is above half the threshold.
84
+ * Useful for visualization/diagnostics.
85
+ */
86
+ get spectrum(): readonly FrequencyBin[];
87
+ private bufX;
88
+ private bufY;
89
+ private bufZ;
90
+ private head;
91
+ private filled;
92
+ private _sampleRate;
93
+ /** Sustain counter for debounce — counts up when above threshold, down when below. */
94
+ private sustainCounter;
95
+ private readonly sustainRequired;
96
+ /** EMA-smoothed frequency for stable readout. */
97
+ private smoothedFreq;
98
+ /** Frequency bins to probe, built from constructor params. */
99
+ private readonly freqBins;
100
+ /** Bin step size, used for snapping the EMA output. */
101
+ private readonly freqStep;
102
+ /** Latest computed bin powers. */
103
+ private _bins;
104
+ /**
105
+ * Scale factor: maps RMS of our [-1, 1] calibrated accel deviation
106
+ * to a 0–1 intensity. A vigorous shake produces magnitude-RMS of
107
+ * ~0.3–0.5 in our units; this maps that to ~0.6–1.0 intensity.
108
+ */
109
+ private static readonly INTENSITY_SCALE;
110
+ constructor(params?: ShakeDetectorParams);
111
+ /** Reset all state (call on disconnect). */
112
+ reset(): void;
113
+ /**
114
+ * Feed one accelerometer sample.
115
+ *
116
+ * @param ax Calibrated accel X ([-1, 1])
117
+ * @param ay Calibrated accel Y ([-1, 1])
118
+ * @param az Calibrated accel Z ([-1, 1])
119
+ * @param dt Time delta in seconds since last sample
120
+ */
121
+ update(ax: number, ay: number, az: number, dt: number): void;
122
+ /**
123
+ * Goertzel algorithm: compute power at a single target frequency.
124
+ *
125
+ * Operates on the first-difference of the filled portion of a circular
126
+ * buffer. The first-difference (x[n] - x[n-1]) acts as a high-pass
127
+ * filter that removes DC (gravity) and low-frequency arm drift, with
128
+ * gain proportional to frequency.
129
+ */
130
+ private goertzel;
131
+ }
132
+ //# sourceMappingURL=shake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shake.d.ts","sourceRoot":"","sources":["../../src/motion/shake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,oEAAoE;IACpE,MAAM,UAAS;IAEf,2DAA2D;IAC3D,SAAS,SAAK;IAEd;;;;OAIG;IACH,SAAS,SAAK;IAEd;;;OAGG;IACH,WAAW,SAAK;IAEhB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAElB,6EAA6E;IAC7E,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,0FAA0F;IAC1F,IAAI,UAAU,IAAI,MAAM,CAEvB;IACD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAcvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,SAAS,YAAY,EAAE,CAEtC;IAGD,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAO;IAE1B,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,iDAAiD;IACjD,OAAO,CAAC,YAAY,CAAK;IAEzB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,kCAAkC;IAClC,OAAO,CAAC,KAAK,CAAsB;IAEnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAK;gBAEhC,MAAM,CAAC,EAAE,mBAAmB;IAiBxC,4CAA4C;IAC5C,KAAK,IAAI,IAAI;IAgBb;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IA4F5D;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;CAwBjB"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Shake detector with frequency-band energy analysis.
4
+ *
5
+ * Maintains circular buffers of per-axis acceleration samples. Shake
6
+ * intensity is computed via RMS of the acceleration magnitude deviation
7
+ * from its mean (high-pass to remove gravity). The dominant shake
8
+ * frequency is identified using the Goertzel algorithm — a single-bin
9
+ * DFT that's far cheaper than a full FFT — applied to the first-
10
+ * difference of individual axis signals:
11
+ *
12
+ * - Per-axis preserves the fundamental frequency (magnitude would
13
+ * full-wave-rectify the signal, doubling the apparent frequency).
14
+ * - First-difference acts as a high-pass filter, removing DC (gravity)
15
+ * and low-frequency drift from arm movement. Its gain is proportional
16
+ * to frequency, so the Goertzel output naturally favors oscillatory
17
+ * shake signals over slow drift — no ad-hoc weighting needed.
18
+ *
19
+ * A 1/freq compensation is applied so the net effective weighting is
20
+ * proportional to freq (diff-filter gain² ∝ freq², divided by freq),
21
+ * giving moderate preference to actual shake frequencies without
22
+ * completely suppressing sub-1 Hz rocking.
23
+ *
24
+ * `.frequency` reports the **reversal rate** (2× fundamental) — how many
25
+ * direction changes per second. This matches the intuitive "how fast am
26
+ * I shaking it?" mental model. `.fundamental` reports the true oscillation
27
+ * frequency (one full back-and-forth cycle).
28
+ *
29
+ * The active flag uses a sustain counter to require several consecutive
30
+ * frames above threshold before triggering, preventing transient jolts
31
+ * from registering as shakes.
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.ShakeDetector = void 0;
35
+ class ShakeDetector {
36
+ /** Estimated sample rate in Hz (derived from dt). Useful for diagnostics. */
37
+ get inputRate() {
38
+ return this._sampleRate;
39
+ }
40
+ /** Number of samples in the analysis window. Can be changed at runtime (resets state). */
41
+ get windowSize() {
42
+ return this.bufX.length;
43
+ }
44
+ set windowSize(n) {
45
+ if (n === this.bufX.length)
46
+ return;
47
+ this.bufX = new Float64Array(n);
48
+ this.bufY = new Float64Array(n);
49
+ this.bufZ = new Float64Array(n);
50
+ this.head = 0;
51
+ this.filled = 0;
52
+ this.smoothedFreq = 0;
53
+ this.sustainCounter = 0;
54
+ this.active = false;
55
+ this.intensity = 0;
56
+ this.frequency = 0;
57
+ this.fundamental = 0;
58
+ this._bins = [];
59
+ }
60
+ /**
61
+ * Current frequency spectrum — weighted power at each probed bin.
62
+ * Updated every frame when intensity is above half the threshold.
63
+ * Useful for visualization/diagnostics.
64
+ */
65
+ get spectrum() {
66
+ return this._bins;
67
+ }
68
+ constructor(params) {
69
+ /** Whether the controller is currently being shaken (sustained). */
70
+ this.active = false;
71
+ /** Shake intensity from 0 (still) to 1 (violent shake). */
72
+ this.intensity = 0;
73
+ /**
74
+ * Dominant shake frequency in Hz as a **reversal rate** — how many
75
+ * direction changes per second (2× the fundamental oscillation
76
+ * frequency). 0 when not shaking.
77
+ */
78
+ this.frequency = 0;
79
+ /**
80
+ * Fundamental oscillation frequency in Hz — one complete back-and-forth
81
+ * cycle. Equal to `frequency / 2`. 0 when not shaking.
82
+ */
83
+ this.fundamental = 0;
84
+ this.head = 0;
85
+ this.filled = 0;
86
+ this._sampleRate = 250; // estimated, updated from dt
87
+ /** Sustain counter for debounce — counts up when above threshold, down when below. */
88
+ this.sustainCounter = 0;
89
+ /** EMA-smoothed frequency for stable readout. */
90
+ this.smoothedFreq = 0;
91
+ /** Latest computed bin powers. */
92
+ this._bins = [];
93
+ this.threshold = params?.threshold ?? 0.15;
94
+ this.sustainRequired = params?.sustain ?? 15;
95
+ const windowSize = params?.windowSize ?? 256;
96
+ this.bufX = new Float64Array(windowSize);
97
+ this.bufY = new Float64Array(windowSize);
98
+ this.bufZ = new Float64Array(windowSize);
99
+ this.freqStep = params?.freqStep ?? 0.25;
100
+ const freqMin = params?.freqMin ?? 0.25;
101
+ const freqMax = params?.freqMax ?? 15;
102
+ this.freqBins = [];
103
+ for (let f = freqMin; f <= freqMax + 1e-9; f += this.freqStep) {
104
+ this.freqBins.push(Math.round(f * 1000) / 1000); // avoid float drift
105
+ }
106
+ }
107
+ /** Reset all state (call on disconnect). */
108
+ reset() {
109
+ this.bufX.fill(0);
110
+ this.bufY.fill(0);
111
+ this.bufZ.fill(0);
112
+ this.head = 0;
113
+ this.filled = 0;
114
+ this.intensity = 0;
115
+ this.frequency = 0;
116
+ this.fundamental = 0;
117
+ this.active = false;
118
+ this._sampleRate = 250;
119
+ this.sustainCounter = 0;
120
+ this.smoothedFreq = 0;
121
+ this._bins = [];
122
+ }
123
+ /**
124
+ * Feed one accelerometer sample.
125
+ *
126
+ * @param ax Calibrated accel X ([-1, 1])
127
+ * @param ay Calibrated accel Y ([-1, 1])
128
+ * @param az Calibrated accel Z ([-1, 1])
129
+ * @param dt Time delta in seconds since last sample
130
+ */
131
+ update(ax, ay, az, dt) {
132
+ // Update sample rate estimate (exponential moving average)
133
+ if (dt > 0 && dt < 0.1) {
134
+ const instantRate = 1 / dt;
135
+ this._sampleRate += 0.1 * (instantRate - this._sampleRate);
136
+ }
137
+ // Store per-axis acceleration in circular buffers
138
+ const len = this.bufX.length;
139
+ this.bufX[this.head] = ax;
140
+ this.bufY[this.head] = ay;
141
+ this.bufZ[this.head] = az;
142
+ this.head = (this.head + 1) % len;
143
+ if (this.filled < len)
144
+ this.filled++;
145
+ // Need at least half a window to produce meaningful results
146
+ if (this.filled < len / 2)
147
+ return;
148
+ // ---- Intensity: RMS of magnitude deviation from mean ----
149
+ const n = this.filled;
150
+ const start = n < len ? 0 : this.head;
151
+ // Compute acceleration magnitudes and their mean
152
+ let magSum = 0;
153
+ for (let i = 0; i < n; i++) {
154
+ const idx = (start + i) % len;
155
+ const x = this.bufX[idx], y = this.bufY[idx], z = this.bufZ[idx];
156
+ magSum += Math.sqrt(x * x + y * y + z * z);
157
+ }
158
+ const magMean = magSum / n;
159
+ let sumSq = 0;
160
+ for (let i = 0; i < n; i++) {
161
+ const idx = (start + i) % len;
162
+ const x = this.bufX[idx], y = this.bufY[idx], z = this.bufZ[idx];
163
+ const d = Math.sqrt(x * x + y * y + z * z) - magMean;
164
+ sumSq += d * d;
165
+ }
166
+ const rms = Math.sqrt(sumSq / n);
167
+ this.intensity = Math.min(1, rms * ShakeDetector.INTENSITY_SCALE);
168
+ // ---- Frequency: per-axis Goertzel on first-difference signal ----
169
+ if (this.intensity > this.threshold * 0.5) {
170
+ let peakPower = 0;
171
+ let peakFreq = 0;
172
+ this._bins = new Array(this.freqBins.length);
173
+ for (let b = 0; b < this.freqBins.length; b++) {
174
+ const freq = this.freqBins[b];
175
+ const px = this.goertzel(freq, this.bufX);
176
+ const py = this.goertzel(freq, this.bufY);
177
+ const pz = this.goertzel(freq, this.bufZ);
178
+ // The first-difference filter has gain ∝ freq², so raw Goertzel
179
+ // power is ∝ freq² × signal_power. Divide by freq to get net
180
+ // weighting ∝ freq — moderate preference for shake frequencies
181
+ // without killing sub-1 Hz rocking.
182
+ const power = Math.max(px, py, pz) / freq;
183
+ this._bins[b] = { freq, power };
184
+ if (power > peakPower) {
185
+ peakPower = power;
186
+ peakFreq = freq;
187
+ }
188
+ }
189
+ // EMA-smooth the frequency reading for stability.
190
+ // α = 0.2 gives ~5-frame smoothing at 250 Hz.
191
+ const alpha = 0.2;
192
+ if (this.smoothedFreq === 0) {
193
+ this.smoothedFreq = peakFreq;
194
+ }
195
+ else {
196
+ this.smoothedFreq += alpha * (peakFreq - this.smoothedFreq);
197
+ }
198
+ // Snap to nearest bin step for clean readout
199
+ const snapped = Math.round(this.smoothedFreq / this.freqStep) * this.freqStep;
200
+ this.fundamental = snapped;
201
+ this.frequency = snapped * 2; // reversal rate
202
+ }
203
+ else {
204
+ this.smoothedFreq = 0;
205
+ this.frequency = 0;
206
+ this.fundamental = 0;
207
+ this._bins = [];
208
+ }
209
+ // ---- Sustain: require consecutive frames to activate/deactivate ----
210
+ if (this.intensity > this.threshold) {
211
+ this.sustainCounter = Math.min(this.sustainCounter + 1, this.sustainRequired * 2);
212
+ }
213
+ else {
214
+ this.sustainCounter = Math.max(this.sustainCounter - 1, 0);
215
+ }
216
+ this.active = this.sustainCounter >= this.sustainRequired;
217
+ }
218
+ /**
219
+ * Goertzel algorithm: compute power at a single target frequency.
220
+ *
221
+ * Operates on the first-difference of the filled portion of a circular
222
+ * buffer. The first-difference (x[n] - x[n-1]) acts as a high-pass
223
+ * filter that removes DC (gravity) and low-frequency arm drift, with
224
+ * gain proportional to frequency.
225
+ */
226
+ goertzel(targetFreq, buf) {
227
+ const N = this.filled;
228
+ const k = (targetFreq * N) / this._sampleRate;
229
+ const w = (2 * Math.PI * k) / N;
230
+ const coeff = 2 * Math.cos(w);
231
+ let s1 = 0;
232
+ let s2 = 0;
233
+ const start = this.filled < buf.length ? 0 : this.head;
234
+ let prevSample = buf[start % buf.length];
235
+ for (let i = 0; i < N; i++) {
236
+ const idx = (start + i) % buf.length;
237
+ const raw = buf[idx];
238
+ const x = raw - prevSample; // first-difference high-pass
239
+ prevSample = raw;
240
+ const s0 = x + coeff * s1 - s2;
241
+ s2 = s1;
242
+ s1 = s0;
243
+ }
244
+ return s1 * s1 + s2 * s2 - coeff * s1 * s2;
245
+ }
246
+ }
247
+ exports.ShakeDetector = ShakeDetector;
248
+ /**
249
+ * Scale factor: maps RMS of our [-1, 1] calibrated accel deviation
250
+ * to a 0–1 intensity. A vigorous shake produces magnitude-RMS of
251
+ * ~0.3–0.5 in our units; this maps that to ~0.6–1.0 intensity.
252
+ */
253
+ ShakeDetector.INTENSITY_SCALE = 2;
254
+ //# sourceMappingURL=shake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shake.js","sourceRoot":"","sources":["../../src/motion/shake.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dualsense-ts",
3
- "version": "6.12.0",
3
+ "version": "6.13.0",
4
4
  "description": "The natural interface for your DualSense controller, with Typescript",
5
5
  "keywords": [
6
6
  "dualsense",