@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,225 @@
|
|
|
1
|
+
import { GWOLVES_ADDRESS, GWOLVES_COMMAND, GWOLVES_REPORT_ID, gwolvesBuildReadPayload, gwolvesBuildSimplePayload, gwolvesBuildWritePayload, gwolvesBuildWriteScalarPayload, gwolvesDecodeProfile, gwolvesEncodeDpi, gwolvesEncodePollingRate, gwolvesParseBattery, gwolvesParseReadResponse, gwolvesReportChecksumIsValid, } from "@openmouse/protocol/gwolves";
|
|
2
|
+
import { GWOLVES_PRODUCTS, GWOLVES_VENDOR_ID } from "./products.js";
|
|
3
|
+
// G-Wolves mice enumerate under their own vendor id (0x33e4) but speak the
|
|
4
|
+
// exact same shared VGN-family wire protocol already implemented
|
|
5
|
+
// independently in this repo for the VGN Dragonfly F2 Master+ and the
|
|
6
|
+
// Pulsar 4K Wireless Receiver — identical opcodes, checksums, EEPROM
|
|
7
|
+
// address map, DPI encoding, and polling-rate encoding. This driver uses
|
|
8
|
+
// its own protocol module (../../gwolves/index.ts) rather than importing
|
|
9
|
+
// vgn's, matching the pattern already established for the Pulsar/VGN case:
|
|
10
|
+
// independent per-brand implementation of a shared algorithm, so a future
|
|
11
|
+
// G-Wolves-specific quirk can diverge without touching another brand's
|
|
12
|
+
// tested code. Confirmed against real hardware 2026-08-21 via a live HID
|
|
13
|
+
// capture (browser sendReport/inputreport patch) while changing DPI, LOD,
|
|
14
|
+
// and polling rate on the official G-Wolves web driver at mouse.fit, then
|
|
15
|
+
// independently reproduced with hidapitester with no browser involved at
|
|
16
|
+
// all. See PROTOCOL-NOTES.md in the PR for the raw captured packets this
|
|
17
|
+
// was verified against.
|
|
18
|
+
//
|
|
19
|
+
// This class is intentionally model-agnostic: per-product identity (name,
|
|
20
|
+
// wireless/wired, verified-on-hardware status) lives in ./products.ts, not
|
|
21
|
+
// here. Adding support for another G-Wolves model that turns out to share
|
|
22
|
+
// this same protocol should just mean a new entry in that catalog.
|
|
23
|
+
const RESPONSE_TIMEOUT_MS = 700;
|
|
24
|
+
const SUPPORTED_POLLING_RATES = [125, 250, 500, 1000, 2000, 4000, 8000];
|
|
25
|
+
export class GWolvesHidClient {
|
|
26
|
+
device;
|
|
27
|
+
waiter = null;
|
|
28
|
+
onInputReport = (event) => {
|
|
29
|
+
if (event.reportId !== GWOLVES_REPORT_ID)
|
|
30
|
+
return;
|
|
31
|
+
const response = new Uint8Array(event.data.buffer.slice(event.data.byteOffset, event.data.byteOffset + event.data.byteLength));
|
|
32
|
+
const waiter = this.waiter;
|
|
33
|
+
if (!waiter || response[0] !== waiter.command)
|
|
34
|
+
return;
|
|
35
|
+
window.clearTimeout(waiter.timer);
|
|
36
|
+
this.waiter = null;
|
|
37
|
+
waiter.resolve(response);
|
|
38
|
+
};
|
|
39
|
+
constructor(device) {
|
|
40
|
+
this.device = device;
|
|
41
|
+
}
|
|
42
|
+
// Only product ids present in GWOLVES_PRODUCTS (see ./products.ts) are
|
|
43
|
+
// accepted — this is the single place that catalog is consulted for
|
|
44
|
+
// device recognition, so adding a model is purely a data change there.
|
|
45
|
+
static isSupported(device) {
|
|
46
|
+
if (device.vendorId !== GWOLVES_VENDOR_ID)
|
|
47
|
+
return false;
|
|
48
|
+
if (!GWOLVES_PRODUCTS.has(device.productId))
|
|
49
|
+
return false;
|
|
50
|
+
return device.collections.some((collection) => collection.usagePage === 0xff02
|
|
51
|
+
&& collection.inputReports.some((report) => report.reportId === GWOLVES_REPORT_ID && this.reportLength(report) === 16)
|
|
52
|
+
&& collection.outputReports.some((report) => report.reportId === GWOLVES_REPORT_ID && this.reportLength(report) === 16));
|
|
53
|
+
}
|
|
54
|
+
get product() {
|
|
55
|
+
// isSupported() is always checked before a client is constructed (see
|
|
56
|
+
// registry.ts), so an unknown product id here means a caller bypassed
|
|
57
|
+
// that check rather than a real runtime case to handle gracefully.
|
|
58
|
+
const product = GWOLVES_PRODUCTS.get(this.device.productId);
|
|
59
|
+
if (!product)
|
|
60
|
+
throw new Error(`Unrecognized G-Wolves product id 0x${this.device.productId.toString(16)}.`);
|
|
61
|
+
return product;
|
|
62
|
+
}
|
|
63
|
+
isWirelessPath() {
|
|
64
|
+
return this.product.wireless;
|
|
65
|
+
}
|
|
66
|
+
get pollIntervalMs() {
|
|
67
|
+
return this.isWirelessPath() ? 10_000 : 30_000;
|
|
68
|
+
}
|
|
69
|
+
getDpiOptions() {
|
|
70
|
+
const values = [];
|
|
71
|
+
for (let dpi = 50; dpi <= 26_000; dpi += 50)
|
|
72
|
+
values.push(dpi);
|
|
73
|
+
return values;
|
|
74
|
+
}
|
|
75
|
+
async open() {
|
|
76
|
+
if (!this.device.opened)
|
|
77
|
+
await this.device.open();
|
|
78
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
79
|
+
this.device.addEventListener("inputreport", this.onInputReport);
|
|
80
|
+
}
|
|
81
|
+
async readStatus() {
|
|
82
|
+
await this.open();
|
|
83
|
+
const { model, wireless } = this.product;
|
|
84
|
+
const batteryResponse = await this.transact(gwolvesBuildSimplePayload(GWOLVES_COMMAND.battery));
|
|
85
|
+
const firmwareResponse = await this.transact(gwolvesBuildSimplePayload(GWOLVES_COMMAND.firmware));
|
|
86
|
+
const profile = await this.readProfile();
|
|
87
|
+
const battery = gwolvesParseBattery(batteryResponse);
|
|
88
|
+
const settings = gwolvesDecodeProfile(profile);
|
|
89
|
+
const firmware = this.version(firmwareResponse);
|
|
90
|
+
return {
|
|
91
|
+
brand: "G-Wolves",
|
|
92
|
+
name: `G-Wolves ${model}`,
|
|
93
|
+
batteryPercent: battery?.percent ?? null,
|
|
94
|
+
batteryVoltageMv: battery?.voltageMv ?? null,
|
|
95
|
+
batteryState: battery
|
|
96
|
+
? battery.charging ? (battery.percent >= 99 ? "Full" : "Charging") : "Discharging"
|
|
97
|
+
: "Unknown",
|
|
98
|
+
dpi: settings.dpi,
|
|
99
|
+
pollingRateHz: settings.pollingRateHz,
|
|
100
|
+
supportedPollingRates: SUPPORTED_POLLING_RATES,
|
|
101
|
+
activeProfile: null,
|
|
102
|
+
connectionType: wireless ? "Wireless" : "Wired",
|
|
103
|
+
connectionDetail: wireless ? "2.4 GHz receiver · 8K protocol" : "USB · 8K protocol",
|
|
104
|
+
motionSync: settings.motionSync,
|
|
105
|
+
debounceMs: settings.debounceMs,
|
|
106
|
+
sleepTimeout: settings.sleepTimeout === null ? null : settings.sleepTimeout / 10,
|
|
107
|
+
angleSnapping: settings.angleSnapping,
|
|
108
|
+
rippleControl: settings.rippleControl,
|
|
109
|
+
performanceMode: settings.performanceMode,
|
|
110
|
+
liftOffDistance: settings.liftOffDistance,
|
|
111
|
+
firmware: firmware ? [`Mouse ${firmware}`] : [],
|
|
112
|
+
ui: {
|
|
113
|
+
family: "vgn-f2",
|
|
114
|
+
hideUnsupportedPollingRates: true,
|
|
115
|
+
forceShowBattery: false,
|
|
116
|
+
pollingNote: `${model} supports 125 Hz through 8,000 Hz over its shared VGN-family protocol.`,
|
|
117
|
+
defaultDisplayName: `G-Wolves ${model}`,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async setDpi(dpi) {
|
|
122
|
+
const profile = gwolvesDecodeProfile(await this.readProfile());
|
|
123
|
+
const address = GWOLVES_ADDRESS.dpiStages + profile.activeDpiStage * 4;
|
|
124
|
+
await this.write(address, [...gwolvesEncodeDpi(dpi)]);
|
|
125
|
+
const confirmed = gwolvesDecodeProfile(await this.readProfile()).dpi;
|
|
126
|
+
if (confirmed !== dpi)
|
|
127
|
+
throw new Error(`The ${this.product.model} kept ${confirmed} DPI instead of ${dpi} DPI.`);
|
|
128
|
+
return confirmed;
|
|
129
|
+
}
|
|
130
|
+
async setPollingRate(rate) {
|
|
131
|
+
await this.writeScalar(GWOLVES_ADDRESS.pollingRate, gwolvesEncodePollingRate(rate));
|
|
132
|
+
const confirmed = gwolvesDecodeProfile(await this.readProfile()).pollingRateHz;
|
|
133
|
+
if (confirmed !== rate) {
|
|
134
|
+
const hint = this.isWirelessPath()
|
|
135
|
+
? " (on the wireless path, the mouse must be actively awake — try moving it first)"
|
|
136
|
+
: "";
|
|
137
|
+
throw new Error(`The ${this.product.model} kept ${confirmed} Hz instead of ${rate} Hz.${hint}`);
|
|
138
|
+
}
|
|
139
|
+
return confirmed;
|
|
140
|
+
}
|
|
141
|
+
async setLiftOffDistance(value) {
|
|
142
|
+
const raw = value === "Low" ? 3 : value === "Medium" ? 1 : 2;
|
|
143
|
+
await this.writeScalar(GWOLVES_ADDRESS.lod, raw);
|
|
144
|
+
const confirmed = gwolvesDecodeProfile(await this.readProfile()).liftOffDistance;
|
|
145
|
+
if (confirmed !== value)
|
|
146
|
+
throw new Error(`The ${this.product.model} kept ${confirmed ?? "unknown"} LOD instead of ${value}.`);
|
|
147
|
+
return confirmed;
|
|
148
|
+
}
|
|
149
|
+
async close() {
|
|
150
|
+
this.failWaiter(new Error("The G-Wolves device was closed."));
|
|
151
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
152
|
+
if (this.device.opened)
|
|
153
|
+
await this.device.close();
|
|
154
|
+
}
|
|
155
|
+
async readProfile() {
|
|
156
|
+
const profile = new Uint8Array(0xb7);
|
|
157
|
+
for (const [start, end] of [[0, 0x2c], [0xa8, 0xb7]]) {
|
|
158
|
+
for (let address = start; address < end; address += 10) {
|
|
159
|
+
const length = Math.min(10, end - address);
|
|
160
|
+
profile.set(await this.read(address, length), address);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return profile;
|
|
164
|
+
}
|
|
165
|
+
async read(address, length) {
|
|
166
|
+
const response = await this.transact(gwolvesBuildReadPayload(address, length));
|
|
167
|
+
const data = gwolvesParseReadResponse(response, address, length);
|
|
168
|
+
if (!data)
|
|
169
|
+
throw new Error(`${this.product.model} flash read failed at 0x${address.toString(16)}.`);
|
|
170
|
+
return data;
|
|
171
|
+
}
|
|
172
|
+
async writeScalar(address, value) {
|
|
173
|
+
const response = await this.transact(gwolvesBuildWriteScalarPayload(address, value));
|
|
174
|
+
if (!gwolvesReportChecksumIsValid(response) || response[0] !== GWOLVES_COMMAND.write || response[1] !== 0) {
|
|
175
|
+
throw new Error(`${this.product.model} flash write failed at 0x${address.toString(16)}.`);
|
|
176
|
+
}
|
|
177
|
+
const confirmed = await this.read(address, 2);
|
|
178
|
+
if (confirmed[0] !== value || ((confirmed[0] + confirmed[1]) & 0xff) !== 0x55) {
|
|
179
|
+
throw new Error(`The ${this.product.model} did not retain the value written at 0x${address.toString(16)}.`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async write(address, data) {
|
|
183
|
+
const response = await this.transact(gwolvesBuildWritePayload(address, data));
|
|
184
|
+
if (!gwolvesReportChecksumIsValid(response) || response[0] !== GWOLVES_COMMAND.write || response[1] !== 0) {
|
|
185
|
+
throw new Error(`${this.product.model} flash write failed at 0x${address.toString(16)}.`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async transact(payload) {
|
|
189
|
+
await this.open();
|
|
190
|
+
this.failWaiter(new Error("Superseded by another G-Wolves request."));
|
|
191
|
+
const command = payload[0];
|
|
192
|
+
const response = new Promise((resolve, reject) => {
|
|
193
|
+
const timer = window.setTimeout(() => {
|
|
194
|
+
if (this.waiter?.resolve === resolve)
|
|
195
|
+
this.waiter = null;
|
|
196
|
+
reject(new Error(`Timed out waiting for G-Wolves command 0x${command.toString(16)}.`));
|
|
197
|
+
}, RESPONSE_TIMEOUT_MS);
|
|
198
|
+
this.waiter = { command, resolve, reject, timer };
|
|
199
|
+
});
|
|
200
|
+
try {
|
|
201
|
+
await this.device.sendReport(GWOLVES_REPORT_ID, new Uint8Array(payload).buffer);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
this.failWaiter(error instanceof Error ? error : new Error(String(error)));
|
|
205
|
+
}
|
|
206
|
+
return response;
|
|
207
|
+
}
|
|
208
|
+
version(response) {
|
|
209
|
+
if (!gwolvesReportChecksumIsValid(response) || response[0] !== GWOLVES_COMMAND.firmware || response[1] !== 0)
|
|
210
|
+
return null;
|
|
211
|
+
return `v${response[5] ?? 0}.${(response[6] ?? 0).toString(16).padStart(2, "0")}`;
|
|
212
|
+
}
|
|
213
|
+
failWaiter(error) {
|
|
214
|
+
const waiter = this.waiter;
|
|
215
|
+
if (!waiter)
|
|
216
|
+
return;
|
|
217
|
+
window.clearTimeout(waiter.timer);
|
|
218
|
+
this.waiter = null;
|
|
219
|
+
waiter.reject(error);
|
|
220
|
+
}
|
|
221
|
+
static reportLength(report) {
|
|
222
|
+
return report.items.reduce((sum, item) => sum + item.reportSize * item.reportCount, 0) / 8;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/gwolves/hid.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAuB,MAAM,eAAe,CAAC;AAEzF,2EAA2E;AAC3E,iEAAiE;AACjE,sEAAsE;AACtE,qEAAqE;AACrE,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,wBAAwB;AACxB,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,mEAAmE;AACnE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAExE,MAAM,OAAO,gBAAgB;IAClB,MAAM,CAAY;IACnB,MAAM,GAKH,IAAI,CAAC;IAEC,aAAa,GAAG,CAAC,KAA0B,EAAQ,EAAE;QACpE,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB;YAAE,OAAO;QACjD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAC9F,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO;YAAE,OAAO;QACtD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,uEAAuE;IACvE,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,CAAC,WAAW,CAAC,MAAiB;QAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,iBAAiB;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAC5C,UAAU,CAAC,SAAS,KAAK,MAAM;eAC5B,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;eACnH,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7H,CAAC;IAED,IAAY,OAAO;QACjB,sEAAsE;QACtE,sEAAsE;QACtE,mEAAmE;QACnE,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3G,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,aAAa;QACX,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAChG,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEhD,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,YAAY,KAAK,EAAE;YACzB,cAAc,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;YACxC,gBAAgB,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YAC5C,YAAY,EAAE,OAAO;gBACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa;gBAClF,CAAC,CAAC,SAAS;YACb,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,qBAAqB,EAAE,uBAAuB;YAC9C,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;YAC/C,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,mBAAmB;YACnF,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,EAAE;YAChF,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/C,EAAE,EAAE;gBACF,MAAM,EAAE,QAAQ;gBAChB,2BAA2B,EAAE,IAAI;gBACjC,gBAAgB,EAAE,KAAK;gBACvB,WAAW,EAAE,GAAG,KAAK,wEAAwE;gBAC7F,kBAAkB,EAAE,YAAY,KAAK,EAAE;aACxC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;QACvE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC;QACrE,IAAI,SAAS,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,SAAS,mBAAmB,GAAG,OAAO,CAAC,CAAC;QACjH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC;QAC/E,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;gBAChC,CAAC,CAAC,iFAAiF;gBACnF,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,SAAS,kBAAkB,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAkD;QACzE,MAAM,GAAG,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC;QACjF,IAAI,SAAS,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,SAAS,IAAI,SAAS,mBAAmB,KAAK,GAAG,CAAC,CAAC;QAC9H,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAU,EAAE,CAAC;YAC9D,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,MAAc;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,2BAA2B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,KAAa;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1G,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,4BAA4B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,0CAA0C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,IAAuB;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1G,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,4BAA4B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAmB;QACxC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO;oBAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACzD,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,OAAO,CAAC,QAAoB;QAClC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1H,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACpF,CAAC;IAEO,UAAU,CAAC,KAAY;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,MAAqB;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7F,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface GWolvesProduct {
|
|
2
|
+
model: string;
|
|
3
|
+
wireless: boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Only `verified: true` entries have been exercised against real hardware
|
|
6
|
+
* by this project. Everything else would be a guess based on "probably
|
|
7
|
+
* the same shared VGN-family protocol as the HTX Ultra" and should not be
|
|
8
|
+
* assumed correct until actually tested — see PROTOCOL-NOTES.md in the
|
|
9
|
+
* HTX Ultra PR for how the verified entries were confirmed (live HID
|
|
10
|
+
* capture while using the official web driver at mouse.fit, cross-checked
|
|
11
|
+
* independently with hidapitester).
|
|
12
|
+
*/
|
|
13
|
+
verified: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare const GWOLVES_VENDOR_ID = 13284;
|
|
16
|
+
export declare const GWOLVES_PRODUCTS: ReadonlyMap<number, GWolvesProduct>;
|
|
17
|
+
//# sourceMappingURL=products.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../src/drivers/gwolves/products.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;;;OAQG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAuD/D,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const GWOLVES_VENDOR_ID = 0x33e4;
|
|
2
|
+
export const GWOLVES_PRODUCTS = new Map([
|
|
3
|
+
[0x5618, { model: "HTX Ultra", wireless: false, verified: true }],
|
|
4
|
+
[0x3854, { model: "HTX Ultra", wireless: true, verified: true }],
|
|
5
|
+
// Everything below is transcribed from G-Wolves' own live web-driver config
|
|
6
|
+
// (mouse.xyz's env-models.json, fetched 2026-08-30 — every entry shares the
|
|
7
|
+
// HTX Ultra's vendor id 0x33e4 and "IsNewProtocol": "1"), not independently
|
|
8
|
+
// hardware-tested. Add further G-Wolves models here as they're
|
|
9
|
+
// captured/verified — but confirm with a real capture before setting
|
|
10
|
+
// verified: true, since a wrong address/encoding on an unverified model
|
|
11
|
+
// could silently write the wrong value rather than fail loudly.
|
|
12
|
+
[0x3808, { model: "HTM Plus", wireless: false, verified: false }],
|
|
13
|
+
[0x3817, { model: "HTM Plus", wireless: true, verified: false }],
|
|
14
|
+
[0x6808, { model: "HSK Pro 2.0", wireless: false, verified: false }],
|
|
15
|
+
[0x6817, { model: "HSK Pro 2.0", wireless: true, verified: false }],
|
|
16
|
+
[0x5608, { model: "HTXU", wireless: false, verified: false }],
|
|
17
|
+
[0x5617, { model: "HTXU", wireless: true, verified: false }],
|
|
18
|
+
[0x3608, { model: "Fenrir Pro", wireless: false, verified: false }],
|
|
19
|
+
[0x3617, { model: "Fenrir Pro", wireless: true, verified: false }],
|
|
20
|
+
[0x3908, { model: "VUK", wireless: false, verified: false }],
|
|
21
|
+
[0x3917, { model: "VUK", wireless: true, verified: false }],
|
|
22
|
+
[0x7904, { model: "HT-S2", wireless: false, verified: false }],
|
|
23
|
+
[0x7913, { model: "HT-S2", wireless: true, verified: false }],
|
|
24
|
+
[0x3708, { model: "Fenir Max", wireless: false, verified: false }],
|
|
25
|
+
[0x3717, { model: "Fenir Max", wireless: true, verified: false }],
|
|
26
|
+
[0x5308, { model: "HTS Ultra", wireless: false, verified: false }],
|
|
27
|
+
[0x5317, { model: "HTS Ultra", wireless: true, verified: false }],
|
|
28
|
+
[0x7704, { model: "HTR", wireless: false, verified: false }],
|
|
29
|
+
[0x7713, { model: "HTR", wireless: true, verified: false }],
|
|
30
|
+
[0x3508, { model: "Fenrir", wireless: false, verified: false }],
|
|
31
|
+
[0x3517, { model: "Fenrir", wireless: true, verified: false }],
|
|
32
|
+
[0x7908, { model: "HT-S2 Pro", wireless: false, verified: false }],
|
|
33
|
+
[0x7917, { model: "HT-S2 Pro", wireless: true, verified: false }],
|
|
34
|
+
[0x5808, { model: "HSK Pro", wireless: false, verified: false }],
|
|
35
|
+
[0x5817, { model: "HSK Pro", wireless: true, verified: false }],
|
|
36
|
+
[0x2708, { model: "HTX Mini", wireless: false, verified: false }],
|
|
37
|
+
[0x2717, { model: "HTX Mini", wireless: true, verified: false }],
|
|
38
|
+
[0x5408, { model: "HTS Plus", wireless: false, verified: false }],
|
|
39
|
+
[0x5417, { model: "HTS Plus", wireless: true, verified: false }],
|
|
40
|
+
[0x5708, { model: "HTX", wireless: false, verified: false }],
|
|
41
|
+
[0x5717, { model: "HTX", wireless: true, verified: false }],
|
|
42
|
+
[0x5908, { model: "HSK Plus", wireless: false, verified: false }],
|
|
43
|
+
[0x5917, { model: "HSK Plus", wireless: true, verified: false }],
|
|
44
|
+
[0x7708, { model: "HTR Pro", wireless: false, verified: false }],
|
|
45
|
+
[0x7717, { model: "HTR Pro", wireless: true, verified: false }],
|
|
46
|
+
[0x5804, { model: "HSK Pro ACE", wireless: false, verified: false }],
|
|
47
|
+
[0x5803, { model: "HSK Pro ACE", wireless: true, verified: false }],
|
|
48
|
+
[0x5404, { model: "HTS Plus ACE", wireless: false, verified: false }],
|
|
49
|
+
[0x5403, { model: "HTS Plus ACE", wireless: true, verified: false }],
|
|
50
|
+
[0x5704, { model: "HTX ACE", wireless: false, verified: false }],
|
|
51
|
+
[0x5703, { model: "HTX ACE", wireless: true, verified: false }],
|
|
52
|
+
[0x5904, { model: "HSK Plus ACE", wireless: false, verified: false }],
|
|
53
|
+
[0x5903, { model: "HSK Plus ACE", wireless: true, verified: false }],
|
|
54
|
+
// "TEST HTS Plus" in that config (wired 0x5428, wireless 0x3854) is
|
|
55
|
+
// deliberately skipped: its own name marks it a dev/test entry, and its
|
|
56
|
+
// wireless id collides with the already-verified HTX Ultra's 0x3854.
|
|
57
|
+
]);
|
|
58
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/drivers/gwolves/products.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { MouseStatus } from "../mouse-types.ts";
|
|
2
|
+
import { type DpiSettings } from "@openmouse/protocol/hyperx";
|
|
3
|
+
/**
|
|
4
|
+
* HyperX Pulsefire Haste — WebHID client.
|
|
5
|
+
*
|
|
6
|
+
* The config channel is a single vendor collection (usage page 0xFF00, usage
|
|
7
|
+
* 0x01) carrying one 64-byte **output** report and one 64-byte **input**
|
|
8
|
+
* report. It declares no feature report, so this driver transfers through
|
|
9
|
+
* `sendReport()` / the `inputreport` event instead of `sendFeatureReport()`.
|
|
10
|
+
*
|
|
11
|
+
* Reads (0x46/0x50/0x51/0x53/0x54) echo the request's opcode at byte 0 of
|
|
12
|
+
* their reply; writes (0xD0/0xD3/0xDE) are fire-and-forget and must be
|
|
13
|
+
* confirmed by re-reading the matching getter.
|
|
14
|
+
*
|
|
15
|
+
* The mouse is write-direct: DPI writes target onboard profile 0 (the profile
|
|
16
|
+
* NGENUITY opens as "Profile 1") and are persisted with a SAVE packet, then
|
|
17
|
+
* re-read through the 0x53 DPI-settings report so staged values are confirmed
|
|
18
|
+
* rather than assumed.
|
|
19
|
+
*/
|
|
20
|
+
export declare class HyperXHidClient {
|
|
21
|
+
readonly device: HIDDevice;
|
|
22
|
+
private onReport;
|
|
23
|
+
private inbox;
|
|
24
|
+
constructor(device: HIDDevice);
|
|
25
|
+
static isSupported(device: HIDDevice): boolean;
|
|
26
|
+
get supportedPollingRates(): number[];
|
|
27
|
+
getDpiOptions(): number[];
|
|
28
|
+
open(): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Send a 64-byte output report and wait for a reply echoing `opcode` at byte
|
|
32
|
+
* 0. Other interfaces (mouse input, keyboard) share this HIDDevice; their
|
|
33
|
+
* reports are filtered out by length and opcode.
|
|
34
|
+
*/
|
|
35
|
+
sendQuery(opcode: number): Promise<Uint8Array>;
|
|
36
|
+
/** Fire-and-forget write; no reply is expected. */
|
|
37
|
+
private sendCommand;
|
|
38
|
+
private delay;
|
|
39
|
+
getHardwareInfo(): Promise<{
|
|
40
|
+
firmware: string;
|
|
41
|
+
product: string;
|
|
42
|
+
}>;
|
|
43
|
+
getConnection(): Promise<{
|
|
44
|
+
type: "Wired" | "Wireless" | null;
|
|
45
|
+
detail: string;
|
|
46
|
+
}>;
|
|
47
|
+
getBattery(): Promise<{
|
|
48
|
+
percent: number | null;
|
|
49
|
+
state: "Charging" | "Discharging" | "Full" | "Unknown";
|
|
50
|
+
}>;
|
|
51
|
+
getDpiSettings(): Promise<DpiSettings | null>;
|
|
52
|
+
setDpi(dpi: number, dpiY?: number): Promise<number>;
|
|
53
|
+
setPollingRate(rate: number): Promise<number>;
|
|
54
|
+
setLiftOffDistance(value: NonNullable<MouseStatus["liftOffDistance"]>): Promise<void>;
|
|
55
|
+
/** Re-read DPI settings until they match, tolerating fire-and-forget write latency. */
|
|
56
|
+
private confirmDpi;
|
|
57
|
+
readStatus(): Promise<MouseStatus>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=hid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/hyperx/hid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAiBL,KAAK,WAAW,EAEjB,MAAM,4BAA4B,CAAC;AAYpC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAuD;IACvE,OAAO,CAAC,KAAK,CAAoB;gBAErB,MAAM,EAAE,SAAS;IAI7B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAY9C,IAAI,qBAAqB,IAAI,MAAM,EAAE,CAEpC;IAED,aAAa,IAAI,MAAM,EAAE;IAInB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAcpD,mDAAmD;YACrC,WAAW;IAKzB,OAAO,CAAC,KAAK;IAQP,eAAe,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASjE,aAAa,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAM/E,UAAU,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAKzG,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAS7C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBxD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7C,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3F,uFAAuF;YACzE,UAAU;IAalB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;CAkDzC"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { CMD, HYPERX_USAGE, HYPERX_USAGE_PAGE, HYPERX_VENDOR_ID_HP, HYPERX_VENDOR_ID_KINGSTON, SUPPORTED_POLLING_RATES, decodeBattery, decodeConnection, decodeDpiSettings, decodeHardwareInfo, dpiOptions, encodeSave, encodeSetDpi, encodeSetLod, encodeSetPollingRate, isValidDpi, } from "@openmouse/protocol/hyperx";
|
|
2
|
+
const REPORT_SIZE = 64;
|
|
3
|
+
const RESPONSE_TIMEOUT_MS = 500;
|
|
4
|
+
const RESPONSE_POLL_MS = 5;
|
|
5
|
+
const WRITE_SETTLE_MS = 60;
|
|
6
|
+
const WRITE_CONFIRM_ATTEMPTS = 5;
|
|
7
|
+
function hex(value) {
|
|
8
|
+
return `0x${value.toString(16).padStart(2, "0")}`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* HyperX Pulsefire Haste — WebHID client.
|
|
12
|
+
*
|
|
13
|
+
* The config channel is a single vendor collection (usage page 0xFF00, usage
|
|
14
|
+
* 0x01) carrying one 64-byte **output** report and one 64-byte **input**
|
|
15
|
+
* report. It declares no feature report, so this driver transfers through
|
|
16
|
+
* `sendReport()` / the `inputreport` event instead of `sendFeatureReport()`.
|
|
17
|
+
*
|
|
18
|
+
* Reads (0x46/0x50/0x51/0x53/0x54) echo the request's opcode at byte 0 of
|
|
19
|
+
* their reply; writes (0xD0/0xD3/0xDE) are fire-and-forget and must be
|
|
20
|
+
* confirmed by re-reading the matching getter.
|
|
21
|
+
*
|
|
22
|
+
* The mouse is write-direct: DPI writes target onboard profile 0 (the profile
|
|
23
|
+
* NGENUITY opens as "Profile 1") and are persisted with a SAVE packet, then
|
|
24
|
+
* re-read through the 0x53 DPI-settings report so staged values are confirmed
|
|
25
|
+
* rather than assumed.
|
|
26
|
+
*/
|
|
27
|
+
export class HyperXHidClient {
|
|
28
|
+
device;
|
|
29
|
+
onReport = null;
|
|
30
|
+
inbox = [];
|
|
31
|
+
constructor(device) {
|
|
32
|
+
this.device = device;
|
|
33
|
+
}
|
|
34
|
+
static isSupported(device) {
|
|
35
|
+
const vid = device.vendorId;
|
|
36
|
+
if (vid !== HYPERX_VENDOR_ID_KINGSTON && vid !== HYPERX_VENDOR_ID_HP)
|
|
37
|
+
return false;
|
|
38
|
+
const hasVendorCollection = (collections) => collections.some((collection) => (collection.usagePage === HYPERX_USAGE_PAGE && collection.usage === HYPERX_USAGE) ||
|
|
39
|
+
hasVendorCollection(collection.children));
|
|
40
|
+
return hasVendorCollection(device.collections);
|
|
41
|
+
}
|
|
42
|
+
get supportedPollingRates() {
|
|
43
|
+
return [...SUPPORTED_POLLING_RATES];
|
|
44
|
+
}
|
|
45
|
+
getDpiOptions() {
|
|
46
|
+
return dpiOptions();
|
|
47
|
+
}
|
|
48
|
+
async open() {
|
|
49
|
+
if (!this.device.opened)
|
|
50
|
+
await this.device.open();
|
|
51
|
+
if (!this.onReport) {
|
|
52
|
+
this.inbox = [];
|
|
53
|
+
this.onReport = (event) => {
|
|
54
|
+
const data = new Uint8Array(event.data.buffer, event.data.byteOffset, event.data.byteLength);
|
|
55
|
+
if (data.length >= REPORT_SIZE) {
|
|
56
|
+
this.inbox.push(data.subarray(0, REPORT_SIZE));
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
this.device.addEventListener("inputreport", this.onReport);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async close() {
|
|
63
|
+
if (this.onReport) {
|
|
64
|
+
this.device.removeEventListener("inputreport", this.onReport);
|
|
65
|
+
this.onReport = null;
|
|
66
|
+
}
|
|
67
|
+
this.inbox = [];
|
|
68
|
+
if (this.device.opened)
|
|
69
|
+
await this.device.close();
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Report I/O
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Send a 64-byte output report and wait for a reply echoing `opcode` at byte
|
|
76
|
+
* 0. Other interfaces (mouse input, keyboard) share this HIDDevice; their
|
|
77
|
+
* reports are filtered out by length and opcode.
|
|
78
|
+
*/
|
|
79
|
+
async sendQuery(opcode) {
|
|
80
|
+
await this.open();
|
|
81
|
+
const buf = new Uint8Array(REPORT_SIZE);
|
|
82
|
+
buf[0] = opcode;
|
|
83
|
+
const deadline = performance.now() + RESPONSE_TIMEOUT_MS;
|
|
84
|
+
await this.device.sendReport(0, buf);
|
|
85
|
+
while (performance.now() < deadline) {
|
|
86
|
+
const index = this.inbox.findIndex((candidate) => candidate[0] === opcode);
|
|
87
|
+
if (index !== -1)
|
|
88
|
+
return this.inbox.splice(index, 1)[0];
|
|
89
|
+
await this.delay(RESPONSE_POLL_MS);
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`HyperX command ${hex(opcode)} was not answered.`);
|
|
92
|
+
}
|
|
93
|
+
/** Fire-and-forget write; no reply is expected. */
|
|
94
|
+
async sendCommand(buf) {
|
|
95
|
+
await this.open();
|
|
96
|
+
await this.device.sendReport(0, buf.buffer);
|
|
97
|
+
}
|
|
98
|
+
delay(ms) {
|
|
99
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Reads
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
async getHardwareInfo() {
|
|
105
|
+
const resp = await this.sendQuery(CMD.GET_HARDWARE_INFO);
|
|
106
|
+
const info = decodeHardwareInfo(resp);
|
|
107
|
+
return {
|
|
108
|
+
firmware: info?.firmware ?? "unknown",
|
|
109
|
+
product: info?.product ?? this.device.productName ?? "",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async getConnection() {
|
|
113
|
+
const resp = await this.sendQuery(CMD.GET_CONNECTION);
|
|
114
|
+
const type = decodeConnection(resp);
|
|
115
|
+
return { type, detail: type === "Wireless" ? "2.4 GHz receiver" : type === "Wired" ? "USB" : "" };
|
|
116
|
+
}
|
|
117
|
+
async getBattery() {
|
|
118
|
+
const resp = await this.sendQuery(CMD.GET_BATTERY);
|
|
119
|
+
return decodeBattery(resp) ?? { percent: null, state: "Unknown" };
|
|
120
|
+
}
|
|
121
|
+
async getDpiSettings() {
|
|
122
|
+
const resp = await this.sendQuery(CMD.GET_DPI);
|
|
123
|
+
return decodeDpiSettings(resp);
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Writes
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
async setDpi(dpi, dpiY = dpi) {
|
|
129
|
+
if (!isValidDpi(dpi) || !isValidDpi(dpiY)) {
|
|
130
|
+
throw new Error("HyperX DPI must be 200–16,000 in 100 DPI steps.");
|
|
131
|
+
}
|
|
132
|
+
await this.open();
|
|
133
|
+
for (const [profile, value] of [[0, dpi], [1, dpiY]]) {
|
|
134
|
+
const buf = encodeSetDpi(profile, value);
|
|
135
|
+
if (buf)
|
|
136
|
+
await this.sendCommand(buf);
|
|
137
|
+
}
|
|
138
|
+
const save = encodeSave(0x03);
|
|
139
|
+
await this.sendCommand(save);
|
|
140
|
+
await this.delay(WRITE_SETTLE_MS);
|
|
141
|
+
const confirmed = await this.confirmDpi((settings) => settings !== null && settings.profiles[0] === dpi);
|
|
142
|
+
if (confirmed && confirmed.profiles[0] !== dpi) {
|
|
143
|
+
throw new Error(`The mouse kept ${confirmed.profiles[0].toLocaleString()} DPI instead of ${dpi.toLocaleString()}.`);
|
|
144
|
+
}
|
|
145
|
+
return confirmed?.profiles[0] ?? dpi;
|
|
146
|
+
}
|
|
147
|
+
async setPollingRate(rate) {
|
|
148
|
+
if (!SUPPORTED_POLLING_RATES.includes(rate)) {
|
|
149
|
+
throw new Error(`HyperX supports ${SUPPORTED_POLLING_RATES.join(", ")} Hz.`);
|
|
150
|
+
}
|
|
151
|
+
const buf = encodeSetPollingRate(rate);
|
|
152
|
+
if (!buf)
|
|
153
|
+
throw new Error(`Failed to encode polling rate ${rate} Hz.`);
|
|
154
|
+
await this.sendCommand(buf);
|
|
155
|
+
await this.delay(WRITE_SETTLE_MS);
|
|
156
|
+
return rate;
|
|
157
|
+
}
|
|
158
|
+
async setLiftOffDistance(value) {
|
|
159
|
+
if (value !== "Low" && value !== "High") {
|
|
160
|
+
throw new Error("HyperX supports 1 mm (Low) or 2 mm (High) lift-off distance.");
|
|
161
|
+
}
|
|
162
|
+
const buf = encodeSetLod(value);
|
|
163
|
+
await this.sendCommand(buf);
|
|
164
|
+
const save = encodeSave(0x03);
|
|
165
|
+
await this.sendCommand(save);
|
|
166
|
+
await this.delay(WRITE_SETTLE_MS);
|
|
167
|
+
const confirmed = await this.confirmDpi((settings) => settings !== null && settings.liftOffDistance === value);
|
|
168
|
+
if (confirmed && confirmed.liftOffDistance !== value) {
|
|
169
|
+
throw new Error(`The mouse kept ${confirmed.liftOffDistance ?? "an unknown"} lift-off distance instead of ${value}.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Re-read DPI settings until they match, tolerating fire-and-forget write latency. */
|
|
173
|
+
async confirmDpi(matches) {
|
|
174
|
+
let settings = await this.getDpiSettings().catch(() => null);
|
|
175
|
+
for (let attempt = 1; attempt < WRITE_CONFIRM_ATTEMPTS && !matches(settings); attempt += 1) {
|
|
176
|
+
await this.delay(WRITE_SETTLE_MS);
|
|
177
|
+
settings = await this.getDpiSettings().catch(() => null);
|
|
178
|
+
}
|
|
179
|
+
return settings;
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// High-level API
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
async readStatus() {
|
|
185
|
+
await this.open();
|
|
186
|
+
// Hardware info must answer, or this is not a HyperX config interface.
|
|
187
|
+
const [infoResult, dpiResult, batteryResult, connectionResult] = await Promise.allSettled([
|
|
188
|
+
this.getHardwareInfo(),
|
|
189
|
+
this.getDpiSettings(),
|
|
190
|
+
this.getBattery(),
|
|
191
|
+
this.getConnection(),
|
|
192
|
+
]);
|
|
193
|
+
if (infoResult.status === "rejected") {
|
|
194
|
+
throw new Error(`HyperX control interface did not answer hardware info. ${infoResult.reason}`);
|
|
195
|
+
}
|
|
196
|
+
const info = infoResult.value;
|
|
197
|
+
const dpi = dpiResult.status === "fulfilled" ? dpiResult.value : null;
|
|
198
|
+
const battery = batteryResult.status === "fulfilled" ? batteryResult.value : null;
|
|
199
|
+
const connection = connectionResult.status === "fulfilled" ? connectionResult.value : null;
|
|
200
|
+
const activeDpi = dpi?.profiles[dpi.activeProfile] ?? dpi?.profiles[0] ?? 1600;
|
|
201
|
+
const isWireless = connection?.type === "Wireless";
|
|
202
|
+
const settingsReady = dpi !== null;
|
|
203
|
+
return {
|
|
204
|
+
brand: "HyperX",
|
|
205
|
+
name: info.product || this.device.productName || "HyperX Mouse",
|
|
206
|
+
ui: {
|
|
207
|
+
family: "hyperx",
|
|
208
|
+
settingsReady,
|
|
209
|
+
hideLodLow: false,
|
|
210
|
+
hideUnsupportedPollingRates: true,
|
|
211
|
+
hideProcessingCard: true,
|
|
212
|
+
defaultDisplayName: info.product || this.device.productName || "HyperX Mouse",
|
|
213
|
+
},
|
|
214
|
+
batteryPercent: isWireless ? battery?.percent ?? null : null,
|
|
215
|
+
batteryState: isWireless ? battery?.state ?? "Unknown" : "Unknown",
|
|
216
|
+
dpi: activeDpi,
|
|
217
|
+
dpiY: activeDpi,
|
|
218
|
+
pollingRateHz: 1000,
|
|
219
|
+
supportedPollingRates: this.supportedPollingRates,
|
|
220
|
+
activeProfile: dpi?.activeProfile ?? null,
|
|
221
|
+
connectionType: connection?.type ?? (isWireless ? "Wireless" : "Wired"),
|
|
222
|
+
connectionDetail: connection?.detail,
|
|
223
|
+
liftOffDistance: dpi?.liftOffDistance ?? null,
|
|
224
|
+
supportedLiftOffDistances: ["Low", "High"],
|
|
225
|
+
firmware: info.firmware ? [`Mouse v${info.firmware}`] : [],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/hyperx/hid.ts"],"names":[],"mappings":"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"}
|