feat(steelseries): add Rival 3 Gen 1 driver (write-only protocol) - #36
Open
simply-justin wants to merge 1 commit into
Open
feat(steelseries): add Rival 3 Gen 1 driver (write-only protocol)#36simply-justin wants to merge 1 commit into
simply-justin wants to merge 1 commit into
Conversation
Adds SteelSeries support for the Rival 3 Gen 1 (1038:1824 and its post-0.37 firmware enumeration 1038:184C), transcribed from the public rivalcfg project and corroborated against libratbag and OpenRGB. The device is write-only: the codec builds unnumbered output-report frames for DPI presets (TrueMove Core byte table, 200-8500 in 100 DPI steps), polling rate, and the save command, and the only read is the two-byte firmware query, which the driver uses as its connectivity probe. readStatus reports last-written values flagged as unverified rather than pretending to read them. Both catalog entries ship verified: false; docs/steelseries-testing.md is the promotion path. Filters are PID-scoped (never VID-only - 0x1038 also covers keyboards and headsets), and the different-protocol siblings (Rival 3 Wireless 0x1830/0x1872, Gen 2 0x1870) are deliberately not claimed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a codec and WebHID driver for the SteelSeries Rival 3 Gen 1:
1038:1824, plus1038:184C, which is the same mouse after the v0.37.0.0 firmware update (rivalcfg lists both against one profile, OpenRGB labels 0x1824 "Old Firmware"). Both catalog entries shipverified: false— I don't own the hardware yet, so this is a transcription of public sources, not a tested driver.Sources: rivalcfg (
devices/rival3.py,handlers/multidpi_range_choice.py,devices/dpi/truemove_core.py,mouse.py,usbhid.py) for the command set and the TrueMove Core DPI table, cross-checked against libratbag'sdriver-steelseries.cand OpenRGB's Rival 3 controller where they overlap (polling values, save id, firmware query, interface 3, unnumbered reports).The awkward thing about this mouse is that it's write-only. rivalcfg keeps a local JSON mirror because the device can't be asked for its settings, and libratbag flags its SteelSeries profiles
RATBAG_PROFILE_CAP_WRITE_ONLY. The only read anywhere is a two-byte firmware query (10 00). So the driver leans on that:readStatus()reports last-written values (or rivalcfg's defaults before any write) flaggedvaluesVerified: false, with a note explaining why — it never pretends to have read the mouse09 00) like the rivalcfg CLI does, with its 50 ms inter-command delay, and are never retried: with no ack there's no telling "lost" from "applied"setDpireplaces the whole on-device preset table with one preset; read-modify-write isn't possible here, so that's documented rather than worked aroundIn scope: detection, firmware read, DPI presets (200–8500 in 100 steps, table-encoded), polling rate (125/250/500/1000), save. Not in scope: lighting and buttons (the commands are documented in the codec docblock but no encoders ship), battery, and every other 0x1038 product — filters are PID-scoped because SteelSeries puts keyboards and headsets on the same VID. The Rival 3 Wireless (
1830/1872) and Gen 2 (1870) are deliberately not claimed: rivalcfg shows they use different command sets, and the tests pin their rejection so they can land later as their own family modules.Known unknowns, listed instead of guessed:
device.collectionsdump so the filters can be narrowed184Cunit (known v0.37.x) will settle it09 00only committing to flash — inferred from rivalcfg's--no-save, not confirmedOne deliberate divergence from rivalcfg: it rounds a requested DPI to the nearest table entry, this codec rejects off-grid values, matching how the rest of the package validates.
Tested:
npm run checkpasses (536 tests, including the registry overlap matrix); OpenMouse builds and its test suite passes with the local package installed per CONTRIBUTING, so no matching OpenMouse PR is needed — the only app-visible change is the new"SteelSeries"brand union member.docs/steelseries-testing.mdhas the hardware checklist for promoting either PID toverified: true; everything on it is physical verification (pointer speed, external rate meter), since there's nothing to read back.