Skip to content

feat(rapoo): drive the VT9 Pro through the Rapoo HID client - #422

Merged
snekxs merged 1 commit into
OpenMouse-Project:mainfrom
LinkPass888:feat/rapoo-vt9-pro
Sep 30, 2026
Merged

snekxs merged 1 commit into
OpenMouse-Project:mainfrom
LinkPass888:feat/rapoo-vt9-pro

Conversation

@LinkPass888

@LinkPass888 LinkPass888 commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

mouse-protocol gains a Rapoo codec and a RapooHidClient for the Rapoo VT9 Pro
(0x24AE:0x1205 receiver, 0x24AE:0x4405 cable). This adds that client to
NEEDS_OPEN, the list of clients the controller opens on connect.

The entry matters for this driver specifically: the mouse answers on its own
vendor collection (FF00:0x000E), so nothing else would open that interface. If
it stays closed, readStatus() never runs and the device looks like any other
unknown mouse.

Behaviour

  • With OpenMouse Bridge installed, the connection read unlocks DPI, polling rate,
    motion sync, debounce and the sleep timer: receiveInputReport is what makes
    the register channel readable, and on hardware the walk returned the full map
    (4000 Hz, 800 DPI, 16 ms debounce, battery 100 %).
  • Without Bridge, the client sends nothing and reports the battery the mouse
    pushes on its own, so the device is still useful in the browser.

Review notes

  • Every byte the driver reads was taken from a real mouse on both USB paths; the
    protocol notes and the sanitized capture ship with the mouse-protocol PR.
  • The driver is read-only and never reads feature report 0x2B, which drops the
    device off the bus until it is unplugged and replugged.

Companion PR

OpenMouse-Project/mouse-protocol#147 (the driver itself).

Depends on the protocol release

This PR needs the companion mouse-protocol PR to be merged and published:
until then the @openmouse/protocol version in package.json has no
drivers/rapoo/hid, so the import cannot resolve. That dependency is bumped from
the published release by .github/workflows/update-protocol.yml, which is why
this PR does not touch package.json itself.

Keeping it a draft until that release exists.

The mouse-protocol PR that adds the Rapoo codec and its WebHID client
also adds RapooHidClient, and it was not on the list of clients the
controller opens on connect. Without that entry the driver never gets to
run against a device that is already picked, which is the whole point of
the client: it answers on its own vendor collection, so nothing else
notices it.

The client reports the battery on its own when the transport has no
receiveInputReport (WebHID alone cannot read the register channel), and
when OpenMouse Bridge supplies it the same connect path unlocks DPI,
polling rate and the sensor settings.
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.

2 participants