UMBRA-13: Add DeviceSpecs for six one-off mice (Imperator, Ouroboros, Taipan, Diamondback Chroma, Atheris, HyperPolling dongle) #11

Merged
David merged 1 commit from feat/oneoff-mice-devicespecs-UMBRA-13 into main 2026-06-06 11:04:40 +02:00
Owner

UMBRA-13: Add DeviceSpecs for six one-off mice (Imperator, Ouroboros, Taipan, Diamondback Chroma, Atheris, HyperPolling dongle)

Resolves UMBRA-13.

Registers the six remaining one-off mouse PIDs from OpenRazer's driver/razermouse_driver.h as standalone DeviceSpecs under crates/umbra-hid/src/models/, so the OpenRazer mouse PID space is fully accounted for in umbra. Every transaction ID, DPI/poll path, lighting surface, and battery/idle flag was read branch-by-branch from razermouse_driver.c; a single device may use different transaction IDs per command class.

Added

PID Model DPI max Poll Lighting Battery Notes
0x002F Razer Imperator 2012 6400 yes (0xFF) none n/a classic on/off LEDs unmodelled
0x0032 Razer Ouroboros 2012 8200 yes (0xFF) none yes (0xFF) AA-powered; scroll on/off LED unmodelled
0x0034 Razer Taipan 8200 yes (0xFF) none n/a classic on/off LEDs unmodelled
0x004C Razer Diamondback Chroma 16000 no none n/a standard-matrix (class 0x03) path + no poll attr
0x0062 Razer Atheris (Receiver) 7200 yes (0x1f) none yes (0x1f) dpi/poll/battery 0x1f, idle 0xFF
0x00B3 Razer HyperPolling Wireless Dongle 30000 no none yes (0x1f) set_polling_rate2 path unmodelled

Decisions (AC)

  • Atheris receiver (0x0062) and HyperPolling dongle (0x00B3): both INCLUDED. The driver registers a full DPI / poll / battery / idle control attribute set directly against each PID in razer_mouse_probe, so each enumerates as a configurable endpoint umbra can talk to. This follows the UMBRA-1 dock/receiver precedent (registration is the include test).
  • Omissions are recorded as None with a doc comment, per the naga_2012 precedent: classic on/off set_led_state lighting (Imperator, Taipan, Ouroboros); the Diamondback Chroma's standard-matrix (class 0x03) lighting path (umbra builds only the extended-matrix class 0x0F path); the Diamondback's polling (the driver registers no poll-rate attribute for that PID); the HyperPolling dongle's polling (it uses the set_polling_rate2 two-step path the 4/8 kHz devices use, which umbra does not build).
  • Mixed transaction IDs are modelled per command class, not assumed uniform. The Atheris is the clearest case: dpi/poll/battery on 0x1f but idle on 0xFF.
  • DPI maxima are sensor-derived assumptions documented in each file (the driver does not clamp DPI). The HyperPolling dongle has no sensor of its own; its 30000 ceiling reflects the flagship sensors it is sold to pair with (Viper V2 Pro, DeathAdder V3 Pro) and is flagged to revise on hardware testing.

Verification

  • cargo fmt --check, cargo clippy --workspace --all-targets, and cargo test --package umbra-hid --no-default-features all pass clean.
  • New every_oneoff_pid_is_registered test asserts registration plus the per-device lighting/poll omissions and transaction-ID splits.
  • README "Supported devices" table lists all six new models with VID:PID, DPI max, polling, lighting, and battery columns.

🤖 Generated with Claude Code

UMBRA-13: Add DeviceSpecs for six one-off mice (Imperator, Ouroboros, Taipan, Diamondback Chroma, Atheris, HyperPolling dongle) Resolves UMBRA-13. Registers the six remaining one-off mouse PIDs from OpenRazer's `driver/razermouse_driver.h` as standalone `DeviceSpec`s under `crates/umbra-hid/src/models/`, so the OpenRazer mouse PID space is fully accounted for in umbra. Every transaction ID, DPI/poll path, lighting surface, and battery/idle flag was read branch-by-branch from `razermouse_driver.c`; a single device may use different transaction IDs per command class. ## Added | PID | Model | DPI max | Poll | Lighting | Battery | Notes | |--------|----------------------------------|---------|------|----------|---------|-------| | 0x002F | Razer Imperator 2012 | 6400 | yes (0xFF) | none | n/a | classic on/off LEDs unmodelled | | 0x0032 | Razer Ouroboros 2012 | 8200 | yes (0xFF) | none | yes (0xFF) | AA-powered; scroll on/off LED unmodelled | | 0x0034 | Razer Taipan | 8200 | yes (0xFF) | none | n/a | classic on/off LEDs unmodelled | | 0x004C | Razer Diamondback Chroma | 16000 | no | none | n/a | standard-matrix (class 0x03) path + no poll attr | | 0x0062 | Razer Atheris (Receiver) | 7200 | yes (0x1f) | none | yes (0x1f) | dpi/poll/battery 0x1f, idle 0xFF | | 0x00B3 | Razer HyperPolling Wireless Dongle | 30000 | no | none | yes (0x1f) | set_polling_rate2 path unmodelled | ## Decisions (AC) - **Atheris receiver (0x0062) and HyperPolling dongle (0x00B3): both INCLUDED.** The driver registers a full DPI / poll / battery / idle control attribute set directly against each PID in `razer_mouse_probe`, so each enumerates as a configurable endpoint umbra can talk to. This follows the UMBRA-1 dock/receiver precedent (registration is the include test). - **Omissions are recorded as `None` with a doc comment, per the `naga_2012` precedent:** classic on/off `set_led_state` lighting (Imperator, Taipan, Ouroboros); the Diamondback Chroma's standard-matrix (class 0x03) lighting path (umbra builds only the extended-matrix class 0x0F path); the Diamondback's polling (the driver registers no poll-rate attribute for that PID); the HyperPolling dongle's polling (it uses the `set_polling_rate2` two-step path the 4/8 kHz devices use, which umbra does not build). - **Mixed transaction IDs are modelled per command class**, not assumed uniform. The Atheris is the clearest case: dpi/poll/battery on 0x1f but idle on 0xFF. - **DPI maxima are sensor-derived assumptions** documented in each file (the driver does not clamp DPI). The HyperPolling dongle has no sensor of its own; its 30000 ceiling reflects the flagship sensors it is sold to pair with (Viper V2 Pro, DeathAdder V3 Pro) and is flagged to revise on hardware testing. ## Verification - `cargo fmt --check`, `cargo clippy --workspace --all-targets`, and `cargo test --package umbra-hid --no-default-features` all pass clean. - New `every_oneoff_pid_is_registered` test asserts registration plus the per-device lighting/poll omissions and transaction-ID splits. - README "Supported devices" table lists all six new models with VID:PID, DPI max, polling, lighting, and battery columns. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(umbra-hid): add DeviceSpecs for six one-off mice
Some checks failed
Check / fmt + clippy + build + tests (pull_request) Failing after 4s
Create release / Create release from merged PR (pull_request) Has been skipped
ddf6251d76
Register the six remaining one-off mouse PIDs from OpenRazer's driver/razermouse_driver.h that umbra previously did not recognize, each as its own DeviceSpec under crates/umbra-hid/src/models/. Per-command transaction IDs, DPI/poll paths, lighting surfaces, and battery/idle support are read branch-by-branch from razermouse_driver.c, not assumed; a single device may use different transaction IDs per command class.

Added: Imperator 2012 (0x002F), Ouroboros 2012 (0x0032), Taipan (0x0034), Diamondback Chroma (0x004C), Atheris receiver (0x0062), HyperPolling Wireless Dongle (0x00B3).

Features with no umbra command builder are declared None with a doc comment, per the naga_2012 precedent: classic on/off set_led_state LEDs on Imperator/Taipan/Ouroboros, and the Diamondback Chroma's standard-matrix (class 0x03) lighting path. The Diamondback registers no poll-rate attribute, so polling is omitted; the HyperPolling dongle drives polling through the set_polling_rate2 path umbra does not build, so its polling is omitted too. Modelled DPI maxima are sensor-derived assumptions documented in each file (HyperPolling has no sensor of its own, so its 30000 ceiling is the flagship sensors it pairs with).

Decision (AC): the Atheris receiver (0x0062) and HyperPolling dongle (0x00B3) are both INCLUDED because the driver registers a full DPI/poll/battery/idle control attribute set directly against each PID in razer_mouse_probe, per the UMBRA-1 dock/receiver precedent. Both mix transaction IDs across command classes (e.g. Atheris idle is 0xFF while its DPI/poll/battery are 0x1f).

Registration plus the lighting/poll/omission and transaction-ID decisions are covered by a new every_oneoff_pid_is_registered test, and the README "Supported devices" table lists every newly added model.

#UMBRA-13

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
David merged commit ded541cb26 into main 2026-06-06 11:04:40 +02:00
David deleted branch feat/oneoff-mice-devicespecs-UMBRA-13 2026-06-06 11:04:40 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pandoras-box/umbra!11
No description provided.