@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,41 @@
|
|
|
1
|
+
/** Index probe on empty Bolt slots should fail fast; feature I/O keeps longer. */
|
|
2
|
+
export declare const BOLT_INDEX_PROBE_TIMEOUT_MS = 800;
|
|
3
|
+
/** Short-report HID++ collection (Lightspeed, Bolt receiver registers). */
|
|
4
|
+
export declare function hasHidppShortCollection(device: HIDDevice): boolean;
|
|
5
|
+
/** Long-report HID++ collection (required for Bolt device feature traffic). */
|
|
6
|
+
export declare function hasHidppLongCollection(device: HIDDevice): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* HID++ over Bluetooth, which lives on its own vendor page instead of the
|
|
9
|
+
* 0xFF00 short/long pair. Kept separate from those two so Bolt peer collapsing
|
|
10
|
+
* and report-device selection keep reasoning only about 0xFF00 interfaces.
|
|
11
|
+
*
|
|
12
|
+
* @see HIDPP_BLUETOOTH_USAGE_PAGE
|
|
13
|
+
*/
|
|
14
|
+
export declare function hasHidppBluetoothCollection(device: HIDDevice): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Prefer Bolt's long-report collection when both HID++ endpoints are present
|
|
17
|
+
* so feature traffic lands on the interface that can carry it.
|
|
18
|
+
*/
|
|
19
|
+
export declare function boltSupportScore(device: HIDDevice, supported: boolean): number;
|
|
20
|
+
/**
|
|
21
|
+
* Collapse Bolt short+long peers to one sidebar entry (the long collection
|
|
22
|
+
* when both are authorized).
|
|
23
|
+
*/
|
|
24
|
+
export declare function collapseBoltPeers(devices: readonly HIDDevice[]): HIDDevice[];
|
|
25
|
+
/**
|
|
26
|
+
* HID++ device-index probe order. Bolt may place the mouse on any of six
|
|
27
|
+
* pairing slots; Lightspeed stays 0x01 then 0xFF; unknown endpoints try self
|
|
28
|
+
* first so wired mice are not addressed as receivers.
|
|
29
|
+
*/
|
|
30
|
+
export declare function hidppIndexCandidates(productId: number, knownReceiverIds: ReadonlySet<number>): number[];
|
|
31
|
+
/**
|
|
32
|
+
* Classify a root getFeature probe: only HID++ 2.0 replies mean a mouse is on
|
|
33
|
+
* that index. Bolt receivers answer HID++ 1.0 errors on empty slots / 0xFF.
|
|
34
|
+
*/
|
|
35
|
+
export declare function classifyHidpp20Probe(error: unknown, isTimeout: boolean): "hidpp20" | "absent";
|
|
36
|
+
/**
|
|
37
|
+
* Bolt device features answer on the long-report collection (usage 2). The
|
|
38
|
+
* picker may hand us the short collection; use an already-authorized peer.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveBoltReportDevice(device: HIDDevice, peers: readonly HIDDevice[]): HIDDevice;
|
|
41
|
+
//# sourceMappingURL=bolt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bolt.d.ts","sourceRoot":"","sources":["../../../src/drivers/logitech/bolt.ts"],"names":[],"mappings":"AAeA,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAW/C,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGlE;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGjE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAI9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAY5E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,MAAM,EAAE,CAIV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAI7F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,SAAS,CAgBX"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logi Bolt transport helpers.
|
|
3
|
+
*
|
|
4
|
+
* Kept out of hidpp.ts so Bolt/MX work can land without rewriting the shared
|
|
5
|
+
* Lightspeed / direct-connect driver paths that other PRs touch often.
|
|
6
|
+
*/
|
|
7
|
+
import { BOLT_PAIRING_SLOTS, DEVICE_INDEX_DIRECT, DEVICE_INDEX_RECEIVER, HIDPP_BLUETOOTH_USAGE_PAGE, HIDPP_USAGE_PAGE, isBoltReceiverProduct, } from "@openmouse/protocol/logitech";
|
|
8
|
+
/** Index probe on empty Bolt slots should fail fast; feature I/O keeps longer. */
|
|
9
|
+
export const BOLT_INDEX_PROBE_TIMEOUT_MS = 800;
|
|
10
|
+
/** True when a collection, or any nested child, matches. */
|
|
11
|
+
function anyCollection(collections, matches) {
|
|
12
|
+
return collections.some((collection) => matches(collection) || anyCollection(collection.children, matches));
|
|
13
|
+
}
|
|
14
|
+
/** Short-report HID++ collection (Lightspeed, Bolt receiver registers). */
|
|
15
|
+
export function hasHidppShortCollection(device) {
|
|
16
|
+
return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_USAGE_PAGE && collection.usage === 0x0001);
|
|
17
|
+
}
|
|
18
|
+
/** Long-report HID++ collection (required for Bolt device feature traffic). */
|
|
19
|
+
export function hasHidppLongCollection(device) {
|
|
20
|
+
return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_USAGE_PAGE && collection.usage === 0x0002);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* HID++ over Bluetooth, which lives on its own vendor page instead of the
|
|
24
|
+
* 0xFF00 short/long pair. Kept separate from those two so Bolt peer collapsing
|
|
25
|
+
* and report-device selection keep reasoning only about 0xFF00 interfaces.
|
|
26
|
+
*
|
|
27
|
+
* @see HIDPP_BLUETOOTH_USAGE_PAGE
|
|
28
|
+
*/
|
|
29
|
+
export function hasHidppBluetoothCollection(device) {
|
|
30
|
+
return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_BLUETOOTH_USAGE_PAGE);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Prefer Bolt's long-report collection when both HID++ endpoints are present
|
|
34
|
+
* so feature traffic lands on the interface that can carry it.
|
|
35
|
+
*/
|
|
36
|
+
export function boltSupportScore(device, supported) {
|
|
37
|
+
if (!supported)
|
|
38
|
+
return 0;
|
|
39
|
+
if (isBoltReceiverProduct(device.productId) && hasHidppLongCollection(device))
|
|
40
|
+
return 8;
|
|
41
|
+
return 6;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Collapse Bolt short+long peers to one sidebar entry (the long collection
|
|
45
|
+
* when both are authorized).
|
|
46
|
+
*/
|
|
47
|
+
export function collapseBoltPeers(devices) {
|
|
48
|
+
const boltLongPresent = new Set();
|
|
49
|
+
for (const device of devices) {
|
|
50
|
+
if (isBoltReceiverProduct(device.productId) && hasHidppLongCollection(device)) {
|
|
51
|
+
boltLongPresent.add(device.productId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return devices.filter((device) => {
|
|
55
|
+
if (!isBoltReceiverProduct(device.productId) || !hasHidppShortCollection(device))
|
|
56
|
+
return true;
|
|
57
|
+
if (hasHidppLongCollection(device))
|
|
58
|
+
return true;
|
|
59
|
+
return !boltLongPresent.has(device.productId);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* HID++ device-index probe order. Bolt may place the mouse on any of six
|
|
64
|
+
* pairing slots; Lightspeed stays 0x01 then 0xFF; unknown endpoints try self
|
|
65
|
+
* first so wired mice are not addressed as receivers.
|
|
66
|
+
*/
|
|
67
|
+
export function hidppIndexCandidates(productId, knownReceiverIds) {
|
|
68
|
+
if (isBoltReceiverProduct(productId))
|
|
69
|
+
return [...BOLT_PAIRING_SLOTS];
|
|
70
|
+
if (knownReceiverIds.has(productId))
|
|
71
|
+
return [DEVICE_INDEX_RECEIVER, DEVICE_INDEX_DIRECT];
|
|
72
|
+
return [DEVICE_INDEX_DIRECT, DEVICE_INDEX_RECEIVER];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Classify a root getFeature probe: only HID++ 2.0 replies mean a mouse is on
|
|
76
|
+
* that index. Bolt receivers answer HID++ 1.0 errors on empty slots / 0xFF.
|
|
77
|
+
*/
|
|
78
|
+
export function classifyHidpp20Probe(error, isTimeout) {
|
|
79
|
+
if (isTimeout)
|
|
80
|
+
return "absent";
|
|
81
|
+
if (error instanceof Error && /HID\+\+ 1\.0/.test(error.message))
|
|
82
|
+
return "absent";
|
|
83
|
+
return "hidpp20";
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Bolt device features answer on the long-report collection (usage 2). The
|
|
87
|
+
* picker may hand us the short collection; use an already-authorized peer.
|
|
88
|
+
*/
|
|
89
|
+
export function resolveBoltReportDevice(device, peers) {
|
|
90
|
+
if (!isBoltReceiverProduct(device.productId))
|
|
91
|
+
return device;
|
|
92
|
+
if (hasHidppLongCollection(device))
|
|
93
|
+
return device;
|
|
94
|
+
const longPeer = peers.find((candidate) => candidate !== device
|
|
95
|
+
&& candidate.vendorId === device.vendorId
|
|
96
|
+
&& candidate.productId === device.productId
|
|
97
|
+
&& hasHidppLongCollection(candidate));
|
|
98
|
+
if (!longPeer) {
|
|
99
|
+
throw new Error("Logi Bolt needs the HID++ long-report interface (usage 2). "
|
|
100
|
+
+ "Reconnect and authorize both Bolt HID++ collections, or pick the usage-2 interface. "
|
|
101
|
+
+ "Close Logi Options+ if the browser cannot open the device.");
|
|
102
|
+
}
|
|
103
|
+
return longPeer;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=bolt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bolt.js","sourceRoot":"","sources":["../../../src/drivers/logitech/bolt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAEtC,kFAAkF;AAClF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,4DAA4D;AAC5D,SAAS,aAAa,CACpB,WAAyC,EACzC,OAAmD;IAEnD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACrC,OAAO,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,OAAO,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CACtD,UAAU,CAAC,SAAS,KAAK,gBAAgB,IAAI,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,OAAO,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CACtD,UAAU,CAAC,SAAS,KAAK,gBAAgB,IAAI,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CACtD,UAAU,CAAC,SAAS,KAAK,0BAA0B,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,SAAkB;IACpE,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACxF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA6B;IAC7D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9F,IAAI,sBAAsB,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,gBAAqC;IAErC,IAAI,qBAAqB,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACrE,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;IACzF,OAAO,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,SAAkB;IACrE,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,KAAK,YAAY,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,KAA2B;IAE3B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,sBAAsB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACxC,SAAS,KAAK,MAAM;WACjB,SAAS,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;WACtC,SAAS,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;WACxC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,6DAA6D;cAC3D,sFAAsF;cACtF,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import type { MouseLighting, MouseStatus } from "../mouse-types.ts";
|
|
2
|
+
import { type LogitechReprogrammableControl, type LogitechWheelMode } from "@openmouse/protocol/logitech";
|
|
3
|
+
export { collapseBoltPeers, hasHidppBluetoothCollection, hasHidppLongCollection, hasHidppShortCollection, } from "./bolt.ts";
|
|
4
|
+
import { type GamingSurfaceMode, type LightforceSwitchMode } from "./mode-status.ts";
|
|
5
|
+
import { type DpiStagePlan, type LogitechButtonAction, type LogitechButtonBinding, type LogitechMacroStep, parseProfilesInfo, type OnboardProfile } from "./onboard-profiles.ts";
|
|
6
|
+
export type { OnboardProfile };
|
|
7
|
+
/** Raw, read-only evidence used to confirm an onboard-profile format. */
|
|
8
|
+
export interface OnboardProfileVerification {
|
|
9
|
+
info: ReturnType<typeof parseProfilesInfo>;
|
|
10
|
+
infoReply: Uint8Array;
|
|
11
|
+
mode: "Onboard" | "Host" | "Unknown";
|
|
12
|
+
modeValue: number;
|
|
13
|
+
modeReply: Uint8Array;
|
|
14
|
+
currentSector: number;
|
|
15
|
+
currentProfileReply: Uint8Array;
|
|
16
|
+
directory: Uint8Array;
|
|
17
|
+
directoryCrcValid: boolean;
|
|
18
|
+
profiles: OnboardProfile[];
|
|
19
|
+
dpiCapabilities: VerificationCapability | null;
|
|
20
|
+
reportRateCapabilities: VerificationCapability | null;
|
|
21
|
+
}
|
|
22
|
+
export interface VerificationCapability {
|
|
23
|
+
featureId: number;
|
|
24
|
+
featureIndex: number;
|
|
25
|
+
featureVersion: number;
|
|
26
|
+
kind: "legacy" | "extended";
|
|
27
|
+
replies: Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
bytes: Uint8Array;
|
|
30
|
+
}>;
|
|
31
|
+
decodedValues: number[];
|
|
32
|
+
error: string | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Master switch for writing DPI slots into profile flash.
|
|
36
|
+
*
|
|
37
|
+
* Enabled after probeProfileWriteSequence passed on a Pro X Superlight 2
|
|
38
|
+
* (format 7): writing a changed byte to sector 0x0002 appeared on read-back,
|
|
39
|
+
* and restoring it appeared too, both with valid checksums. That proves the
|
|
40
|
+
* memoryAddrWrite/memoryWrite/memoryWriteEnd sequence lands rather than being
|
|
41
|
+
* silently dropped. Run the probe again before trusting a new format.
|
|
42
|
+
*/
|
|
43
|
+
export declare const PROFILE_DPI_WRITES_ENABLED = true;
|
|
44
|
+
export interface ProfileWriteProbeMismatch {
|
|
45
|
+
offset: number;
|
|
46
|
+
expected: number;
|
|
47
|
+
actual: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ProfileWriteProbeStep {
|
|
50
|
+
name: string;
|
|
51
|
+
ok: boolean;
|
|
52
|
+
checksumValid: boolean;
|
|
53
|
+
mismatches: ProfileWriteProbeMismatch[];
|
|
54
|
+
}
|
|
55
|
+
export interface ProfileWriteProbe {
|
|
56
|
+
sector: number;
|
|
57
|
+
sectorSize: number;
|
|
58
|
+
offset: number;
|
|
59
|
+
originalByte: number;
|
|
60
|
+
probeByte: number;
|
|
61
|
+
steps: ProfileWriteProbeStep[];
|
|
62
|
+
ok: boolean;
|
|
63
|
+
restored: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface ProfileContentWriteProbeBackup {
|
|
66
|
+
formatId: number;
|
|
67
|
+
sector: number;
|
|
68
|
+
sectorSize: number;
|
|
69
|
+
originalMode: "Onboard" | "Host";
|
|
70
|
+
originalCurrentSector: number;
|
|
71
|
+
directory: Uint8Array;
|
|
72
|
+
profile: Uint8Array;
|
|
73
|
+
dpiOptions: number[];
|
|
74
|
+
reportRates: number[];
|
|
75
|
+
}
|
|
76
|
+
export interface ProfileContentWriteProbeStep {
|
|
77
|
+
setting: "name" | "dpi" | "polling";
|
|
78
|
+
intended: string;
|
|
79
|
+
storedExactly: boolean;
|
|
80
|
+
liveConfirmed: boolean | null;
|
|
81
|
+
restored: boolean;
|
|
82
|
+
error: string | null;
|
|
83
|
+
}
|
|
84
|
+
export interface ProfileContentWriteProbeReport {
|
|
85
|
+
backup: ProfileContentWriteProbeBackup;
|
|
86
|
+
steps: ProfileContentWriteProbeStep[];
|
|
87
|
+
restored: boolean;
|
|
88
|
+
modeRestored: boolean;
|
|
89
|
+
ok: boolean;
|
|
90
|
+
}
|
|
91
|
+
export declare class NotAMouseError extends Error {
|
|
92
|
+
constructor(name: string);
|
|
93
|
+
}
|
|
94
|
+
/** Whether 0x8090 on this model is the power-mode-only variant. */
|
|
95
|
+
export declare function isPowerOnlyModeStatus(modelId: string | null | undefined): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Whether the mouse exposes lift-off levels it can drive: only extended DPI
|
|
98
|
+
* (0x2202) carries one, and its byte 0 is the "no lift-off control" value, so
|
|
99
|
+
* a legacy-DPI mouse or a sensor reporting 0 advertises no levels.
|
|
100
|
+
*/
|
|
101
|
+
export declare function hasLiftOffControl(legacyDpi: boolean, lodByte: number | null): boolean;
|
|
102
|
+
export type LogitechMouseStatus = MouseStatus;
|
|
103
|
+
/**
|
|
104
|
+
* Extended DPI alone does not imply adjustable lift-off distance. Some mice,
|
|
105
|
+
* including the G309, expose 0x2202 but return the protocol's "no LOD control"
|
|
106
|
+
* value. Legacy DPI never carries LOD either.
|
|
107
|
+
*/
|
|
108
|
+
export declare function supportsLiveLiftOffControl(legacyDpi: boolean, liftOffDistance: LogitechMouseStatus["liftOffDistance"]): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Resolves the active physical link from HID++ identity transport IDs. A
|
|
111
|
+
* receiver's USB PID does not match the paired mouse's Wireless transport ID;
|
|
112
|
+
* a mouse connected by cable matches its own USB transport ID. Direct-index
|
|
113
|
+
* probing remains the fallback for older devices that omit identity data.
|
|
114
|
+
*/
|
|
115
|
+
export declare function isWiredHidppConnection(productId: number, transportIds: Record<string, string>, directIndex: boolean): boolean;
|
|
116
|
+
export declare class LogitechHidppClient {
|
|
117
|
+
private dpiOptionsCache;
|
|
118
|
+
private dpiFeatureResolved;
|
|
119
|
+
private rateFeatureResolved;
|
|
120
|
+
private reportRateFeatureIndex;
|
|
121
|
+
private supportedPollingRatesCache;
|
|
122
|
+
private livePollingRateHz;
|
|
123
|
+
/** Discovered by resolveDeviceIndex; null until the mouse has answered. */
|
|
124
|
+
private resolvedDeviceIndex;
|
|
125
|
+
/** Last format read from 0x8100, so a refusal can name it. */
|
|
126
|
+
private profileFormatId;
|
|
127
|
+
private wiredConnection;
|
|
128
|
+
/** Lift-off levels this device advertised; the single source of truth for both UI and validation. */
|
|
129
|
+
private lodCapabilities;
|
|
130
|
+
private supportedLods;
|
|
131
|
+
private rgbZone;
|
|
132
|
+
private colorLedZones;
|
|
133
|
+
private rgbLighting;
|
|
134
|
+
private rgbClaimed;
|
|
135
|
+
private rgbOriginalMode;
|
|
136
|
+
private readonly rateChangeWaiters;
|
|
137
|
+
/**
|
|
138
|
+
* Device used for HID++ feature sendReport. On Bolt this is the long-report
|
|
139
|
+
* collection (usage 2); elsewhere it is `device` itself.
|
|
140
|
+
*/
|
|
141
|
+
private ioDevice;
|
|
142
|
+
private listeningDevices;
|
|
143
|
+
private readonly onInputReport;
|
|
144
|
+
private readonly waiters;
|
|
145
|
+
readonly device: HIDDevice;
|
|
146
|
+
constructor(device: HIDDevice);
|
|
147
|
+
/**
|
|
148
|
+
* True when the vendor interface belongs to the mouse itself instead of a
|
|
149
|
+
* receiver. Written as a getter because `useDefineForClassFields` runs
|
|
150
|
+
* field initializers before the `device` parameter property is assigned.
|
|
151
|
+
*/
|
|
152
|
+
private get isDirectConnect();
|
|
153
|
+
private get isBoltReceiver();
|
|
154
|
+
/** @see hasHidppBluetoothCollection */
|
|
155
|
+
private get isBluetooth();
|
|
156
|
+
/** HID++ device index: a receiver pairing slot, or the mouse itself. */
|
|
157
|
+
private get deviceIndex();
|
|
158
|
+
private get reportDevice();
|
|
159
|
+
/**
|
|
160
|
+
* Finds which HID++ device index this connection answers on.
|
|
161
|
+
*
|
|
162
|
+
* A mouse reached through its receiver answers on a pairing slot (usually
|
|
163
|
+
* 0x01 on Lightspeed; any of 1..6 on Bolt). The same mouse plugged in by
|
|
164
|
+
* cable answers as itself (0xFF). That cannot be read from the descriptors.
|
|
165
|
+
*
|
|
166
|
+
* Only a HID++ 2.0 reply (success or 2.0 error) counts. Bolt receivers answer
|
|
167
|
+
* HID++ 1.0 errors on empty slots and on 0xFF; treating those as "answered"
|
|
168
|
+
* made OpenMouse lock onto the receiver and report "invalid command".
|
|
169
|
+
* A G HUB merge can also push the mouse off slot 0x01, so receivers probe
|
|
170
|
+
* every pairing slot, not just the first.
|
|
171
|
+
*
|
|
172
|
+
* So ask. The root feature query is the cheapest request there is, and the
|
|
173
|
+
* wrong index simply times out.
|
|
174
|
+
*/
|
|
175
|
+
private resolveDeviceIndex;
|
|
176
|
+
/** Root getFeature(firmware) distinguishes HID++ 2.0 from receiver noise. */
|
|
177
|
+
private probeHidpp20Root;
|
|
178
|
+
/**
|
|
179
|
+
* Whether the slot currently probed exposes a DPI feature — the same sensor
|
|
180
|
+
* check readStatus uses, so a keyboard paired to a merged receiver is never
|
|
181
|
+
* mistaken for the mouse.
|
|
182
|
+
*/
|
|
183
|
+
private hasDpiFeature;
|
|
184
|
+
/**
|
|
185
|
+
* Any Logitech device speaking HID++, not just the receivers we happen to
|
|
186
|
+
* have listed. Whether it is a *mouse* cannot be told from descriptors —
|
|
187
|
+
* keyboards and headsets use the same transport — so that is decided after
|
|
188
|
+
* connecting, by asking for a DPI feature. See readStatus.
|
|
189
|
+
*/
|
|
190
|
+
static isSupported(device: HIDDevice): boolean;
|
|
191
|
+
/**
|
|
192
|
+
* Prefer Bolt's long-report collection when both HID++ endpoints are present
|
|
193
|
+
* so feature traffic lands on the interface that can carry it.
|
|
194
|
+
*/
|
|
195
|
+
static supportScore(device: HIDDevice): number;
|
|
196
|
+
/** @see collapseBoltPeers */
|
|
197
|
+
static collapseBoltPeers(devices: readonly HIDDevice[]): HIDDevice[];
|
|
198
|
+
/** Known receivers, kept as the fast path for the WebHID picker's filters. */
|
|
199
|
+
static isKnownReceiver(device: HIDDevice): boolean;
|
|
200
|
+
static requestReceiver(): Promise<LogitechHidppClient | null>;
|
|
201
|
+
static reconnectAuthorizedReceiver(): Promise<LogitechHidppClient | null>;
|
|
202
|
+
readStatus(): Promise<LogitechMouseStatus>;
|
|
203
|
+
close(): Promise<void>;
|
|
204
|
+
setLighting(lighting: MouseLighting): Promise<MouseLighting>;
|
|
205
|
+
private readColorLedLighting;
|
|
206
|
+
setPollingRate(pollingRateHz: number): Promise<number>;
|
|
207
|
+
private setExtendedReportRate;
|
|
208
|
+
getDpiOptions(): Promise<number[]>;
|
|
209
|
+
setDpi(dpi: number, dpiY?: number): Promise<number>;
|
|
210
|
+
setLiftOffDistance(liftOffDistance: NonNullable<LogitechMouseStatus["liftOffDistance"]>): Promise<NonNullable<LogitechMouseStatus["liftOffDistance"]>>;
|
|
211
|
+
setAnalogButtonTuning(button: 0 | 1, tuning: {
|
|
212
|
+
actuation: number;
|
|
213
|
+
rapidTrigger: number;
|
|
214
|
+
haptics: number;
|
|
215
|
+
}): Promise<void>;
|
|
216
|
+
/**
|
|
217
|
+
* Switches the mouse between running from profile flash and being driven live
|
|
218
|
+
* by software. This is what G HUB's "Onboard Memory Mode" toggle does.
|
|
219
|
+
*/
|
|
220
|
+
setOnboardMode(mode: "Onboard" | "Host"): Promise<"Onboard" | "Host">;
|
|
221
|
+
/** Switches which stored profile the mouse runs. Volatile — no flash write. */
|
|
222
|
+
setCurrentProfile(sector: number): Promise<void>;
|
|
223
|
+
/**
|
|
224
|
+
* Enables or disables a profile slot.
|
|
225
|
+
*
|
|
226
|
+
* WRITES FLASH. The directory sector is read, one flag byte changed, the
|
|
227
|
+
* checksum recomputed and the whole sector written back — one erase/write
|
|
228
|
+
* cycle per call. See docs/logitech-onboard-profiles.md. The write sequence
|
|
229
|
+
* itself has not been verified on hardware; callers should confirm with the
|
|
230
|
+
* user first.
|
|
231
|
+
*/
|
|
232
|
+
setProfileEnabled(sector: number, enabled: boolean): Promise<void>;
|
|
233
|
+
/**
|
|
234
|
+
* Restores every onboard profile byte-for-byte to the vendor's captured
|
|
235
|
+
* defaults, then leaves only the first profile enabled and running.
|
|
236
|
+
*
|
|
237
|
+
* WRITES FLASH. Support is deliberately limited to a profile format and
|
|
238
|
+
* sector geometry for which a complete vendor reset was captured. Using a
|
|
239
|
+
* decoded subset here would leave unknown button or lighting settings behind.
|
|
240
|
+
*/
|
|
241
|
+
resetAllOnboardProfiles(): Promise<void>;
|
|
242
|
+
/**
|
|
243
|
+
* Sets the bunny-hop timeout on the active profile.
|
|
244
|
+
*
|
|
245
|
+
* WRITES FLASH — one erase/write cycle. Stored as ms / 10, with 0 meaning
|
|
246
|
+
* off; G HUB's range is 100-1000 ms. The encoding is confirmed on hardware,
|
|
247
|
+
* but the write sequence itself is not, so callers should confirm first.
|
|
248
|
+
*/
|
|
249
|
+
/**
|
|
250
|
+
* Reads the active profile and the context needed to write it back. Every
|
|
251
|
+
* profile write starts here so the format check, the checksum check and the
|
|
252
|
+
* sector-size fallback cannot drift apart between settings.
|
|
253
|
+
*/
|
|
254
|
+
private openActiveProfile;
|
|
255
|
+
/**
|
|
256
|
+
* Writes every changed setting of the active profile in one sector write.
|
|
257
|
+
*
|
|
258
|
+
* Flash is erased a whole sector at a time, so settings that share the sector
|
|
259
|
+
* must be applied together: writing them one at a time would cost an erase
|
|
260
|
+
* cycle each, and each write would be built from a read the previous one had
|
|
261
|
+
* already invalidated.
|
|
262
|
+
*/
|
|
263
|
+
writeActiveProfile(values: {
|
|
264
|
+
bunnyHoppingMs?: number | null;
|
|
265
|
+
dpiStages?: DpiStagePlan | null;
|
|
266
|
+
reportRateWirelessHz?: number | null;
|
|
267
|
+
reportRateWiredHz?: number | null;
|
|
268
|
+
name?: string | null;
|
|
269
|
+
buttonAssignments?: Array<{
|
|
270
|
+
layer: "primary" | "g-shift";
|
|
271
|
+
button: number;
|
|
272
|
+
binding: LogitechButtonAction | LogitechButtonBinding;
|
|
273
|
+
}>;
|
|
274
|
+
buttonMacros?: Array<{
|
|
275
|
+
layer: "primary" | "g-shift";
|
|
276
|
+
button: number;
|
|
277
|
+
steps: LogitechMacroStep[];
|
|
278
|
+
}>;
|
|
279
|
+
/** Defaults to the running profile when omitted. */
|
|
280
|
+
sector?: number;
|
|
281
|
+
}): Promise<void>;
|
|
282
|
+
setBunnyHoppingMs(milliseconds: number): Promise<void>;
|
|
283
|
+
setProfileDpiStages(plan: DpiStagePlan): Promise<void>;
|
|
284
|
+
/**
|
|
285
|
+
* memoryAddrWrite declares the destination and length, memoryWrite streams
|
|
286
|
+
* 16 bytes at a time, memoryWriteEnd commits and validates the checksum.
|
|
287
|
+
*/
|
|
288
|
+
private writeProfileSector;
|
|
289
|
+
/**
|
|
290
|
+
* Proves the profile write sequence on hardware.
|
|
291
|
+
*
|
|
292
|
+
* A no-op rewrite would be useless: writing a sector's own bytes back reads
|
|
293
|
+
* identical whether the write landed or was silently ignored. So this flips
|
|
294
|
+
* one byte, checks the change actually appears, then restores it and checks
|
|
295
|
+
* the restore appears too. Both halves must pass.
|
|
296
|
+
*
|
|
297
|
+
* The target is an unused sector — disabled, and never the active profile —
|
|
298
|
+
* so nothing the user relies on is at risk, and the original bytes are held
|
|
299
|
+
* in memory for restore if a step fails midway. Cost is two erase cycles of
|
|
300
|
+
* roughly 100,000, on a sector that is not in use.
|
|
301
|
+
*/
|
|
302
|
+
probeProfileWriteSequence(): Promise<ProfileWriteProbe>;
|
|
303
|
+
/**
|
|
304
|
+
* Reads and retains everything required to recover a legacy format-2/3/4 profile before
|
|
305
|
+
* the semantic write probe starts. The UI copies this object first.
|
|
306
|
+
*/
|
|
307
|
+
prepareProfileContentWriteProbe(): Promise<ProfileContentWriteProbeBackup>;
|
|
308
|
+
/**
|
|
309
|
+
* Applies temporary format-2/3/4 name, DPI and rate values, confirms each sector
|
|
310
|
+
* read-back, confirms live DPI/rate, and restores the original after every
|
|
311
|
+
* step. The caller must copy the backup before invoking this method.
|
|
312
|
+
*/
|
|
313
|
+
runProfileContentWriteProbe(backup: ProfileContentWriteProbeBackup): Promise<ProfileContentWriteProbeReport>;
|
|
314
|
+
/**
|
|
315
|
+
* Reads and decodes every onboard profile. Deliberately not part of
|
|
316
|
+
* readStatus: a full pass is ~80 HID++ round trips, far too slow for the
|
|
317
|
+
* refresh loop, so the UI loads it on demand.
|
|
318
|
+
*/
|
|
319
|
+
readOnboardProfiles(): Promise<OnboardProfile[]>;
|
|
320
|
+
/**
|
|
321
|
+
* Collects a self-contained, read-only dump for validating any profile
|
|
322
|
+
* format. Unlike readOnboardProfiles, this keeps the full directory and the
|
|
323
|
+
* raw protocol replies so a maintainer can verify geometry and parsing rather
|
|
324
|
+
* than trusting OpenMouse's current assumptions.
|
|
325
|
+
*/
|
|
326
|
+
readOnboardProfileVerification(): Promise<OnboardProfileVerification>;
|
|
327
|
+
private verificationFeature;
|
|
328
|
+
private readDpiVerificationCapability;
|
|
329
|
+
private readReportRateVerificationCapability;
|
|
330
|
+
/**
|
|
331
|
+
* memoryRead returns 16 bytes per call and rejects a read running past the
|
|
332
|
+
* end of the sector, so a sector length that is not a multiple of 16 needs its
|
|
333
|
+
* tail fetched from `length - 16`, overlapping the previous chunk.
|
|
334
|
+
*/
|
|
335
|
+
private readProfileSector;
|
|
336
|
+
/**
|
|
337
|
+
* Haptic configuration, or null on a device without feature 0x19B0. Only the
|
|
338
|
+
* MX Master 4 is known to carry it.
|
|
339
|
+
*/
|
|
340
|
+
private readHapticConfig;
|
|
341
|
+
/**
|
|
342
|
+
* Read-modify-write of the two-byte pair, then verify. Both fields share the
|
|
343
|
+
* write, so a caller changing one has to supply the other exactly as the
|
|
344
|
+
* device reports it, and bits 2-7 of the flag byte ride through untouched.
|
|
345
|
+
*/
|
|
346
|
+
private writeHapticConfig;
|
|
347
|
+
/**
|
|
348
|
+
* Scroll-wheel state across 0x2111, 0x2121 and 0x2150. Every field stays
|
|
349
|
+
* absent rather than guessed when its feature is missing, so a mouse
|
|
350
|
+
* without a thumb wheel does not get a control that can only fail.
|
|
351
|
+
*/
|
|
352
|
+
private readWheelState;
|
|
353
|
+
private readThumbWheelState;
|
|
354
|
+
/** 0x2111 carries all three bytes, so each setter changes only its field. */
|
|
355
|
+
private writeRatchetControl;
|
|
356
|
+
setWheelMode(mode: LogitechWheelMode): Promise<LogitechWheelMode>;
|
|
357
|
+
/** Passing null disables SmartShift; the ratchet mode is preserved either way. */
|
|
358
|
+
setSmartShiftThreshold(threshold: number | null): Promise<number>;
|
|
359
|
+
/**
|
|
360
|
+
* Flips one bit of the 0x2121 mode byte. Diversion is read and carried
|
|
361
|
+
* through: setting it routes the wheel to HID++ and stops it scrolling, and
|
|
362
|
+
* clearing it would take that away from whatever set it.
|
|
363
|
+
*/
|
|
364
|
+
private writeWheelModeBit;
|
|
365
|
+
setHiResScroll(enabled: boolean): Promise<boolean>;
|
|
366
|
+
setInvertScroll(inverted: boolean): Promise<boolean>;
|
|
367
|
+
/**
|
|
368
|
+
* Inverts the thumb wheel. Logi Options+ sets the diversion bit to implement
|
|
369
|
+
* horizontal scrolling, so it is read and preserved rather than rewritten.
|
|
370
|
+
*/
|
|
371
|
+
setThumbWheelInverted(inverted: boolean): Promise<boolean>;
|
|
372
|
+
/** The editable name, or null on a device without feature 0x0007. */
|
|
373
|
+
private readFriendlyName;
|
|
374
|
+
/**
|
|
375
|
+
* Renames the device, then reads the name back. The read-back is not
|
|
376
|
+
* ceremony: firmware that acknowledges a write and quietly keeps its old
|
|
377
|
+
* value would otherwise look like a successful rename.
|
|
378
|
+
*/
|
|
379
|
+
setFriendlyName(name: string): Promise<string>;
|
|
380
|
+
/**
|
|
381
|
+
* Easy-Switch slots, or null without feature 0x1815. Slot indices are
|
|
382
|
+
* zero-based here as they are on the wire; the button under the mouse counts
|
|
383
|
+
* from one, so anything user-facing has to add one.
|
|
384
|
+
*/
|
|
385
|
+
private readHostState;
|
|
386
|
+
/**
|
|
387
|
+
* Asks the mouse to move to another Easy-Switch slot.
|
|
388
|
+
*
|
|
389
|
+
* Named for what it can prove. A successful switch disconnects this host, so
|
|
390
|
+
* there is no state left to read back and no way to confirm the mouse
|
|
391
|
+
* arrived — disconnection IS the expected success path, not a failure.
|
|
392
|
+
* Resolving means the command reached the device: either it acknowledged, or
|
|
393
|
+
* it left before an acknowledgement could be observed and the report was
|
|
394
|
+
* accepted by the transport.
|
|
395
|
+
*
|
|
396
|
+
* An empty slot is refused outright. Switching there leaves the mouse
|
|
397
|
+
* unreachable until someone presses the button on its underside.
|
|
398
|
+
*/
|
|
399
|
+
requestHostSwitch(slot: number): Promise<void>;
|
|
400
|
+
/**
|
|
401
|
+
* Reads every reprogrammable control, what it currently does, and where it
|
|
402
|
+
* may legally be pointed.
|
|
403
|
+
*
|
|
404
|
+
* Two round-trips per control, which is why this is not part of readStatus:
|
|
405
|
+
* on an MX Master 4 that is eighteen more exchanges, enough on a wireless
|
|
406
|
+
* link to start timing other reads out. Call it on connect and after a
|
|
407
|
+
* write, not on a poll.
|
|
408
|
+
*
|
|
409
|
+
* The control table itself never changes for a given device, so it is read
|
|
410
|
+
* once per connection; only the reporting is re-read.
|
|
411
|
+
*/
|
|
412
|
+
readButtons(): Promise<LogitechReprogrammableControl[]>;
|
|
413
|
+
/**
|
|
414
|
+
* Points one button at another control's action.
|
|
415
|
+
*
|
|
416
|
+
* The device is asked what is legal before anything is written, and the
|
|
417
|
+
* result is read back afterwards — firmware that acknowledges a remap and
|
|
418
|
+
* keeps its old mapping would otherwise look like a success.
|
|
419
|
+
*/
|
|
420
|
+
setButtonMapping(controlId: number, targetControlId: number): Promise<LogitechReprogrammableControl[]>;
|
|
421
|
+
/**
|
|
422
|
+
* Hands every diverted button back to the hardware.
|
|
423
|
+
*
|
|
424
|
+
* A diverted button sends HID++ notifications instead of acting, which is
|
|
425
|
+
* how a vendor application implements behaviours of its own. Logi Options+
|
|
426
|
+
* uses the temporary flag and the mouse clears that itself once Options+
|
|
427
|
+
* stops — but the persistent flag survives, so a button left that way stays
|
|
428
|
+
* dead until something clears it. That something has to exist somewhere.
|
|
429
|
+
*/
|
|
430
|
+
clearButtonDiversion(): Promise<LogitechReprogrammableControl[]>;
|
|
431
|
+
/** Sets haptic strength, leaving the flag byte as the device reports it. */
|
|
432
|
+
setHapticIntensity(intensity: number): Promise<number>;
|
|
433
|
+
setHapticEnabled(enabled: boolean): Promise<boolean>;
|
|
434
|
+
setHapticBatterySaving(enabled: boolean): Promise<boolean>;
|
|
435
|
+
/**
|
|
436
|
+
* Fires the motor once at whatever strength is set. Nothing persists, so
|
|
437
|
+
* this is safe to use as feedback. The reply reports whether the motor was
|
|
438
|
+
* already running, which says nothing about the effect itself.
|
|
439
|
+
*/
|
|
440
|
+
playHapticEffect(effect?: number): Promise<void>;
|
|
441
|
+
setGamingSurfaceMode(mode: GamingSurfaceMode): Promise<GamingSurfaceMode>;
|
|
442
|
+
setLightforceSwitchMode(mode: LightforceSwitchMode): Promise<LightforceSwitchMode>;
|
|
443
|
+
/**
|
|
444
|
+
* Read-modify-write of modeStatus1, then verify. Both fields share the byte,
|
|
445
|
+
* so passing them together writes once instead of twice; the change mask
|
|
446
|
+
* stops the firmware touching bits neither field names.
|
|
447
|
+
* Reading first keeps this correct if a future field spans bits we do not know about.
|
|
448
|
+
*/
|
|
449
|
+
setModeStatus(values: {
|
|
450
|
+
gamingSurface?: GamingSurfaceMode | null;
|
|
451
|
+
lightforce?: LightforceSwitchMode | null;
|
|
452
|
+
}): Promise<void>;
|
|
453
|
+
/** Byte 4 of getModeStatus, carrying both the surface and LightForce fields. */
|
|
454
|
+
private readModeStatus;
|
|
455
|
+
private open;
|
|
456
|
+
private bindBoltIoDevice;
|
|
457
|
+
/** Prefer extended DPI (0x2202); fall back to legacy Adjustable DPI (0x2201). */
|
|
458
|
+
private resolveDpiFeature;
|
|
459
|
+
/** Prefer extended report rate (0x8061); fall back to legacy Report Rate (0x8060). */
|
|
460
|
+
private resolveReportRateFeature;
|
|
461
|
+
private readLegacyDpi;
|
|
462
|
+
private readLegacyDpiList;
|
|
463
|
+
private setLegacyDpi;
|
|
464
|
+
private readLegacyReportRates;
|
|
465
|
+
private getSupportedPollingRateOptions;
|
|
466
|
+
private readLegacyReportRate;
|
|
467
|
+
private setLegacyReportRate;
|
|
468
|
+
/**
|
|
469
|
+
* Values that cannot change while a connection is open. Easy-Switch is the
|
|
470
|
+
* clearest case: the slot count is fixed and the current slot changing IS
|
|
471
|
+
* the connection ending, because that is what switching host does. The
|
|
472
|
+
* friendly name only moves when something renames it, and this client drops
|
|
473
|
+
* the entry after its own write.
|
|
474
|
+
*
|
|
475
|
+
* Re-reading these was costing six round-trips of radio every refresh, on
|
|
476
|
+
* top of a feature lookup per read. On a wireless mouse that is enough for
|
|
477
|
+
* some reads to time out, which surfaces as controls vanishing and coming
|
|
478
|
+
* back a few seconds later.
|
|
479
|
+
*/
|
|
480
|
+
private hostStateCache;
|
|
481
|
+
private controlInfoCache;
|
|
482
|
+
private friendlyNameCache;
|
|
483
|
+
private wheelCapabilityCache;
|
|
484
|
+
private getFeature;
|
|
485
|
+
private readName;
|
|
486
|
+
/**
|
|
487
|
+
* 0x1004 UNIFIED_BATTERY getStatus: [stateOfCharge, batteryLevel,
|
|
488
|
+
* chargingStatus, externalPower].
|
|
489
|
+
*
|
|
490
|
+
* The charging enum here is NOT the one 0x1000 uses, which is what this
|
|
491
|
+
* previously decoded: on 0x1004, 2 means charging slowly and 4 means a
|
|
492
|
+
* charging fault, where on 0x1000 those are "almost full" and "charging
|
|
493
|
+
* slowly". A slow charge was therefore reported as almost full.
|
|
494
|
+
*/
|
|
495
|
+
private readBattery;
|
|
496
|
+
/**
|
|
497
|
+
* 0x1000 BATTERY_LEVEL_STATUS getBatteryLevelStatus:
|
|
498
|
+
* [dischargeLevel, nextLevel, batteryStatus].
|
|
499
|
+
*
|
|
500
|
+
* Older mice expose only this. Without it they reported no battery at all,
|
|
501
|
+
* because the driver probed 0x1004, 0x1001 and 0x1f20 and nothing else.
|
|
502
|
+
*/
|
|
503
|
+
private readBatteryLevelStatus;
|
|
504
|
+
private readBatteryVoltage;
|
|
505
|
+
private readAdcMeasurement;
|
|
506
|
+
private estimateBatteryPercent;
|
|
507
|
+
private readDpi;
|
|
508
|
+
private readAnalogButtonTuning;
|
|
509
|
+
private readDpiCapabilities;
|
|
510
|
+
private readRgbLighting;
|
|
511
|
+
private readPerLedLighting;
|
|
512
|
+
private readDpiConfiguration;
|
|
513
|
+
private readSupportedPollingRates;
|
|
514
|
+
private readPollingRate;
|
|
515
|
+
private waitForRateChange;
|
|
516
|
+
private readProfileState;
|
|
517
|
+
private readIdentity;
|
|
518
|
+
private ensureHostControl;
|
|
519
|
+
private readFirmware;
|
|
520
|
+
private request;
|
|
521
|
+
private requestWithOptions;
|
|
522
|
+
private requestLong;
|
|
523
|
+
private waitForResponse;
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=hidpp.d.ts.map
|