Skip to content

Consolidate SteelSeries protocol families (#206–#220) - #234

Merged
snekxs merged 28 commits into
mainfrom
integration/steelseries
Oct 16, 2026
Merged

snekxs merged 28 commits into
mainfrom
integration/steelseries

Conversation

@snekxs

@snekxs snekxs commented Oct 16, 2026

Copy link
Copy Markdown
Member

Consolidation: SteelSeries protocol families

Merges the full set of open SteelSeries protocol-family PRs. They were all branched from the same old main and each edits the same three shared files (src/drivers/registry.ts, src/steelseries/devices.ts, src/steelseries/index.ts), so GitHub could merge at most one of them cleanly — this branch integrates all of them with the conflicts resolved as the union of the independent additions.

Included PRs

Verification

  • npm run build / tsc --noEmit clean
  • npm test: 2637 tests, 0 failures
  • 69 product IDs present (base + every addition), no duplicate PIDs
  • 12/12 new registry classes and src/steelseries exports present

Closes #206
Closes #207
Closes #208
Closes #209
Closes #210
Closes #211
Closes #212
Closes #214
Closes #215
Closes #217
Closes #218
Closes #219
Closes #220

snekxs and others added 28 commits October 12, 2026 17:39
Derived from the vendor's own SteelSeries GG 121.0.0 device specification
(sensei_rival_pro_shared.lisp): raw-uint16 XY DPI presets with per-preset
lift-off/landing (0x34), dual report/polling rates to 8000 Hz (0x2C/0x2D),
8-slot button mapping (0x2A), save (0x09). Registers the base station
(1038:1880) and dongle (1038:1882); the four models share one spec and
report the model themselves. Unverified on hardware.
prime.py is byte-identical to prime_plus.py and the plain Prime Wireless
shares the Prime Mini Wireless settings dict, so 0x182E/0x182A/0x1856 and
0x1842/0x1840 reuse the prime-plus and prime-mini-wireless codecs with no
new modules. Unverified on hardware.
The vendor GG specification includes Rival 310's profile wholesale and
overrides only the button table (8 slots vs 6), so this family mirrors the
Rival 310 command set (DPI 0x53, polling 0x54, logo/wheel RGB, save 0x59,
firmware 0x90) with its own 8-button mapping. Registers 1038:1722 with a
matching WebHID driver. Unverified on hardware.
Wired-only Prime Mini (1038:184D), reconstructed from the vendor's own GG
121.0.0 device specification (prime_mini.lisp) — not rivalcfg, which does
not cover this mouse. Not the Prime Mini Wireless (different command set):
DPI batch 0x2D with uint16 factors (x50, 50-18000), polling 0x2B with
read-back 0xAB, 8-slot buttons 0x2A, single-zone lighting (color 0x21,
brightness 0x23, default 0x27, reset 0x22), save 0x11, firmware 0x90
(15-byte string, used as the connectivity probe). Unverified on hardware.
Wired-only Rival 5 (1038:183C), reconstructed from the vendor's own GG
121.0.0 device specification (rival-5.lisp) — no rivalcfg profile exists.
DPI batch 0x2D with TrueMove Air bytes (spot-checked 0x00/0x04/0x12/0xD6
against the vendor's inline table), polling 0x2B, 11-slot buttons 0x2A,
save 0x11, firmware 0x90 (32-byte string, used as the connectivity probe).
Unverified on hardware.
Wired-only Rival 3 Gen 2 (1038:1870), reconstructed from the vendor's own
GG 121.0.0 device specification (rival-3-v2.lisp); rivalcfg corroborates
the PID and command bytes but not the DPI table. XY DPI batch 0x34
(interleaved pairs, vendor TrueMove Core table with 0x49 for 3200 —
diverges from rivalcfg's table in 23 entries, flagged in-code), polling
0x2B, 8-slot buttons 0x2A, save 0x11, firmware 0x90 (15-byte string, used
as the connectivity probe). Unverified on hardware.
2.4 GHz Rival 3 Wireless Gen 2 (1038:1872), reconstructed from the
vendor's own GG 121.0.0 device specification
(rival-3-wireless-v2.lisp) — no readable rivalcfg profile exists. Split
XY DPI batch 0x2C (1-based index, TrueMove Air), polling 0x17, 7-slot
buttons 0x19 plus 2-slot wheel mapping 0x1A, battery 0xAA 0x01 (2-byte
level, no charging flag), firmware 0x10, save 0x09. No lighting commands
exist on this mouse. Unverified on hardware.
Aerox 3 Wireless Gen 2 (1038:1892 wired, 1038:1890 dongle), reconstructed
from the vendor's own GG 121.0.0 device specification — no rivalcfg
profile exists. Raw-uint16 XY DPI with per-preset lift-off (0x2D), split
wired/wireless polling to 4000 Hz (0x2B, inferred value map flagged
in-code), 8-slot buttons (0x2A), battery (0x92, direct percent), firmware
0x90 (12-byte string, used with battery as connectivity probes), save
0x11 0x00. Unverified on hardware.
Wired Rival 600 (1038:1724) and Dota 2 Edition (1038:172E), reconstructed
from the vendor's own GG 121.0.0 device specification (rival-600.lisp,
dota2-rival-600.lisp) with rivalcfg's rival600.py corroborating every
command byte. Distinct command set from the Rival 650 Wireless despite the
shared A3360 sensor: sensitivity 0x03 per-level (linear byte, 100-12000),
polling 0x04, button feature report 0x31, proximity 0x96, save 0x09,
firmware 0x10 (2-byte, used as the connectivity probe). 33-byte reports.
Lighting withheld (vendor 0x07/0x27 vs rivalcfg 0x05 disagree). Unverified
on hardware.
Rival 100 (1038:1702) with its PC Bang/Dell China/Dota 2 special editions
and the Rival 105 (1038:1814), all sharing the vendor GG 121.0.0
rival-100.lisp command set: two-preset DPI 0x03 with a choice byte
(250-4000, rivalcfg-supplied table), polling 0x04, single-zone LED
0x05/0x07, button-6 mode 0x0B (with the PC Bang pre-packet), save 0x09,
firmware 0x10 (used as the connectivity probe), no button remapping.
Unverified on hardware.
Rival 110 (1038:1729), Rival 106 (1038:1816) and Rival 300S (1038:1810),
reconstructed from the vendor's own GG 121.0.0 device specifications
(rival-110.lisp/rival-106.lisp/rival-300s.lisp, all including rival-100)
with rivalcfg's rival110.py corroborating every byte. Shares the Rival
100 command set but uses the PixArt PMW3326 sensor curve (200-7200, the
vendor file gives no table), so it is a separate family from ./rival-100.ts.
Unverified on hardware.
Rival 300 (1038:1710) and its editions (Dota 2 1038:1392, CS:GO Fade
1038:1394, Fallout 4 1038:1712, Acer Predator 1038:1714, CS:GO Fade stm32
1038:1716, HP OMEN 1038:1718, CS:GO Hyper Beast 1038:171A, Evil Geniuses
1038:171C), reconstructed from the vendor's own GG 121.0.0 rival_base.lisp
profile with rivalcfg's rival300.py corroborating every byte. Linear DPI
0x03 (50-6500 in 50 steps), polling 0x04, two-zone LED 0x08/0x07, six
remappable buttons 0x31, save 0x09, firmware 0x10. Unverified on hardware.
Addresses CodeRabbit: when the CPI button has selected preset 2, setDpi()
now reads the active preset index (0x16) and writes that preset, so the
change takes effect; readStatus() reports the active preset's DPI. Both
presets are tracked independently (falling back to their rivalcfg defaults
when this session has not written them). setDpiPreset2 still writes preset
2 explicitly. Adds steelseriesRival110DecodeActivePreset.
Addresses CodeRabbit: readStatus now reports the active preset's DPI and
setDpi writes the active preset (read via 0x16) rather than always preset
1, so a change takes effect after the CPI button switches presets. Both
presets are now tracked independently (each falling back to its rivalcfg
default), fixing the setDpi/setDpiPreset2 asymmetry. setDpiPreset2 still
writes preset 2 explicitly. Adds steelseriesRival300DecodeActivePreset.
Sensei [RAW] (1038:1369) and its Diablo III / Guild Wars 2 / Black Ops II /
World of Tanks / Heroes of the Storm editions, reconstructed from the
vendor's own GG 121.0.0 sensei-raw_base.lisp profile with rivalcfg's
sensei_raw.py corroborating every byte. Linear two-preset DPI 0x03
(90-5670), polling 0x04, single-LED brightness 0x05 and effect 0x07,
eight 3-byte button slots 0x31, save 0x09, firmware 0x10. setDpi writes
the active preset (read via 0x16). Unverified on hardware.
…ries

# Conflicts:
#	src/steelseries/devices.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
…ries

# Conflicts:
#	src/drivers/registry.ts
#	src/steelseries/devices.ts
#	src/steelseries/index.ts
@github-actions github-actions Bot added area: protocol Protocol codecs and shared types area: drivers Device drivers and transport integration labels Oct 16, 2026
@github-actions github-actions Bot added the area: tests Protocol and driver tests label Oct 16, 2026
@coderabbitai

coderabbitai Bot commented Oct 16, 2026

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: Repository: OpenMouse-Project/mouse-protocol/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9361ed53-5140-4ae7-bcfe-b66b73d2ef17
📥 Commits

Reviewing files that changed from the base of the PR and between 15996d4 and cf93825.

📒 Files selected for processing: 56
  • src/drivers/registry.ts
  • src/drivers/steelseries/aerox-3-wireless-gen2-hid.test.ts
  • src/drivers/steelseries/aerox-3-wireless-gen2-hid.ts
  • src/drivers/steelseries/prime-mini-hid.test.ts
  • src/drivers/steelseries/prime-mini-hid.ts
  • src/drivers/steelseries/prime-mini-wireless-hid.test.ts
  • src/drivers/steelseries/prime-plus-hid.test.ts
  • src/drivers/steelseries/rival-100-hid.test.ts
  • src/drivers/steelseries/rival-100-hid.ts
  • src/drivers/steelseries/rival-110-hid.test.ts
  • src/drivers/steelseries/rival-110-hid.ts
  • src/drivers/steelseries/rival-3-v2-hid.test.ts
  • src/drivers/steelseries/rival-3-v2-hid.ts
  • src/drivers/steelseries/rival-3-wireless-v2-hid.test.ts
  • src/drivers/steelseries/rival-3-wireless-v2-hid.ts
  • src/drivers/steelseries/rival-300-hid.test.ts
  • src/drivers/steelseries/rival-300-hid.ts
  • src/drivers/steelseries/rival-5-hid.test.ts
  • src/drivers/steelseries/rival-5-hid.ts
  • src/drivers/steelseries/rival-600-hid.test.ts
  • src/drivers/steelseries/rival-600-hid.ts
  • src/drivers/steelseries/sensei-310-hid.test.ts
  • src/drivers/steelseries/sensei-310-hid.ts
  • src/drivers/steelseries/sensei-raw-hid.test.ts
  • src/drivers/steelseries/sensei-raw-hid.ts
  • src/drivers/steelseries/sensei-rival-pro-hid.test.ts
  • src/drivers/steelseries/sensei-rival-pro-hid.ts
  • src/steelseries/aerox-3-wireless-gen2.test.ts
  • src/steelseries/aerox-3-wireless-gen2.ts
  • src/steelseries/aerox3.ts
  • src/steelseries/devices.ts
  • src/steelseries/index.ts
  • src/steelseries/prime-mini-wireless.ts
  • src/steelseries/prime-mini.test.ts
  • src/steelseries/prime-mini.ts
  • src/steelseries/prime-plus.ts
  • src/steelseries/rival-100.test.ts
  • src/steelseries/rival-100.ts
  • src/steelseries/rival-110.test.ts
  • src/steelseries/rival-110.ts
  • src/steelseries/rival-3-v2.test.ts
  • src/steelseries/rival-3-v2.ts
  • src/steelseries/rival-3-wireless-v2.test.ts
  • src/steelseries/rival-3-wireless-v2.ts
  • src/steelseries/rival-300.test.ts
  • src/steelseries/rival-300.ts
  • src/steelseries/rival-5.test.ts
  • src/steelseries/rival-5.ts
  • src/steelseries/rival-600.test.ts
  • src/steelseries/rival-600.ts
  • src/steelseries/sensei-310.test.ts
  • src/steelseries/sensei-310.ts
  • src/steelseries/sensei-raw.test.ts
  • src/steelseries/sensei-raw.ts
  • src/steelseries/sensei-rival-pro.test.ts
  • src/steelseries/sensei-rival-pro.ts
+-------------------------------+
| Copilot: Off. CodeRabbit: On. |
+-------------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@snekxs
snekxs merged commit 4cadd7d into main Oct 16, 2026
5 of 6 checks passed
@snekxs
snekxs deleted the integration/steelseries branch October 16, 2026 07:50
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 0.43.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: drivers Device drivers and transport integration area: protocol Protocol codecs and shared types area: tests Protocol and driver tests released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant