@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,295 @@
|
|
|
1
|
+
import { VENDOR_ID } from "../vendors.js";
|
|
2
|
+
import { GEARHUB_PRODUCTS } from "@openmouse/protocol/gearhub";
|
|
3
|
+
// Fantech command IDs (from GearHub qmk.top protocol)
|
|
4
|
+
export const CMD = {
|
|
5
|
+
// Family B (older Fantech mice) command set
|
|
6
|
+
GET_ALL_PARAMS: 159, // Get all parameters (profile, report rate, etc.)
|
|
7
|
+
GET_DPI: 144, // Get DPI settings (SENSORDPI)
|
|
8
|
+
SET_DPI: 16, // Set DPI settings
|
|
9
|
+
GET_REPORT_RATE: 131, // Get report/polling rate
|
|
10
|
+
SET_REPORT_RATE: 8, // Set report/polling rate
|
|
11
|
+
GET_DEBOUNCE: 132, // Get debounce time
|
|
12
|
+
SET_DEBOUNCE: 4, // Set debounce time
|
|
13
|
+
SET_PROFILE: 2, // Set current profile
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Report rate encoding for Fantech mice.
|
|
17
|
+
*
|
|
18
|
+
* This table is also the single source of truth for `supportedPollingRates`:
|
|
19
|
+
* a rate the driver cannot encode must never reach the UI, which renders one
|
|
20
|
+
* button per advertised rate and would throw on click. 250 Hz is deliberately
|
|
21
|
+
* absent — Fantech's own spec sheet lists it for the WG14P, but its wire
|
|
22
|
+
* encoding has never been captured, and inventing a code byte would silently
|
|
23
|
+
* set some other rate. Add it here, and nowhere else, once a capture confirms
|
|
24
|
+
* the value.
|
|
25
|
+
*/
|
|
26
|
+
export const REPORT_RATE_ENCODE = {
|
|
27
|
+
8000: 0,
|
|
28
|
+
4000: 1,
|
|
29
|
+
2000: 2,
|
|
30
|
+
1000: 3,
|
|
31
|
+
500: 4,
|
|
32
|
+
125: 5,
|
|
33
|
+
};
|
|
34
|
+
export const REPORT_RATE_DECODE = Object.fromEntries(Object.entries(REPORT_RATE_ENCODE).map(([k, v]) => [v, Number(k)]));
|
|
35
|
+
export const FANTECH_REPORT_ID = 0x00;
|
|
36
|
+
export const FANTECH_REPORT_SIZE = 64;
|
|
37
|
+
/** DPI slots the Family B report layout has room for (bytes [8..23] X, [24..39] Y). */
|
|
38
|
+
export const FANTECH_MAX_DPI_SLOTS = 8;
|
|
39
|
+
/** First byte of the per-slot X DPI array, in both a GET_DPI response and a SET_DPI command. */
|
|
40
|
+
const DPI_X_OFFSET = 8;
|
|
41
|
+
/** First byte of the per-slot Y DPI array, immediately after the X array. */
|
|
42
|
+
const DPI_Y_OFFSET = DPI_X_OFFSET + FANTECH_MAX_DPI_SLOTS * 2;
|
|
43
|
+
/** One past the end of the Y array; the whole DPI table is [DPI_X_OFFSET, DPI_END). */
|
|
44
|
+
const DPI_END = DPI_Y_OFFSET + FANTECH_MAX_DPI_SLOTS * 2;
|
|
45
|
+
function rejectionMessage(result) {
|
|
46
|
+
return result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fantech vendor HID control.
|
|
50
|
+
*
|
|
51
|
+
* Transport: vendor usage page 0xFFFF, usage 0x02 under VID 0x3151.
|
|
52
|
+
* The WG14P Yari Pro exposes a 64-byte feature report on this interface
|
|
53
|
+
* for DPI and configuration settings.
|
|
54
|
+
*
|
|
55
|
+
* Protocol: Fantech command-based protocol (Family B).
|
|
56
|
+
* - Send command as first byte of 64-byte feature report
|
|
57
|
+
* - Read response as 64-byte feature report
|
|
58
|
+
* - DPI stored as LE uint16 in bytes [8+h*2..9+h*2] (X) and [24+h*2..25+h*2] (Y)
|
|
59
|
+
* - Report rate encoded as 0=8000, 1=4000, 2=2000, 3=1000, 4=500, 5=125
|
|
60
|
+
*
|
|
61
|
+
* NOT every VID 0x3151 mouse speaks Family B, and the ones that do not are
|
|
62
|
+
* indistinguishable from the ones that do until you ask them something. The
|
|
63
|
+
* 2.4G receiver sold as PID 0x402D presents byte-for-byte the interface
|
|
64
|
+
* described above — vendor page 0xFFFF, usage 0x02, one unnumbered 64-byte
|
|
65
|
+
* feature report — and ACKs every SET_FEATURE write without error, yet
|
|
66
|
+
* answers GET_DPI, GET_REPORT_RATE, GET_ALL_PARAMS and GET_DEBOUNCE alike
|
|
67
|
+
* with 64 zero bytes (measured on Windows across 0-500ms read delays and
|
|
68
|
+
* three different command layouts).
|
|
69
|
+
*
|
|
70
|
+
* Reading those zeros as data is worse than failing outright: byte 2 of a
|
|
71
|
+
* blank response decodes to report-rate code 0 = 8000 Hz, and a zero DPI used
|
|
72
|
+
* to fall back to 1600, so `readStatus()` returned a perfectly plausible
|
|
73
|
+
* "ready" mouse whose every number was invented. Each read below therefore
|
|
74
|
+
* rejects a blank response, and `readStatus()` throws when nothing answers at
|
|
75
|
+
* all — the caller treats that as "try the next candidate driver" (see
|
|
76
|
+
* `connectToInterface()` in the desktop app under `src/native-hid/scan.ts`).
|
|
77
|
+
*/
|
|
78
|
+
export class FantechHidClient {
|
|
79
|
+
device;
|
|
80
|
+
currentProfile = 0;
|
|
81
|
+
constructor(device) {
|
|
82
|
+
this.device = device;
|
|
83
|
+
}
|
|
84
|
+
static isSupported(device) {
|
|
85
|
+
if (device.vendorId !== VENDOR_ID.fantech)
|
|
86
|
+
return false;
|
|
87
|
+
// 0x3151 is the MicLink/mlzn ODM vendor id, not Fantech's own, and the
|
|
88
|
+
// GearHub-V5 mice (Lingbao M5 Pro, Attack Shark R2, …) answer on the
|
|
89
|
+
// identical 0xFFFF/0x02 interface while speaking a different dialect
|
|
90
|
+
// entirely (2.4G relay + Bit7 checksum). They have their own driver;
|
|
91
|
+
// leave their product ids to it, or driverFor() would hand this one a
|
|
92
|
+
// device it cannot read.
|
|
93
|
+
if (GEARHUB_PRODUCTS.has(device.productId))
|
|
94
|
+
return false;
|
|
95
|
+
const hasVendorConfig = (collections) => collections.some((collection) => (collection.usagePage === 0xffff &&
|
|
96
|
+
collection.usage === 0x02) ||
|
|
97
|
+
hasVendorConfig(collection.children));
|
|
98
|
+
return hasVendorConfig(device.collections);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Only the rates this driver can actually put on the wire. Derived from
|
|
102
|
+
* REPORT_RATE_ENCODE so the list the UI renders and the list
|
|
103
|
+
* `setReportRate()` accepts cannot drift apart.
|
|
104
|
+
*/
|
|
105
|
+
get supportedPollingRates() {
|
|
106
|
+
return Object.keys(REPORT_RATE_ENCODE)
|
|
107
|
+
.map(Number)
|
|
108
|
+
.sort((a, b) => a - b);
|
|
109
|
+
}
|
|
110
|
+
getDpiOptions() {
|
|
111
|
+
return [
|
|
112
|
+
400, 800, 1200, 1600, 2000, 2400, 3200, 4000, 4800, 5600, 6400, 8000,
|
|
113
|
+
10000, 12000, 16000, 20000, 26000, 30000,
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
async open() {
|
|
117
|
+
if (!this.device.opened)
|
|
118
|
+
await this.device.open();
|
|
119
|
+
}
|
|
120
|
+
async close() {
|
|
121
|
+
if (this.device.opened)
|
|
122
|
+
await this.device.close();
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Command I/O
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
/** Send a command and return the raw response, answered or not. */
|
|
128
|
+
async sendCommand(cmd, ...payload) {
|
|
129
|
+
const buf = new Uint8Array(FANTECH_REPORT_SIZE);
|
|
130
|
+
buf[0] = cmd;
|
|
131
|
+
for (let i = 0; i < payload.length && i + 1 < buf.length; i++) {
|
|
132
|
+
buf[i + 1] = payload[i];
|
|
133
|
+
}
|
|
134
|
+
await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
|
|
135
|
+
return this.readResponse();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Send a command that must be answered, rejecting a response that carries no
|
|
139
|
+
* answer at all. A device on a different protocol family still ACKs the
|
|
140
|
+
* feature write and hands back a zero-filled buffer, which is exactly what
|
|
141
|
+
* used to be decoded into invented DPI and polling-rate readings — see the
|
|
142
|
+
* class docs.
|
|
143
|
+
*/
|
|
144
|
+
async sendQuery(cmd, ...payload) {
|
|
145
|
+
const resp = await this.sendCommand(cmd, ...payload);
|
|
146
|
+
if (resp.length < FANTECH_REPORT_SIZE) {
|
|
147
|
+
throw new Error(`Fantech command ${cmd} returned ${resp.length} bytes, expected ${FANTECH_REPORT_SIZE}.`);
|
|
148
|
+
}
|
|
149
|
+
if (resp.every((byte) => byte === 0)) {
|
|
150
|
+
throw new Error(`Fantech command ${cmd} was not answered (all-zero response); this device does not speak the Family B protocol.`);
|
|
151
|
+
}
|
|
152
|
+
return resp;
|
|
153
|
+
}
|
|
154
|
+
/** Read a response report. */
|
|
155
|
+
async readResponse() {
|
|
156
|
+
const view = await this.device.receiveFeatureReport(FANTECH_REPORT_ID);
|
|
157
|
+
return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// DPI Protocol
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
/**
|
|
163
|
+
* Read current DPI settings for the active slot. Throws when the device does
|
|
164
|
+
* not answer, or answers without a usable DPI — a caller must never be handed
|
|
165
|
+
* a fabricated default it cannot tell apart from a real reading.
|
|
166
|
+
*/
|
|
167
|
+
async getDpi() {
|
|
168
|
+
await this.open();
|
|
169
|
+
const resp = await this.sendQuery(CMD.GET_DPI, this.currentProfile);
|
|
170
|
+
// Response structure (Family B):
|
|
171
|
+
// Byte 2: current DPI slot index
|
|
172
|
+
// Byte 3: number of DPI slots
|
|
173
|
+
// Bytes [8..23]: X DPI per slot (LE uint16, up to 8 slots)
|
|
174
|
+
// Bytes [24..39]: Y DPI per slot (LE uint16, up to 8 slots)
|
|
175
|
+
const slot = resp[2] >= FANTECH_MAX_DPI_SLOTS ? 0 : resp[2];
|
|
176
|
+
const numSlots = resp[3] || 1;
|
|
177
|
+
const dpiX = resp[DPI_X_OFFSET + slot * 2] | (resp[DPI_X_OFFSET + 1 + slot * 2] << 8);
|
|
178
|
+
const dpiY = resp[DPI_Y_OFFSET + slot * 2] | (resp[DPI_Y_OFFSET + 1 + slot * 2] << 8);
|
|
179
|
+
if (!dpiX) {
|
|
180
|
+
throw new Error(`Fantech GET_DPI answered, but slot ${slot} carries no DPI value.`);
|
|
181
|
+
}
|
|
182
|
+
return { dpiX, dpiY: dpiY || dpiX, slot, numSlots };
|
|
183
|
+
}
|
|
184
|
+
/** Set DPI for a specific slot, leaving every other slot exactly as it was. */
|
|
185
|
+
async setDpiForSlot(dpiX, dpiY, slot = 0) {
|
|
186
|
+
await this.open();
|
|
187
|
+
// Read current state first. SET_DPI carries the WHOLE per-slot DPI table,
|
|
188
|
+
// so every slot that is not being written has to be echoed back unchanged;
|
|
189
|
+
// sending a freshly zeroed buffer wiped the other DPI stages.
|
|
190
|
+
const readResp = await this.sendQuery(CMD.GET_DPI, this.currentProfile);
|
|
191
|
+
const numSlots = readResp[3] || 1;
|
|
192
|
+
const target = slot >= FANTECH_MAX_DPI_SLOTS ? 0 : slot;
|
|
193
|
+
// Build the Set DPI command
|
|
194
|
+
const buf = new Uint8Array(FANTECH_REPORT_SIZE);
|
|
195
|
+
buf[0] = CMD.SET_DPI;
|
|
196
|
+
buf[1] = this.currentProfile;
|
|
197
|
+
buf[2] = target;
|
|
198
|
+
buf[3] = numSlots;
|
|
199
|
+
// Carry every slot's existing X and Y over before overwriting the target's.
|
|
200
|
+
buf.set(readResp.subarray(DPI_X_OFFSET, DPI_END), DPI_X_OFFSET);
|
|
201
|
+
// Write X DPI as LE uint16
|
|
202
|
+
buf[DPI_X_OFFSET + target * 2] = dpiX & 0xff;
|
|
203
|
+
buf[DPI_X_OFFSET + 1 + target * 2] = (dpiX >> 8) & 0xff;
|
|
204
|
+
// Write Y DPI as LE uint16
|
|
205
|
+
buf[DPI_Y_OFFSET + target * 2] = dpiY & 0xff;
|
|
206
|
+
buf[DPI_Y_OFFSET + 1 + target * 2] = (dpiY >> 8) & 0xff;
|
|
207
|
+
await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
|
|
208
|
+
return dpiX;
|
|
209
|
+
}
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
// Report Rate Protocol
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
/** Get current report/polling rate. Throws when the device does not answer. */
|
|
214
|
+
async getReportRate() {
|
|
215
|
+
await this.open();
|
|
216
|
+
const resp = await this.sendQuery(CMD.GET_REPORT_RATE);
|
|
217
|
+
const code = resp[2];
|
|
218
|
+
const hz = REPORT_RATE_DECODE[code];
|
|
219
|
+
if (hz === undefined) {
|
|
220
|
+
throw new Error(`Fantech GET_REPORT_RATE returned unknown rate code ${code}.`);
|
|
221
|
+
}
|
|
222
|
+
return hz;
|
|
223
|
+
}
|
|
224
|
+
/** Set report/polling rate. */
|
|
225
|
+
async setReportRate(hz) {
|
|
226
|
+
if (!(hz in REPORT_RATE_ENCODE)) {
|
|
227
|
+
throw new Error(`Unsupported rate ${hz} Hz. Supported: ${this.supportedPollingRates.join(", ")}`);
|
|
228
|
+
}
|
|
229
|
+
await this.open();
|
|
230
|
+
const code = REPORT_RATE_ENCODE[hz];
|
|
231
|
+
const buf = new Uint8Array(FANTECH_REPORT_SIZE);
|
|
232
|
+
buf[0] = CMD.SET_REPORT_RATE;
|
|
233
|
+
buf[1] = code;
|
|
234
|
+
await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
|
|
235
|
+
return hz;
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// High-Level API
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
async readStatus() {
|
|
241
|
+
await this.open();
|
|
242
|
+
const [dpiResult, pollRate] = await Promise.allSettled([
|
|
243
|
+
this.getDpi(),
|
|
244
|
+
this.getReportRate(),
|
|
245
|
+
]);
|
|
246
|
+
// Nothing answered at all: this interface is not a Family B control
|
|
247
|
+
// channel, so fail instead of returning a status assembled from defaults.
|
|
248
|
+
if (dpiResult.status === "rejected" && pollRate.status === "rejected") {
|
|
249
|
+
throw new Error(`Fantech control interface did not answer. ${rejectionMessage(dpiResult)} ${rejectionMessage(pollRate)}`);
|
|
250
|
+
}
|
|
251
|
+
const dpiData = dpiResult.status === "fulfilled" ? dpiResult.value : null;
|
|
252
|
+
const pollRateVal = pollRate.status === "fulfilled" ? pollRate.value : 1000;
|
|
253
|
+
return {
|
|
254
|
+
brand: "Fantech",
|
|
255
|
+
name: this.device.productName || "Fantech Mouse",
|
|
256
|
+
ui: {
|
|
257
|
+
family: "fantech",
|
|
258
|
+
settingsReady: dpiData !== null,
|
|
259
|
+
hideLodLow: true,
|
|
260
|
+
hideUnsupportedPollingRates: true,
|
|
261
|
+
hideProcessingCard: true,
|
|
262
|
+
defaultDisplayName: this.device.productName || "Fantech Mouse",
|
|
263
|
+
},
|
|
264
|
+
batteryPercent: null,
|
|
265
|
+
batteryState: "Unknown",
|
|
266
|
+
dpi: dpiData?.dpiX ?? 1600,
|
|
267
|
+
dpiY: dpiData?.dpiY ?? dpiData?.dpiX ?? 1600,
|
|
268
|
+
pollingRateHz: pollRateVal,
|
|
269
|
+
supportedPollingRates: this.supportedPollingRates,
|
|
270
|
+
activeProfile: this.currentProfile,
|
|
271
|
+
// connectionType/connectionDetail are deliberately unset. Family B
|
|
272
|
+
// carries no link information, and VID 0x3151 covers both wired mice and
|
|
273
|
+
// 2.4G receivers, so the "Wired (USB)" that used to be hardcoded here
|
|
274
|
+
// mislabelled every wireless one. OverviewPage hides the row when absent.
|
|
275
|
+
liftOffDistance: null,
|
|
276
|
+
// No firmware command is implemented; an empty list hides the row instead
|
|
277
|
+
// of showing the placeholder string that used to sit here.
|
|
278
|
+
firmware: [],
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
async setDpi(dpi, dpiY = dpi) {
|
|
282
|
+
await this.open();
|
|
283
|
+
const current = await this.getDpi();
|
|
284
|
+
await this.setDpiForSlot(dpi, dpiY, current.slot);
|
|
285
|
+
return dpi;
|
|
286
|
+
}
|
|
287
|
+
async setPollingRate(rate) {
|
|
288
|
+
if (!this.supportedPollingRates.includes(rate)) {
|
|
289
|
+
throw new Error(`Fantech supports ${this.supportedPollingRates.join(", ")} Hz.`);
|
|
290
|
+
}
|
|
291
|
+
await this.setReportRate(rate);
|
|
292
|
+
return rate;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/fantech/hid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MouseStatus } from "../mouse-types.js";
|
|
2
|
+
export declare const FINALMOUSE_VENDOR_ID = 13853;
|
|
3
|
+
export declare const FINALMOUSE_ULX_DONGLE_PRODUCT_ID = 256;
|
|
4
|
+
export declare const FINALMOUSE_DISPLAY_NAME = "Finalmouse UltralightX";
|
|
5
|
+
export declare class FinalmouseHidClient {
|
|
6
|
+
readonly device: HIDDevice;
|
|
7
|
+
private telemetry;
|
|
8
|
+
private reportRevision;
|
|
9
|
+
private listenerAttached;
|
|
10
|
+
private readonly reportWaiters;
|
|
11
|
+
private readonly onInputReport;
|
|
12
|
+
constructor(device: HIDDevice);
|
|
13
|
+
static isSupported(device: HIDDevice): boolean;
|
|
14
|
+
open(): Promise<void>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
displayName(): string;
|
|
17
|
+
get pollIntervalMs(): number;
|
|
18
|
+
getDpiOptions(): number[];
|
|
19
|
+
readStatus(): Promise<MouseStatus>;
|
|
20
|
+
setDpi(dpi: number): Promise<number>;
|
|
21
|
+
setPollingRate(pollingRateHz: number): Promise<number>;
|
|
22
|
+
setMotionSync(enabled: boolean): Promise<boolean>;
|
|
23
|
+
setLiftOffDistance(value: NonNullable<MouseStatus["liftOffDistance"]>): Promise<NonNullable<MouseStatus["liftOffDistance"]>>;
|
|
24
|
+
setDongleLedMode(mode: number): Promise<number>;
|
|
25
|
+
setTournamentScrollMode(mode: number): Promise<number>;
|
|
26
|
+
setTournamentScrollTimeout(milliseconds: number): Promise<number>;
|
|
27
|
+
private writeU16;
|
|
28
|
+
private write;
|
|
29
|
+
private waitForReport;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=hid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/finalmouse/hid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,gCAAgC,MAAS,CAAC;AACvD,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAUhE,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAO5B;gBAEU,MAAM,EAAE,SAAS;IAI7B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAMxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,WAAW,IAAI,MAAM;IAIrB,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,aAAa,IAAI,MAAM,EAAE;IAInB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAqDlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAMjD,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAQ5H,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO/C,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAOzD,QAAQ;YAIR,KAAK;YAML,aAAa;CAa5B"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { buildFinalmouseReport, decodeFinalmouseReport, FINALMOUSE_COMMAND, FINALMOUSE_REPORT, } from "@openmouse/protocol/finalmouse";
|
|
2
|
+
export const FINALMOUSE_VENDOR_ID = 0x361d;
|
|
3
|
+
export const FINALMOUSE_ULX_DONGLE_PRODUCT_ID = 0x0100;
|
|
4
|
+
export const FINALMOUSE_DISPLAY_NAME = "Finalmouse UltralightX";
|
|
5
|
+
const POLLING_RATES = [500, 1000, 2000, 4000, 8000];
|
|
6
|
+
const DPI_MIN = 50;
|
|
7
|
+
const DPI_MAX = 26000;
|
|
8
|
+
function pause(milliseconds) {
|
|
9
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
10
|
+
}
|
|
11
|
+
export class FinalmouseHidClient {
|
|
12
|
+
device;
|
|
13
|
+
telemetry = {};
|
|
14
|
+
reportRevision = 0;
|
|
15
|
+
listenerAttached = false;
|
|
16
|
+
reportWaiters = new Set();
|
|
17
|
+
onInputReport = (event) => {
|
|
18
|
+
const bytes = new Uint8Array(event.data.buffer.slice(event.data.byteOffset, event.data.byteOffset + event.data.byteLength));
|
|
19
|
+
const update = decodeFinalmouseReport(event.reportId, bytes);
|
|
20
|
+
if (!update)
|
|
21
|
+
return;
|
|
22
|
+
Object.assign(this.telemetry, update);
|
|
23
|
+
this.reportRevision += 1;
|
|
24
|
+
for (const finish of [...this.reportWaiters])
|
|
25
|
+
finish();
|
|
26
|
+
};
|
|
27
|
+
constructor(device) {
|
|
28
|
+
this.device = device;
|
|
29
|
+
}
|
|
30
|
+
static isSupported(device) {
|
|
31
|
+
return device.vendorId === FINALMOUSE_VENDOR_ID
|
|
32
|
+
&& device.productId === FINALMOUSE_ULX_DONGLE_PRODUCT_ID
|
|
33
|
+
&& device.collections.some((collection) => collection.usagePage === 0xff00 && collection.usage === 0x0001);
|
|
34
|
+
}
|
|
35
|
+
async open() {
|
|
36
|
+
if (!this.device.opened)
|
|
37
|
+
await this.device.open();
|
|
38
|
+
if (!this.listenerAttached) {
|
|
39
|
+
this.device.addEventListener("inputreport", this.onInputReport);
|
|
40
|
+
this.listenerAttached = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async close() {
|
|
44
|
+
if (this.listenerAttached) {
|
|
45
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
46
|
+
this.listenerAttached = false;
|
|
47
|
+
}
|
|
48
|
+
if (this.device.opened)
|
|
49
|
+
await this.device.close();
|
|
50
|
+
}
|
|
51
|
+
displayName() {
|
|
52
|
+
return FINALMOUSE_DISPLAY_NAME;
|
|
53
|
+
}
|
|
54
|
+
get pollIntervalMs() {
|
|
55
|
+
return 10_000;
|
|
56
|
+
}
|
|
57
|
+
getDpiOptions() {
|
|
58
|
+
return Array.from({ length: DPI_MAX - DPI_MIN + 1 }, (_, index) => DPI_MIN + index);
|
|
59
|
+
}
|
|
60
|
+
async readStatus() {
|
|
61
|
+
await this.open();
|
|
62
|
+
const revision = this.reportRevision;
|
|
63
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.liftOffDistance);
|
|
64
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.wakeAll);
|
|
65
|
+
await this.write(FINALMOUSE_REPORT.dongle, FINALMOUSE_COMMAND.dongleInfo);
|
|
66
|
+
await this.waitForReport(revision, 1000);
|
|
67
|
+
// Status arrives as a short burst of separate feature reports.
|
|
68
|
+
await pause(75);
|
|
69
|
+
const state = this.telemetry;
|
|
70
|
+
if (state.dpi === undefined || state.pollingRateHz === undefined) {
|
|
71
|
+
throw new Error("The Finalmouse UltralightX did not return its current settings. Make sure the mouse is on and close xpanel or other Finalmouse software.");
|
|
72
|
+
}
|
|
73
|
+
const firmware = [
|
|
74
|
+
state.mouseFirmware ? `Mouse ${state.mouseFirmware}` : null,
|
|
75
|
+
state.dongleRfFirmware ? `Dongle RF ${state.dongleRfFirmware}` : null,
|
|
76
|
+
state.dongleUsbFirmware ? `Dongle USB ${state.dongleUsbFirmware}` : null,
|
|
77
|
+
].filter((value) => value !== null);
|
|
78
|
+
const connectionDetail = [
|
|
79
|
+
"2.4 GHz receiver",
|
|
80
|
+
state.rssiDbm === undefined ? null : `${state.rssiDbm} dBm`,
|
|
81
|
+
].filter((value) => value !== null).join(" · ");
|
|
82
|
+
return {
|
|
83
|
+
brand: "Finalmouse",
|
|
84
|
+
name: this.displayName(),
|
|
85
|
+
ui: {
|
|
86
|
+
family: "finalmouse-ulx",
|
|
87
|
+
defaultDisplayName: FINALMOUSE_DISPLAY_NAME,
|
|
88
|
+
hideUnsupportedPollingRates: true,
|
|
89
|
+
forceShowBattery: true,
|
|
90
|
+
},
|
|
91
|
+
batteryPercent: state.batteryPercent ?? null,
|
|
92
|
+
batteryVoltageMv: state.batteryVoltageMv ?? null,
|
|
93
|
+
batteryState: state.chargingState === 1 ? "Charging" : state.chargingState === undefined ? "Unknown" : "Discharging",
|
|
94
|
+
dpi: state.dpi,
|
|
95
|
+
pollingRateHz: state.pollingRateHz,
|
|
96
|
+
supportedPollingRates: [...POLLING_RATES],
|
|
97
|
+
activeProfile: null,
|
|
98
|
+
unitId: state.mouseSerial ?? null,
|
|
99
|
+
connectionType: "Wireless",
|
|
100
|
+
connectionDetail,
|
|
101
|
+
motionSync: state.motionSync ?? null,
|
|
102
|
+
liftOffDistance: state.liftOffDistanceMm === 1 ? "Medium" : state.liftOffDistanceMm === 2 ? "High" : null,
|
|
103
|
+
supportedLiftOffDistances: ["Medium", "High"],
|
|
104
|
+
finalmouseDongleLedMode: state.dongleLedMode ?? null,
|
|
105
|
+
finalmouseTournamentScrollMode: state.tournamentScrollMode ?? null,
|
|
106
|
+
finalmouseTournamentScrollTimeoutMs: state.tournamentScrollTimeoutMs ?? null,
|
|
107
|
+
firmware,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async setDpi(dpi) {
|
|
111
|
+
if (!Number.isInteger(dpi) || dpi < DPI_MIN || dpi > DPI_MAX)
|
|
112
|
+
throw new Error("Finalmouse UltralightX DPI must be between 50 and 26,000.");
|
|
113
|
+
await this.writeU16(FINALMOUSE_COMMAND.dpi, dpi);
|
|
114
|
+
this.telemetry.dpi = dpi;
|
|
115
|
+
return dpi;
|
|
116
|
+
}
|
|
117
|
+
async setPollingRate(pollingRateHz) {
|
|
118
|
+
if (!POLLING_RATES.includes(pollingRateHz))
|
|
119
|
+
throw new Error("Unsupported Finalmouse UltralightX polling rate.");
|
|
120
|
+
await this.writeU16(FINALMOUSE_COMMAND.pollingRate, pollingRateHz);
|
|
121
|
+
this.telemetry.pollingRateHz = pollingRateHz;
|
|
122
|
+
return pollingRateHz;
|
|
123
|
+
}
|
|
124
|
+
async setMotionSync(enabled) {
|
|
125
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.motionSync, new Uint8Array([enabled ? 1 : 0]));
|
|
126
|
+
this.telemetry.motionSync = enabled;
|
|
127
|
+
return enabled;
|
|
128
|
+
}
|
|
129
|
+
async setLiftOffDistance(value) {
|
|
130
|
+
const millimeters = value === "Medium" ? 1 : value === "High" ? 2 : null;
|
|
131
|
+
if (millimeters === null)
|
|
132
|
+
throw new Error("Finalmouse UltralightX lift-off distance must be 1 mm or 2 mm.");
|
|
133
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.liftOffDistance, new Uint8Array([millimeters]));
|
|
134
|
+
this.telemetry.liftOffDistanceMm = millimeters;
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
async setDongleLedMode(mode) {
|
|
138
|
+
if (![0, 1, 2].includes(mode))
|
|
139
|
+
throw new Error("Unsupported Finalmouse dongle LED mode.");
|
|
140
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.dongleLed, new Uint8Array([mode]));
|
|
141
|
+
this.telemetry.dongleLedMode = mode;
|
|
142
|
+
return mode;
|
|
143
|
+
}
|
|
144
|
+
async setTournamentScrollMode(mode) {
|
|
145
|
+
if (![0, 1, 2, 3].includes(mode))
|
|
146
|
+
throw new Error("Unsupported Finalmouse tournament scroll mode.");
|
|
147
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.tournamentScrollMode, new Uint8Array([mode]));
|
|
148
|
+
this.telemetry.tournamentScrollMode = mode;
|
|
149
|
+
return mode;
|
|
150
|
+
}
|
|
151
|
+
async setTournamentScrollTimeout(milliseconds) {
|
|
152
|
+
if (![100, 500, 1000, 1500].includes(milliseconds))
|
|
153
|
+
throw new Error("Unsupported Finalmouse tournament scroll timeout.");
|
|
154
|
+
await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.tournamentScrollTimeout, new Uint8Array([milliseconds / 100]));
|
|
155
|
+
this.telemetry.tournamentScrollTimeoutMs = milliseconds;
|
|
156
|
+
return milliseconds;
|
|
157
|
+
}
|
|
158
|
+
async writeU16(command, value) {
|
|
159
|
+
await this.write(FINALMOUSE_REPORT.main, command, new Uint8Array([value & 0xff, value >> 8]));
|
|
160
|
+
}
|
|
161
|
+
async write(reportId, command, payload = new Uint8Array()) {
|
|
162
|
+
await this.open();
|
|
163
|
+
const report = buildFinalmouseReport(command, payload);
|
|
164
|
+
await this.device.sendReport(reportId, report.buffer);
|
|
165
|
+
}
|
|
166
|
+
async waitForReport(afterRevision, timeoutMs) {
|
|
167
|
+
if (this.reportRevision > afterRevision)
|
|
168
|
+
return;
|
|
169
|
+
await new Promise((resolve) => {
|
|
170
|
+
let timer = 0;
|
|
171
|
+
const finish = () => {
|
|
172
|
+
clearTimeout(timer);
|
|
173
|
+
this.reportWaiters.delete(finish);
|
|
174
|
+
resolve();
|
|
175
|
+
};
|
|
176
|
+
timer = setTimeout(finish, timeoutMs);
|
|
177
|
+
this.reportWaiters.add(finish);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/finalmouse/hid.ts"],"names":[],"mappings":"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"}
|