@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,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature 0x1B04 (REPROG CONTROLS V4) — which buttons a device has, what each
|
|
3
|
+
* one currently does, and which of them may be pointed at another.
|
|
4
|
+
*
|
|
5
|
+
* Read from an MX Master 4 (WPID B042) over a Logi Bolt receiver, which
|
|
6
|
+
* reports nine controls at version 6. Control and task names follow Solaar's
|
|
7
|
+
* special_keys tables; the ids this device actually reports were confirmed
|
|
8
|
+
* against it, and the rest are carried from that list unverified.
|
|
9
|
+
*
|
|
10
|
+
* The device decides what is legal here, not this code. Every control carries
|
|
11
|
+
* a group and a mask of the groups it accepts, and the primary buttons report
|
|
12
|
+
* a mask of zero — so firmware, not a rule invented here, is what refuses to
|
|
13
|
+
* let left click be moved.
|
|
14
|
+
*/
|
|
15
|
+
export const LOGITECH_REPROG_CONTROLS = {
|
|
16
|
+
/** getCount: [count]. */
|
|
17
|
+
count: 0x00,
|
|
18
|
+
/** getControlIdInfo(index): [cid(2), tid(2), flags, pos, group, gmask, ...]. */
|
|
19
|
+
info: 0x10,
|
|
20
|
+
/** getControlIdReporting(cid): [cid(2), flagsLow, remap(2), flagsHigh]. */
|
|
21
|
+
reporting: 0x20,
|
|
22
|
+
/** setControlIdReporting(cid, flags, remap(2)). */
|
|
23
|
+
setReporting: 0x30,
|
|
24
|
+
};
|
|
25
|
+
/** Control ids — the physical (or virtual) buttons a device exposes. */
|
|
26
|
+
export const LOGITECH_CONTROL_NAMES = {
|
|
27
|
+
0x0050: "Left click",
|
|
28
|
+
0x0051: "Right click",
|
|
29
|
+
0x0052: "Middle click",
|
|
30
|
+
0x0053: "Back",
|
|
31
|
+
0x0054: "Back (alt)",
|
|
32
|
+
0x0056: "Forward",
|
|
33
|
+
0x0057: "Forward (as HID)",
|
|
34
|
+
0x0059: "Button 6",
|
|
35
|
+
0x005a: "Button 7",
|
|
36
|
+
0x005b: "Button 8",
|
|
37
|
+
0x005c: "Button 9",
|
|
38
|
+
0x005d: "Button 10",
|
|
39
|
+
0x005e: "Button 11",
|
|
40
|
+
0x00c3: "Gesture button",
|
|
41
|
+
0x00c4: "SmartShift button",
|
|
42
|
+
0x00d7: "Virtual gesture button",
|
|
43
|
+
0x00dc: "Back (long press)",
|
|
44
|
+
0x00e0: "Mission Control / Task View",
|
|
45
|
+
0x00e1: "Dashboard / Action Center",
|
|
46
|
+
0x00e2: "Backlight down",
|
|
47
|
+
0x00e3: "Backlight up",
|
|
48
|
+
0x00e4: "Previous track",
|
|
49
|
+
0x00e5: "Play / pause",
|
|
50
|
+
0x00e6: "Next track",
|
|
51
|
+
0x00e7: "Mute",
|
|
52
|
+
0x00e8: "Volume down",
|
|
53
|
+
0x00e9: "Volume up",
|
|
54
|
+
/** The MX Master 4's Actions Ring, the panel paired with 0x19B0 haptics. */
|
|
55
|
+
0x01a0: "Actions Ring",
|
|
56
|
+
};
|
|
57
|
+
/** Native task each control performs when it is neither remapped nor diverted. */
|
|
58
|
+
export const LOGITECH_TASK_NAMES = {
|
|
59
|
+
0x0038: "Left click",
|
|
60
|
+
0x0039: "Right click",
|
|
61
|
+
0x003a: "Middle click",
|
|
62
|
+
0x003c: "Back",
|
|
63
|
+
0x003e: "Forward",
|
|
64
|
+
0x009c: "Gesture button",
|
|
65
|
+
0x009d: "SmartShift",
|
|
66
|
+
0x00b4: "Virtual gesture button",
|
|
67
|
+
0x0109: "App switch / Launchpad",
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Bits of the flags byte from getControlIdInfo. Confirmed against an
|
|
71
|
+
* MX Master 4: left click reports 0x01 (a plain mouse button, not
|
|
72
|
+
* reprogrammable), the gesture button 0x31, and the virtual gesture button
|
|
73
|
+
* 0xA0 — virtual and divertable, but not a physical key.
|
|
74
|
+
*/
|
|
75
|
+
export const LOGITECH_KEY_FLAG = {
|
|
76
|
+
mouseButton: 0x01,
|
|
77
|
+
fkey: 0x02,
|
|
78
|
+
hotkey: 0x04,
|
|
79
|
+
fnToggle: 0x08,
|
|
80
|
+
reprogrammable: 0x10,
|
|
81
|
+
divertable: 0x20,
|
|
82
|
+
persistentlyDivertable: 0x40,
|
|
83
|
+
virtual: 0x80,
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Bits of the mapping flags from getControlIdReporting, which is one 16-bit
|
|
87
|
+
* field split across two non-adjacent payload bytes — low at [2], high at [5],
|
|
88
|
+
* with the remap target wedged between them.
|
|
89
|
+
*/
|
|
90
|
+
export const LOGITECH_MAPPING_FLAG = {
|
|
91
|
+
diverted: 0x0001,
|
|
92
|
+
persistentlyDiverted: 0x0004,
|
|
93
|
+
rawXy: 0x0010,
|
|
94
|
+
forceRawXy: 0x0040,
|
|
95
|
+
analyticsKeyEvents: 0x0100,
|
|
96
|
+
rawWheel: 0x0400,
|
|
97
|
+
};
|
|
98
|
+
export const logitechControlName = (controlId) => LOGITECH_CONTROL_NAMES[controlId]
|
|
99
|
+
?? `Control 0x${controlId.toString(16).padStart(4, "0").toUpperCase()}`;
|
|
100
|
+
export const logitechTaskName = (taskId) => LOGITECH_TASK_NAMES[taskId] ?? `Task 0x${taskId.toString(16).padStart(4, "0").toUpperCase()}`;
|
|
101
|
+
/** Decodes the getControlIdInfo payload (function 0x10). */
|
|
102
|
+
export function decodeControlInfo(payload) {
|
|
103
|
+
if (payload.length < 8)
|
|
104
|
+
return null;
|
|
105
|
+
const at = (index) => payload[index] ?? 0;
|
|
106
|
+
return {
|
|
107
|
+
controlId: (at(0) << 8) | at(1),
|
|
108
|
+
taskId: (at(2) << 8) | at(3),
|
|
109
|
+
flags: at(4),
|
|
110
|
+
// Byte 5 is the physical position, which is meaningful on keyboards only.
|
|
111
|
+
group: at(6),
|
|
112
|
+
groupMask: at(7),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Decodes the getControlIdReporting payload (function 0x20).
|
|
117
|
+
*
|
|
118
|
+
* The mapping flags are one 16-bit field whose halves are not adjacent: the
|
|
119
|
+
* low byte sits at [2] and the high byte at [5], with the remap target at
|
|
120
|
+
* [3..4] between them. Reading the two as a contiguous pair puts the remap
|
|
121
|
+
* target's high byte where the flags belong, which reports a button remapped
|
|
122
|
+
* to anything in 0x01.. as diverted.
|
|
123
|
+
*/
|
|
124
|
+
export function decodeControlReporting(payload) {
|
|
125
|
+
if (payload.length < 6)
|
|
126
|
+
return null;
|
|
127
|
+
const at = (index) => payload[index] ?? 0;
|
|
128
|
+
const mappingFlags = at(2) | (at(5) << 8);
|
|
129
|
+
const diverted = LOGITECH_MAPPING_FLAG.diverted | LOGITECH_MAPPING_FLAG.persistentlyDiverted;
|
|
130
|
+
return {
|
|
131
|
+
controlId: (at(0) << 8) | at(1),
|
|
132
|
+
mappingFlags,
|
|
133
|
+
mappedTo: (at(3) << 8) | at(4),
|
|
134
|
+
diverted: (mappingFlags & diverted) !== 0,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Which controls a given control may be remapped to.
|
|
139
|
+
*
|
|
140
|
+
* The device's group mask names the groups it accepts, and only controls
|
|
141
|
+
* belonging to one of those groups are legal targets. Left and right click
|
|
142
|
+
* report a mask of zero, so they come back with nothing.
|
|
143
|
+
*/
|
|
144
|
+
export function remappableControlTargets(control, all) {
|
|
145
|
+
return all
|
|
146
|
+
// Group 0 means the control belongs to no group and is not a target. The
|
|
147
|
+
// mask test alone would also reject it — but only via a negative shift,
|
|
148
|
+
// which is an accident to rely on rather than a rule to read.
|
|
149
|
+
.filter((candidate) => candidate.group > 0
|
|
150
|
+
&& (control.groupMask & (1 << (candidate.group - 1))) !== 0)
|
|
151
|
+
.map((candidate) => candidate.controlId);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Builds the setControlIdReporting payload for a pure remap.
|
|
155
|
+
*
|
|
156
|
+
* Each mapping flag occupies two bits — the value, and a companion "valid" bit
|
|
157
|
+
* one position higher — and the device ignores any flag whose valid bit is
|
|
158
|
+
* clear. A flags byte of zero therefore changes no flag at all, which is
|
|
159
|
+
* exactly what is wanted here: turning diversion on would route the button to
|
|
160
|
+
* HID++ notifications that nothing consumes, leaving it dead.
|
|
161
|
+
*/
|
|
162
|
+
export function buildControlRemapWrite(controlId, targetControlId) {
|
|
163
|
+
return [controlId >> 8, controlId & 0xff, 0x00, targetControlId >> 8, targetControlId & 0xff];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Builds the payload that hands a button back to the hardware.
|
|
167
|
+
*
|
|
168
|
+
* A diverted button emits HID++ notifications instead of acting, which is how
|
|
169
|
+
* a vendor application implements behaviours of its own. Logi Options+ uses
|
|
170
|
+
* the temporary flag, which the device clears when its owner stops — but the
|
|
171
|
+
* persistent flag survives, and a button left that way does nothing at all
|
|
172
|
+
* until something clears it.
|
|
173
|
+
*
|
|
174
|
+
* Only the valid bits are set, with both value bits left clear, so this can
|
|
175
|
+
* only ever turn diversion off. There is deliberately no way to turn it on:
|
|
176
|
+
* nothing here consumes those notifications. A remap target of zero leaves the
|
|
177
|
+
* existing mapping untouched.
|
|
178
|
+
*/
|
|
179
|
+
export function buildControlDiversionClearWrite(controlId) {
|
|
180
|
+
const clearDiverted = LOGITECH_MAPPING_FLAG.diverted << 1;
|
|
181
|
+
const clearPersistent = LOGITECH_MAPPING_FLAG.persistentlyDiverted << 1;
|
|
182
|
+
return [controlId >> 8, controlId & 0xff, clearDiverted | clearPersistent, 0x00, 0x00];
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/logitech/controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,yBAAyB;IACzB,KAAK,EAAE,IAAI;IACX,gFAAgF;IAChF,IAAI,EAAE,IAAI;IACV,2EAA2E;IAC3E,SAAS,EAAE,IAAI;IACf,mDAAmD;IACnD,YAAY,EAAE,IAAI;CACV,CAAC;AAEX,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAqC;IACtE,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,6BAA6B;IACrC,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,WAAW;IACnB,4EAA4E;IAC5E,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,wBAAwB;CACjC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,IAAI;IAChB,sBAAsB,EAAE,IAAI;IAC5B,OAAO,EAAE,IAAI;CACL,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,MAAM;IAChB,oBAAoB,EAAE,MAAM;IAC5B,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,MAAM;IAClB,kBAAkB,EAAE,MAAM;IAC1B,QAAQ,EAAE,MAAM;CACR,CAAC;AAsCX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAiB,EAAU,EAAE,CAC/D,sBAAsB,CAAC,SAAS,CAAC;OAC9B,aAAa,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAU,EAAE,CACzD,mBAAmB,CAAC,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAEhG,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAAC,OAAuC;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO;QACL,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACZ,0EAA0E;QAC1E,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACZ,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAuC;IAEvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;IAC7F,OAAO;QACL,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/B,YAAY;QACZ,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9B,QAAQ,EAAE,CAAC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA4B,EAC5B,GAAmC;IAEnC,OAAO,GAAG;QACR,yEAAyE;QACzE,wEAAwE;QACxE,8DAA8D;SAC7D,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;WACrC,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,eAAuB;IAC/E,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,eAAe,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;AAChG,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,+BAA+B,CAAC,SAAiB;IAC/D,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,aAAa,GAAG,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature 0x0007 (Device Friendly Name) — the editable name a device presents
|
|
3
|
+
* to a host, distinct from the fixed 0x0005 device name.
|
|
4
|
+
*
|
|
5
|
+
* Read from an MX Master 4 (WPID B042): fn 0x00 answers
|
|
6
|
+
* [currentLength, maxLength, ...], reporting 11 of a maximum 14 and holding
|
|
7
|
+
* "MX Master 4". fn 0x01 returns the text in chunks headed by the offset that
|
|
8
|
+
* was asked for, so characters begin one byte into the payload. fn 0x03 writes
|
|
9
|
+
* it back in the same shape.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LOGITECH_FRIENDLY_NAME: {
|
|
12
|
+
/** getFriendlyNameLengths: [current, max]. */
|
|
13
|
+
readonly lengths: 0;
|
|
14
|
+
/** getFriendlyName(offset): [offset, ...characters]. */
|
|
15
|
+
readonly get: 16;
|
|
16
|
+
/** getDefaultFriendlyName(offset), same shape as get. */
|
|
17
|
+
readonly getDefault: 32;
|
|
18
|
+
/** setFriendlyName(offset, ...characters). */
|
|
19
|
+
readonly set: 48;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A long report carries 19 bytes: three of HID++ header, then the echoed
|
|
23
|
+
* offset, leaving fifteen for characters. The MX Master 4 allows fourteen, so
|
|
24
|
+
* one write covers any name it accepts — but the limit is the device's, read
|
|
25
|
+
* from the hardware rather than assumed, so this is the transport ceiling.
|
|
26
|
+
*/
|
|
27
|
+
export declare const LOGITECH_FRIENDLY_NAME_BYTES_PER_REPORT = 15;
|
|
28
|
+
export interface LogitechFriendlyNameLengths {
|
|
29
|
+
length: number;
|
|
30
|
+
maxLength: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function decodeFriendlyNameLengths(payload: Uint8Array | readonly number[]): LogitechFriendlyNameLengths | null;
|
|
33
|
+
/**
|
|
34
|
+
* Characters from one chunk. The reply repeats the offset it was asked for, so
|
|
35
|
+
* the text starts at payload[1]; reading from payload[0] yields the offset as
|
|
36
|
+
* a stray character and shifts the whole name.
|
|
37
|
+
*/
|
|
38
|
+
export declare function decodeFriendlyNameChunk(payload: Uint8Array | readonly number[], remaining: number): number[];
|
|
39
|
+
/** Trailing NULs are padding, not part of the name. */
|
|
40
|
+
export declare function decodeFriendlyNameText(characters: readonly number[]): string;
|
|
41
|
+
export type LogitechFriendlyNameRejection = "empty" | "too-long" | "non-ascii" | "too-long-for-one-report";
|
|
42
|
+
/**
|
|
43
|
+
* Why a name cannot be written, or null when it can. Names are validated
|
|
44
|
+
* before any bytes go out: a device that accepts half a name and rejects the
|
|
45
|
+
* rest leaves a user with neither the old one nor the new.
|
|
46
|
+
*/
|
|
47
|
+
export declare function rejectFriendlyName(name: string, maxLength: number): LogitechFriendlyNameRejection | null;
|
|
48
|
+
export declare function encodeFriendlyName(name: string): number[];
|
|
49
|
+
export declare function buildFriendlyNameWrite(name: string): number[];
|
|
50
|
+
//# sourceMappingURL=friendly-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendly-name.d.ts","sourceRoot":"","sources":["../../src/logitech/friendly-name.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,sBAAsB;IACjC,8CAA8C;;IAE9C,wDAAwD;;IAExD,yDAAyD;;IAEzD,8CAA8C;;CAEtC,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,KAAK,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GACtC,2BAA2B,GAAG,IAAI,CAKpC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,EACvC,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAGV;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE5E;AAED,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,UAAU,GACV,WAAW,GACX,yBAAyB,CAAC;AAE9B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,6BAA6B,GAAG,IAAI,CAUxG;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE7D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature 0x0007 (Device Friendly Name) — the editable name a device presents
|
|
3
|
+
* to a host, distinct from the fixed 0x0005 device name.
|
|
4
|
+
*
|
|
5
|
+
* Read from an MX Master 4 (WPID B042): fn 0x00 answers
|
|
6
|
+
* [currentLength, maxLength, ...], reporting 11 of a maximum 14 and holding
|
|
7
|
+
* "MX Master 4". fn 0x01 returns the text in chunks headed by the offset that
|
|
8
|
+
* was asked for, so characters begin one byte into the payload. fn 0x03 writes
|
|
9
|
+
* it back in the same shape.
|
|
10
|
+
*/
|
|
11
|
+
export const LOGITECH_FRIENDLY_NAME = {
|
|
12
|
+
/** getFriendlyNameLengths: [current, max]. */
|
|
13
|
+
lengths: 0x00,
|
|
14
|
+
/** getFriendlyName(offset): [offset, ...characters]. */
|
|
15
|
+
get: 0x10,
|
|
16
|
+
/** getDefaultFriendlyName(offset), same shape as get. */
|
|
17
|
+
getDefault: 0x20,
|
|
18
|
+
/** setFriendlyName(offset, ...characters). */
|
|
19
|
+
set: 0x30,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A long report carries 19 bytes: three of HID++ header, then the echoed
|
|
23
|
+
* offset, leaving fifteen for characters. The MX Master 4 allows fourteen, so
|
|
24
|
+
* one write covers any name it accepts — but the limit is the device's, read
|
|
25
|
+
* from the hardware rather than assumed, so this is the transport ceiling.
|
|
26
|
+
*/
|
|
27
|
+
export const LOGITECH_FRIENDLY_NAME_BYTES_PER_REPORT = 15;
|
|
28
|
+
export function decodeFriendlyNameLengths(payload) {
|
|
29
|
+
const length = payload[0];
|
|
30
|
+
const maxLength = payload[1];
|
|
31
|
+
if (length === undefined || maxLength === undefined || maxLength === 0)
|
|
32
|
+
return null;
|
|
33
|
+
return { length, maxLength };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Characters from one chunk. The reply repeats the offset it was asked for, so
|
|
37
|
+
* the text starts at payload[1]; reading from payload[0] yields the offset as
|
|
38
|
+
* a stray character and shifts the whole name.
|
|
39
|
+
*/
|
|
40
|
+
export function decodeFriendlyNameChunk(payload, remaining) {
|
|
41
|
+
const wanted = Math.min(LOGITECH_FRIENDLY_NAME_BYTES_PER_REPORT, Math.max(0, remaining));
|
|
42
|
+
return [...payload].slice(1, 1 + wanted);
|
|
43
|
+
}
|
|
44
|
+
/** Trailing NULs are padding, not part of the name. */
|
|
45
|
+
export function decodeFriendlyNameText(characters) {
|
|
46
|
+
return new TextDecoder().decode(new Uint8Array(characters)).replace(/\0/g, "").trim();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Why a name cannot be written, or null when it can. Names are validated
|
|
50
|
+
* before any bytes go out: a device that accepts half a name and rejects the
|
|
51
|
+
* rest leaves a user with neither the old one nor the new.
|
|
52
|
+
*/
|
|
53
|
+
export function rejectFriendlyName(name, maxLength) {
|
|
54
|
+
const bytes = encodeFriendlyName(name);
|
|
55
|
+
if (bytes.length === 0)
|
|
56
|
+
return "empty";
|
|
57
|
+
if (bytes.length > maxLength)
|
|
58
|
+
return "too-long";
|
|
59
|
+
if (bytes.length > LOGITECH_FRIENDLY_NAME_BYTES_PER_REPORT)
|
|
60
|
+
return "too-long-for-one-report";
|
|
61
|
+
// The wire carries bytes, but a name outside printable ASCII has never been
|
|
62
|
+
// exercised on hardware and multi-byte characters would break the length
|
|
63
|
+
// accounting the device does in characters.
|
|
64
|
+
if (bytes.some((byte) => byte < 0x20 || byte > 0x7e))
|
|
65
|
+
return "non-ascii";
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
export function encodeFriendlyName(name) {
|
|
69
|
+
return [...new TextEncoder().encode(name.trim())];
|
|
70
|
+
}
|
|
71
|
+
export function buildFriendlyNameWrite(name) {
|
|
72
|
+
return [0x00, ...encodeFriendlyName(name)];
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=friendly-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendly-name.js","sourceRoot":"","sources":["../../src/logitech/friendly-name.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,8CAA8C;IAC9C,OAAO,EAAE,IAAI;IACb,wDAAwD;IACxD,GAAG,EAAE,IAAI;IACT,yDAAyD;IACzD,UAAU,EAAE,IAAI;IAChB,8CAA8C;IAC9C,GAAG,EAAE,IAAI;CACD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAG,EAAE,CAAC;AAO1D,MAAM,UAAU,yBAAyB,CACvC,OAAuC;IAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAuC,EACvC,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,uCAAuC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxF,CAAC;AAQD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB;IAChE,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,UAAU,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,GAAG,uCAAuC;QAAE,OAAO,yBAAyB,CAAC;IAC7F,4EAA4E;IAC5E,yEAAyE;IACzE,4CAA4C;IAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,CAAC,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature 0x19B0 (Haptic), as implemented by the MX Master 4 (WPID B042).
|
|
3
|
+
*
|
|
4
|
+
* No public documentation exists for this feature. Everything here was read
|
|
5
|
+
* off hardware by watching Logi Options+ talk to the mouse: a Bolt receiver
|
|
6
|
+
* broadcasts replies to every open handle, and the low nibble of the function
|
|
7
|
+
* byte carries the requester's software id, so the vendor application's own
|
|
8
|
+
* traffic is visible alongside your own.
|
|
9
|
+
*
|
|
10
|
+
* The configuration is a two-byte pair behind get 0x10 / set 0x20.
|
|
11
|
+
*
|
|
12
|
+
* Byte 0 is a flag bitmask. Turning haptics off in Options+ cleared bit 0;
|
|
13
|
+
* turning its battery-saving mode off cleared bit 1; both returned together as
|
|
14
|
+
* 0x03. Ten writes for ten switch toggles, and only those two pairs moved
|
|
15
|
+
* anything — Options+'s per-context switches (Actions Ring, Gestures, Switch
|
|
16
|
+
* Screens) change no device byte at all, so those are decided in its software.
|
|
17
|
+
* Bits 2-7 were 0 throughout and their purpose is unknown, so a write carries
|
|
18
|
+
* them through rather than clearing them.
|
|
19
|
+
*
|
|
20
|
+
* Byte 1 is the strength. Options+'s four presets write exactly the values in
|
|
21
|
+
* LOGITECH_HAPTIC_PRESETS, and capability byte 3 reports 60 as the device
|
|
22
|
+
* default, matching its Medium.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LOGITECH_HAPTIC: {
|
|
25
|
+
/** getCapabilities: [?, ?, ?, defaultIntensity, defaultEffect, ...]. */
|
|
26
|
+
readonly capabilities: 0;
|
|
27
|
+
readonly get: 16;
|
|
28
|
+
readonly set: 32;
|
|
29
|
+
/** Fires the motor once. Nothing is persisted. */
|
|
30
|
+
readonly play: 64;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Options+'s Subtle / Low / Medium / High, captured from its writes. The
|
|
34
|
+
* device takes any byte in range, so these are the vendor's choices rather
|
|
35
|
+
* than a device-imposed set.
|
|
36
|
+
*/
|
|
37
|
+
export declare const LOGITECH_HAPTIC_PRESETS: {
|
|
38
|
+
readonly Subtle: 25;
|
|
39
|
+
readonly Low: 45;
|
|
40
|
+
readonly Medium: 60;
|
|
41
|
+
readonly High: 100;
|
|
42
|
+
};
|
|
43
|
+
export type LogitechHapticPreset = keyof typeof LOGITECH_HAPTIC_PRESETS;
|
|
44
|
+
/** The largest value any preset uses; nothing above it has been exercised. */
|
|
45
|
+
export declare const LOGITECH_HAPTIC_INTENSITY_MAX: 100;
|
|
46
|
+
export declare const LOGITECH_HAPTIC_FLAG: {
|
|
47
|
+
readonly enabled: 1;
|
|
48
|
+
readonly batterySaving: 2;
|
|
49
|
+
};
|
|
50
|
+
export type LogitechHapticFlag = keyof typeof LOGITECH_HAPTIC_FLAG;
|
|
51
|
+
/**
|
|
52
|
+
* Effect ids the MX Master 4 accepts; every other id up to 0x3F answers
|
|
53
|
+
* INVALID_ARGUMENT. Sixteen ids but thirteen distinct sensations by hand:
|
|
54
|
+
* 0x00 and 0x01 are indistinguishable, as are 0x02, 0x03 and 0x04. 0x1B sits
|
|
55
|
+
* apart from the contiguous block and feels like a lighter variant of another
|
|
56
|
+
* effect, which one is unconfirmed.
|
|
57
|
+
*/
|
|
58
|
+
export declare const LOGITECH_HAPTIC_EFFECT_IDS: readonly number[];
|
|
59
|
+
/**
|
|
60
|
+
* The effects Options+ plays for each action, captured from its traffic: 0x08
|
|
61
|
+
* straight after every strength write, 0x00 after re-enabling haptics.
|
|
62
|
+
*/
|
|
63
|
+
export declare const LOGITECH_HAPTIC_EFFECTS: {
|
|
64
|
+
readonly strengthSample: 8;
|
|
65
|
+
readonly enableConfirmation: 0;
|
|
66
|
+
};
|
|
67
|
+
export interface LogitechHapticConfig {
|
|
68
|
+
enabled: boolean;
|
|
69
|
+
batterySaving: boolean;
|
|
70
|
+
intensity: number;
|
|
71
|
+
/** Byte 0 as read, so a later write can carry its unknown bits through. */
|
|
72
|
+
flagByte: number;
|
|
73
|
+
}
|
|
74
|
+
export declare function decodeHapticConfig(payload: Uint8Array | readonly number[]): LogitechHapticConfig | null;
|
|
75
|
+
/** Sets or clears one flag, leaving every other bit of the byte alone. */
|
|
76
|
+
export declare function encodeHapticFlags(flagByte: number, flag: LogitechHapticFlag, on: boolean): number;
|
|
77
|
+
/**
|
|
78
|
+
* A write carries both bytes, so a caller changing one field must supply the
|
|
79
|
+
* other as the device currently reports it. Passing a stale or invented flag
|
|
80
|
+
* byte silently discards whatever bits 2-7 hold.
|
|
81
|
+
*/
|
|
82
|
+
export declare function buildHapticConfigWrite(flagByte: number, intensity: number): number[];
|
|
83
|
+
export declare function isLogitechHapticIntensity(value: number): boolean;
|
|
84
|
+
export declare function isLogitechHapticEffect(effect: number): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Byte 1 of a play reply reports that the motor was already running, not
|
|
87
|
+
* anything about the effect. Proven by playing one short effect from idle and
|
|
88
|
+
* again on the heels of the longest effect in the set: the same id answered 0
|
|
89
|
+
* three times and then 1 three times.
|
|
90
|
+
*/
|
|
91
|
+
export declare function decodeHapticPlayReply(payload: Uint8Array | readonly number[]): {
|
|
92
|
+
effect: number;
|
|
93
|
+
motorWasBusy: boolean;
|
|
94
|
+
} | null;
|
|
95
|
+
/** Capability byte 3 is the factory strength; the MX Master 4 reports 60. */
|
|
96
|
+
export declare function decodeHapticDefaultIntensity(payload: Uint8Array | readonly number[]): number | null;
|
|
97
|
+
//# sourceMappingURL=haptics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haptics.d.ts","sourceRoot":"","sources":["../../src/logitech/haptics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,eAAO,MAAM,eAAe;IAC1B,wEAAwE;;;;IAIxE,kDAAkD;;CAE1C,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAExE,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,KAA+B,CAAC;AAE1E,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAGvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;CAG1B,CAAC;AAUX,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,oBAAoB,GAAG,IAAI,CAUvG;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAGjG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GACtC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAKlD;AAED,6EAA6E;AAC7E,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAEnG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature 0x19B0 (Haptic), as implemented by the MX Master 4 (WPID B042).
|
|
3
|
+
*
|
|
4
|
+
* No public documentation exists for this feature. Everything here was read
|
|
5
|
+
* off hardware by watching Logi Options+ talk to the mouse: a Bolt receiver
|
|
6
|
+
* broadcasts replies to every open handle, and the low nibble of the function
|
|
7
|
+
* byte carries the requester's software id, so the vendor application's own
|
|
8
|
+
* traffic is visible alongside your own.
|
|
9
|
+
*
|
|
10
|
+
* The configuration is a two-byte pair behind get 0x10 / set 0x20.
|
|
11
|
+
*
|
|
12
|
+
* Byte 0 is a flag bitmask. Turning haptics off in Options+ cleared bit 0;
|
|
13
|
+
* turning its battery-saving mode off cleared bit 1; both returned together as
|
|
14
|
+
* 0x03. Ten writes for ten switch toggles, and only those two pairs moved
|
|
15
|
+
* anything — Options+'s per-context switches (Actions Ring, Gestures, Switch
|
|
16
|
+
* Screens) change no device byte at all, so those are decided in its software.
|
|
17
|
+
* Bits 2-7 were 0 throughout and their purpose is unknown, so a write carries
|
|
18
|
+
* them through rather than clearing them.
|
|
19
|
+
*
|
|
20
|
+
* Byte 1 is the strength. Options+'s four presets write exactly the values in
|
|
21
|
+
* LOGITECH_HAPTIC_PRESETS, and capability byte 3 reports 60 as the device
|
|
22
|
+
* default, matching its Medium.
|
|
23
|
+
*/
|
|
24
|
+
export const LOGITECH_HAPTIC = {
|
|
25
|
+
/** getCapabilities: [?, ?, ?, defaultIntensity, defaultEffect, ...]. */
|
|
26
|
+
capabilities: 0x00,
|
|
27
|
+
get: 0x10,
|
|
28
|
+
set: 0x20,
|
|
29
|
+
/** Fires the motor once. Nothing is persisted. */
|
|
30
|
+
play: 0x40,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Options+'s Subtle / Low / Medium / High, captured from its writes. The
|
|
34
|
+
* device takes any byte in range, so these are the vendor's choices rather
|
|
35
|
+
* than a device-imposed set.
|
|
36
|
+
*/
|
|
37
|
+
export const LOGITECH_HAPTIC_PRESETS = {
|
|
38
|
+
Subtle: 25,
|
|
39
|
+
Low: 45,
|
|
40
|
+
Medium: 60,
|
|
41
|
+
High: 100,
|
|
42
|
+
};
|
|
43
|
+
/** The largest value any preset uses; nothing above it has been exercised. */
|
|
44
|
+
export const LOGITECH_HAPTIC_INTENSITY_MAX = LOGITECH_HAPTIC_PRESETS.High;
|
|
45
|
+
export const LOGITECH_HAPTIC_FLAG = {
|
|
46
|
+
enabled: 0x01,
|
|
47
|
+
batterySaving: 0x02,
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Effect ids the MX Master 4 accepts; every other id up to 0x3F answers
|
|
51
|
+
* INVALID_ARGUMENT. Sixteen ids but thirteen distinct sensations by hand:
|
|
52
|
+
* 0x00 and 0x01 are indistinguishable, as are 0x02, 0x03 and 0x04. 0x1B sits
|
|
53
|
+
* apart from the contiguous block and feels like a lighter variant of another
|
|
54
|
+
* effect, which one is unconfirmed.
|
|
55
|
+
*/
|
|
56
|
+
export const LOGITECH_HAPTIC_EFFECT_IDS = [
|
|
57
|
+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
|
58
|
+
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x1b,
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* The effects Options+ plays for each action, captured from its traffic: 0x08
|
|
62
|
+
* straight after every strength write, 0x00 after re-enabling haptics.
|
|
63
|
+
*/
|
|
64
|
+
export const LOGITECH_HAPTIC_EFFECTS = {
|
|
65
|
+
strengthSample: 0x08,
|
|
66
|
+
enableConfirmation: 0x00,
|
|
67
|
+
};
|
|
68
|
+
export function decodeHapticConfig(payload) {
|
|
69
|
+
const flagByte = payload[0];
|
|
70
|
+
const intensity = payload[1];
|
|
71
|
+
if (flagByte === undefined || intensity === undefined)
|
|
72
|
+
return null;
|
|
73
|
+
return {
|
|
74
|
+
enabled: (flagByte & LOGITECH_HAPTIC_FLAG.enabled) !== 0,
|
|
75
|
+
batterySaving: (flagByte & LOGITECH_HAPTIC_FLAG.batterySaving) !== 0,
|
|
76
|
+
intensity,
|
|
77
|
+
flagByte,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Sets or clears one flag, leaving every other bit of the byte alone. */
|
|
81
|
+
export function encodeHapticFlags(flagByte, flag, on) {
|
|
82
|
+
const mask = LOGITECH_HAPTIC_FLAG[flag];
|
|
83
|
+
return on ? flagByte | mask : flagByte & ~mask;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A write carries both bytes, so a caller changing one field must supply the
|
|
87
|
+
* other as the device currently reports it. Passing a stale or invented flag
|
|
88
|
+
* byte silently discards whatever bits 2-7 hold.
|
|
89
|
+
*/
|
|
90
|
+
export function buildHapticConfigWrite(flagByte, intensity) {
|
|
91
|
+
return [flagByte & 0xff, intensity & 0xff];
|
|
92
|
+
}
|
|
93
|
+
export function isLogitechHapticIntensity(value) {
|
|
94
|
+
return Number.isInteger(value) && value >= 0 && value <= LOGITECH_HAPTIC_INTENSITY_MAX;
|
|
95
|
+
}
|
|
96
|
+
export function isLogitechHapticEffect(effect) {
|
|
97
|
+
return LOGITECH_HAPTIC_EFFECT_IDS.includes(effect);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Byte 1 of a play reply reports that the motor was already running, not
|
|
101
|
+
* anything about the effect. Proven by playing one short effect from idle and
|
|
102
|
+
* again on the heels of the longest effect in the set: the same id answered 0
|
|
103
|
+
* three times and then 1 three times.
|
|
104
|
+
*/
|
|
105
|
+
export function decodeHapticPlayReply(payload) {
|
|
106
|
+
const effect = payload[0];
|
|
107
|
+
const busy = payload[1];
|
|
108
|
+
if (effect === undefined || busy === undefined)
|
|
109
|
+
return null;
|
|
110
|
+
return { effect, motorWasBusy: busy !== 0 };
|
|
111
|
+
}
|
|
112
|
+
/** Capability byte 3 is the factory strength; the MX Master 4 reports 60. */
|
|
113
|
+
export function decodeHapticDefaultIntensity(payload) {
|
|
114
|
+
return payload[3] ?? null;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=haptics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haptics.js","sourceRoot":"","sources":["../../src/logitech/haptics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Features 0x1815 (Hosts Info) and 0x1814 (Change Host) — Easy-Switch.
|
|
3
|
+
*
|
|
4
|
+
* Read from an MX Master 4 (WPID B042) over a Logi Bolt receiver. 0x1815
|
|
5
|
+
* fn 0x00 answers [capabilities(2), hostCount, currentHost]: the two leading
|
|
6
|
+
* capability bytes matter, because reading the counts one byte earlier reports
|
|
7
|
+
* eight slots on a device whose slots 3 and up refuse outright. That device
|
|
8
|
+
* reports three slots with two paired, itself on slot 0.
|
|
9
|
+
*
|
|
10
|
+
* Slot indices are zero-based on the wire. The button on the underside of the
|
|
11
|
+
* mouse and its indicator both count from one, so anything user-facing has to
|
|
12
|
+
* add one or it disagrees with the hardware in the user's hand.
|
|
13
|
+
*/
|
|
14
|
+
export declare const LOGITECH_HOSTS: {
|
|
15
|
+
/** getHostsInfo: [capabilities(2), hostCount, currentHost]. */
|
|
16
|
+
readonly info: 0;
|
|
17
|
+
/** getHostInfo(slot): [slot, status, ..., nameLength, maxNameLength]. */
|
|
18
|
+
readonly host: 16;
|
|
19
|
+
/**
|
|
20
|
+
* getHostFriendlyName(slot, offset). NOT the host's label: on an MX Master 4
|
|
21
|
+
* this answers six non-text bytes per slot regardless of the reported name
|
|
22
|
+
* length, which is an address rather than a name. Where the label actually
|
|
23
|
+
* lives is unknown, and the remaining function ids on this feature are
|
|
24
|
+
* reportedly set-name, move and delete-host — a blind call to the last would
|
|
25
|
+
* unpair one of the user's computers, so it was left alone.
|
|
26
|
+
*/
|
|
27
|
+
readonly hostName: 32;
|
|
28
|
+
};
|
|
29
|
+
export declare const LOGITECH_CHANGE_HOST: {
|
|
30
|
+
/** getCurrentHost. */
|
|
31
|
+
readonly current: 0;
|
|
32
|
+
/** setCurrentHost(slot) — disconnects this host on success. */
|
|
33
|
+
readonly set: 16;
|
|
34
|
+
};
|
|
35
|
+
/** Status 1 means a computer is paired to the slot; 0 means it is empty. */
|
|
36
|
+
export declare const LOGITECH_HOST_STATUS_PAIRED = 1;
|
|
37
|
+
export interface LogitechHostsInfo {
|
|
38
|
+
hostCount: number;
|
|
39
|
+
currentHost: number;
|
|
40
|
+
capabilities: number;
|
|
41
|
+
}
|
|
42
|
+
export declare function decodeHostsInfo(payload: Uint8Array | readonly number[]): LogitechHostsInfo | null;
|
|
43
|
+
export declare function decodeHostPaired(payload: Uint8Array | readonly number[]): boolean | null;
|
|
44
|
+
export type LogitechHostSwitchRejection = "no-hosts" | "out-of-range" | "already-current" | "empty-slot";
|
|
45
|
+
/**
|
|
46
|
+
* Why a host switch must not be sent, or null when it may be.
|
|
47
|
+
*
|
|
48
|
+
* Refusing an empty slot is the important one. Switching into a slot with no
|
|
49
|
+
* computer paired leaves the mouse unreachable until someone presses the
|
|
50
|
+
* button on its underside, and no warning text makes that an acceptable thing
|
|
51
|
+
* for a misclick to do.
|
|
52
|
+
*/
|
|
53
|
+
export declare function rejectHostSwitch(slot: number, info: LogitechHostsInfo | null, paired: readonly boolean[]): LogitechHostSwitchRejection | null;
|
|
54
|
+
export declare function buildHostSwitchWrite(slot: number): number[];
|
|
55
|
+
//# sourceMappingURL=hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../src/logitech/hosts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,cAAc;IACzB,+DAA+D;;IAE/D,yEAAyE;;IAEzE;;;;;;;OAOG;;CAEK,CAAC;AAEX,eAAO,MAAM,oBAAoB;IAC/B,sBAAsB;;IAEtB,+DAA+D;;CAEvD,CAAC;AAEX,4EAA4E;AAC5E,eAAO,MAAM,2BAA2B,IAAO,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,iBAAiB,GAAG,IAAI,CAajG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAGxF;AAED,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAEzG;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAC9B,MAAM,EAAE,SAAS,OAAO,EAAE,GACzB,2BAA2B,GAAG,IAAI,CAMpC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3D"}
|