@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,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wooting analog keyboard vendor HID protocol — transport-independent codec.
|
|
3
|
+
*
|
|
4
|
+
* Wire mechanics mirror the official Wooting RGB SDK (`src/wooting-usb.c`,
|
|
5
|
+
* `wooting_usb_send_feature_buff`). Commands are 8-byte HID *feature* reports:
|
|
6
|
+
*
|
|
7
|
+
* [reportIndex, magic0, magic1, commandId, param3, param2, param1, param0]
|
|
8
|
+
*
|
|
9
|
+
* where `magic0`/`magic1` are `0xD0`/`0xDA` on single-report (v1/v2-interface)
|
|
10
|
+
* devices and `0xD1`/`0xDA` on multi-report (v3) devices, and `reportIndex`
|
|
11
|
+
* (0 or 1) matches. Note the SDK writes the four parameters in reverse order
|
|
12
|
+
* (param3 first). The response is read back as an *input* report; its layout is
|
|
13
|
+
* command-specific.
|
|
14
|
+
*
|
|
15
|
+
* The Wooting 60HE+ (VID `0x31E3`, PID `0x1322`) is a single-report,
|
|
16
|
+
* v2-interface board, so it uses magic `0xD0`/`0xDA` and report index 0, and
|
|
17
|
+
* exposes its config interface on vendor usage page `0xFF53`, usage `0x01`.
|
|
18
|
+
*
|
|
19
|
+
* These helpers are read-only building blocks: OpenMouse uses them to identify
|
|
20
|
+
* a board and, where the browser permits, read its device config. No firmware
|
|
21
|
+
* flashing, profile writes, or key remapping live here.
|
|
22
|
+
*/
|
|
23
|
+
/** Wooting "VID2" — used by every Hall-effect / ARM board (Two HE, 60HE, 60HE+, 80HE…). */
|
|
24
|
+
export const WOOTING_VENDOR_ID = 0x31e3;
|
|
25
|
+
/** Atmel VID on the original AVR boards (Wooting One / Two). Kept for discovery only. */
|
|
26
|
+
export const WOOTING_LEGACY_VENDOR_ID = 0x03eb;
|
|
27
|
+
/**
|
|
28
|
+
* Vendor config interface exposed over WebHID. The 60HE+ presents several
|
|
29
|
+
* vendor-defined collections; only `0xFF55` usage `0x01` declares a writable
|
|
30
|
+
* feature report (confirmed on hardware — the `0xFF53` collection is the
|
|
31
|
+
* analog/HID data stream and declares no feature report, so a WebHID feature
|
|
32
|
+
* write there fails). `0xFF00` is the legacy generic interface on older boards.
|
|
33
|
+
*/
|
|
34
|
+
export const WOOTING_CONFIG_USAGE_PAGE = 0xff55;
|
|
35
|
+
export const WOOTING_CONFIG_USAGE_PAGE_LEGACY = 0xff00;
|
|
36
|
+
/** The analog/HID data stream — not used for commands. */
|
|
37
|
+
export const WOOTING_ANALOG_USAGE_PAGE = 0xff53;
|
|
38
|
+
export const WOOTING_CONFIG_USAGE = 0x01;
|
|
39
|
+
/**
|
|
40
|
+
* Known product IDs. Only the 60HE+ is listed until other boards are captured
|
|
41
|
+
* with `openmouse-collect` and confirmed on hardware.
|
|
42
|
+
*/
|
|
43
|
+
export const WOOTING_PRODUCTS = new Map([
|
|
44
|
+
[0x1322, { name: "Wooting 60HE+", verified: false }],
|
|
45
|
+
]);
|
|
46
|
+
export const WOOTING_PRODUCT_IDS = [...WOOTING_PRODUCTS.keys()];
|
|
47
|
+
export const WOOTING_COMMAND_SIZE = 8;
|
|
48
|
+
export const WOOTING_MAGIC_SINGLE = 0xd0;
|
|
49
|
+
export const WOOTING_MAGIC_MULTI = 0xd1;
|
|
50
|
+
export const WOOTING_MAGIC_WORD_1 = 0xda;
|
|
51
|
+
/**
|
|
52
|
+
* Command IDs from the D0DA command table (the `d0da` project's
|
|
53
|
+
* `d0da_feature.py`, cross-checked with the RGB SDK). Only read-only queries are
|
|
54
|
+
* listed here — deliberately NOT the neighbouring destructive ones
|
|
55
|
+
* (`reset_to_bootloader = 0x02`, `keys_off = 0x15`, `do_soft_reset = 0x19`).
|
|
56
|
+
*/
|
|
57
|
+
export const WOOTING_COMMAND = {
|
|
58
|
+
/** get_version — firmware version. */
|
|
59
|
+
getVersion: 0x01,
|
|
60
|
+
/** get_serial — device serial number. */
|
|
61
|
+
getSerial: 0x03,
|
|
62
|
+
/** get_current_keyboard_profile_index — which onboard profile is active. */
|
|
63
|
+
getCurrentKeyboardProfileIndex: 0x0b,
|
|
64
|
+
/** get_actuation_profile — per-key actuation overrides for a profile. */
|
|
65
|
+
getActuationProfile: 0x31,
|
|
66
|
+
/** get_keyboard_profile — the active profile: actuation (field 1, mm × 20480), rapid trigger, etc. */
|
|
67
|
+
getKeyboardProfile: 0x27,
|
|
68
|
+
/** get_settings — global device settings protobuf. */
|
|
69
|
+
getSettings: 0x33,
|
|
70
|
+
/** get_device_config — board layout / config block. */
|
|
71
|
+
getDeviceConfig: 0x13,
|
|
72
|
+
};
|
|
73
|
+
/** Total key travel of a Wooting Lekker/analog switch, in millimetres (0–255 maps onto this). */
|
|
74
|
+
export const WOOTING_TRAVEL_MM = 4.0;
|
|
75
|
+
/** Convert a raw 0–255 analog value to millimetres of travel. */
|
|
76
|
+
export function wootingAnalogMm(value) {
|
|
77
|
+
return (value / 255) * WOOTING_TRAVEL_MM;
|
|
78
|
+
}
|
|
79
|
+
function readVarint(data, at) {
|
|
80
|
+
let result = 0;
|
|
81
|
+
let shift = 0;
|
|
82
|
+
let i = at;
|
|
83
|
+
while (i < data.length) {
|
|
84
|
+
const byte = data[i];
|
|
85
|
+
result += (byte & 0x7f) * 2 ** shift;
|
|
86
|
+
i += 1;
|
|
87
|
+
if ((byte & 0x80) === 0)
|
|
88
|
+
break;
|
|
89
|
+
shift += 7;
|
|
90
|
+
}
|
|
91
|
+
return [result, i];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Decode a protobuf message into its raw fields — no schema needed, because the
|
|
95
|
+
* wire format tags every field with its number and type. Used to read the
|
|
96
|
+
* Wooting profile blob and pick out the actuation / rapid-trigger values by
|
|
97
|
+
* correlating with known settings. Returns [] if the bytes are not valid protobuf.
|
|
98
|
+
*/
|
|
99
|
+
export function decodeProtobufFields(data) {
|
|
100
|
+
const fields = [];
|
|
101
|
+
let i = 0;
|
|
102
|
+
while (i < data.length) {
|
|
103
|
+
const [tag, afterTag] = readVarint(data, i);
|
|
104
|
+
if (tag === 0)
|
|
105
|
+
break;
|
|
106
|
+
i = afterTag;
|
|
107
|
+
const field = Math.floor(tag / 8);
|
|
108
|
+
const wire = tag & 7;
|
|
109
|
+
if (wire === 0) {
|
|
110
|
+
const [value, next] = readVarint(data, i);
|
|
111
|
+
fields.push({ field, wire, int: value });
|
|
112
|
+
i = next;
|
|
113
|
+
}
|
|
114
|
+
else if (wire === 2) {
|
|
115
|
+
const [len, next] = readVarint(data, i);
|
|
116
|
+
i = next;
|
|
117
|
+
if (i + len > data.length)
|
|
118
|
+
break;
|
|
119
|
+
fields.push({ field, wire, bytes: data.slice(i, i + len) });
|
|
120
|
+
i += len;
|
|
121
|
+
}
|
|
122
|
+
else if (wire === 5) {
|
|
123
|
+
if (i + 4 > data.length)
|
|
124
|
+
break;
|
|
125
|
+
const view = new DataView(data.buffer, data.byteOffset + i, 4);
|
|
126
|
+
fields.push({ field, wire, int: view.getUint32(0, true), float: view.getFloat32(0, true) });
|
|
127
|
+
i += 4;
|
|
128
|
+
}
|
|
129
|
+
else if (wire === 1) {
|
|
130
|
+
if (i + 8 > data.length)
|
|
131
|
+
break;
|
|
132
|
+
const view = new DataView(data.buffer, data.byteOffset + i, 8);
|
|
133
|
+
fields.push({ field, wire, int: Number(view.getBigUint64(0, true)), float: view.getFloat64(0, true) });
|
|
134
|
+
i += 8;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return fields;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Decode the global settings from a `get_settings` (0x33) reply, confirmed on a
|
|
144
|
+
* real 60HE+: `d1 da 33 88 <len:u16> <protobuf>`. The body's field 1 is a nested
|
|
145
|
+
* message whose field 1 is the global actuation and field 2 the rapid-trigger
|
|
146
|
+
* sensitivity (raw units). Example `08 05 10 0a` → actuation 5, RT sensitivity 10
|
|
147
|
+
* for a keyboard set to 0.20mm / 0.15mm.
|
|
148
|
+
*/
|
|
149
|
+
/**
|
|
150
|
+
* Decode the nested-message fields of a profile reply
|
|
151
|
+
* (`magic magic cmd status <len:u16> 0a <len> <nested>`). Returns the nested
|
|
152
|
+
* message's fields as {field, value}. Used to read the keyboard profile (0x27),
|
|
153
|
+
* whose field 1 is the actuation (stored as mm × 20480).
|
|
154
|
+
*/
|
|
155
|
+
export function decodeWootingProfileFields(reply) {
|
|
156
|
+
if (reply.length < 6)
|
|
157
|
+
return [];
|
|
158
|
+
const length = reply[4] | (reply[5] << 8);
|
|
159
|
+
const body = reply.subarray(6, 6 + length);
|
|
160
|
+
const nested = decodeProtobufFields(body).find((field) => field.field === 1 && field.bytes);
|
|
161
|
+
if (!nested?.bytes)
|
|
162
|
+
return [];
|
|
163
|
+
return decodeProtobufFields(nested.bytes)
|
|
164
|
+
.filter((field) => field.int !== undefined)
|
|
165
|
+
.map((field) => ({ field: field.field, value: field.int }));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Millimetres of actuation from the keyboard profile's raw value. Confirmed on a
|
|
169
|
+
* 60HE+ across two settings: 1.00mm → 20480, 0.50mm → 18432, i.e. a line
|
|
170
|
+
* `raw = 16384 + mm * 4096` (raw 0x4000 = 0mm, 0x8000 = 4mm).
|
|
171
|
+
*/
|
|
172
|
+
export const WOOTING_ACTUATION_ZERO = 16384;
|
|
173
|
+
export const WOOTING_ACTUATION_UNITS_PER_MM = 4096;
|
|
174
|
+
export function wootingActuationMm(raw) {
|
|
175
|
+
return (raw - WOOTING_ACTUATION_ZERO) / WOOTING_ACTUATION_UNITS_PER_MM;
|
|
176
|
+
}
|
|
177
|
+
export function decodeWootingGlobalSettings(reply) {
|
|
178
|
+
if (reply.length < 6 || reply[2] !== WOOTING_COMMAND.getSettings)
|
|
179
|
+
return null;
|
|
180
|
+
const length = reply[4] | (reply[5] << 8);
|
|
181
|
+
const body = reply.subarray(6, 6 + length);
|
|
182
|
+
const nested = decodeProtobufFields(body).find((field) => field.field === 1 && field.bytes);
|
|
183
|
+
if (!nested?.bytes)
|
|
184
|
+
return { actuationRaw: null, rapidTriggerSensitivityRaw: null };
|
|
185
|
+
const sub = decodeProtobufFields(nested.bytes);
|
|
186
|
+
const at = (n) => sub.find((field) => field.field === n)?.int ?? null;
|
|
187
|
+
return { actuationRaw: at(1), rapidTriggerSensitivityRaw: at(2) };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Build the full 8-byte command buffer exactly as the SDK lays it out, with the
|
|
191
|
+
* hidapi report-index byte first. Transports that take the report id separately
|
|
192
|
+
* (WebHID) should send `buffer[0]` as the report id and `buffer.subarray(1)` as
|
|
193
|
+
* the data — see {@link wootingFeatureReport}.
|
|
194
|
+
*/
|
|
195
|
+
export function encodeWootingCommand(commandId, param0 = 0, param1 = 0, param2 = 0, param3 = 0, { multiReport = false } = {}) {
|
|
196
|
+
const buffer = new Uint8Array(WOOTING_COMMAND_SIZE);
|
|
197
|
+
buffer[0] = multiReport ? 1 : 0;
|
|
198
|
+
buffer[1] = multiReport ? WOOTING_MAGIC_MULTI : WOOTING_MAGIC_SINGLE;
|
|
199
|
+
buffer[2] = WOOTING_MAGIC_WORD_1;
|
|
200
|
+
buffer[3] = commandId & 0xff;
|
|
201
|
+
buffer[4] = param3 & 0xff;
|
|
202
|
+
buffer[5] = param2 & 0xff;
|
|
203
|
+
buffer[6] = param1 & 0xff;
|
|
204
|
+
buffer[7] = param0 & 0xff;
|
|
205
|
+
return buffer;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Split an encoded command into the `{ reportId, data }` pair a WebHID
|
|
209
|
+
* `sendFeatureReport(reportId, data)` call expects: the leading hidapi index
|
|
210
|
+
* byte becomes the report id, and the remaining seven bytes are the data.
|
|
211
|
+
*/
|
|
212
|
+
export function wootingFeatureReport(buffer) {
|
|
213
|
+
return { reportId: buffer[0] ?? 0, data: buffer.slice(1) };
|
|
214
|
+
}
|
|
215
|
+
/** SDK `WOOTING_DEVICE_LAYOUT` values → display names. */
|
|
216
|
+
const WOOTING_LAYOUTS = {
|
|
217
|
+
0: "ANSI",
|
|
218
|
+
1: "ISO",
|
|
219
|
+
2: "JIS",
|
|
220
|
+
3: "ANSI Split",
|
|
221
|
+
4: "ISO Split",
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Offset of the layout byte inside the device-config response as WebHID delivers
|
|
225
|
+
* it. The Wooting SDK reads index 10, but its buffer includes the leading
|
|
226
|
+
* report-id byte that a WebHID `inputreport` event strips, so the same field
|
|
227
|
+
* sits at index 9 here — confirmed against a 60HE+ reply
|
|
228
|
+
* (`d1 da 13 88 07 00 00 00 00 00 …`, byte 9 = 0x00 = ANSI).
|
|
229
|
+
*/
|
|
230
|
+
export const WOOTING_DEVICE_CONFIG_LAYOUT_OFFSET = 9;
|
|
231
|
+
/**
|
|
232
|
+
* Decode the layout out of a device-config response. `response` is the raw input
|
|
233
|
+
* report payload (no report-id prefix, matching the WebHID `inputreport` event).
|
|
234
|
+
* Returns `null` when the buffer is too short to trust.
|
|
235
|
+
*/
|
|
236
|
+
export function decodeWootingDeviceConfig(response, offset = WOOTING_DEVICE_CONFIG_LAYOUT_OFFSET) {
|
|
237
|
+
if (response.length <= offset)
|
|
238
|
+
return null;
|
|
239
|
+
const layoutId = response[offset];
|
|
240
|
+
return { layout: WOOTING_LAYOUTS[layoutId] ?? "Unknown", layoutId };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* True when a buffer looks like a genuine Wooting command reply: it starts with
|
|
244
|
+
* the magic word (`0xD0` or `0xD1`, then `0xDA`) and is long enough to carry a
|
|
245
|
+
* command byte. Used to reject stub responses — e.g. a feature GET that echoes
|
|
246
|
+
* only the report id — so the driver waits for the real input-report reply.
|
|
247
|
+
*/
|
|
248
|
+
export function isWootingReply(bytes) {
|
|
249
|
+
return bytes.length >= 4
|
|
250
|
+
&& (bytes[0] === WOOTING_MAGIC_SINGLE || bytes[0] === WOOTING_MAGIC_MULTI)
|
|
251
|
+
&& bytes[1] === WOOTING_MAGIC_WORD_1;
|
|
252
|
+
}
|
|
253
|
+
/** Offset of the `major` byte in a get_version reply (minor/patch follow). */
|
|
254
|
+
export const WOOTING_VERSION_OFFSET = 6;
|
|
255
|
+
/**
|
|
256
|
+
* Decode the firmware version out of a `get_version` reply.
|
|
257
|
+
*
|
|
258
|
+
* Confirmed against a real 60HE+ answer `d1 da 01 88 03 00 02 0d 00 …` whose
|
|
259
|
+
* Wootility-reported version is v2.13.0: after the 4-byte header
|
|
260
|
+
* (`magic0 magic1 command status`, status 0x88 = OK) and a two-byte leading
|
|
261
|
+
* field, the version is `major minor patch` at offset 6 — here 2, 13, 0 → "2.13.0".
|
|
262
|
+
* Returns null when the reply is not a version answer or carries no version.
|
|
263
|
+
*/
|
|
264
|
+
export function decodeWootingVersion(reply) {
|
|
265
|
+
const o = WOOTING_VERSION_OFFSET;
|
|
266
|
+
if (!isWootingReply(reply) || reply.length < o + 3)
|
|
267
|
+
return null;
|
|
268
|
+
const [major, minor, patch] = [reply[o], reply[o + 1], reply[o + 2]];
|
|
269
|
+
if (major === 0 && minor === 0 && patch === 0)
|
|
270
|
+
return null;
|
|
271
|
+
return `${major}.${minor}.${patch}`;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Decode one analog input report from the Wooting analog stream (the 0xFF53
|
|
275
|
+
* interface). The report is a run of 3-byte entries `[usageHigh, usage, value]`;
|
|
276
|
+
* a full snapshot of the currently-pressed keys arrives on every event (a key at
|
|
277
|
+
* value 0 / usage 0 is absent). Layout matches the community WebHID readers
|
|
278
|
+
* (colecrouter/wooting-js). Returns the pressed keys in a stable order (by usage
|
|
279
|
+
* id) so a live UI can keep each key's row in place instead of reordering as
|
|
280
|
+
* values fluctuate.
|
|
281
|
+
*/
|
|
282
|
+
export function decodeWootingAnalogReport(data) {
|
|
283
|
+
const keys = [];
|
|
284
|
+
for (let i = 0; i + 2 < data.length; i += 3) {
|
|
285
|
+
const usage = data[i + 1];
|
|
286
|
+
const value = data[i + 2];
|
|
287
|
+
if (usage !== 0 && value !== 0)
|
|
288
|
+
keys.push({ usage, value });
|
|
289
|
+
}
|
|
290
|
+
return keys.sort((a, b) => a.usage - b.usage);
|
|
291
|
+
}
|
|
292
|
+
/** Human name for a product id, falling back to a generic Wooting label. */
|
|
293
|
+
export function wootingProductName(productId) {
|
|
294
|
+
return WOOTING_PRODUCTS.get(productId)?.name ?? "Wooting keyboard";
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wooting/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zaunkoenig's WebHID configuration protocol, reconstructed from the public
|
|
3
|
+
* Zaunkoenfigurator shipped at https://zaunkoenig.co/zaunkoenfigurator.
|
|
4
|
+
*
|
|
5
|
+
* The device stores every setting in one little-endian 16-bit word. Writes
|
|
6
|
+
* carry a second 16-bit control word: zero applies the configuration and
|
|
7
|
+
* 0xffff requests a factory reset.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ZAUNKOENIG_VENDOR_ID = 1155;
|
|
10
|
+
export declare const ZAUNKOENIG_M3K_PRODUCT_ID = 42082;
|
|
11
|
+
export declare const ZAUNKOENIG_M2K_PRODUCT_ID = 41935;
|
|
12
|
+
export declare const ZAUNKOENIG_PRODUCT_IDS: readonly [42082, 41935];
|
|
13
|
+
export declare const ZAUNKOENIG_USAGE_PAGE = 65280;
|
|
14
|
+
export declare const ZAUNKOENIG_VERSION_REPORT_ID = 2;
|
|
15
|
+
export declare const ZAUNKOENIG_CONFIG_REPORT_ID = 3;
|
|
16
|
+
export declare const ZAUNKOENIG_MINIMUM_FIRMWARE_MARKER = "parawizard new v0.8";
|
|
17
|
+
export type ZaunkoenigModel = "M3K" | "M2K";
|
|
18
|
+
export type ZaunkoenigUsbSpeed = "Full" | "High";
|
|
19
|
+
export type ZaunkoenigPrimaryButton = "Left" | "Right";
|
|
20
|
+
export interface ZaunkoenigConfig {
|
|
21
|
+
usbSpeed: ZaunkoenigUsbSpeed;
|
|
22
|
+
pollingRateHz: 1000 | 2000 | 4000 | 8000;
|
|
23
|
+
/** Raw interval code retained even when Full-speed forces the effective rate to 1 kHz. */
|
|
24
|
+
pollingRateCode: 0 | 1 | 2 | 3;
|
|
25
|
+
liftOffDistanceMm: 1 | 2 | 3;
|
|
26
|
+
angleSnapping: boolean;
|
|
27
|
+
primaryButton: ZaunkoenigPrimaryButton;
|
|
28
|
+
dpi: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ZaunkoenigDeviceDefinition {
|
|
31
|
+
model: ZaunkoenigModel;
|
|
32
|
+
dpiStep: 50 | 100;
|
|
33
|
+
dpiMax: 12_000 | 20_000;
|
|
34
|
+
liftOffDistancesMm: readonly (1 | 2 | 3)[];
|
|
35
|
+
/** This implementation follows public code and still needs physical-hardware verification. */
|
|
36
|
+
verified: false;
|
|
37
|
+
}
|
|
38
|
+
export declare const ZAUNKOENIG_DEVICES: ReadonlyMap<number, ZaunkoenigDeviceDefinition>;
|
|
39
|
+
export declare function zaunkoenigDevice(productId: number): ZaunkoenigDeviceDefinition;
|
|
40
|
+
export declare function zaunkoenigFirmwareIsSupported(version: string): boolean;
|
|
41
|
+
export declare function zaunkoenigDecodeVersionReport(source: DataView | Uint8Array): string;
|
|
42
|
+
export declare function zaunkoenigDecodeConfigWord(word: number, productId: number): ZaunkoenigConfig;
|
|
43
|
+
export declare function zaunkoenigDecodeConfigReport(source: DataView | Uint8Array, productId: number): ZaunkoenigConfig;
|
|
44
|
+
export declare function zaunkoenigEncodeConfigWord(config: ZaunkoenigConfig, productId: number): number;
|
|
45
|
+
/** Four-byte payload passed to sendFeatureReport(3, ...). */
|
|
46
|
+
export declare function zaunkoenigBuildConfigPayload(config: ZaunkoenigConfig, productId: number): Uint8Array;
|
|
47
|
+
/** 0x0000 followed by the 0xffff factory-reset sentinel. */
|
|
48
|
+
export declare function zaunkoenigBuildFactoryResetPayload(): Uint8Array;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zaunkoenig/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,OAAS,CAAC;AAC3C,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,sBAAsB,yBAGzB,CAAC;AAEX,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,kCAAkC,wBAAwB,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;AAC5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC;AACjD,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACzC,0FAA0F;IAC1F,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,iBAAiB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,uBAAuB,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC3C,8FAA8F;IAC9F,QAAQ,EAAE,KAAK,CAAC;CACjB;AAED,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAe7E,CAAC;AAIH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,CAI9E;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAMnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAmB5F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAK/G;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA6B9F;AAED,6DAA6D;AAC7D,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAGpG;AAED,4DAA4D;AAC5D,wBAAgB,kCAAkC,IAAI,UAAU,CAE/D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zaunkoenig's WebHID configuration protocol, reconstructed from the public
|
|
3
|
+
* Zaunkoenfigurator shipped at https://zaunkoenig.co/zaunkoenfigurator.
|
|
4
|
+
*
|
|
5
|
+
* The device stores every setting in one little-endian 16-bit word. Writes
|
|
6
|
+
* carry a second 16-bit control word: zero applies the configuration and
|
|
7
|
+
* 0xffff requests a factory reset.
|
|
8
|
+
*/
|
|
9
|
+
export const ZAUNKOENIG_VENDOR_ID = 0x0483;
|
|
10
|
+
export const ZAUNKOENIG_M3K_PRODUCT_ID = 0xa462;
|
|
11
|
+
export const ZAUNKOENIG_M2K_PRODUCT_ID = 0xa3cf;
|
|
12
|
+
export const ZAUNKOENIG_PRODUCT_IDS = [
|
|
13
|
+
ZAUNKOENIG_M3K_PRODUCT_ID,
|
|
14
|
+
ZAUNKOENIG_M2K_PRODUCT_ID,
|
|
15
|
+
];
|
|
16
|
+
export const ZAUNKOENIG_USAGE_PAGE = 0xff00;
|
|
17
|
+
export const ZAUNKOENIG_VERSION_REPORT_ID = 2;
|
|
18
|
+
export const ZAUNKOENIG_CONFIG_REPORT_ID = 3;
|
|
19
|
+
export const ZAUNKOENIG_MINIMUM_FIRMWARE_MARKER = "parawizard new v0.8";
|
|
20
|
+
export const ZAUNKOENIG_DEVICES = new Map([
|
|
21
|
+
[ZAUNKOENIG_M3K_PRODUCT_ID, {
|
|
22
|
+
model: "M3K",
|
|
23
|
+
dpiStep: 50,
|
|
24
|
+
dpiMax: 20_000,
|
|
25
|
+
liftOffDistancesMm: [1, 2, 3],
|
|
26
|
+
verified: false,
|
|
27
|
+
}],
|
|
28
|
+
[ZAUNKOENIG_M2K_PRODUCT_ID, {
|
|
29
|
+
model: "M2K",
|
|
30
|
+
dpiStep: 100,
|
|
31
|
+
dpiMax: 12_000,
|
|
32
|
+
liftOffDistancesMm: [2, 3],
|
|
33
|
+
verified: false,
|
|
34
|
+
}],
|
|
35
|
+
]);
|
|
36
|
+
const POLLING_RATES = [8000, 4000, 2000, 1000];
|
|
37
|
+
export function zaunkoenigDevice(productId) {
|
|
38
|
+
const definition = ZAUNKOENIG_DEVICES.get(productId);
|
|
39
|
+
if (!definition)
|
|
40
|
+
throw new Error(`Unsupported Zaunkoenig product id 0x${productId.toString(16)}.`);
|
|
41
|
+
return definition;
|
|
42
|
+
}
|
|
43
|
+
export function zaunkoenigFirmwareIsSupported(version) {
|
|
44
|
+
return version.includes(ZAUNKOENIG_MINIMUM_FIRMWARE_MARKER);
|
|
45
|
+
}
|
|
46
|
+
export function zaunkoenigDecodeVersionReport(source) {
|
|
47
|
+
const bytes = asBytes(source);
|
|
48
|
+
const start = bytes[0] === ZAUNKOENIG_VERSION_REPORT_ID ? 1 : 0;
|
|
49
|
+
const terminator = bytes.indexOf(0, start);
|
|
50
|
+
const end = terminator < 0 ? bytes.length : terminator;
|
|
51
|
+
return String.fromCharCode(...bytes.slice(start, end)).trim();
|
|
52
|
+
}
|
|
53
|
+
export function zaunkoenigDecodeConfigWord(word, productId) {
|
|
54
|
+
const definition = zaunkoenigDevice(productId);
|
|
55
|
+
const value = word & 0xffff;
|
|
56
|
+
const pollingRateCode = ((value >> 11) & 0b11);
|
|
57
|
+
const rawLod = (value >> 9) & 0b11;
|
|
58
|
+
const liftOffDistanceMm = definition.model === "M2K" ? rawLod : rawLod + 1;
|
|
59
|
+
if (!definition.liftOffDistancesMm.includes(liftOffDistanceMm)) {
|
|
60
|
+
throw new Error(`Zaunkoenig ${definition.model} reported unsupported lift-off code ${rawLod}.`);
|
|
61
|
+
}
|
|
62
|
+
const usbSpeed = value & 0x2000 ? "High" : "Full";
|
|
63
|
+
return {
|
|
64
|
+
usbSpeed,
|
|
65
|
+
pollingRateHz: usbSpeed === "Full" ? 1000 : POLLING_RATES[pollingRateCode],
|
|
66
|
+
pollingRateCode,
|
|
67
|
+
liftOffDistanceMm: liftOffDistanceMm,
|
|
68
|
+
angleSnapping: Boolean(value & 0x4000),
|
|
69
|
+
primaryButton: value & 0x8000 ? "Right" : "Left",
|
|
70
|
+
dpi: ((value & 0x01ff) + 1) * definition.dpiStep,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export function zaunkoenigDecodeConfigReport(source, productId) {
|
|
74
|
+
const bytes = asBytes(source);
|
|
75
|
+
const start = bytes[0] === ZAUNKOENIG_CONFIG_REPORT_ID ? 1 : 0;
|
|
76
|
+
if (bytes.length - start < 2)
|
|
77
|
+
throw new Error("Zaunkoenig configuration report is shorter than two bytes.");
|
|
78
|
+
return zaunkoenigDecodeConfigWord(bytes[start] | (bytes[start + 1] << 8), productId);
|
|
79
|
+
}
|
|
80
|
+
export function zaunkoenigEncodeConfigWord(config, productId) {
|
|
81
|
+
const definition = zaunkoenigDevice(productId);
|
|
82
|
+
if (!Number.isInteger(config.dpi) || config.dpi < definition.dpiStep || config.dpi > definition.dpiMax
|
|
83
|
+
|| config.dpi % definition.dpiStep !== 0) {
|
|
84
|
+
throw new Error(`Zaunkoenig ${definition.model} DPI must be ${definition.dpiStep}–${definition.dpiMax} in ${definition.dpiStep} DPI steps.`);
|
|
85
|
+
}
|
|
86
|
+
if (!definition.liftOffDistancesMm.includes(config.liftOffDistanceMm)) {
|
|
87
|
+
throw new Error(`Zaunkoenig ${definition.model} lift-off distance must be ${definition.liftOffDistancesMm.join(" or ")} mm.`);
|
|
88
|
+
}
|
|
89
|
+
const selectedPollingRateCode = POLLING_RATES.indexOf(config.pollingRateHz);
|
|
90
|
+
if (selectedPollingRateCode < 0)
|
|
91
|
+
throw new Error("Zaunkoenig polling rate must be 1000, 2000, 4000, or 8000 Hz.");
|
|
92
|
+
if (!Number.isInteger(config.pollingRateCode) || config.pollingRateCode < 0 || config.pollingRateCode > 3) {
|
|
93
|
+
throw new Error("Zaunkoenig polling-rate code must be an integer from 0 to 3.");
|
|
94
|
+
}
|
|
95
|
+
if (config.usbSpeed === "Full" && config.pollingRateHz !== 1000) {
|
|
96
|
+
throw new Error("USB Full-speed supports only 1000 Hz polling.");
|
|
97
|
+
}
|
|
98
|
+
// Full-speed always reports at 1 kHz, but the firmware retains the interval
|
|
99
|
+
// bits and uses them again if High-speed is restored.
|
|
100
|
+
const pollingRateCode = config.usbSpeed === "Full" ? config.pollingRateCode : selectedPollingRateCode;
|
|
101
|
+
const rawLod = definition.model === "M2K" ? config.liftOffDistanceMm : config.liftOffDistanceMm - 1;
|
|
102
|
+
let word = (config.dpi / definition.dpiStep - 1) & 0x01ff;
|
|
103
|
+
word |= (rawLod & 0b11) << 9;
|
|
104
|
+
word |= (pollingRateCode & 0b11) << 11;
|
|
105
|
+
if (config.usbSpeed === "High")
|
|
106
|
+
word |= 0x2000;
|
|
107
|
+
if (config.angleSnapping)
|
|
108
|
+
word |= 0x4000;
|
|
109
|
+
if (config.primaryButton === "Right")
|
|
110
|
+
word |= 0x8000;
|
|
111
|
+
return word & 0xffff;
|
|
112
|
+
}
|
|
113
|
+
/** Four-byte payload passed to sendFeatureReport(3, ...). */
|
|
114
|
+
export function zaunkoenigBuildConfigPayload(config, productId) {
|
|
115
|
+
const word = zaunkoenigEncodeConfigWord(config, productId);
|
|
116
|
+
return new Uint8Array([word & 0xff, word >> 8, 0, 0]);
|
|
117
|
+
}
|
|
118
|
+
/** 0x0000 followed by the 0xffff factory-reset sentinel. */
|
|
119
|
+
export function zaunkoenigBuildFactoryResetPayload() {
|
|
120
|
+
return new Uint8Array([0, 0, 0xff, 0xff]);
|
|
121
|
+
}
|
|
122
|
+
function asBytes(source) {
|
|
123
|
+
return source instanceof Uint8Array
|
|
124
|
+
? source
|
|
125
|
+
: new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zaunkoenig/index.ts"],"names":[],"mappings":"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"}
|