@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,86 @@
|
|
|
1
|
+
import type { MouseStatus } from "../mouse-types.ts";
|
|
2
|
+
import { type WootingAnalogKey } from "@openmouse/protocol/wooting";
|
|
3
|
+
export declare class WootingHidClient {
|
|
4
|
+
readonly device: HIDDevice;
|
|
5
|
+
private responseWaiter;
|
|
6
|
+
private responseTimer;
|
|
7
|
+
private readonly replies;
|
|
8
|
+
private commandLock;
|
|
9
|
+
private collecting;
|
|
10
|
+
private readonly onInputReport;
|
|
11
|
+
private listening;
|
|
12
|
+
constructor(device: HIDDevice);
|
|
13
|
+
/**
|
|
14
|
+
* Wooting VID plus the command-capable config collection: usage page `0xFF55`,
|
|
15
|
+
* usage `0x01`. Only this collection is matched — a board also presents a
|
|
16
|
+
* legacy `0xFF00` collection and the `0xFF53` analog stream, and matching those
|
|
17
|
+
* would list the same physical keyboard several times.
|
|
18
|
+
*/
|
|
19
|
+
static isSupported(device: HIDDevice): boolean;
|
|
20
|
+
/** The command-capable config collection, if this device exposes one. */
|
|
21
|
+
private static configCollection;
|
|
22
|
+
/**
|
|
23
|
+
* Part of the shared client contract the control panel calls on every device.
|
|
24
|
+
* A keyboard exposes no mouse DPI, so there are no options to offer.
|
|
25
|
+
*/
|
|
26
|
+
getDpiOptions(): number[];
|
|
27
|
+
open(): Promise<void>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Subscribe to the live analog key stream. The 60HE+ pushes a full snapshot of
|
|
31
|
+
* the currently-pressed keys as input reports on its analog interface (0xFF53,
|
|
32
|
+
* a sibling of the config interface). Opens that interface, forwards each
|
|
33
|
+
* decoded frame to `onFrame`, and resolves to a stop function that detaches the
|
|
34
|
+
* listener. Rejects if the analog interface is not available to the page.
|
|
35
|
+
*/
|
|
36
|
+
startAnalog(onFrame: (keys: WootingAnalogKey[]) => void): Promise<() => void>;
|
|
37
|
+
/** The sibling analog-stream interface (same board, usage page 0xFF53). */
|
|
38
|
+
private analogDevice;
|
|
39
|
+
readStatus(): Promise<MouseStatus>;
|
|
40
|
+
/**
|
|
41
|
+
* Best-effort live read of a command's raw reply, attempted once per connection
|
|
42
|
+
* and then cached. Never throws: on any failure it returns null, the caller
|
|
43
|
+
* falls back to whatever it has, and the failure is remembered so a background
|
|
44
|
+
* refresh does not try (and fail) the write again.
|
|
45
|
+
*/
|
|
46
|
+
private command;
|
|
47
|
+
/**
|
|
48
|
+
* Live (uncached) read of the connected profile's actuation / rapid-trigger
|
|
49
|
+
* settings: the current profile index plus the raw analog-profile "main part"
|
|
50
|
+
* reply, for the analog UI to decode.
|
|
51
|
+
*/
|
|
52
|
+
readAnalogProfile(): Promise<{
|
|
53
|
+
index: number | null;
|
|
54
|
+
reports: Uint8Array[];
|
|
55
|
+
note: string;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Send a command and gather every input report it triggers within a short
|
|
59
|
+
* window. `viaOutput` chooses Wootility's output-report channel (id 2) versus
|
|
60
|
+
* the feature-report channel.
|
|
61
|
+
*/
|
|
62
|
+
private collectCommand;
|
|
63
|
+
/** Serialize command sends so overlapping callers never share the reply channel. */
|
|
64
|
+
private sendCommand;
|
|
65
|
+
/**
|
|
66
|
+
* Send a command on the config interface's declared feature report and read the
|
|
67
|
+
* reply. The 60HE+ answers with the multi-report magic (0xD1), so commands go
|
|
68
|
+
* out in that form. The answer arrives as an input report (matching Wooting's
|
|
69
|
+
* own tooling); a feature GET is tried only as a fallback. Returns the raw
|
|
70
|
+
* reply for the matching command, or null if nothing usable came back.
|
|
71
|
+
*/
|
|
72
|
+
private probeCommand;
|
|
73
|
+
/** Report id of the config collection's declared feature report (0 if none). */
|
|
74
|
+
private featureReportId;
|
|
75
|
+
/** Resolve with the next input report, or reject on timeout. */
|
|
76
|
+
private nextInputReport;
|
|
77
|
+
private clearPendingRead;
|
|
78
|
+
/**
|
|
79
|
+
* Turn the command replies into readable lines. Decoded fields (firmware
|
|
80
|
+
* version, layout) are shown on their own; a raw hex preview appears only as a
|
|
81
|
+
* fallback when a reply could not be decoded, so a fully-decoded board reads as
|
|
82
|
+
* a clean two-line card rather than a debug dump.
|
|
83
|
+
*/
|
|
84
|
+
private firmwareLines;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=hid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/wooting/hid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAUL,KAAK,gBAAgB,EAOtB,MAAM,6BAA6B,CAAC;AAsBrC,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAE3B,OAAO,CAAC,cAAc,CAAwF;IAC9G,OAAO,CAAC,aAAa,CAA8C;IAKnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAIhE,OAAO,CAAC,WAAW,CAAuC;IAI1D,OAAO,CAAC,UAAU,CAA6B;IAE/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAY5B;IAEF,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,SAAS;IAI7B;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAM9C,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAc/B;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAInB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;;;;;OAMG;IACG,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAgBnF,2EAA2E;YAC7D,YAAY;IAYpB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAkCxC;;;;;OAKG;YACW,OAAO;IAOrB;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBjG;;;;OAIG;YACW,cAAc;IAwB5B,oFAAoF;YACtE,WAAW;IAMzB;;;;;;OAMG;YACW,YAAY;IA4B1B,gFAAgF;IAChF,OAAO,CAAC,eAAe;IAKvB,gEAAgE;IAChE,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAQxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CAmBtB"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { decodeWootingAnalogReport, decodeWootingDeviceConfig, decodeWootingVersion, encodeWootingCommand, isWootingReply, wootingFeatureReport, wootingProductName, WOOTING_MAGIC_MULTI, WOOTING_MAGIC_WORD_1, WOOTING_ANALOG_USAGE_PAGE, WOOTING_COMMAND, WOOTING_CONFIG_USAGE, WOOTING_CONFIG_USAGE_PAGE, WOOTING_PRODUCTS, WOOTING_VENDOR_ID, } from "@openmouse/protocol/wooting";
|
|
2
|
+
/**
|
|
3
|
+
* Wooting analog keyboard (60HE+) read-only WebHID control — stage one.
|
|
4
|
+
*
|
|
5
|
+
* OpenMouse is a mouse control panel, so a keyboard has no home in the settings
|
|
6
|
+
* grid. This driver's job is narrow and honest: recognise a supported Wooting
|
|
7
|
+
* board, connect to its vendor config interface, and report what it is. It sets
|
|
8
|
+
* `ui.settingsReady = false` so the mouse settings grid stays hidden, and it
|
|
9
|
+
* exposes no setters, so nothing here can change a key, curve, or profile.
|
|
10
|
+
*
|
|
11
|
+
* Device identity always succeeds — it comes from the `HIDDevice` metadata. The
|
|
12
|
+
* live device-config read is best-effort: the 60HE+ config interface declares
|
|
13
|
+
* only an input report, so whether the browser permits the outgoing feature
|
|
14
|
+
* report is hardware/Chrome-specific. When it is not permitted the driver still
|
|
15
|
+
* connects and identifies the board; it just omits the live layout line.
|
|
16
|
+
*/
|
|
17
|
+
const CONFIG_RESPONSE_TIMEOUT_MS = 400;
|
|
18
|
+
/** How long to gather input reports for a multi-report reply (ack + data). */
|
|
19
|
+
const COLLECT_WINDOW_MS = 130;
|
|
20
|
+
export class WootingHidClient {
|
|
21
|
+
device;
|
|
22
|
+
responseWaiter = null;
|
|
23
|
+
responseTimer = null;
|
|
24
|
+
// Each command's raw reply is read once per connection and cached, so a
|
|
25
|
+
// failure (or a device that just will not answer) never re-spams writes on
|
|
26
|
+
// every background refresh.
|
|
27
|
+
replies = new Map();
|
|
28
|
+
// Serializes command sends so a profile read and a status refresh never share
|
|
29
|
+
// the single input-report reply channel at the same time.
|
|
30
|
+
commandLock = Promise.resolve();
|
|
31
|
+
// When set, input reports are accumulated here instead of resolving a single
|
|
32
|
+
// waiter — used to gather a multi-report reply (ack + data) for one command.
|
|
33
|
+
collecting = null;
|
|
34
|
+
onInputReport = (event) => {
|
|
35
|
+
const bytes = new Uint8Array(event.data.buffer.slice(event.data.byteOffset, event.data.byteOffset + event.data.byteLength));
|
|
36
|
+
if (this.collecting) {
|
|
37
|
+
this.collecting.push(bytes);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const waiter = this.responseWaiter;
|
|
41
|
+
if (!waiter)
|
|
42
|
+
return;
|
|
43
|
+
this.clearPendingRead();
|
|
44
|
+
waiter.resolve(bytes);
|
|
45
|
+
};
|
|
46
|
+
listening = false;
|
|
47
|
+
constructor(device) {
|
|
48
|
+
this.device = device;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Wooting VID plus the command-capable config collection: usage page `0xFF55`,
|
|
52
|
+
* usage `0x01`. Only this collection is matched — a board also presents a
|
|
53
|
+
* legacy `0xFF00` collection and the `0xFF53` analog stream, and matching those
|
|
54
|
+
* would list the same physical keyboard several times.
|
|
55
|
+
*/
|
|
56
|
+
static isSupported(device) {
|
|
57
|
+
if (device.vendorId !== WOOTING_VENDOR_ID)
|
|
58
|
+
return false;
|
|
59
|
+
if (!WOOTING_PRODUCTS.has(device.productId))
|
|
60
|
+
return false;
|
|
61
|
+
return WootingHidClient.configCollection(device.collections) !== null;
|
|
62
|
+
}
|
|
63
|
+
/** The command-capable config collection, if this device exposes one. */
|
|
64
|
+
static configCollection(collections) {
|
|
65
|
+
for (const collection of collections) {
|
|
66
|
+
if (collection.usage === WOOTING_CONFIG_USAGE
|
|
67
|
+
&& collection.usagePage === WOOTING_CONFIG_USAGE_PAGE) {
|
|
68
|
+
return collection;
|
|
69
|
+
}
|
|
70
|
+
const nested = WootingHidClient.configCollection(collection.children);
|
|
71
|
+
if (nested)
|
|
72
|
+
return nested;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Part of the shared client contract the control panel calls on every device.
|
|
78
|
+
* A keyboard exposes no mouse DPI, so there are no options to offer.
|
|
79
|
+
*/
|
|
80
|
+
getDpiOptions() {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
async open() {
|
|
84
|
+
if (!this.device.opened)
|
|
85
|
+
await this.device.open();
|
|
86
|
+
if (!this.listening) {
|
|
87
|
+
this.device.addEventListener("inputreport", this.onInputReport);
|
|
88
|
+
this.listening = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async close() {
|
|
92
|
+
if (this.listening) {
|
|
93
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
94
|
+
this.listening = false;
|
|
95
|
+
}
|
|
96
|
+
if (this.device.opened)
|
|
97
|
+
await this.device.close();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to the live analog key stream. The 60HE+ pushes a full snapshot of
|
|
101
|
+
* the currently-pressed keys as input reports on its analog interface (0xFF53,
|
|
102
|
+
* a sibling of the config interface). Opens that interface, forwards each
|
|
103
|
+
* decoded frame to `onFrame`, and resolves to a stop function that detaches the
|
|
104
|
+
* listener. Rejects if the analog interface is not available to the page.
|
|
105
|
+
*/
|
|
106
|
+
async startAnalog(onFrame) {
|
|
107
|
+
const analog = await this.analogDevice();
|
|
108
|
+
if (!analog) {
|
|
109
|
+
throw new Error("This Wooting's analog interface is not available to OpenMouse.");
|
|
110
|
+
}
|
|
111
|
+
if (!analog.opened)
|
|
112
|
+
await analog.open();
|
|
113
|
+
const listener = (event) => {
|
|
114
|
+
const data = new Uint8Array(event.data.buffer.slice(event.data.byteOffset, event.data.byteOffset + event.data.byteLength));
|
|
115
|
+
onFrame(decodeWootingAnalogReport(data));
|
|
116
|
+
};
|
|
117
|
+
analog.addEventListener("inputreport", listener);
|
|
118
|
+
return () => analog.removeEventListener("inputreport", listener);
|
|
119
|
+
}
|
|
120
|
+
/** The sibling analog-stream interface (same board, usage page 0xFF53). */
|
|
121
|
+
async analogDevice() {
|
|
122
|
+
const hid = globalThis.navigator?.hid;
|
|
123
|
+
if (!hid)
|
|
124
|
+
return null;
|
|
125
|
+
const devices = await hid.getDevices();
|
|
126
|
+
return devices.find((device) => device.vendorId === WOOTING_VENDOR_ID
|
|
127
|
+
&& device.productId === this.device.productId
|
|
128
|
+
&& device.collections.some((collection) => collection.usagePage === WOOTING_ANALOG_USAGE_PAGE && collection.usage === WOOTING_CONFIG_USAGE)) ?? null;
|
|
129
|
+
}
|
|
130
|
+
async readStatus() {
|
|
131
|
+
await this.open();
|
|
132
|
+
// Sequential: each reply is awaited before the next command is sent, so the
|
|
133
|
+
// input-report answers never interleave.
|
|
134
|
+
const version = await this.command(WOOTING_COMMAND.getVersion);
|
|
135
|
+
const config = await this.command(WOOTING_COMMAND.getDeviceConfig);
|
|
136
|
+
return {
|
|
137
|
+
brand: "Wooting",
|
|
138
|
+
name: wootingProductName(this.device.productId),
|
|
139
|
+
ui: {
|
|
140
|
+
family: "wooting",
|
|
141
|
+
// Keyboard analog controls have no place in the mouse settings grid yet.
|
|
142
|
+
settingsReady: false,
|
|
143
|
+
defaultDisplayName: wootingProductName(this.device.productId),
|
|
144
|
+
},
|
|
145
|
+
batteryPercent: null,
|
|
146
|
+
batteryState: "Unknown",
|
|
147
|
+
// Placeholder mouse fields the shared status shape still requires; the grid
|
|
148
|
+
// is hidden, so these are never shown.
|
|
149
|
+
dpi: 0,
|
|
150
|
+
pollingRateHz: 0,
|
|
151
|
+
activeProfile: null,
|
|
152
|
+
connectionType: "Wired",
|
|
153
|
+
connectionDetail: "USB",
|
|
154
|
+
liftOffDistance: null,
|
|
155
|
+
firmware: this.firmwareLines(version, config),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// Report I/O
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* Best-effort live read of a command's raw reply, attempted once per connection
|
|
163
|
+
* and then cached. Never throws: on any failure it returns null, the caller
|
|
164
|
+
* falls back to whatever it has, and the failure is remembered so a background
|
|
165
|
+
* refresh does not try (and fail) the write again.
|
|
166
|
+
*/
|
|
167
|
+
async command(commandId) {
|
|
168
|
+
if (this.replies.has(commandId))
|
|
169
|
+
return this.replies.get(commandId) ?? null;
|
|
170
|
+
const raw = await this.sendCommand(commandId).catch(() => null);
|
|
171
|
+
this.replies.set(commandId, raw);
|
|
172
|
+
return raw;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Live (uncached) read of the connected profile's actuation / rapid-trigger
|
|
176
|
+
* settings: the current profile index plus the raw analog-profile "main part"
|
|
177
|
+
* reply, for the analog UI to decode.
|
|
178
|
+
*/
|
|
179
|
+
async readAnalogProfile() {
|
|
180
|
+
const indexReply = await this.sendCommand(WOOTING_COMMAND.getCurrentKeyboardProfileIndex).catch(() => null);
|
|
181
|
+
const index = indexReply && indexReply.length > 4 ? indexReply[4] : null;
|
|
182
|
+
// Send the profile-read command over Wootility's OUTPUT-report channel and
|
|
183
|
+
// collect whatever comes back. Surface exactly what happened for diagnosis.
|
|
184
|
+
// The parameter is an "optionalProfile" selector: qQ = (namespace << 8) | index
|
|
185
|
+
// in the low 16 bits (namespace enum: onboard=0, linked=1). We've confirmed the
|
|
186
|
+
// command/selector but not the exact CHANNEL + MAGIC. Wootility uses output
|
|
187
|
+
// reports with magic 0xD0 0xDA; our feature commands use 0xD1 0xDA. Sweep the
|
|
188
|
+
// combinations and keep whichever returns a real body. All read-only.
|
|
189
|
+
// get_keyboard_profile (0x27) carries the actuation (nested field 1 = mm × 20480)
|
|
190
|
+
// and rapid-trigger fields. Read it over the working channel (feature, magic
|
|
191
|
+
// 0xD1, current-profile selector 0xFFFF).
|
|
192
|
+
const command = new Uint8Array([
|
|
193
|
+
WOOTING_MAGIC_MULTI, WOOTING_MAGIC_WORD_1, WOOTING_COMMAND.getKeyboardProfile, 0xff, 0xff, 0x00, 0x00,
|
|
194
|
+
]);
|
|
195
|
+
const reports = await this.collectCommand(command, false).catch(() => []);
|
|
196
|
+
const note = reports.some((report) => report.subarray(4).some((byte) => byte !== 0))
|
|
197
|
+
? "get_keyboard_profile"
|
|
198
|
+
: "no body";
|
|
199
|
+
return { index, reports, note };
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Send a command and gather every input report it triggers within a short
|
|
203
|
+
* window. `viaOutput` chooses Wootility's output-report channel (id 2) versus
|
|
204
|
+
* the feature-report channel.
|
|
205
|
+
*/
|
|
206
|
+
async collectCommand(command, viaOutput) {
|
|
207
|
+
const run = this.commandLock.then(async () => {
|
|
208
|
+
this.collecting = [];
|
|
209
|
+
try {
|
|
210
|
+
if (viaOutput) {
|
|
211
|
+
const report = new Uint8Array(62);
|
|
212
|
+
report.set(command.subarray(0, 62));
|
|
213
|
+
await this.device.sendReport(2, report);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
await this.device.sendFeatureReport(this.featureReportId(), command.slice());
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
this.collecting = null;
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
await new Promise((resolve) => setTimeout(resolve, COLLECT_WINDOW_MS));
|
|
224
|
+
const reports = this.collecting ?? [];
|
|
225
|
+
this.collecting = null;
|
|
226
|
+
return reports;
|
|
227
|
+
});
|
|
228
|
+
this.commandLock = run.then(() => undefined, () => undefined);
|
|
229
|
+
return run;
|
|
230
|
+
}
|
|
231
|
+
/** Serialize command sends so overlapping callers never share the reply channel. */
|
|
232
|
+
async sendCommand(commandId, param0 = 0) {
|
|
233
|
+
const run = this.commandLock.then(() => this.probeCommand(commandId, param0));
|
|
234
|
+
this.commandLock = run.then(() => undefined, () => undefined);
|
|
235
|
+
return run;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Send a command on the config interface's declared feature report and read the
|
|
239
|
+
* reply. The 60HE+ answers with the multi-report magic (0xD1), so commands go
|
|
240
|
+
* out in that form. The answer arrives as an input report (matching Wooting's
|
|
241
|
+
* own tooling); a feature GET is tried only as a fallback. Returns the raw
|
|
242
|
+
* reply for the matching command, or null if nothing usable came back.
|
|
243
|
+
*/
|
|
244
|
+
async probeCommand(commandId, param0 = 0) {
|
|
245
|
+
const reportId = this.featureReportId();
|
|
246
|
+
// Magic + command payload, without hidapi's leading report-index byte —
|
|
247
|
+
// WebHID carries the report id separately.
|
|
248
|
+
const payload = wootingFeatureReport(encodeWootingCommand(commandId, param0, 0, 0, 0, { multiReport: true })).data;
|
|
249
|
+
const inputReply = this.nextInputReport();
|
|
250
|
+
inputReply.catch(() => { }); // guard: this promise may go unused
|
|
251
|
+
try {
|
|
252
|
+
await this.device.sendFeatureReport(reportId, payload);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
this.clearPendingRead();
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const viaInput = await inputReply.catch(() => null);
|
|
259
|
+
if (viaInput && isWootingReply(viaInput))
|
|
260
|
+
return viaInput;
|
|
261
|
+
this.clearPendingRead();
|
|
262
|
+
const viaFeature = await this.device.receiveFeatureReport(reportId)
|
|
263
|
+
.then((view) => new Uint8Array(view.buffer, view.byteOffset, view.byteLength))
|
|
264
|
+
.catch(() => null);
|
|
265
|
+
return viaFeature && isWootingReply(viaFeature) ? viaFeature : null;
|
|
266
|
+
}
|
|
267
|
+
/** Report id of the config collection's declared feature report (0 if none). */
|
|
268
|
+
featureReportId() {
|
|
269
|
+
const collection = WootingHidClient.configCollection(this.device.collections);
|
|
270
|
+
return collection?.featureReports?.[0]?.reportId ?? 0;
|
|
271
|
+
}
|
|
272
|
+
/** Resolve with the next input report, or reject on timeout. */
|
|
273
|
+
nextInputReport() {
|
|
274
|
+
return new Promise((resolve, reject) => {
|
|
275
|
+
this.responseWaiter = { resolve, reject };
|
|
276
|
+
this.responseTimer = setTimeout(() => {
|
|
277
|
+
const waiter = this.responseWaiter;
|
|
278
|
+
if (!waiter)
|
|
279
|
+
return;
|
|
280
|
+
this.clearPendingRead();
|
|
281
|
+
waiter.reject(new Error("Wooting keyboard did not answer the config request."));
|
|
282
|
+
}, CONFIG_RESPONSE_TIMEOUT_MS);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
clearPendingRead() {
|
|
286
|
+
if (this.responseTimer !== null) {
|
|
287
|
+
clearTimeout(this.responseTimer);
|
|
288
|
+
this.responseTimer = null;
|
|
289
|
+
}
|
|
290
|
+
this.responseWaiter = null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Turn the command replies into readable lines. Decoded fields (firmware
|
|
294
|
+
* version, layout) are shown on their own; a raw hex preview appears only as a
|
|
295
|
+
* fallback when a reply could not be decoded, so a fully-decoded board reads as
|
|
296
|
+
* a clean two-line card rather than a debug dump.
|
|
297
|
+
*/
|
|
298
|
+
firmwareLines(version, config) {
|
|
299
|
+
const lines = [];
|
|
300
|
+
if (version) {
|
|
301
|
+
const decoded = decodeWootingVersion(version);
|
|
302
|
+
lines.push(decoded ? `Firmware: ${decoded}` : `Version reply: ${wootingHexPreview(version, 20)}`);
|
|
303
|
+
}
|
|
304
|
+
if (config) {
|
|
305
|
+
// Only decode when the reply carries a payload past its 4-byte header — a
|
|
306
|
+
// header-only answer has no config, so never invent a layout.
|
|
307
|
+
const decoded = config.subarray(4).some((byte) => byte !== 0)
|
|
308
|
+
? decodeWootingDeviceConfig(config)
|
|
309
|
+
: null;
|
|
310
|
+
lines.push(decoded ? `Layout: ${decoded.layout}` : `Config reply: ${wootingHexPreview(config, 20)}`);
|
|
311
|
+
}
|
|
312
|
+
return lines;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/** First `count` bytes of a buffer as spaced hex, with an ellipsis if truncated. */
|
|
316
|
+
function wootingHexPreview(bytes, count) {
|
|
317
|
+
const shown = [...bytes.subarray(0, count)].map((byte) => byte.toString(16).padStart(2, "0")).join(" ");
|
|
318
|
+
return bytes.length > count ? `${shown} …` : shown;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/wooting/hid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MouseStatus } from "../mouse-types.ts";
|
|
2
|
+
import { type ZaunkoenigPrimaryButton, type ZaunkoenigUsbSpeed } from "@openmouse/protocol/zaunkoenig";
|
|
3
|
+
type LiftOffDistance = NonNullable<MouseStatus["liftOffDistance"]>;
|
|
4
|
+
/** WebHID client for the public Zaunkoenfigurator protocol (M3K and M2K). */
|
|
5
|
+
export declare class ZaunkoenigHidClient {
|
|
6
|
+
readonly canDisableSleep = false;
|
|
7
|
+
readonly device: HIDDevice;
|
|
8
|
+
private queue;
|
|
9
|
+
constructor(device: HIDDevice);
|
|
10
|
+
static isSupported(device: HIDDevice): boolean;
|
|
11
|
+
get pollIntervalMs(): number;
|
|
12
|
+
getDpiOptions(): number[];
|
|
13
|
+
getSupportedPollingRates(): number[];
|
|
14
|
+
open(): Promise<void>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
startNotifications(_onChange?: () => void): Promise<boolean>;
|
|
17
|
+
readStatus(): Promise<MouseStatus>;
|
|
18
|
+
setDpi(dpi: number): Promise<number>;
|
|
19
|
+
setPollingRate(pollingRateHz: number): Promise<number>;
|
|
20
|
+
setLiftOffDistance(value: LiftOffDistance): Promise<LiftOffDistance>;
|
|
21
|
+
setAngleSnapping(enabled: boolean): Promise<boolean>;
|
|
22
|
+
setUsbSpeed(usbSpeed: ZaunkoenigUsbSpeed): Promise<ZaunkoenigUsbSpeed>;
|
|
23
|
+
setPrimaryButton(primaryButton: ZaunkoenigPrimaryButton): Promise<ZaunkoenigPrimaryButton>;
|
|
24
|
+
factoryReset(): Promise<MouseStatus>;
|
|
25
|
+
private update;
|
|
26
|
+
private readStatusDirect;
|
|
27
|
+
private readConfig;
|
|
28
|
+
private run;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=hid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/zaunkoenig/hid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAOL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAQxB,MAAM,gCAAgC,CAAC;AAKxC,KAAK,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,eAAe,SAAS;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAuC;gBAExC,MAAM,EAAE,SAAS;IAI7B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAK9C,IAAI,cAAc,IAAI,MAAM,CAAmB;IAE/C,aAAa,IAAI,MAAM,EAAE;IAKzB,wBAAwB,IAAI,MAAM,EAAE;IAE9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAE5D,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAOlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAatD,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAMpE,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAStE,gBAAgB,CAAC,aAAa,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAI1F,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YAQ5B,MAAM;YAoBN,gBAAgB;YA0ChB,UAAU;YAOV,GAAG;CAKlB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { ZAUNKOENIG_CONFIG_REPORT_ID, ZAUNKOENIG_PRODUCT_IDS, ZAUNKOENIG_USAGE_PAGE, ZAUNKOENIG_VENDOR_ID, ZAUNKOENIG_VERSION_REPORT_ID, zaunkoenigBuildConfigPayload, zaunkoenigBuildFactoryResetPayload, zaunkoenigDecodeConfigReport, zaunkoenigDecodeVersionReport, zaunkoenigDevice, zaunkoenigEncodeConfigWord, zaunkoenigFirmwareIsSupported, } from "@openmouse/protocol/zaunkoenig";
|
|
2
|
+
const PRODUCT_IDS = new Set(ZAUNKOENIG_PRODUCT_IDS);
|
|
3
|
+
const POLLING_RATES = [1000, 2000, 4000, 8000];
|
|
4
|
+
/** WebHID client for the public Zaunkoenfigurator protocol (M3K and M2K). */
|
|
5
|
+
export class ZaunkoenigHidClient {
|
|
6
|
+
canDisableSleep = false;
|
|
7
|
+
device;
|
|
8
|
+
queue = Promise.resolve();
|
|
9
|
+
constructor(device) {
|
|
10
|
+
this.device = device;
|
|
11
|
+
}
|
|
12
|
+
static isSupported(device) {
|
|
13
|
+
if (device.vendorId !== ZAUNKOENIG_VENDOR_ID || !PRODUCT_IDS.has(device.productId))
|
|
14
|
+
return false;
|
|
15
|
+
return hasControlCollection(device.collections);
|
|
16
|
+
}
|
|
17
|
+
get pollIntervalMs() { return 30_000; }
|
|
18
|
+
getDpiOptions() {
|
|
19
|
+
const { dpiStep, dpiMax } = zaunkoenigDevice(this.device.productId);
|
|
20
|
+
return Array.from({ length: dpiMax / dpiStep }, (_, index) => (index + 1) * dpiStep);
|
|
21
|
+
}
|
|
22
|
+
getSupportedPollingRates() { return [...POLLING_RATES]; }
|
|
23
|
+
async open() {
|
|
24
|
+
if (!this.device.opened)
|
|
25
|
+
await this.device.open();
|
|
26
|
+
}
|
|
27
|
+
async close() {
|
|
28
|
+
if (this.device.opened)
|
|
29
|
+
await this.device.close();
|
|
30
|
+
}
|
|
31
|
+
async startNotifications(_onChange) { return false; }
|
|
32
|
+
async readStatus() {
|
|
33
|
+
return await this.run(async () => {
|
|
34
|
+
await this.open();
|
|
35
|
+
return await this.readStatusDirect();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async setDpi(dpi) {
|
|
39
|
+
const confirmed = await this.update((config) => ({ ...config, dpi }));
|
|
40
|
+
return confirmed.dpi;
|
|
41
|
+
}
|
|
42
|
+
async setPollingRate(pollingRateHz) {
|
|
43
|
+
if (!POLLING_RATES.includes(pollingRateHz)) {
|
|
44
|
+
throw new Error("Zaunkoenig polling rate must be 1000, 2000, 4000, or 8000 Hz.");
|
|
45
|
+
}
|
|
46
|
+
const confirmed = await this.update((config) => ({
|
|
47
|
+
...config,
|
|
48
|
+
pollingRateHz: pollingRateHz,
|
|
49
|
+
pollingRateCode: pollingCode(pollingRateHz),
|
|
50
|
+
usbSpeed: pollingRateHz > 1000 ? "High" : config.usbSpeed,
|
|
51
|
+
}));
|
|
52
|
+
return confirmed.pollingRateHz;
|
|
53
|
+
}
|
|
54
|
+
async setLiftOffDistance(value) {
|
|
55
|
+
const millimetres = value === "Low" ? 1 : value === "Medium" ? 2 : 3;
|
|
56
|
+
const confirmed = await this.update((config) => ({ ...config, liftOffDistanceMm: millimetres }));
|
|
57
|
+
return lodName(confirmed.liftOffDistanceMm);
|
|
58
|
+
}
|
|
59
|
+
async setAngleSnapping(enabled) {
|
|
60
|
+
return (await this.update((config) => ({ ...config, angleSnapping: enabled }))).angleSnapping;
|
|
61
|
+
}
|
|
62
|
+
async setUsbSpeed(usbSpeed) {
|
|
63
|
+
const confirmed = await this.update((config) => ({
|
|
64
|
+
...config,
|
|
65
|
+
usbSpeed,
|
|
66
|
+
pollingRateHz: usbSpeed === "Full" ? 1000 : pollingRate(config.pollingRateCode),
|
|
67
|
+
}));
|
|
68
|
+
return confirmed.usbSpeed;
|
|
69
|
+
}
|
|
70
|
+
async setPrimaryButton(primaryButton) {
|
|
71
|
+
return (await this.update((config) => ({ ...config, primaryButton }))).primaryButton;
|
|
72
|
+
}
|
|
73
|
+
async factoryReset() {
|
|
74
|
+
return await this.run(async () => {
|
|
75
|
+
await this.open();
|
|
76
|
+
await this.device.sendFeatureReport(ZAUNKOENIG_CONFIG_REPORT_ID, buffer(zaunkoenigBuildFactoryResetPayload()));
|
|
77
|
+
return await this.readStatusDirect();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async update(change) {
|
|
81
|
+
return await this.run(async () => {
|
|
82
|
+
await this.open();
|
|
83
|
+
const current = await this.readConfig();
|
|
84
|
+
const wanted = change(current);
|
|
85
|
+
const wantedWord = zaunkoenigEncodeConfigWord(wanted, this.device.productId);
|
|
86
|
+
if (wantedWord !== zaunkoenigEncodeConfigWord(current, this.device.productId)) {
|
|
87
|
+
await this.device.sendFeatureReport(ZAUNKOENIG_CONFIG_REPORT_ID, buffer(zaunkoenigBuildConfigPayload(wanted, this.device.productId)));
|
|
88
|
+
}
|
|
89
|
+
const confirmed = await this.readConfig();
|
|
90
|
+
if (zaunkoenigEncodeConfigWord(confirmed, this.device.productId) !== wantedWord) {
|
|
91
|
+
throw new Error("The Zaunkoenig mouse did not retain the requested configuration.");
|
|
92
|
+
}
|
|
93
|
+
return confirmed;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async readStatusDirect() {
|
|
97
|
+
const firmware = zaunkoenigDecodeVersionReport(await this.device.receiveFeatureReport(ZAUNKOENIG_VERSION_REPORT_ID));
|
|
98
|
+
if (!zaunkoenigFirmwareIsSupported(firmware)) {
|
|
99
|
+
throw new Error(`Unsupported Zaunkoenig firmware: ${firmware || "unknown"}. parawizard new v0.8 is required.`);
|
|
100
|
+
}
|
|
101
|
+
const config = await this.readConfig();
|
|
102
|
+
const definition = zaunkoenigDevice(this.device.productId);
|
|
103
|
+
return {
|
|
104
|
+
brand: "Zaunkoenig",
|
|
105
|
+
name: this.device.productName?.trim() || `Zaunkoenig ${definition.model}`,
|
|
106
|
+
batteryPercent: null,
|
|
107
|
+
batteryState: "Unknown",
|
|
108
|
+
dpi: config.dpi,
|
|
109
|
+
pollingRateHz: config.pollingRateHz,
|
|
110
|
+
supportedPollingRates: [...POLLING_RATES],
|
|
111
|
+
activeProfile: null,
|
|
112
|
+
connectionType: "Wired",
|
|
113
|
+
connectionDetail: `USB ${config.usbSpeed}-speed`,
|
|
114
|
+
liftOffDistance: lodName(config.liftOffDistanceMm),
|
|
115
|
+
supportedLiftOffDistances: definition.liftOffDistancesMm.map(lodName),
|
|
116
|
+
angleSnapping: config.angleSnapping,
|
|
117
|
+
motionSync: null,
|
|
118
|
+
rippleControl: null,
|
|
119
|
+
usbSpeed: config.usbSpeed,
|
|
120
|
+
primaryButton: config.primaryButton,
|
|
121
|
+
firmware: firmware ? [firmware] : [],
|
|
122
|
+
ui: {
|
|
123
|
+
family: "zaunkoenig",
|
|
124
|
+
hideUnsupportedPollingRates: true,
|
|
125
|
+
hideMotionSync: true,
|
|
126
|
+
hideRippleControl: true,
|
|
127
|
+
hideSleepCard: true,
|
|
128
|
+
hideSignalCard: true,
|
|
129
|
+
showAdvancedSection: true,
|
|
130
|
+
pollingNote: "Full-speed is limited to 1,000 Hz; High-speed supports 1,000–8,000 Hz.",
|
|
131
|
+
defaultDisplayName: `Zaunkoenig ${definition.model}`,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async readConfig() {
|
|
136
|
+
return zaunkoenigDecodeConfigReport(await this.device.receiveFeatureReport(ZAUNKOENIG_CONFIG_REPORT_ID), this.device.productId);
|
|
137
|
+
}
|
|
138
|
+
async run(operation) {
|
|
139
|
+
const result = this.queue.then(operation, operation);
|
|
140
|
+
this.queue = result.then(() => undefined, () => undefined);
|
|
141
|
+
return await result;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function lodName(millimetres) {
|
|
145
|
+
return millimetres === 1 ? "Low" : millimetres === 2 ? "Medium" : "High";
|
|
146
|
+
}
|
|
147
|
+
function pollingCode(rate) {
|
|
148
|
+
return { 8000: 0, 4000: 1, 2000: 2, 1000: 3 }[rate] ?? 3;
|
|
149
|
+
}
|
|
150
|
+
function pollingRate(code) {
|
|
151
|
+
return [8000, 4000, 2000, 1000][code];
|
|
152
|
+
}
|
|
153
|
+
function hasControlCollection(items) {
|
|
154
|
+
return items.some((collection) => (collection.usagePage === ZAUNKOENIG_USAGE_PAGE
|
|
155
|
+
&& collection.featureReports.some((report) => report.reportId === ZAUNKOENIG_VERSION_REPORT_ID)
|
|
156
|
+
&& collection.featureReports.some((report) => report.reportId === ZAUNKOENIG_CONFIG_REPORT_ID))
|
|
157
|
+
|| hasControlCollection(collection.children));
|
|
158
|
+
}
|
|
159
|
+
function buffer(payload) {
|
|
160
|
+
return new Uint8Array(payload).buffer;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=hid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/zaunkoenig/hid.ts"],"names":[],"mappings":"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"}
|