dualsense-ts
Version:
The natural interface for your DualSense and DualSense Access controllers, with Typescript
290 lines (166 loc) • 9.79 kB
Markdown
# Changelog
All notable changes to `dualsense-ts` are documented here. This project uses [Semantic Versioning](https://semver.org/).
## [6.15.0] - 2026-04-15
### Added
- **DualSense Access profile-mapped inputs**: `DualsenseAccess` now exposes a full DualSense-compatible input layer driven by the controller's active profile
- Mapped sticks (`left.analog`, `right.analog`), triggers (`left.trigger`, `right.trigger`), bumpers (`left.bumper`, `right.bumper`), face buttons (`cross`, `circle`, `square`, `triangle`), D-pad, touchpad button, `options`, `create`, and `mute`
- Same property names and types as `Dualsense` - code written for one works on both
- Bluetooth limited mode (Report 0x01) now parses the mapped header, providing mapped inputs before Feature Report 0x05 triggers full mode
- **Documentation app**: expanded Access section with 7 pages - Overview (with DualSense comparison table), Access Playground (interactive demo with all inputs and LED controls), Hardware Inputs, Profile Inputs, LED Control, Profile Management (WIP), and Expansion Slots (WIP)
- Updated README with profile-mapped input examples and revised comparison table
## [6.14.0] - 2026-04-14
### Added
- **DualSense Access controller support**: new `DualsenseAccess` class with full input reading and LED control over USB and Bluetooth
- **Inputs**: 8 hardware buttons (B1–B8), center button, PS button, profile cycle button, analog stick (X/Y/click), battery level and charge status, active profile ID (1–3)
- **LED output**: RGB lightbar, 3-segment profile LEDs (off/on/fade/sweep), 6-segment player indicator (patterns 1–4), white status LED — all controllable over both USB and BT
- **Bluetooth**: full Report 0x31 support with automatic firmware animation dismiss on connect, CRC32 output reports, and Feature Report 0x05 mode switch
- **Transports**: `AccessNodeHIDProvider` (node-hid) with multi-device enumeration and serial number targeting, `AccessWebHIDProvider` (WebHID) with permission dialog and device replacement, `AccessNullHIDProvider` (headless/testing)
- **Identity**: firmware version, factory info (serial number, body color, board revision), and MAC address loaded automatically on connect with retry/backoff
- **Documentation app**: new Access controller page with connect button, button state grid, stick visualization, and interactive LED controls
- Hardware verification script (`scripts/verify_access.ts`) for walking through all input/output stages with a physical controller
- Diagnostic scripts for BT LED protocol research (`scripts/access_led_demo.ts`, `scripts/access_bt_led_sweep.ts`, `scripts/access_bt_init_find.ts`)
### Fixed
- `Dualsense` constructor used `params.square` instead of `params.connection` when configuring the connection input (copy-paste bug, no practical effect since `InputParams` only controls icon/name/threshold)
## [6.13.0] - 2026-04-13
### Added
- **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
- **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
- Axis remapping from DualSense Y-up to Madgwick Z-up convention for correct symmetric tilt behavior
- Zero-gradient guard in the Madgwick filter to prevent NaN when gravity is already aligned
- New `motion/` module: `Orientation`, `ShakeDetector`, `MadgwickFilter`, quaternion math — all zero-dependency
## [6.12.0] - 2026-04-14
### Added
- **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
- `controller.calibration` exposes the resolved calibration factors for inspection and diagnostics
## [6.11.0] - 2026-04-13
### Added
- **Power save control**: `controller.powerSave` allows selectively disabling touch, motion, haptics, or audio processing on the controller to conserve battery. Supports individual property setters, bulk `set()`, and `reset()`
## [6.10.0] - 2026-04-13
### Added
- **Sensor timestamp**: `controller.sensorTimestamp` exposes the 32-bit monotonic microsecond counter from each input report, enabling precise time deltas for gyroscope integration and frame-rate-independent motion processing
- `ByteArray.readUint32LE` for reading 32-bit little-endian values from HID reports
### Changed
- **TypeScript 6.0**: upgraded from 5.8; migrated to `module: "Node16"` / `moduleResolution: "Node16"` with explicit `types` declarations and `isolatedModules: true`
- **ESLint 10**: upgraded from 9; added `@eslint/js` as explicit dependency (unbundled in ESLint 10)
- Bumped CI actions: `actions/checkout` v6, `actions/setup-node` v6, `actions/download-artifact` v8, `dependabot/fetch-metadata` v3
## [6.9.10] - 2026-04-13
### Fixed
- Fix for rendering docs pages in unsupported browsers
### Added
- `null_hid_provider` to simplify compatibility for incompatible browser environments
## [6.9.5] - 2026-04-13
### Added
- A new interactive documentation app is now available for your enjoyment
## [6.9.4] - 2026-04-13
### Fixed
- Input events no longer fire when there are no listeners, improving performance by 11%
### Added
- A new benchmarking script is provided to set performance baselines for the package
## [6.9.3] - 2026-04-13
### Fixed
- Cleaned up npm bundling, reducing package size by over 50%
## [6.9.0] - 2026-04-12
### Added
- `dispose()` method on `Dualsense` and `DualsenseHID` for proper cleanup
- `exports` field in package.json for modern bundler/ESM resolution
### Changed
- Upgraded Node 16 → 22, TypeScript 4.6 → 5.8, Jest 27 → 29, ESLint 8 → 9
- Migrated ESLint to flat config (`eslint.config.mjs`)
- Replaced `ts-node` with `tsx` for dev scripts
- Removed unused webpack dev server setup and 6 excess devDependencies
- Trimmed npm package from 437 files to ~170 (whitelist via `files` field)
- Updated CI workflow: modern action versions, `--frozen-lockfile`, build artifacts
- Expanded test suite from 26 to 200 tests across 25 suites
### Fixed
- Timer leak in `Dualsense` and `DualsenseHID` (intervals not cleared on dispose)
- README syntax errors in code examples
## [6.8.0] - 2026-04-12
### Changed
- License changed to LGPL-v3
## [6.7.0] - 2026-04-11
### Added
- Audio support (speaker output)
### Fixed
- Fixes for node-hid compatibility issues
- Fixes for rumble quirks
## [6.6.0] - 2026-04-11
### Added
- Mute LED override support
## [6.5.0] - 2026-04-11
### Added
- EventEmitter-style listener management (`on`, `off`, `once`, etc.)
## [6.4.0] - 2026-04-11
### Added
- Firmware version lookup
- Improved multi-controller behavior
## [6.3.0] - 2026-04-04
### Added
- Microphone and headphone detection
## [6.2.0] - 2026-04-04
### Added
- Multiplayer support (connect and manage multiple controllers)
- Seamless switching between wired and wireless connections
### Fixed
- Bad browser fallback in demo app
### Changed
- Improved the WebHID example/demo app
## [6.1.0] - 2026-04-03
### Added
- Light bar control (player LEDs and light bar color)
- Battery level readings
## [6.0.0] - 2026-04-02
### Added
- Trigger haptic feedback (adaptive triggers)
- Haptic feedback support over Bluetooth and WebHID
### Changed
- **Breaking:** Haptics API restructured for trigger feedback support
## [5.5.0] - 2023-11-26
### Added
- Gyroscope and accelerometer (motion sensor) support
## [5.4.0] - 2023-11-19
### Fixed
- HID report mapping for all report styles (USB, Bluetooth, WebHID)
- D-pad input conflicts resolved
## [5.3.0] - 2023-11-16
### Added
- Debugging tools for inspecting controller state
### Fixed
- GitHub Pages deployment for the demo app
## [5.2.0] - 2023-11-15
### Added
- Wired/wireless connection detection in WebHID mode
## [5.1.0] - 2023-03-04
### Added
- Rumble (haptic motor) support
- Tool for forcing wired/wireless behavior
### Changed
- Enabled `@typescript-eslint/strict` for stricter type checking
### Fixed
- Undefined `window` check for HID provider
## [5.0.0] - 2022-10-10
### Changed
- **Breaking:** No-throw constructor; the `Dualsense` constructor no longer throws when a controller is not connected
- New connection state interface for monitoring controller connectivity
### Fixed
- Reduced excess analog input events
- Improved analog input handling
## [4.0.0] - 2022-10-01
### Changed
- **Breaking:** `node-hid` is now a peer dependency (consumers must install it themselves)
### Fixed
- Excessive HID reconnect attempts
- Overhauled WebHID connection strategy for improved reliability
- Fixed bad HID connection check
## [3.1.0] - 2022-09-03
### Added
- Scaled deadzone for analog inputs (sticks and triggers)
## [3.0.0] - 2022-07-15
### Added
- **Breaking:** Browser support via WebHID API
- Tests and fixed default analog threshold
## [2.2.0] - 2022-06-24
### Changed
- Improved analog threshold setting
- Improved README examples
## [2.1.39] - 2022-06-21
Initial tagged release. Basic DualSense controller support via `node-hid` with button, stick, and trigger inputs.