@openmouse/protocol 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +167 -0
- package/README.md +89 -0
- package/dist/asus/index.d.ts +52 -0
- package/dist/asus/index.d.ts.map +1 -0
- package/dist/asus/index.js +248 -0
- package/dist/asus/index.js.map +1 -0
- package/dist/atk/index.d.ts +200 -0
- package/dist/atk/index.d.ts.map +1 -0
- package/dist/atk/index.js +480 -0
- package/dist/atk/index.js.map +1 -0
- package/dist/bitmouse/index.d.ts +284 -0
- package/dist/bitmouse/index.d.ts.map +1 -0
- package/dist/bitmouse/index.js +396 -0
- package/dist/bitmouse/index.js.map +1 -0
- package/dist/compx/codec.d.ts +31 -0
- package/dist/compx/codec.d.ts.map +1 -0
- package/dist/compx/codec.js +50 -0
- package/dist/compx/codec.js.map +1 -0
- package/dist/corsair/index.d.ts +147 -0
- package/dist/corsair/index.d.ts.map +1 -0
- package/dist/corsair/index.js +223 -0
- package/dist/corsair/index.js.map +1 -0
- package/dist/dareu/index.d.ts +136 -0
- package/dist/dareu/index.d.ts.map +1 -0
- package/dist/dareu/index.js +344 -0
- package/dist/dareu/index.js.map +1 -0
- package/dist/drivers/asus/hid.d.ts +29 -0
- package/dist/drivers/asus/hid.d.ts.map +1 -0
- package/dist/drivers/asus/hid.js +419 -0
- package/dist/drivers/asus/hid.js.map +1 -0
- package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
- package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
- package/dist/drivers/atk/bitmouse-hid.js +501 -0
- package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
- package/dist/drivers/atk/hid.d.ts +163 -0
- package/dist/drivers/atk/hid.d.ts.map +1 -0
- package/dist/drivers/atk/hid.js +1368 -0
- package/dist/drivers/atk/hid.js.map +1 -0
- package/dist/drivers/atk/products.d.ts +13 -0
- package/dist/drivers/atk/products.d.ts.map +1 -0
- package/dist/drivers/atk/products.js +13 -0
- package/dist/drivers/atk/products.js.map +1 -0
- package/dist/drivers/attackshark/dpi.d.ts +41 -0
- package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
- package/dist/drivers/attackshark/dpi.js +215 -0
- package/dist/drivers/attackshark/dpi.js.map +1 -0
- package/dist/drivers/attackshark/hid.d.ts +124 -0
- package/dist/drivers/attackshark/hid.d.ts.map +1 -0
- package/dist/drivers/attackshark/hid.js +728 -0
- package/dist/drivers/attackshark/hid.js.map +1 -0
- package/dist/drivers/corsair/hid.d.ts +70 -0
- package/dist/drivers/corsair/hid.d.ts.map +1 -0
- package/dist/drivers/corsair/hid.js +414 -0
- package/dist/drivers/corsair/hid.js.map +1 -0
- package/dist/drivers/dareu/hid.d.ts +59 -0
- package/dist/drivers/dareu/hid.d.ts.map +1 -0
- package/dist/drivers/dareu/hid.js +478 -0
- package/dist/drivers/dareu/hid.js.map +1 -0
- package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
- package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
- package/dist/drivers/endgame/egg-op1-hid.js +605 -0
- package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
- package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
- package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
- package/dist/drivers/endgame/egg-we-control.js +87 -0
- package/dist/drivers/endgame/egg-we-control.js.map +1 -0
- package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
- package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
- package/dist/drivers/endgame/egg-we-hid.js +514 -0
- package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
- package/dist/drivers/fantech/hid.d.ts +106 -0
- package/dist/drivers/fantech/hid.d.ts.map +1 -0
- package/dist/drivers/fantech/hid.js +295 -0
- package/dist/drivers/fantech/hid.js.map +1 -0
- package/dist/drivers/finalmouse/hid.d.ts +31 -0
- package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
- package/dist/drivers/finalmouse/hid.js +181 -0
- package/dist/drivers/finalmouse/hid.js.map +1 -0
- package/dist/drivers/gearhub/hid.d.ts +191 -0
- package/dist/drivers/gearhub/hid.d.ts.map +1 -0
- package/dist/drivers/gearhub/hid.js +542 -0
- package/dist/drivers/gearhub/hid.js.map +1 -0
- package/dist/drivers/glorious/classic-hid.d.ts +62 -0
- package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
- package/dist/drivers/glorious/classic-hid.js +326 -0
- package/dist/drivers/glorious/classic-hid.js.map +1 -0
- package/dist/drivers/glorious/hid.d.ts +39 -0
- package/dist/drivers/glorious/hid.d.ts.map +1 -0
- package/dist/drivers/glorious/hid.js +203 -0
- package/dist/drivers/glorious/hid.js.map +1 -0
- package/dist/drivers/gwolves/hid.d.ts +27 -0
- package/dist/drivers/gwolves/hid.d.ts.map +1 -0
- package/dist/drivers/gwolves/hid.js +225 -0
- package/dist/drivers/gwolves/hid.js.map +1 -0
- package/dist/drivers/gwolves/products.d.ts +17 -0
- package/dist/drivers/gwolves/products.d.ts.map +1 -0
- package/dist/drivers/gwolves/products.js +58 -0
- package/dist/drivers/gwolves/products.js.map +1 -0
- package/dist/drivers/hyperx/hid.d.ts +59 -0
- package/dist/drivers/hyperx/hid.d.ts.map +1 -0
- package/dist/drivers/hyperx/hid.js +229 -0
- package/dist/drivers/hyperx/hid.js.map +1 -0
- package/dist/drivers/incott/hid.d.ts +513 -0
- package/dist/drivers/incott/hid.d.ts.map +1 -0
- package/dist/drivers/incott/hid.js +1173 -0
- package/dist/drivers/incott/hid.js.map +1 -0
- package/dist/drivers/index.d.ts +5 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +5 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/keychron/m6-hid.d.ts +81 -0
- package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
- package/dist/drivers/keychron/m6-hid.js +486 -0
- package/dist/drivers/keychron/m6-hid.js.map +1 -0
- package/dist/drivers/keychron/nape-hid.d.ts +60 -0
- package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
- package/dist/drivers/keychron/nape-hid.js +432 -0
- package/dist/drivers/keychron/nape-hid.js.map +1 -0
- package/dist/drivers/ksnake/hid.d.ts +74 -0
- package/dist/drivers/ksnake/hid.d.ts.map +1 -0
- package/dist/drivers/ksnake/hid.js +368 -0
- package/dist/drivers/ksnake/hid.js.map +1 -0
- package/dist/drivers/lamzu/hid.d.ts +58 -0
- package/dist/drivers/lamzu/hid.d.ts.map +1 -0
- package/dist/drivers/lamzu/hid.js +414 -0
- package/dist/drivers/lamzu/hid.js.map +1 -0
- package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
- package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
- package/dist/drivers/lamzu-atlantis/hid.js +587 -0
- package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
- package/dist/drivers/logitech/bolt.d.ts +41 -0
- package/dist/drivers/logitech/bolt.d.ts.map +1 -0
- package/dist/drivers/logitech/bolt.js +105 -0
- package/dist/drivers/logitech/bolt.js.map +1 -0
- package/dist/drivers/logitech/hidpp.d.ts +525 -0
- package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
- package/dist/drivers/logitech/hidpp.js +2774 -0
- package/dist/drivers/logitech/hidpp.js.map +1 -0
- package/dist/drivers/logitech/mode-status.d.ts +53 -0
- package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
- package/dist/drivers/logitech/mode-status.js +52 -0
- package/dist/drivers/logitech/mode-status.js.map +1 -0
- package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
- package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
- package/dist/drivers/logitech/onboard-profiles.js +965 -0
- package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
- package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
- package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
- package/dist/drivers/logitech/rgb-effects.js +93 -0
- package/dist/drivers/logitech/rgb-effects.js.map +1 -0
- package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
- package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
- package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
- package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
- package/dist/drivers/mchose/dock-hid.d.ts +26 -0
- package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
- package/dist/drivers/mchose/dock-hid.js +176 -0
- package/dist/drivers/mchose/dock-hid.js.map +1 -0
- package/dist/drivers/mchose/hid.d.ts +118 -0
- package/dist/drivers/mchose/hid.d.ts.map +1 -0
- package/dist/drivers/mchose/hid.js +550 -0
- package/dist/drivers/mchose/hid.js.map +1 -0
- package/dist/drivers/mchose/v3-hid.d.ts +109 -0
- package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
- package/dist/drivers/mchose/v3-hid.js +572 -0
- package/dist/drivers/mchose/v3-hid.js.map +1 -0
- package/dist/drivers/microsoft/hid.d.ts +25 -0
- package/dist/drivers/microsoft/hid.d.ts.map +1 -0
- package/dist/drivers/microsoft/hid.js +247 -0
- package/dist/drivers/microsoft/hid.js.map +1 -0
- package/dist/drivers/moddo/hid.d.ts +31 -0
- package/dist/drivers/moddo/hid.d.ts.map +1 -0
- package/dist/drivers/moddo/hid.js +154 -0
- package/dist/drivers/moddo/hid.js.map +1 -0
- package/dist/drivers/mouse-types.d.ts +388 -0
- package/dist/drivers/mouse-types.d.ts.map +1 -0
- package/dist/drivers/mouse-types.js +2 -0
- package/dist/drivers/mouse-types.js.map +1 -0
- package/dist/drivers/ninjutso/hid.d.ts +62 -0
- package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
- package/dist/drivers/ninjutso/hid.js +680 -0
- package/dist/drivers/ninjutso/hid.js.map +1 -0
- package/dist/drivers/orbital/hid.d.ts +24 -0
- package/dist/drivers/orbital/hid.d.ts.map +1 -0
- package/dist/drivers/orbital/hid.js +85 -0
- package/dist/drivers/orbital/hid.js.map +1 -0
- package/dist/drivers/orbital/host-protocol.d.ts +59 -0
- package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
- package/dist/drivers/orbital/host-protocol.js +884 -0
- package/dist/drivers/orbital/host-protocol.js.map +1 -0
- package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
- package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
- package/dist/drivers/pulsar/pulsar-hid.js +381 -0
- package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
- package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
- package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
- package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
- package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
- package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
- package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
- package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
- package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
- package/dist/drivers/rawm/hid.d.ts +29 -0
- package/dist/drivers/rawm/hid.d.ts.map +1 -0
- package/dist/drivers/rawm/hid.js +210 -0
- package/dist/drivers/rawm/hid.js.map +1 -0
- package/dist/drivers/razer/cobra-hid.d.ts +63 -0
- package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
- package/dist/drivers/razer/cobra-hid.js +282 -0
- package/dist/drivers/razer/cobra-hid.js.map +1 -0
- package/dist/drivers/razer/hid-open.d.ts +13 -0
- package/dist/drivers/razer/hid-open.d.ts.map +1 -0
- package/dist/drivers/razer/hid-open.js +29 -0
- package/dist/drivers/razer/hid-open.js.map +1 -0
- package/dist/drivers/razer/hid.d.ts +231 -0
- package/dist/drivers/razer/hid.d.ts.map +1 -0
- package/dist/drivers/razer/hid.js +772 -0
- package/dist/drivers/razer/hid.js.map +1 -0
- package/dist/drivers/razer/viper-hid.d.ts +33 -0
- package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
- package/dist/drivers/razer/viper-hid.js +177 -0
- package/dist/drivers/razer/viper-hid.js.map +1 -0
- package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
- package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
- package/dist/drivers/razer/viper-mini-hid.js +273 -0
- package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
- package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
- package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
- package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
- package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
- package/dist/drivers/registry.d.ts +70 -0
- package/dist/drivers/registry.d.ts.map +1 -0
- package/dist/drivers/registry.js +146 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
- package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/aerox3-hid.js +172 -0
- package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
- package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
- package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/aerox5-hid.js +173 -0
- package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
- package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
- package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
- package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
- package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
- package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
- package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
- package/dist/drivers/steelseries/hid.d.ts +48 -0
- package/dist/drivers/steelseries/hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/hid.js +157 -0
- package/dist/drivers/steelseries/hid.js.map +1 -0
- package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
- package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
- package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
- package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
- package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
- package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
- package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
- package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
- package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
- package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
- package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/rival310-hid.js +182 -0
- package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
- package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
- package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/rival650-hid.js +209 -0
- package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
- package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
- package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
- package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
- package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
- package/dist/drivers/teevolution/hid.d.ts +82 -0
- package/dist/drivers/teevolution/hid.d.ts.map +1 -0
- package/dist/drivers/teevolution/hid.js +607 -0
- package/dist/drivers/teevolution/hid.js.map +1 -0
- package/dist/drivers/vendors.d.ts +254 -0
- package/dist/drivers/vendors.d.ts.map +1 -0
- package/dist/drivers/vendors.js +587 -0
- package/dist/drivers/vendors.js.map +1 -0
- package/dist/drivers/vgn/hid.d.ts +33 -0
- package/dist/drivers/vgn/hid.d.ts.map +1 -0
- package/dist/drivers/vgn/hid.js +213 -0
- package/dist/drivers/vgn/hid.js.map +1 -0
- package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
- package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
- package/dist/drivers/wallhack/keyboard-hid.js +80 -0
- package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
- package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
- package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
- package/dist/drivers/wallhack/mouse-hid.js +288 -0
- package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
- package/dist/drivers/webhid.d.ts +59 -0
- package/dist/drivers/webhid.d.ts.map +1 -0
- package/dist/drivers/webhid.js +2 -0
- package/dist/drivers/webhid.js.map +1 -0
- package/dist/drivers/wlmouse/hid.d.ts +81 -0
- package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
- package/dist/drivers/wlmouse/hid.js +576 -0
- package/dist/drivers/wlmouse/hid.js.map +1 -0
- package/dist/drivers/wooting/hid.d.ts +86 -0
- package/dist/drivers/wooting/hid.d.ts.map +1 -0
- package/dist/drivers/wooting/hid.js +320 -0
- package/dist/drivers/wooting/hid.js.map +1 -0
- package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
- package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
- package/dist/drivers/zaunkoenig/hid.js +162 -0
- package/dist/drivers/zaunkoenig/hid.js.map +1 -0
- package/dist/endgame-gear/op1.d.ts +165 -0
- package/dist/endgame-gear/op1.d.ts.map +1 -0
- package/dist/endgame-gear/op1.js +384 -0
- package/dist/endgame-gear/op1.js.map +1 -0
- package/dist/endgame-gear/wireless.d.ts +93 -0
- package/dist/endgame-gear/wireless.d.ts.map +1 -0
- package/dist/endgame-gear/wireless.js +242 -0
- package/dist/endgame-gear/wireless.js.map +1 -0
- package/dist/fantech/index.d.ts +9 -0
- package/dist/fantech/index.d.ts.map +1 -0
- package/dist/fantech/index.js +11 -0
- package/dist/fantech/index.js.map +1 -0
- package/dist/finalmouse/index.d.ts +41 -0
- package/dist/finalmouse/index.d.ts.map +1 -0
- package/dist/finalmouse/index.js +106 -0
- package/dist/finalmouse/index.js.map +1 -0
- package/dist/gearhub/index.d.ts +210 -0
- package/dist/gearhub/index.d.ts.map +1 -0
- package/dist/gearhub/index.js +282 -0
- package/dist/gearhub/index.js.map +1 -0
- package/dist/glorious/index.d.ts +89 -0
- package/dist/glorious/index.d.ts.map +1 -0
- package/dist/glorious/index.js +236 -0
- package/dist/glorious/index.js.map +1 -0
- package/dist/glorious-classic/index.d.ts +103 -0
- package/dist/glorious-classic/index.d.ts.map +1 -0
- package/dist/glorious-classic/index.js +304 -0
- package/dist/glorious-classic/index.js.map +1 -0
- package/dist/gwolves/index.d.ts +82 -0
- package/dist/gwolves/index.d.ts.map +1 -0
- package/dist/gwolves/index.js +197 -0
- package/dist/gwolves/index.js.map +1 -0
- package/dist/hyperx/index.d.ts +181 -0
- package/dist/hyperx/index.d.ts.map +1 -0
- package/dist/hyperx/index.js +303 -0
- package/dist/hyperx/index.js.map +1 -0
- package/dist/incott/index.d.ts +1067 -0
- package/dist/incott/index.d.ts.map +1 -0
- package/dist/incott/index.js +1482 -0
- package/dist/incott/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/keychron/index.d.ts +194 -0
- package/dist/keychron/index.d.ts.map +1 -0
- package/dist/keychron/index.js +341 -0
- package/dist/keychron/index.js.map +1 -0
- package/dist/ksnake/index.d.ts +157 -0
- package/dist/ksnake/index.d.ts.map +1 -0
- package/dist/ksnake/index.js +314 -0
- package/dist/ksnake/index.js.map +1 -0
- package/dist/lamzu/atlantis.d.ts +237 -0
- package/dist/lamzu/atlantis.d.ts.map +1 -0
- package/dist/lamzu/atlantis.js +263 -0
- package/dist/lamzu/atlantis.js.map +1 -0
- package/dist/lamzu/index.d.ts +60 -0
- package/dist/lamzu/index.d.ts.map +1 -0
- package/dist/lamzu/index.js +86 -0
- package/dist/lamzu/index.js.map +1 -0
- package/dist/logitech/controls.d.ts +138 -0
- package/dist/logitech/controls.d.ts.map +1 -0
- package/dist/logitech/controls.js +184 -0
- package/dist/logitech/controls.js.map +1 -0
- package/dist/logitech/friendly-name.d.ts +50 -0
- package/dist/logitech/friendly-name.d.ts.map +1 -0
- package/dist/logitech/friendly-name.js +74 -0
- package/dist/logitech/friendly-name.js.map +1 -0
- package/dist/logitech/haptics.d.ts +97 -0
- package/dist/logitech/haptics.d.ts.map +1 -0
- package/dist/logitech/haptics.js +116 -0
- package/dist/logitech/haptics.js.map +1 -0
- package/dist/logitech/hosts.d.ts +55 -0
- package/dist/logitech/hosts.d.ts.map +1 -0
- package/dist/logitech/hosts.js +80 -0
- package/dist/logitech/hosts.js.map +1 -0
- package/dist/logitech/index.d.ts +127 -0
- package/dist/logitech/index.d.ts.map +1 -0
- package/dist/logitech/index.js +233 -0
- package/dist/logitech/index.js.map +1 -0
- package/dist/logitech/wheel.d.ts +117 -0
- package/dist/logitech/wheel.d.ts.map +1 -0
- package/dist/logitech/wheel.js +133 -0
- package/dist/logitech/wheel.js.map +1 -0
- package/dist/mchose/a5-gen1.d.ts +38 -0
- package/dist/mchose/a5-gen1.d.ts.map +1 -0
- package/dist/mchose/a5-gen1.js +60 -0
- package/dist/mchose/a5-gen1.js.map +1 -0
- package/dist/mchose/buttons.d.ts +66 -0
- package/dist/mchose/buttons.d.ts.map +1 -0
- package/dist/mchose/buttons.js +184 -0
- package/dist/mchose/buttons.js.map +1 -0
- package/dist/mchose/dock.d.ts +77 -0
- package/dist/mchose/dock.d.ts.map +1 -0
- package/dist/mchose/dock.js +133 -0
- package/dist/mchose/dock.js.map +1 -0
- package/dist/mchose/index.d.ts +299 -0
- package/dist/mchose/index.d.ts.map +1 -0
- package/dist/mchose/index.js +429 -0
- package/dist/mchose/index.js.map +1 -0
- package/dist/mchose/v3-buttons.d.ts +64 -0
- package/dist/mchose/v3-buttons.d.ts.map +1 -0
- package/dist/mchose/v3-buttons.js +258 -0
- package/dist/mchose/v3-buttons.js.map +1 -0
- package/dist/mchose/v3.d.ts +380 -0
- package/dist/mchose/v3.d.ts.map +1 -0
- package/dist/mchose/v3.js +608 -0
- package/dist/mchose/v3.js.map +1 -0
- package/dist/microsoft/index.d.ts +19 -0
- package/dist/microsoft/index.d.ts.map +1 -0
- package/dist/microsoft/index.js +22 -0
- package/dist/microsoft/index.js.map +1 -0
- package/dist/moddo/index.d.ts +72 -0
- package/dist/moddo/index.d.ts.map +1 -0
- package/dist/moddo/index.js +147 -0
- package/dist/moddo/index.js.map +1 -0
- package/dist/ninjutso/index.d.ts +74 -0
- package/dist/ninjutso/index.d.ts.map +1 -0
- package/dist/ninjutso/index.js +133 -0
- package/dist/ninjutso/index.js.map +1 -0
- package/dist/orbital/index.d.ts +14 -0
- package/dist/orbital/index.d.ts.map +1 -0
- package/dist/orbital/index.js +19 -0
- package/dist/orbital/index.js.map +1 -0
- package/dist/pulsar/index.d.ts +81 -0
- package/dist/pulsar/index.d.ts.map +1 -0
- package/dist/pulsar/index.js +185 -0
- package/dist/pulsar/index.js.map +1 -0
- package/dist/rawm/index.d.ts +55 -0
- package/dist/rawm/index.d.ts.map +1 -0
- package/dist/rawm/index.js +229 -0
- package/dist/rawm/index.js.map +1 -0
- package/dist/razer/codec.d.ts +504 -0
- package/dist/razer/codec.d.ts.map +1 -0
- package/dist/razer/codec.js +648 -0
- package/dist/razer/codec.js.map +1 -0
- package/dist/razer/devices.d.ts +156 -0
- package/dist/razer/devices.d.ts.map +1 -0
- package/dist/razer/devices.js +540 -0
- package/dist/razer/devices.js.map +1 -0
- package/dist/razer/index.d.ts +2 -0
- package/dist/razer/index.d.ts.map +1 -0
- package/dist/razer/index.js +2 -0
- package/dist/razer/index.js.map +1 -0
- package/dist/razer/v4.d.ts +19 -0
- package/dist/razer/v4.d.ts.map +1 -0
- package/dist/razer/v4.js +51 -0
- package/dist/razer/v4.js.map +1 -0
- package/dist/steelseries/aerox3.d.ts +236 -0
- package/dist/steelseries/aerox3.d.ts.map +1 -0
- package/dist/steelseries/aerox3.js +311 -0
- package/dist/steelseries/aerox3.js.map +1 -0
- package/dist/steelseries/aerox5-wireless.d.ts +300 -0
- package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
- package/dist/steelseries/aerox5-wireless.js +389 -0
- package/dist/steelseries/aerox5-wireless.js.map +1 -0
- package/dist/steelseries/aerox5.d.ts +228 -0
- package/dist/steelseries/aerox5.d.ts.map +1 -0
- package/dist/steelseries/aerox5.js +294 -0
- package/dist/steelseries/aerox5.js.map +1 -0
- package/dist/steelseries/aerox9-wireless.d.ts +213 -0
- package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
- package/dist/steelseries/aerox9-wireless.js +305 -0
- package/dist/steelseries/aerox9-wireless.js.map +1 -0
- package/dist/steelseries/devices.d.ts +82 -0
- package/dist/steelseries/devices.d.ts.map +1 -0
- package/dist/steelseries/devices.js +310 -0
- package/dist/steelseries/devices.js.map +1 -0
- package/dist/steelseries/index.d.ts +13 -0
- package/dist/steelseries/index.d.ts.map +1 -0
- package/dist/steelseries/index.js +13 -0
- package/dist/steelseries/index.js.map +1 -0
- package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
- package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
- package/dist/steelseries/prime-mini-wireless.js +351 -0
- package/dist/steelseries/prime-mini-wireless.js.map +1 -0
- package/dist/steelseries/prime-plus.d.ts +179 -0
- package/dist/steelseries/prime-plus.d.ts.map +1 -0
- package/dist/steelseries/prime-plus.js +275 -0
- package/dist/steelseries/prime-plus.js.map +1 -0
- package/dist/steelseries/rival3-wireless.d.ts +222 -0
- package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
- package/dist/steelseries/rival3-wireless.js +308 -0
- package/dist/steelseries/rival3-wireless.js.map +1 -0
- package/dist/steelseries/rival3.d.ts +99 -0
- package/dist/steelseries/rival3.d.ts.map +1 -0
- package/dist/steelseries/rival3.js +147 -0
- package/dist/steelseries/rival3.js.map +1 -0
- package/dist/steelseries/rival310.d.ts +230 -0
- package/dist/steelseries/rival310.d.ts.map +1 -0
- package/dist/steelseries/rival310.js +322 -0
- package/dist/steelseries/rival310.js.map +1 -0
- package/dist/steelseries/rival650.d.ts +215 -0
- package/dist/steelseries/rival650.d.ts.map +1 -0
- package/dist/steelseries/rival650.js +284 -0
- package/dist/steelseries/rival650.js.map +1 -0
- package/dist/steelseries/sensei-ten.d.ts +283 -0
- package/dist/steelseries/sensei-ten.d.ts.map +1 -0
- package/dist/steelseries/sensei-ten.js +389 -0
- package/dist/steelseries/sensei-ten.js.map +1 -0
- package/dist/teevolution/index.d.ts +211 -0
- package/dist/teevolution/index.d.ts.map +1 -0
- package/dist/teevolution/index.js +458 -0
- package/dist/teevolution/index.js.map +1 -0
- package/dist/valkyrie/index.d.ts +19 -0
- package/dist/valkyrie/index.d.ts.map +1 -0
- package/dist/valkyrie/index.js +43 -0
- package/dist/valkyrie/index.js.map +1 -0
- package/dist/valkyrie/settings.d.ts +28 -0
- package/dist/valkyrie/settings.d.ts.map +1 -0
- package/dist/valkyrie/settings.js +84 -0
- package/dist/valkyrie/settings.js.map +1 -0
- package/dist/vgn/index.d.ts +59 -0
- package/dist/vgn/index.d.ts.map +1 -0
- package/dist/vgn/index.js +165 -0
- package/dist/vgn/index.js.map +1 -0
- package/dist/wallhack/index.d.ts +165 -0
- package/dist/wallhack/index.d.ts.map +1 -0
- package/dist/wallhack/index.js +226 -0
- package/dist/wallhack/index.js.map +1 -0
- package/dist/wlmouse/index.d.ts +4 -0
- package/dist/wlmouse/index.d.ts.map +1 -0
- package/dist/wlmouse/index.js +7 -0
- package/dist/wlmouse/index.js.map +1 -0
- package/dist/wooting/index.d.ts +225 -0
- package/dist/wooting/index.d.ts.map +1 -0
- package/dist/wooting/index.js +296 -0
- package/dist/wooting/index.js.map +1 -0
- package/dist/zaunkoenig/index.d.ts +49 -0
- package/dist/zaunkoenig/index.d.ts.map +1 -0
- package/dist/zaunkoenig/index.js +127 -0
- package/dist/zaunkoenig/index.js.map +1 -0
- package/package.json +193 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SteelSeries Rival 3 Wireless configuration protocol — pure encode/decode helpers.
|
|
3
|
+
*
|
|
4
|
+
* Reconstructed from public open-source implementations, not vendor software:
|
|
5
|
+
*
|
|
6
|
+
* - rivalcfg `rivalcfg/devices/rival3_wireless.py` — the primary source for
|
|
7
|
+
* every command byte, product id, and default here. Read in full for this
|
|
8
|
+
* cluster; not assumed from any other SteelSeries device file.
|
|
9
|
+
* - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — the DPI byte table for
|
|
10
|
+
* this device's TrueMove Air sensor. **This is a distinct table from
|
|
11
|
+
* `./rival3.ts`'s `TRUEMOVE_CORE_DPI_TO_BYTE`** (used by Rival 3 Gen 1 and
|
|
12
|
+
* Aerox 3): TrueMove Air starts at 100 DPI (Core starts at 200), covers
|
|
13
|
+
* 100–18000 in 100 DPI steps (180 entries; Core tops out at 8500 in 84
|
|
14
|
+
* entries), and the byte values at shared DPI numbers differ (e.g.
|
|
15
|
+
* 400 DPI is `0x04` here vs. `0x08` for Core; 1600 DPI is `0x12` here vs.
|
|
16
|
+
* `0x24` for Core). Reusing Core's table for this device would silently
|
|
17
|
+
* set the wrong sensitivity, so this module defines its own
|
|
18
|
+
* `TRUEMOVE_AIR_DPI_TO_BYTE` and does not import Core's.
|
|
19
|
+
* - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — the DPI preset
|
|
20
|
+
* packet shape, same handler as Rival 3 Gen 1/Aerox 3 but with
|
|
21
|
+
* `dpi_length_byte: 2` (little-endian two bytes per preset — Rival 3 Gen 1
|
|
22
|
+
* and Aerox 3 both use one byte per preset, so a preset list here is twice
|
|
23
|
+
* as long as an equivalent list for those families).
|
|
24
|
+
* - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
|
|
25
|
+
* field layout, 6 buttons only (no `scrollUp`/`scrollDown` remap *slots* —
|
|
26
|
+
* this device profile has no such button entries — though `ScrollUp`
|
|
27
|
+
* (`0x31`) and `ScrollDown` (`0x32`) remain valid remap *targets*, same as
|
|
28
|
+
* `dpi` (`0x30`)).
|
|
29
|
+
* - rivalcfg's `usbhid.py` / `mouse.py` framing conventions, shared with
|
|
30
|
+
* `./rival3.ts` and `./aerox3.ts` (unnumbered HID output reports on the
|
|
31
|
+
* vendor configuration interface, `"endpoint": 3`).
|
|
32
|
+
*
|
|
33
|
+
* ## Why this is a separate protocol family from Rival 3 Gen 1 and Aerox 3
|
|
34
|
+
*
|
|
35
|
+
* Despite the shared "Rival 3" name, `rival3_wireless.py` is confirmed as a
|
|
36
|
+
* genuinely separate command set from both siblings, verified directly from
|
|
37
|
+
* the source rather than assumed from the family name:
|
|
38
|
+
*
|
|
39
|
+
* - Product id `1038:1830` ("2.4 GHz mode", endpoint 3) — distinct from Rival
|
|
40
|
+
* 3 Gen 1's `1038:1824`/`184C` and Aerox 3's `1038:1836`.
|
|
41
|
+
* - Sensitivity command `0x20` (single-byte prefix, like Aerox 3's `0x2D` but
|
|
42
|
+
* a different byte) vs. Rival 3 Gen 1's two-byte `0x0B 0x00`.
|
|
43
|
+
* - Polling command `0x17` with choices `{125:0x03, 250:0x02, 500:0x01,
|
|
44
|
+
* 1000:0x00}` — the same four rates as Gen 1/Aerox 3 but a **different
|
|
45
|
+
* command byte** (`0x17` here vs. `0x04 0x00` / `0x2B`); the value mapping
|
|
46
|
+
* is byte-identical, only the command prefix differs.
|
|
47
|
+
* - Buttons command `0x19` vs. Gen 1's undocumented `0x07 0x00` and Aerox 3's
|
|
48
|
+
* `0x2A`.
|
|
49
|
+
* - Save command `0x09` (**one byte**) — distinct from Rival 3 Gen 1's
|
|
50
|
+
* `0x09 0x00` (two bytes, same leading byte, easy to confuse) and Aerox 3's
|
|
51
|
+
* `0x11 0x00`.
|
|
52
|
+
* - Firmware query `0x90 0x00` — distinct from Rival 3 Gen 1's `0x10 0x00`.
|
|
53
|
+
* Aerox 3 has no firmware query at all.
|
|
54
|
+
* - A `battery_level` read (`0xAA 0x01`, three-byte response) that neither
|
|
55
|
+
* Rival 3 Gen 1 nor Aerox 3 profile defines at all — see below.
|
|
56
|
+
*
|
|
57
|
+
* `rivalcfg/devices/devices.py`'s `SUPPORTED_DEVICES` lists `rival3_wireless`
|
|
58
|
+
* and `rival3_wireless_gen2` (`1038:1872`) as separate profile modules from
|
|
59
|
+
* each other and from `rival3.py`/`aerox3.py`; nothing here claims `0x1872`
|
|
60
|
+
* — the Wireless Gen 2 is a different device with its own (unread) command
|
|
61
|
+
* set and is out of scope for this cluster.
|
|
62
|
+
*
|
|
63
|
+
* No corroborating libratbag or OpenRGB source for this exact device/PID was
|
|
64
|
+
* available in this environment (no local libratbag checkout, and OpenRGB's
|
|
65
|
+
* SteelSeries controllers were not searched for a Rival 3 Wireless-specific
|
|
66
|
+
* file this pass) — every command byte above is sourced from rivalcfg alone.
|
|
67
|
+
* This should be treated as a single-source reconstruction until corroborated
|
|
68
|
+
* or hardware-verified.
|
|
69
|
+
*
|
|
70
|
+
* ## Battery / charging read — this device IS partially readable
|
|
71
|
+
*
|
|
72
|
+
* Unlike the wired Rival 3 Gen 1 and Aerox 3 (write-only, no getters at
|
|
73
|
+
* all), `rival3_wireless.py` defines a top-level `battery_level` block: an
|
|
74
|
+
* output-report write of `0xAA 0x01` gets a 3-byte input-report reply, where
|
|
75
|
+
* `data[0]` is the battery percentage (`level`) and `data[2]` is a
|
|
76
|
+
* charging boolean (`is_charging`, `bool(data[2])`) — `data[1]` is unused by
|
|
77
|
+
* rivalcfg's lambdas. This module exposes `steelseriesRival3WirelessBatteryQuery`
|
|
78
|
+
* / `steelseriesRival3WirelessDecodeBattery` so the HID client can wire a real
|
|
79
|
+
* `readStatus` battery read instead of reporting `batteryState: "Unknown"`.
|
|
80
|
+
* The firmware query (`0x90 0x00`, 2-byte reply) is also readable, following
|
|
81
|
+
* the same pattern as `./rival3.ts`'s `10 00`.
|
|
82
|
+
*
|
|
83
|
+
* DPI presets, polling rate, and buttons remain write-only: `rival3_wireless.py`
|
|
84
|
+
* defines no getter for any of the three, same as every other SteelSeries
|
|
85
|
+
* profile in rivalcfg.
|
|
86
|
+
*
|
|
87
|
+
* Settings apply immediately; the save command (`09`) persists them to
|
|
88
|
+
* onboard flash, mirroring the other two families' CLI default. None of this
|
|
89
|
+
* has been verified on physical hardware by this project.
|
|
90
|
+
*/
|
|
91
|
+
export const RIVAL3_WIRELESS_REPORT_ID = 0x00;
|
|
92
|
+
/** Command prefixes; length varies by command, matching rivalcfg exactly. */
|
|
93
|
+
export const RIVAL3_WIRELESS_COMMAND = {
|
|
94
|
+
sensitivity: [0x20],
|
|
95
|
+
pollingRate: [0x17],
|
|
96
|
+
buttonsMapping: [0x19],
|
|
97
|
+
/** `AA 01` — battery percentage + charging state, 3-byte input-report reply. */
|
|
98
|
+
batteryLevel: [0xaa, 0x01],
|
|
99
|
+
/** One byte — distinct from Rival 3 Gen 1's two-byte `09 00`. */
|
|
100
|
+
save: [0x09],
|
|
101
|
+
/** `90 00` — distinct from Rival 3 Gen 1's `10 00`. */
|
|
102
|
+
firmware: [0x90, 0x00],
|
|
103
|
+
};
|
|
104
|
+
export const RIVAL3_WIRELESS_POLLING_RATES = [125, 250, 500, 1000];
|
|
105
|
+
const POLLING_RATE_TO_BYTE = new Map([
|
|
106
|
+
[1000, 0x00],
|
|
107
|
+
[500, 0x01],
|
|
108
|
+
[250, 0x02],
|
|
109
|
+
[125, 0x03],
|
|
110
|
+
]);
|
|
111
|
+
export const RIVAL3_WIRELESS_DPI_MIN = 100;
|
|
112
|
+
export const RIVAL3_WIRELESS_DPI_MAX = 18000;
|
|
113
|
+
export const RIVAL3_WIRELESS_DPI_STEP = 100;
|
|
114
|
+
export const RIVAL3_WIRELESS_MAX_DPI_PRESETS = 5;
|
|
115
|
+
export const RIVAL3_WIRELESS_FIRMWARE_RESPONSE_LENGTH = 2;
|
|
116
|
+
export const RIVAL3_WIRELESS_BATTERY_RESPONSE_LENGTH = 3;
|
|
117
|
+
/**
|
|
118
|
+
* rivalcfg's TrueMove Air sensor table (`devices/dpi/truemove_air.py`), the
|
|
119
|
+
* sensor used by the Rival 3 Wireless — **not** the TrueMove Core table
|
|
120
|
+
* `./rival3.ts` exports. Values pinned in `rival3-wireless.test.ts` against
|
|
121
|
+
* the source file: 100→0x00, 400→0x04, 1600→0x12, 18000→0xD6.
|
|
122
|
+
*/
|
|
123
|
+
export const TRUEMOVE_AIR_DPI_TO_BYTE = new Map([
|
|
124
|
+
[100, 0x00], [200, 0x02], [300, 0x03], [400, 0x04], [500, 0x05], [600, 0x06],
|
|
125
|
+
[700, 0x07], [800, 0x09], [900, 0x0a], [1000, 0x0b], [1100, 0x0c], [1200, 0x0d],
|
|
126
|
+
[1300, 0x0e], [1400, 0x10], [1500, 0x11], [1600, 0x12], [1700, 0x13], [1800, 0x14],
|
|
127
|
+
[1900, 0x16], [2000, 0x17], [2100, 0x18], [2200, 0x19], [2300, 0x1a], [2400, 0x1b],
|
|
128
|
+
[2500, 0x1d], [2600, 0x1e], [2700, 0x1f], [2800, 0x20], [2900, 0x21], [3000, 0x23],
|
|
129
|
+
[3100, 0x25], [3200, 0x26], [3300, 0x27], [3400, 0x28], [3500, 0x29], [3600, 0x2a],
|
|
130
|
+
[3700, 0x2c], [3800, 0x2d], [3900, 0x2e], [4000, 0x2f], [4100, 0x30], [4200, 0x32],
|
|
131
|
+
[4300, 0x33], [4400, 0x34], [4500, 0x35], [4600, 0x36], [4700, 0x38], [4800, 0x39],
|
|
132
|
+
[4900, 0x3a], [5000, 0x3b], [5100, 0x3c], [5200, 0x3e], [5300, 0x3f], [5400, 0x40],
|
|
133
|
+
[5500, 0x41], [5600, 0x42], [5700, 0x44], [5800, 0x45], [5900, 0x46], [6000, 0x47],
|
|
134
|
+
[6100, 0x48], [6200, 0x4a], [6300, 0x4b], [6400, 0x4c], [6500, 0x4d], [6600, 0x4e],
|
|
135
|
+
[6700, 0x50], [6800, 0x51], [6900, 0x52], [7000, 0x53], [7100, 0x54], [7200, 0x56],
|
|
136
|
+
[7300, 0x57], [7400, 0x58], [7500, 0x59], [7600, 0x5a], [7700, 0x5c], [7800, 0x5d],
|
|
137
|
+
[7900, 0x5e], [8000, 0x5f], [8100, 0x60], [8200, 0x62], [8300, 0x63], [8400, 0x64],
|
|
138
|
+
[8500, 0x65], [8600, 0x66], [8700, 0x68], [8800, 0x69], [8900, 0x6a], [9000, 0x6b],
|
|
139
|
+
[9100, 0x6c], [9200, 0x6e], [9300, 0x6f], [9400, 0x70], [9500, 0x71], [9600, 0x72],
|
|
140
|
+
[9700, 0x74], [9800, 0x75], [9900, 0x76], [10000, 0x77], [10100, 0x78], [10200, 0x7a],
|
|
141
|
+
[10300, 0x7b], [10400, 0x7c], [10500, 0x7d], [10600, 0x7e], [10700, 0x80], [10800, 0x81],
|
|
142
|
+
[10900, 0x82], [11000, 0x83], [11100, 0x84], [11200, 0x86], [11300, 0x87], [11400, 0x88],
|
|
143
|
+
[11500, 0x89], [11600, 0x8a], [11700, 0x8c], [11800, 0x8d], [11900, 0x8e], [12000, 0x8f],
|
|
144
|
+
[12100, 0x90], [12200, 0x92], [12300, 0x93], [12400, 0x94], [12500, 0x95], [12600, 0x96],
|
|
145
|
+
[12700, 0x98], [12800, 0x99], [12900, 0x9a], [13000, 0x9b], [13100, 0x9c], [13200, 0x9e],
|
|
146
|
+
[13300, 0x9f], [13400, 0xa0], [13500, 0xa1], [13600, 0xa2], [13700, 0xa4], [13800, 0xa5],
|
|
147
|
+
[13900, 0xa6], [14000, 0xa7], [14100, 0xa8], [14200, 0xaa], [14300, 0xab], [14400, 0xac],
|
|
148
|
+
[14500, 0xad], [14600, 0xae], [14700, 0xb0], [14800, 0xb1], [14900, 0xb2], [15000, 0xb3],
|
|
149
|
+
[15100, 0xb4], [15200, 0xb5], [15300, 0xb6], [15400, 0xb7], [15500, 0xb8], [15600, 0xb9],
|
|
150
|
+
[15700, 0xba], [15800, 0xbb], [15900, 0xbc], [16000, 0xbd], [16100, 0xbf], [16200, 0xc0],
|
|
151
|
+
[16300, 0xc2], [16400, 0xc3], [16500, 0xc4], [16600, 0xc5], [16700, 0xc6], [16800, 0xc7],
|
|
152
|
+
[16900, 0xc9], [17000, 0xca], [17100, 0xcb], [17200, 0xcc], [17300, 0xcd], [17400, 0xcf],
|
|
153
|
+
[17500, 0xd0], [17600, 0xd1], [17700, 0xd2], [17800, 0xd3], [17900, 0xd5], [18000, 0xd6],
|
|
154
|
+
]);
|
|
155
|
+
export class Rival3WirelessProtocolError extends Error {
|
|
156
|
+
}
|
|
157
|
+
/** The 180 DPI values the TrueMove Air sensor table can express, ascending. */
|
|
158
|
+
export function steelseriesRival3WirelessDpiOptions() {
|
|
159
|
+
return [...TRUEMOVE_AIR_DPI_TO_BYTE.keys()].sort((a, b) => a - b);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* `20 <count> <selected> <v1_lo> <v1_hi>…<vN_lo> <vN_hi>` — replaces the
|
|
163
|
+
* mouse's whole preset table. Two little-endian bytes per DPI
|
|
164
|
+
* (`dpi_length_byte: 2`, unlike Rival 3 Gen 1/Aerox 3's one byte); the high
|
|
165
|
+
* byte is always `0x00` since the TrueMove Air table only produces values up
|
|
166
|
+
* to `0xD6`, but both bytes are always sent to match the wire format exactly.
|
|
167
|
+
* `selectedIndex` is 0-based here and encoded 1-based on the wire
|
|
168
|
+
* (`first_preset: 1`).
|
|
169
|
+
*/
|
|
170
|
+
export function steelseriesRival3WirelessEncodeDpiPresets(presets, selectedIndex) {
|
|
171
|
+
if (presets.length < 1 || presets.length > RIVAL3_WIRELESS_MAX_DPI_PRESETS) {
|
|
172
|
+
throw new Rival3WirelessProtocolError(`SteelSeries Rival 3 Wireless supports 1–${RIVAL3_WIRELESS_MAX_DPI_PRESETS} DPI presets.`);
|
|
173
|
+
}
|
|
174
|
+
if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
|
|
175
|
+
throw new Rival3WirelessProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
|
|
176
|
+
}
|
|
177
|
+
const encoded = [];
|
|
178
|
+
for (const dpi of presets) {
|
|
179
|
+
const byte = TRUEMOVE_AIR_DPI_TO_BYTE.get(dpi);
|
|
180
|
+
if (byte === undefined) {
|
|
181
|
+
throw new Rival3WirelessProtocolError(`SteelSeries Rival 3 Wireless DPI must be ${RIVAL3_WIRELESS_DPI_MIN}–${RIVAL3_WIRELESS_DPI_MAX.toLocaleString()} in ${RIVAL3_WIRELESS_DPI_STEP} DPI steps.`);
|
|
182
|
+
}
|
|
183
|
+
encoded.push(byte & 0xff, 0x00);
|
|
184
|
+
}
|
|
185
|
+
return new Uint8Array([
|
|
186
|
+
...RIVAL3_WIRELESS_COMMAND.sensitivity,
|
|
187
|
+
presets.length,
|
|
188
|
+
selectedIndex + 1,
|
|
189
|
+
...encoded,
|
|
190
|
+
]);
|
|
191
|
+
}
|
|
192
|
+
/** `17 <v>` with 1000→0x00, 500→0x01, 250→0x02, 125→0x03 (different byte order than Rival 3 Gen 1/Aerox 3). */
|
|
193
|
+
export function steelseriesRival3WirelessEncodePollingRate(pollingRateHz) {
|
|
194
|
+
const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
|
|
195
|
+
if (byte === undefined) {
|
|
196
|
+
throw new Rival3WirelessProtocolError("SteelSeries Rival 3 Wireless supports 125, 250, 500, or 1000 Hz polling.");
|
|
197
|
+
}
|
|
198
|
+
return new Uint8Array([...RIVAL3_WIRELESS_COMMAND.pollingRate, byte]);
|
|
199
|
+
}
|
|
200
|
+
/** `09` — commit the current settings to onboard flash. One byte, unlike Rival 3 Gen 1's `09 00`. */
|
|
201
|
+
export function steelseriesRival3WirelessSaveCommand() {
|
|
202
|
+
return new Uint8Array(RIVAL3_WIRELESS_COMMAND.save);
|
|
203
|
+
}
|
|
204
|
+
/** `90 00` — the device answers with a two-byte input report. */
|
|
205
|
+
export function steelseriesRival3WirelessFirmwareQuery() {
|
|
206
|
+
return new Uint8Array(RIVAL3_WIRELESS_COMMAND.firmware);
|
|
207
|
+
}
|
|
208
|
+
/** Decode the two-byte firmware response, same read-order convention as `./rival3.ts`. */
|
|
209
|
+
export function steelseriesRival3WirelessDecodeFirmware(payload) {
|
|
210
|
+
if (payload.length < RIVAL3_WIRELESS_FIRMWARE_RESPONSE_LENGTH) {
|
|
211
|
+
throw new Rival3WirelessProtocolError("SteelSeries Rival 3 Wireless firmware response is shorter than two bytes.");
|
|
212
|
+
}
|
|
213
|
+
const bytes = [payload[0], payload[1]];
|
|
214
|
+
return { bytes, display: `${bytes[0]}.${bytes[1]}` };
|
|
215
|
+
}
|
|
216
|
+
/** `AA 01` — the device answers with a three-byte input report (level, unused, charging). */
|
|
217
|
+
export function steelseriesRival3WirelessBatteryQuery() {
|
|
218
|
+
return new Uint8Array(RIVAL3_WIRELESS_COMMAND.batteryLevel);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Decode the three-byte battery response: `data[0]` is the percentage
|
|
222
|
+
* (rivalcfg's `level` lambda, `int(data[0])`), `data[2]` is charging state
|
|
223
|
+
* (rivalcfg's `is_charging` lambda, `bool(data[2])`). `data[1]` is present in
|
|
224
|
+
* the response but unused by either rivalcfg lambda.
|
|
225
|
+
*/
|
|
226
|
+
export function steelseriesRival3WirelessDecodeBattery(payload) {
|
|
227
|
+
if (payload.length < RIVAL3_WIRELESS_BATTERY_RESPONSE_LENGTH) {
|
|
228
|
+
throw new Rival3WirelessProtocolError("SteelSeries Rival 3 Wireless battery response is shorter than three bytes.");
|
|
229
|
+
}
|
|
230
|
+
return { level: payload[0], isCharging: payload[2] !== 0 };
|
|
231
|
+
}
|
|
232
|
+
/** `buttons_mapping.buttons` from `rival3_wireless.py`, id + byte offset into the packet. */
|
|
233
|
+
export const RIVAL3_WIRELESS_BUTTONS = {
|
|
234
|
+
button1: { id: 0x01, offset: 0x00 },
|
|
235
|
+
button2: { id: 0x02, offset: 0x05 },
|
|
236
|
+
button3: { id: 0x03, offset: 0x0a },
|
|
237
|
+
button4: { id: 0x04, offset: 0x0f },
|
|
238
|
+
button5: { id: 0x05, offset: 0x14 },
|
|
239
|
+
button6: { id: 0x06, offset: 0x19 },
|
|
240
|
+
};
|
|
241
|
+
const RIVAL3_WIRELESS_BUTTON_FIELD_LENGTH = 5;
|
|
242
|
+
const RIVAL3_WIRELESS_BUTTON_DISABLE = 0x00;
|
|
243
|
+
const RIVAL3_WIRELESS_BUTTON_DPI_SWITCH = 0x30;
|
|
244
|
+
const RIVAL3_WIRELESS_BUTTON_SCROLL_UP = 0x31;
|
|
245
|
+
const RIVAL3_WIRELESS_BUTTON_SCROLL_DOWN = 0x32;
|
|
246
|
+
const RIVAL3_WIRELESS_BUTTON_KEYBOARD = 0x51;
|
|
247
|
+
const RIVAL3_WIRELESS_BUTTON_MULTIMEDIA = 0x61;
|
|
248
|
+
/**
|
|
249
|
+
* `19` + one 30-byte (`6 buttons × 5-byte field length`) packet, zero-filled
|
|
250
|
+
* except where a mapping is given. Unmapped buttons are left as all-zero
|
|
251
|
+
* fields (rivalcfg instead fills in per-button defaults; this codec leaves
|
|
252
|
+
* that policy to the caller — pass every button explicitly for parity with
|
|
253
|
+
* rivalcfg's default profile).
|
|
254
|
+
*/
|
|
255
|
+
export function steelseriesRival3WirelessEncodeButtonsMapping(mapping) {
|
|
256
|
+
const names = Object.keys(RIVAL3_WIRELESS_BUTTONS);
|
|
257
|
+
const packet = new Array(names.length * RIVAL3_WIRELESS_BUTTON_FIELD_LENGTH).fill(0x00);
|
|
258
|
+
for (const [name, action] of Object.entries(mapping)) {
|
|
259
|
+
const slot = RIVAL3_WIRELESS_BUTTONS[name];
|
|
260
|
+
if (!slot) {
|
|
261
|
+
throw new Rival3WirelessProtocolError(`Unknown SteelSeries Rival 3 Wireless button "${name}".`);
|
|
262
|
+
}
|
|
263
|
+
const { offset } = slot;
|
|
264
|
+
switch (action.type) {
|
|
265
|
+
case "button": {
|
|
266
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTONS[action.target].id;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
case "disabled": {
|
|
270
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_DISABLE;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case "dpiSwitch": {
|
|
274
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_DPI_SWITCH;
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
case "scrollUp": {
|
|
278
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_SCROLL_UP;
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case "scrollDown": {
|
|
282
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_SCROLL_DOWN;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case "keyboard": {
|
|
286
|
+
if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
|
|
287
|
+
throw new Rival3WirelessProtocolError("Keyboard scan codes must be integers 0–255.");
|
|
288
|
+
}
|
|
289
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_KEYBOARD;
|
|
290
|
+
packet[offset + 1] = action.code;
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
case "multimedia": {
|
|
294
|
+
if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
|
|
295
|
+
throw new Rival3WirelessProtocolError("Multimedia key codes must be integers 0–255.");
|
|
296
|
+
}
|
|
297
|
+
packet[offset] = RIVAL3_WIRELESS_BUTTON_MULTIMEDIA;
|
|
298
|
+
packet[offset + 1] = action.code;
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
default: {
|
|
302
|
+
throw new Rival3WirelessProtocolError("Unsupported SteelSeries Rival 3 Wireless button action.");
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return new Uint8Array([...RIVAL3_WIRELESS_COMMAND.buttonsMapping, ...packet]);
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=rival3-wireless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rival3-wireless.js","sourceRoot":"","sources":["../../src/steelseries/rival3-wireless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyFG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,WAAW,EAAE,CAAC,IAAI,CAAC;IACnB,WAAW,EAAE,CAAC,IAAI,CAAC;IACnB,cAAc,EAAE,CAAC,IAAI,CAAC;IACtB,gFAAgF;IAChF,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAC1B,iEAAiE;IACjE,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,uDAAuD;IACvD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAE5E,MAAM,oBAAoB,GAAgC,IAAI,GAAG,CAAC;IAChE,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAgC,IAAI,GAAG,CAAC;IAC3E,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;IAC5E,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAC/E,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACrF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SteelSeries Rival 3 Gen 1 configuration protocol — pure encode/decode helpers.
|
|
3
|
+
*
|
|
4
|
+
* Reconstructed from public open-source implementations, not vendor software:
|
|
5
|
+
*
|
|
6
|
+
* - rivalcfg `rivalcfg/devices/rival3.py`, `rivalcfg/handlers/multidpi_range_choice.py`,
|
|
7
|
+
* `rivalcfg/devices/dpi/truemove_core.py`, `rivalcfg/mouse.py`, `rivalcfg/usbhid.py`
|
|
8
|
+
* (https://github.com/flozz/rivalcfg) — the primary source for every byte here.
|
|
9
|
+
* - libratbag `src/driver-steelseries.c` — corroborates the polling values, the
|
|
10
|
+
* save id, the firmware id, and that SteelSeries uses unnumbered reports.
|
|
11
|
+
* - OpenRGB `SteelSeriesRival3Controller.cpp` — corroborates interface 3, the
|
|
12
|
+
* firmware query, and that short unpadded writes are accepted.
|
|
13
|
+
*
|
|
14
|
+
* Every command is an HID **output report** with report id 0x00 on the vendor
|
|
15
|
+
* configuration interface (hidapi `interface_number == 3`). The functions here
|
|
16
|
+
* build the report *payload* — the bytes after the report id, which the WebHID
|
|
17
|
+
* driver passes to `sendReport(0x00, …)` separately. rivalcfg sends these
|
|
18
|
+
* frames unpadded, and that is what this codec produces.
|
|
19
|
+
*
|
|
20
|
+
* **This device is write-only.** No public implementation has a getter for
|
|
21
|
+
* DPI, polling, lighting, or buttons: rivalcfg mirrors state into a local JSON
|
|
22
|
+
* file because the mouse cannot be asked, and libratbag flags its SteelSeries
|
|
23
|
+
* profiles `RATBAG_PROFILE_CAP_WRITE_ONLY`. The single readable value is the
|
|
24
|
+
* two-byte firmware version behind command `10 00`.
|
|
25
|
+
*
|
|
26
|
+
* Settings apply immediately; the save command (`09 00`) commits them to
|
|
27
|
+
* onboard flash (rivalcfg's `--no-save`: "Do not persist settings in the
|
|
28
|
+
* internal device memory"). Which half of that is volatile has not been
|
|
29
|
+
* confirmed on hardware yet.
|
|
30
|
+
*
|
|
31
|
+
* Known but deliberately not implemented — documented so nobody re-derives
|
|
32
|
+
* them, withheld until there is a reason and hardware evidence to ship them:
|
|
33
|
+
*
|
|
34
|
+
* - `05 00 <zone 1–4> <r> <g> <b> <brightness 0x00–0x64>` — zone color (zone 0 = all)
|
|
35
|
+
* - `06 00 <0x00–0x06>` — lighting effect (steady = 0x04)
|
|
36
|
+
* - `07 00` + 8 × 2-byte fields — button mapping
|
|
37
|
+
*
|
|
38
|
+
* None of this has been verified on physical hardware by this project.
|
|
39
|
+
* The Rival 3 Gen 2 (`1038:1870`) and Rival 3 Wireless (`1038:1830`) use
|
|
40
|
+
* different, incompatible command sets and must not reuse this module.
|
|
41
|
+
*/
|
|
42
|
+
export declare const STEELSERIES_REPORT_ID = 0;
|
|
43
|
+
/** Two-byte command prefixes; the payload is the prefix plus its arguments. */
|
|
44
|
+
export declare const RIVAL3_COMMAND: {
|
|
45
|
+
readonly pollingRate: readonly [4, 0];
|
|
46
|
+
readonly save: readonly [9, 0];
|
|
47
|
+
readonly dpiPresets: readonly [11, 0];
|
|
48
|
+
readonly firmware: readonly [16, 0];
|
|
49
|
+
};
|
|
50
|
+
export declare const RIVAL3_POLLING_RATES: readonly [125, 250, 500, 1000];
|
|
51
|
+
export declare const RIVAL3_DPI_MIN = 200;
|
|
52
|
+
export declare const RIVAL3_DPI_MAX = 8500;
|
|
53
|
+
export declare const RIVAL3_DPI_STEP = 100;
|
|
54
|
+
export declare const RIVAL3_MAX_DPI_PRESETS = 5;
|
|
55
|
+
export declare const RIVAL3_FIRMWARE_RESPONSE_LENGTH = 2;
|
|
56
|
+
/**
|
|
57
|
+
* rivalcfg's TrueMove Core sensor table (`devices/dpi/truemove_core.py`):
|
|
58
|
+
* DPI is sent as one byte from this lookup, not as an integer. The source
|
|
59
|
+
* ships it as a literal table with no closed-form formula; the increments
|
|
60
|
+
* follow a repeating +2/+2/+3 pattern, and the values rivalcfg quotes
|
|
61
|
+
* (200→0x04 … 1200→0x1b, 1600→0x24, 8500→0xc5) are pinned in protocol.test.ts.
|
|
62
|
+
*/
|
|
63
|
+
export declare const TRUEMOVE_CORE_DPI_TO_BYTE: ReadonlyMap<number, number>;
|
|
64
|
+
export declare class SteelSeriesProtocolError extends Error {
|
|
65
|
+
}
|
|
66
|
+
/** The 84 DPI values the sensor table can express, ascending. */
|
|
67
|
+
export declare function steelseriesRival3DpiOptions(): number[];
|
|
68
|
+
/**
|
|
69
|
+
* `0B 00 <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
|
|
70
|
+
* table. `selectedIndex` is 0-based here and encoded 1-based on the wire.
|
|
71
|
+
*
|
|
72
|
+
* DPI values must be exact table keys. rivalcfg rounds a request to the
|
|
73
|
+
* nearest table entry; this codec rejects off-grid values instead, matching
|
|
74
|
+
* how the rest of this package validates DPI, so a caller is never silently
|
|
75
|
+
* given a different sensitivity than it asked for.
|
|
76
|
+
*/
|
|
77
|
+
export declare function steelseriesRival3EncodeDpiPresets(presets: readonly number[], selectedIndex: number): Uint8Array;
|
|
78
|
+
/** `04 00 <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
|
|
79
|
+
export declare function steelseriesRival3EncodePollingRate(pollingRateHz: number): Uint8Array;
|
|
80
|
+
/** `09 00` — commit the current settings to onboard flash. */
|
|
81
|
+
export declare function steelseriesRival3SaveCommand(): Uint8Array;
|
|
82
|
+
/** `10 00` — the device answers with a two-byte input report. */
|
|
83
|
+
export declare function steelseriesRival3FirmwareQuery(): Uint8Array;
|
|
84
|
+
export interface SteelSeriesRival3Firmware {
|
|
85
|
+
/** The two raw response bytes, in the order the device sent them. */
|
|
86
|
+
bytes: [number, number];
|
|
87
|
+
/** The bytes joined in read order, e.g. "37.0". */
|
|
88
|
+
display: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Decode the two-byte firmware response. The byte order is contested between
|
|
92
|
+
* public implementations — libratbag reads [minor, major], current rivalcfg
|
|
93
|
+
* joins the bytes in read order, and OpenRGB treats them as a little-endian
|
|
94
|
+
* word — so both raw bytes are returned and `display` follows rivalcfg's
|
|
95
|
+
* read-order behavior until hardware (a `1038:184C` unit, known to be firmware
|
|
96
|
+
* v0.37.0.0) settles which byte is which.
|
|
97
|
+
*/
|
|
98
|
+
export declare function steelseriesRival3DecodeFirmware(payload: Uint8Array): SteelSeriesRival3Firmware;
|
|
99
|
+
//# sourceMappingURL=rival3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rival3.d.ts","sourceRoot":"","sources":["../../src/steelseries/rival3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAE1C,+EAA+E;AAC/E,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX,eAAO,MAAM,oBAAoB,gCAAiC,CAAC;AASnE,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAehE,CAAC;AAEH,qBAAa,wBAAyB,SAAQ,KAAK;CAAG;AAEtD,iEAAiE;AACjE,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,GACpB,UAAU,CAqBZ;AAED,gEAAgE;AAChE,wBAAgB,kCAAkC,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAMpF;AAED,8DAA8D;AAC9D,wBAAgB,4BAA4B,IAAI,UAAU,CAEzD;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,IAAI,UAAU,CAE3D;AAED,MAAM,WAAW,yBAAyB;IACxC,qEAAqE;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,UAAU,GAAG,yBAAyB,CAM9F"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SteelSeries Rival 3 Gen 1 configuration protocol — pure encode/decode helpers.
|
|
3
|
+
*
|
|
4
|
+
* Reconstructed from public open-source implementations, not vendor software:
|
|
5
|
+
*
|
|
6
|
+
* - rivalcfg `rivalcfg/devices/rival3.py`, `rivalcfg/handlers/multidpi_range_choice.py`,
|
|
7
|
+
* `rivalcfg/devices/dpi/truemove_core.py`, `rivalcfg/mouse.py`, `rivalcfg/usbhid.py`
|
|
8
|
+
* (https://github.com/flozz/rivalcfg) — the primary source for every byte here.
|
|
9
|
+
* - libratbag `src/driver-steelseries.c` — corroborates the polling values, the
|
|
10
|
+
* save id, the firmware id, and that SteelSeries uses unnumbered reports.
|
|
11
|
+
* - OpenRGB `SteelSeriesRival3Controller.cpp` — corroborates interface 3, the
|
|
12
|
+
* firmware query, and that short unpadded writes are accepted.
|
|
13
|
+
*
|
|
14
|
+
* Every command is an HID **output report** with report id 0x00 on the vendor
|
|
15
|
+
* configuration interface (hidapi `interface_number == 3`). The functions here
|
|
16
|
+
* build the report *payload* — the bytes after the report id, which the WebHID
|
|
17
|
+
* driver passes to `sendReport(0x00, …)` separately. rivalcfg sends these
|
|
18
|
+
* frames unpadded, and that is what this codec produces.
|
|
19
|
+
*
|
|
20
|
+
* **This device is write-only.** No public implementation has a getter for
|
|
21
|
+
* DPI, polling, lighting, or buttons: rivalcfg mirrors state into a local JSON
|
|
22
|
+
* file because the mouse cannot be asked, and libratbag flags its SteelSeries
|
|
23
|
+
* profiles `RATBAG_PROFILE_CAP_WRITE_ONLY`. The single readable value is the
|
|
24
|
+
* two-byte firmware version behind command `10 00`.
|
|
25
|
+
*
|
|
26
|
+
* Settings apply immediately; the save command (`09 00`) commits them to
|
|
27
|
+
* onboard flash (rivalcfg's `--no-save`: "Do not persist settings in the
|
|
28
|
+
* internal device memory"). Which half of that is volatile has not been
|
|
29
|
+
* confirmed on hardware yet.
|
|
30
|
+
*
|
|
31
|
+
* Known but deliberately not implemented — documented so nobody re-derives
|
|
32
|
+
* them, withheld until there is a reason and hardware evidence to ship them:
|
|
33
|
+
*
|
|
34
|
+
* - `05 00 <zone 1–4> <r> <g> <b> <brightness 0x00–0x64>` — zone color (zone 0 = all)
|
|
35
|
+
* - `06 00 <0x00–0x06>` — lighting effect (steady = 0x04)
|
|
36
|
+
* - `07 00` + 8 × 2-byte fields — button mapping
|
|
37
|
+
*
|
|
38
|
+
* None of this has been verified on physical hardware by this project.
|
|
39
|
+
* The Rival 3 Gen 2 (`1038:1870`) and Rival 3 Wireless (`1038:1830`) use
|
|
40
|
+
* different, incompatible command sets and must not reuse this module.
|
|
41
|
+
*/
|
|
42
|
+
export const STEELSERIES_REPORT_ID = 0x00;
|
|
43
|
+
/** Two-byte command prefixes; the payload is the prefix plus its arguments. */
|
|
44
|
+
export const RIVAL3_COMMAND = {
|
|
45
|
+
pollingRate: [0x04, 0x00],
|
|
46
|
+
save: [0x09, 0x00],
|
|
47
|
+
dpiPresets: [0x0b, 0x00],
|
|
48
|
+
firmware: [0x10, 0x00],
|
|
49
|
+
};
|
|
50
|
+
export const RIVAL3_POLLING_RATES = [125, 250, 500, 1000];
|
|
51
|
+
const POLLING_RATE_TO_BYTE = new Map([
|
|
52
|
+
[1000, 0x01],
|
|
53
|
+
[500, 0x02],
|
|
54
|
+
[250, 0x03],
|
|
55
|
+
[125, 0x04],
|
|
56
|
+
]);
|
|
57
|
+
export const RIVAL3_DPI_MIN = 200;
|
|
58
|
+
export const RIVAL3_DPI_MAX = 8500;
|
|
59
|
+
export const RIVAL3_DPI_STEP = 100;
|
|
60
|
+
export const RIVAL3_MAX_DPI_PRESETS = 5;
|
|
61
|
+
export const RIVAL3_FIRMWARE_RESPONSE_LENGTH = 2;
|
|
62
|
+
/**
|
|
63
|
+
* rivalcfg's TrueMove Core sensor table (`devices/dpi/truemove_core.py`):
|
|
64
|
+
* DPI is sent as one byte from this lookup, not as an integer. The source
|
|
65
|
+
* ships it as a literal table with no closed-form formula; the increments
|
|
66
|
+
* follow a repeating +2/+2/+3 pattern, and the values rivalcfg quotes
|
|
67
|
+
* (200→0x04 … 1200→0x1b, 1600→0x24, 8500→0xc5) are pinned in protocol.test.ts.
|
|
68
|
+
*/
|
|
69
|
+
export const TRUEMOVE_CORE_DPI_TO_BYTE = new Map([
|
|
70
|
+
[200, 0x04], [300, 0x06], [400, 0x08], [500, 0x0b], [600, 0x0d], [700, 0x0f],
|
|
71
|
+
[800, 0x12], [900, 0x14], [1000, 0x16], [1100, 0x19], [1200, 0x1b], [1300, 0x1d],
|
|
72
|
+
[1400, 0x20], [1500, 0x22], [1600, 0x24], [1700, 0x27], [1800, 0x29], [1900, 0x2b],
|
|
73
|
+
[2000, 0x2e], [2100, 0x30], [2200, 0x32], [2300, 0x35], [2400, 0x37], [2500, 0x39],
|
|
74
|
+
[2600, 0x3c], [2700, 0x3e], [2800, 0x40], [2900, 0x43], [3000, 0x45], [3100, 0x47],
|
|
75
|
+
[3200, 0x4a], [3300, 0x4c], [3400, 0x4e], [3500, 0x51], [3600, 0x53], [3700, 0x55],
|
|
76
|
+
[3800, 0x58], [3900, 0x5a], [4000, 0x5c], [4100, 0x5f], [4200, 0x61], [4300, 0x63],
|
|
77
|
+
[4400, 0x66], [4500, 0x68], [4600, 0x6a], [4700, 0x6d], [4800, 0x6f], [4900, 0x71],
|
|
78
|
+
[5000, 0x74], [5100, 0x76], [5200, 0x78], [5300, 0x7b], [5400, 0x7d], [5500, 0x7f],
|
|
79
|
+
[5600, 0x82], [5700, 0x84], [5800, 0x86], [5900, 0x89], [6000, 0x8b], [6100, 0x8d],
|
|
80
|
+
[6200, 0x90], [6300, 0x92], [6400, 0x94], [6500, 0x97], [6600, 0x99], [6700, 0x9b],
|
|
81
|
+
[6800, 0x9e], [6900, 0xa0], [7000, 0xa2], [7100, 0xa5], [7200, 0xa7], [7300, 0xa9],
|
|
82
|
+
[7400, 0xac], [7500, 0xae], [7600, 0xb0], [7700, 0xb3], [7800, 0xb5], [7900, 0xb7],
|
|
83
|
+
[8000, 0xba], [8100, 0xbc], [8200, 0xbe], [8300, 0xc1], [8400, 0xc3], [8500, 0xc5],
|
|
84
|
+
]);
|
|
85
|
+
export class SteelSeriesProtocolError extends Error {
|
|
86
|
+
}
|
|
87
|
+
/** The 84 DPI values the sensor table can express, ascending. */
|
|
88
|
+
export function steelseriesRival3DpiOptions() {
|
|
89
|
+
return [...TRUEMOVE_CORE_DPI_TO_BYTE.keys()].sort((a, b) => a - b);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* `0B 00 <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
|
|
93
|
+
* table. `selectedIndex` is 0-based here and encoded 1-based on the wire.
|
|
94
|
+
*
|
|
95
|
+
* DPI values must be exact table keys. rivalcfg rounds a request to the
|
|
96
|
+
* nearest table entry; this codec rejects off-grid values instead, matching
|
|
97
|
+
* how the rest of this package validates DPI, so a caller is never silently
|
|
98
|
+
* given a different sensitivity than it asked for.
|
|
99
|
+
*/
|
|
100
|
+
export function steelseriesRival3EncodeDpiPresets(presets, selectedIndex) {
|
|
101
|
+
if (presets.length < 1 || presets.length > RIVAL3_MAX_DPI_PRESETS) {
|
|
102
|
+
throw new SteelSeriesProtocolError(`SteelSeries Rival 3 supports 1–${RIVAL3_MAX_DPI_PRESETS} DPI presets.`);
|
|
103
|
+
}
|
|
104
|
+
if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
|
|
105
|
+
throw new SteelSeriesProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
|
|
106
|
+
}
|
|
107
|
+
const encoded = presets.map((dpi) => {
|
|
108
|
+
const byte = TRUEMOVE_CORE_DPI_TO_BYTE.get(dpi);
|
|
109
|
+
if (byte === undefined) {
|
|
110
|
+
throw new SteelSeriesProtocolError(`SteelSeries Rival 3 DPI must be ${RIVAL3_DPI_MIN}–${RIVAL3_DPI_MAX.toLocaleString()} in ${RIVAL3_DPI_STEP} DPI steps.`);
|
|
111
|
+
}
|
|
112
|
+
return byte;
|
|
113
|
+
});
|
|
114
|
+
return new Uint8Array([...RIVAL3_COMMAND.dpiPresets, presets.length, selectedIndex + 1, ...encoded]);
|
|
115
|
+
}
|
|
116
|
+
/** `04 00 <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
|
|
117
|
+
export function steelseriesRival3EncodePollingRate(pollingRateHz) {
|
|
118
|
+
const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
|
|
119
|
+
if (byte === undefined) {
|
|
120
|
+
throw new SteelSeriesProtocolError("SteelSeries Rival 3 supports 125, 250, 500, or 1000 Hz polling.");
|
|
121
|
+
}
|
|
122
|
+
return new Uint8Array([...RIVAL3_COMMAND.pollingRate, byte]);
|
|
123
|
+
}
|
|
124
|
+
/** `09 00` — commit the current settings to onboard flash. */
|
|
125
|
+
export function steelseriesRival3SaveCommand() {
|
|
126
|
+
return new Uint8Array(RIVAL3_COMMAND.save);
|
|
127
|
+
}
|
|
128
|
+
/** `10 00` — the device answers with a two-byte input report. */
|
|
129
|
+
export function steelseriesRival3FirmwareQuery() {
|
|
130
|
+
return new Uint8Array(RIVAL3_COMMAND.firmware);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Decode the two-byte firmware response. The byte order is contested between
|
|
134
|
+
* public implementations — libratbag reads [minor, major], current rivalcfg
|
|
135
|
+
* joins the bytes in read order, and OpenRGB treats them as a little-endian
|
|
136
|
+
* word — so both raw bytes are returned and `display` follows rivalcfg's
|
|
137
|
+
* read-order behavior until hardware (a `1038:184C` unit, known to be firmware
|
|
138
|
+
* v0.37.0.0) settles which byte is which.
|
|
139
|
+
*/
|
|
140
|
+
export function steelseriesRival3DecodeFirmware(payload) {
|
|
141
|
+
if (payload.length < RIVAL3_FIRMWARE_RESPONSE_LENGTH) {
|
|
142
|
+
throw new SteelSeriesProtocolError("SteelSeries Rival 3 firmware response is shorter than two bytes.");
|
|
143
|
+
}
|
|
144
|
+
const bytes = [payload[0], payload[1]];
|
|
145
|
+
return { bytes, display: `${bytes[0]}.${bytes[1]}` };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=rival3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rival3.js","sourceRoot":"","sources":["../../src/steelseries/rival3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACzB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAEnE,MAAM,oBAAoB,GAAgC,IAAI,GAAG,CAAC;IAChE,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAgC,IAAI,GAAG,CAAC;IAC5E,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;IAC5E,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAChF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClF,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IA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"}
|