Skip to content

feat(pulsar): Pulsar 4K receiver support with corrected DPI encoding - #20

Merged
jazzstack merged 2 commits into
OpenMouse-Project:mainfrom
jazzstack:main
Aug 16, 2026
Merged

feat(pulsar): Pulsar 4K receiver support with corrected DPI encoding#20
jazzstack merged 2 commits into
OpenMouse-Project:mainfrom
jazzstack:main

Conversation

@jazzstack

Copy link
Copy Markdown
Contributor

Summary

Adds support for the Pulsar 4K Wireless Receiver, which ships with the X2 V2 4K dongle kit. The receiver does not enumerate under Pulsar's vendor id — it exposes the shared Teevolution/VGN vendor id (0x3554) and speaks the same report-8 16-byte protocol as Pulsar receivers.

Changes

  • src/drivers/pulsar/pulsar-hid.ts — accept the 4K receiver under VID 0x3554, excluding product ids already claimed by the Teevolution and VGN drivers; expose real supported polling rates (125–8000 Hz) capped by the connection's maximum; guard setPollingRate against exceeding the connection max.
  • src/pulsar/index.ts — correct the DPI encode/decode for the 4K receiver (50 DPI steps over 50–26,000 DPI); reject invalid DPI values with a clear error.
  • src/drivers/vendors.ts — add the VGN VID filter so the receiver stays visible in the device picker.
  • Tests for the new encoding and receiver behavior.

Hardware verification

  • Pulsar X2 V2 (Red Edition, Medium) with the Pulsar 4K Wireless Receiver — verified on Windows against the physical hardware: device detection, DPI read/write (50–26,000), polling rate read/write (125–8000 Hz), and profile/battery reporting all confirmed.

The Pulsar 4K Wireless Receiver enumerates under VID 0x3554 (shared with
Teevolution and VGN) and speaks the same report-8 16-byte protocol as
Pulsar receivers, so PulsarHidClient accepts it. Product ids already
claimed by the Teevolution and VGN drivers stay with those drivers, and
the broad VID-only filter keeps the receiver visible in the picker.
The Pulsar 4K Wireless Receiver speaks the shared VGN protocol, where DPI
stages are 50-step values (raw + 1) * 50, not the 10-step + dpiEx scheme
the pulsar codec assumed. The mouse's own flash slots and DPI button cycle
only decode cleanly under the 50-step scheme, and the app's previous 800 DPI
write actually ran the sensor at 4000 DPI. Switch pulsarDecodeDpi,
pulsarEncodeDpi, and pulsarDpiOptions to the 50-step encoding.

Also expose supportedPollingRates capped at maximumPollingRateHz and reject
setPollingRate calls above it, so a 4K receiver no longer offers an 8K
option in the UI.
@jazzstack
jazzstack merged commit 3c3a445 into OpenMouse-Project:main Aug 16, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant