@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.
Files changed (547) hide show
  1. package/CONTRIBUTING.md +167 -0
  2. package/README.md +89 -0
  3. package/dist/asus/index.d.ts +52 -0
  4. package/dist/asus/index.d.ts.map +1 -0
  5. package/dist/asus/index.js +248 -0
  6. package/dist/asus/index.js.map +1 -0
  7. package/dist/atk/index.d.ts +200 -0
  8. package/dist/atk/index.d.ts.map +1 -0
  9. package/dist/atk/index.js +480 -0
  10. package/dist/atk/index.js.map +1 -0
  11. package/dist/bitmouse/index.d.ts +284 -0
  12. package/dist/bitmouse/index.d.ts.map +1 -0
  13. package/dist/bitmouse/index.js +396 -0
  14. package/dist/bitmouse/index.js.map +1 -0
  15. package/dist/compx/codec.d.ts +31 -0
  16. package/dist/compx/codec.d.ts.map +1 -0
  17. package/dist/compx/codec.js +50 -0
  18. package/dist/compx/codec.js.map +1 -0
  19. package/dist/corsair/index.d.ts +147 -0
  20. package/dist/corsair/index.d.ts.map +1 -0
  21. package/dist/corsair/index.js +223 -0
  22. package/dist/corsair/index.js.map +1 -0
  23. package/dist/dareu/index.d.ts +136 -0
  24. package/dist/dareu/index.d.ts.map +1 -0
  25. package/dist/dareu/index.js +344 -0
  26. package/dist/dareu/index.js.map +1 -0
  27. package/dist/drivers/asus/hid.d.ts +29 -0
  28. package/dist/drivers/asus/hid.d.ts.map +1 -0
  29. package/dist/drivers/asus/hid.js +419 -0
  30. package/dist/drivers/asus/hid.js.map +1 -0
  31. package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
  32. package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
  33. package/dist/drivers/atk/bitmouse-hid.js +501 -0
  34. package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
  35. package/dist/drivers/atk/hid.d.ts +163 -0
  36. package/dist/drivers/atk/hid.d.ts.map +1 -0
  37. package/dist/drivers/atk/hid.js +1368 -0
  38. package/dist/drivers/atk/hid.js.map +1 -0
  39. package/dist/drivers/atk/products.d.ts +13 -0
  40. package/dist/drivers/atk/products.d.ts.map +1 -0
  41. package/dist/drivers/atk/products.js +13 -0
  42. package/dist/drivers/atk/products.js.map +1 -0
  43. package/dist/drivers/attackshark/dpi.d.ts +41 -0
  44. package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
  45. package/dist/drivers/attackshark/dpi.js +215 -0
  46. package/dist/drivers/attackshark/dpi.js.map +1 -0
  47. package/dist/drivers/attackshark/hid.d.ts +124 -0
  48. package/dist/drivers/attackshark/hid.d.ts.map +1 -0
  49. package/dist/drivers/attackshark/hid.js +728 -0
  50. package/dist/drivers/attackshark/hid.js.map +1 -0
  51. package/dist/drivers/corsair/hid.d.ts +70 -0
  52. package/dist/drivers/corsair/hid.d.ts.map +1 -0
  53. package/dist/drivers/corsair/hid.js +414 -0
  54. package/dist/drivers/corsair/hid.js.map +1 -0
  55. package/dist/drivers/dareu/hid.d.ts +59 -0
  56. package/dist/drivers/dareu/hid.d.ts.map +1 -0
  57. package/dist/drivers/dareu/hid.js +478 -0
  58. package/dist/drivers/dareu/hid.js.map +1 -0
  59. package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
  60. package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
  61. package/dist/drivers/endgame/egg-op1-hid.js +605 -0
  62. package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
  63. package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
  64. package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
  65. package/dist/drivers/endgame/egg-we-control.js +87 -0
  66. package/dist/drivers/endgame/egg-we-control.js.map +1 -0
  67. package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
  68. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
  69. package/dist/drivers/endgame/egg-we-hid.js +514 -0
  70. package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
  71. package/dist/drivers/fantech/hid.d.ts +106 -0
  72. package/dist/drivers/fantech/hid.d.ts.map +1 -0
  73. package/dist/drivers/fantech/hid.js +295 -0
  74. package/dist/drivers/fantech/hid.js.map +1 -0
  75. package/dist/drivers/finalmouse/hid.d.ts +31 -0
  76. package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
  77. package/dist/drivers/finalmouse/hid.js +181 -0
  78. package/dist/drivers/finalmouse/hid.js.map +1 -0
  79. package/dist/drivers/gearhub/hid.d.ts +191 -0
  80. package/dist/drivers/gearhub/hid.d.ts.map +1 -0
  81. package/dist/drivers/gearhub/hid.js +542 -0
  82. package/dist/drivers/gearhub/hid.js.map +1 -0
  83. package/dist/drivers/glorious/classic-hid.d.ts +62 -0
  84. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
  85. package/dist/drivers/glorious/classic-hid.js +326 -0
  86. package/dist/drivers/glorious/classic-hid.js.map +1 -0
  87. package/dist/drivers/glorious/hid.d.ts +39 -0
  88. package/dist/drivers/glorious/hid.d.ts.map +1 -0
  89. package/dist/drivers/glorious/hid.js +203 -0
  90. package/dist/drivers/glorious/hid.js.map +1 -0
  91. package/dist/drivers/gwolves/hid.d.ts +27 -0
  92. package/dist/drivers/gwolves/hid.d.ts.map +1 -0
  93. package/dist/drivers/gwolves/hid.js +225 -0
  94. package/dist/drivers/gwolves/hid.js.map +1 -0
  95. package/dist/drivers/gwolves/products.d.ts +17 -0
  96. package/dist/drivers/gwolves/products.d.ts.map +1 -0
  97. package/dist/drivers/gwolves/products.js +58 -0
  98. package/dist/drivers/gwolves/products.js.map +1 -0
  99. package/dist/drivers/hyperx/hid.d.ts +59 -0
  100. package/dist/drivers/hyperx/hid.d.ts.map +1 -0
  101. package/dist/drivers/hyperx/hid.js +229 -0
  102. package/dist/drivers/hyperx/hid.js.map +1 -0
  103. package/dist/drivers/incott/hid.d.ts +513 -0
  104. package/dist/drivers/incott/hid.d.ts.map +1 -0
  105. package/dist/drivers/incott/hid.js +1173 -0
  106. package/dist/drivers/incott/hid.js.map +1 -0
  107. package/dist/drivers/index.d.ts +5 -0
  108. package/dist/drivers/index.d.ts.map +1 -0
  109. package/dist/drivers/index.js +5 -0
  110. package/dist/drivers/index.js.map +1 -0
  111. package/dist/drivers/keychron/m6-hid.d.ts +81 -0
  112. package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
  113. package/dist/drivers/keychron/m6-hid.js +486 -0
  114. package/dist/drivers/keychron/m6-hid.js.map +1 -0
  115. package/dist/drivers/keychron/nape-hid.d.ts +60 -0
  116. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
  117. package/dist/drivers/keychron/nape-hid.js +432 -0
  118. package/dist/drivers/keychron/nape-hid.js.map +1 -0
  119. package/dist/drivers/ksnake/hid.d.ts +74 -0
  120. package/dist/drivers/ksnake/hid.d.ts.map +1 -0
  121. package/dist/drivers/ksnake/hid.js +368 -0
  122. package/dist/drivers/ksnake/hid.js.map +1 -0
  123. package/dist/drivers/lamzu/hid.d.ts +58 -0
  124. package/dist/drivers/lamzu/hid.d.ts.map +1 -0
  125. package/dist/drivers/lamzu/hid.js +414 -0
  126. package/dist/drivers/lamzu/hid.js.map +1 -0
  127. package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
  128. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
  129. package/dist/drivers/lamzu-atlantis/hid.js +587 -0
  130. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
  131. package/dist/drivers/logitech/bolt.d.ts +41 -0
  132. package/dist/drivers/logitech/bolt.d.ts.map +1 -0
  133. package/dist/drivers/logitech/bolt.js +105 -0
  134. package/dist/drivers/logitech/bolt.js.map +1 -0
  135. package/dist/drivers/logitech/hidpp.d.ts +525 -0
  136. package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
  137. package/dist/drivers/logitech/hidpp.js +2774 -0
  138. package/dist/drivers/logitech/hidpp.js.map +1 -0
  139. package/dist/drivers/logitech/mode-status.d.ts +53 -0
  140. package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
  141. package/dist/drivers/logitech/mode-status.js +52 -0
  142. package/dist/drivers/logitech/mode-status.js.map +1 -0
  143. package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
  144. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
  145. package/dist/drivers/logitech/onboard-profiles.js +965 -0
  146. package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
  147. package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
  148. package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
  149. package/dist/drivers/logitech/rgb-effects.js +93 -0
  150. package/dist/drivers/logitech/rgb-effects.js.map +1 -0
  151. package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
  152. package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
  153. package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
  154. package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
  155. package/dist/drivers/mchose/dock-hid.d.ts +26 -0
  156. package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
  157. package/dist/drivers/mchose/dock-hid.js +176 -0
  158. package/dist/drivers/mchose/dock-hid.js.map +1 -0
  159. package/dist/drivers/mchose/hid.d.ts +118 -0
  160. package/dist/drivers/mchose/hid.d.ts.map +1 -0
  161. package/dist/drivers/mchose/hid.js +550 -0
  162. package/dist/drivers/mchose/hid.js.map +1 -0
  163. package/dist/drivers/mchose/v3-hid.d.ts +109 -0
  164. package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
  165. package/dist/drivers/mchose/v3-hid.js +572 -0
  166. package/dist/drivers/mchose/v3-hid.js.map +1 -0
  167. package/dist/drivers/microsoft/hid.d.ts +25 -0
  168. package/dist/drivers/microsoft/hid.d.ts.map +1 -0
  169. package/dist/drivers/microsoft/hid.js +247 -0
  170. package/dist/drivers/microsoft/hid.js.map +1 -0
  171. package/dist/drivers/moddo/hid.d.ts +31 -0
  172. package/dist/drivers/moddo/hid.d.ts.map +1 -0
  173. package/dist/drivers/moddo/hid.js +154 -0
  174. package/dist/drivers/moddo/hid.js.map +1 -0
  175. package/dist/drivers/mouse-types.d.ts +388 -0
  176. package/dist/drivers/mouse-types.d.ts.map +1 -0
  177. package/dist/drivers/mouse-types.js +2 -0
  178. package/dist/drivers/mouse-types.js.map +1 -0
  179. package/dist/drivers/ninjutso/hid.d.ts +62 -0
  180. package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
  181. package/dist/drivers/ninjutso/hid.js +680 -0
  182. package/dist/drivers/ninjutso/hid.js.map +1 -0
  183. package/dist/drivers/orbital/hid.d.ts +24 -0
  184. package/dist/drivers/orbital/hid.d.ts.map +1 -0
  185. package/dist/drivers/orbital/hid.js +85 -0
  186. package/dist/drivers/orbital/hid.js.map +1 -0
  187. package/dist/drivers/orbital/host-protocol.d.ts +59 -0
  188. package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
  189. package/dist/drivers/orbital/host-protocol.js +884 -0
  190. package/dist/drivers/orbital/host-protocol.js.map +1 -0
  191. package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
  192. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
  193. package/dist/drivers/pulsar/pulsar-hid.js +381 -0
  194. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
  195. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
  196. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
  197. package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
  198. package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
  199. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
  200. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
  201. package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
  202. package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
  203. package/dist/drivers/rawm/hid.d.ts +29 -0
  204. package/dist/drivers/rawm/hid.d.ts.map +1 -0
  205. package/dist/drivers/rawm/hid.js +210 -0
  206. package/dist/drivers/rawm/hid.js.map +1 -0
  207. package/dist/drivers/razer/cobra-hid.d.ts +63 -0
  208. package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
  209. package/dist/drivers/razer/cobra-hid.js +282 -0
  210. package/dist/drivers/razer/cobra-hid.js.map +1 -0
  211. package/dist/drivers/razer/hid-open.d.ts +13 -0
  212. package/dist/drivers/razer/hid-open.d.ts.map +1 -0
  213. package/dist/drivers/razer/hid-open.js +29 -0
  214. package/dist/drivers/razer/hid-open.js.map +1 -0
  215. package/dist/drivers/razer/hid.d.ts +231 -0
  216. package/dist/drivers/razer/hid.d.ts.map +1 -0
  217. package/dist/drivers/razer/hid.js +772 -0
  218. package/dist/drivers/razer/hid.js.map +1 -0
  219. package/dist/drivers/razer/viper-hid.d.ts +33 -0
  220. package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
  221. package/dist/drivers/razer/viper-hid.js +177 -0
  222. package/dist/drivers/razer/viper-hid.js.map +1 -0
  223. package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
  224. package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
  225. package/dist/drivers/razer/viper-mini-hid.js +273 -0
  226. package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
  227. package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
  228. package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
  229. package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
  230. package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
  231. package/dist/drivers/registry.d.ts +70 -0
  232. package/dist/drivers/registry.d.ts.map +1 -0
  233. package/dist/drivers/registry.js +146 -0
  234. package/dist/drivers/registry.js.map +1 -0
  235. package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
  236. package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
  237. package/dist/drivers/steelseries/aerox3-hid.js +172 -0
  238. package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
  239. package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
  240. package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
  241. package/dist/drivers/steelseries/aerox5-hid.js +173 -0
  242. package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
  243. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
  244. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
  245. package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
  246. package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
  247. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
  248. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
  249. package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
  250. package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
  251. package/dist/drivers/steelseries/hid.d.ts +48 -0
  252. package/dist/drivers/steelseries/hid.d.ts.map +1 -0
  253. package/dist/drivers/steelseries/hid.js +157 -0
  254. package/dist/drivers/steelseries/hid.js.map +1 -0
  255. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
  256. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
  257. package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
  258. package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
  259. package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
  260. package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
  261. package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
  262. package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
  263. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
  264. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
  265. package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
  266. package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
  267. package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
  268. package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
  269. package/dist/drivers/steelseries/rival310-hid.js +182 -0
  270. package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
  271. package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
  272. package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
  273. package/dist/drivers/steelseries/rival650-hid.js +209 -0
  274. package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
  275. package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
  276. package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
  277. package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
  278. package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
  279. package/dist/drivers/teevolution/hid.d.ts +82 -0
  280. package/dist/drivers/teevolution/hid.d.ts.map +1 -0
  281. package/dist/drivers/teevolution/hid.js +607 -0
  282. package/dist/drivers/teevolution/hid.js.map +1 -0
  283. package/dist/drivers/vendors.d.ts +254 -0
  284. package/dist/drivers/vendors.d.ts.map +1 -0
  285. package/dist/drivers/vendors.js +587 -0
  286. package/dist/drivers/vendors.js.map +1 -0
  287. package/dist/drivers/vgn/hid.d.ts +33 -0
  288. package/dist/drivers/vgn/hid.d.ts.map +1 -0
  289. package/dist/drivers/vgn/hid.js +213 -0
  290. package/dist/drivers/vgn/hid.js.map +1 -0
  291. package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
  292. package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
  293. package/dist/drivers/wallhack/keyboard-hid.js +80 -0
  294. package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
  295. package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
  296. package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
  297. package/dist/drivers/wallhack/mouse-hid.js +288 -0
  298. package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
  299. package/dist/drivers/webhid.d.ts +59 -0
  300. package/dist/drivers/webhid.d.ts.map +1 -0
  301. package/dist/drivers/webhid.js +2 -0
  302. package/dist/drivers/webhid.js.map +1 -0
  303. package/dist/drivers/wlmouse/hid.d.ts +81 -0
  304. package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
  305. package/dist/drivers/wlmouse/hid.js +576 -0
  306. package/dist/drivers/wlmouse/hid.js.map +1 -0
  307. package/dist/drivers/wooting/hid.d.ts +86 -0
  308. package/dist/drivers/wooting/hid.d.ts.map +1 -0
  309. package/dist/drivers/wooting/hid.js +320 -0
  310. package/dist/drivers/wooting/hid.js.map +1 -0
  311. package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
  312. package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
  313. package/dist/drivers/zaunkoenig/hid.js +162 -0
  314. package/dist/drivers/zaunkoenig/hid.js.map +1 -0
  315. package/dist/endgame-gear/op1.d.ts +165 -0
  316. package/dist/endgame-gear/op1.d.ts.map +1 -0
  317. package/dist/endgame-gear/op1.js +384 -0
  318. package/dist/endgame-gear/op1.js.map +1 -0
  319. package/dist/endgame-gear/wireless.d.ts +93 -0
  320. package/dist/endgame-gear/wireless.d.ts.map +1 -0
  321. package/dist/endgame-gear/wireless.js +242 -0
  322. package/dist/endgame-gear/wireless.js.map +1 -0
  323. package/dist/fantech/index.d.ts +9 -0
  324. package/dist/fantech/index.d.ts.map +1 -0
  325. package/dist/fantech/index.js +11 -0
  326. package/dist/fantech/index.js.map +1 -0
  327. package/dist/finalmouse/index.d.ts +41 -0
  328. package/dist/finalmouse/index.d.ts.map +1 -0
  329. package/dist/finalmouse/index.js +106 -0
  330. package/dist/finalmouse/index.js.map +1 -0
  331. package/dist/gearhub/index.d.ts +210 -0
  332. package/dist/gearhub/index.d.ts.map +1 -0
  333. package/dist/gearhub/index.js +282 -0
  334. package/dist/gearhub/index.js.map +1 -0
  335. package/dist/glorious/index.d.ts +89 -0
  336. package/dist/glorious/index.d.ts.map +1 -0
  337. package/dist/glorious/index.js +236 -0
  338. package/dist/glorious/index.js.map +1 -0
  339. package/dist/glorious-classic/index.d.ts +103 -0
  340. package/dist/glorious-classic/index.d.ts.map +1 -0
  341. package/dist/glorious-classic/index.js +304 -0
  342. package/dist/glorious-classic/index.js.map +1 -0
  343. package/dist/gwolves/index.d.ts +82 -0
  344. package/dist/gwolves/index.d.ts.map +1 -0
  345. package/dist/gwolves/index.js +197 -0
  346. package/dist/gwolves/index.js.map +1 -0
  347. package/dist/hyperx/index.d.ts +181 -0
  348. package/dist/hyperx/index.d.ts.map +1 -0
  349. package/dist/hyperx/index.js +303 -0
  350. package/dist/hyperx/index.js.map +1 -0
  351. package/dist/incott/index.d.ts +1067 -0
  352. package/dist/incott/index.d.ts.map +1 -0
  353. package/dist/incott/index.js +1482 -0
  354. package/dist/incott/index.js.map +1 -0
  355. package/dist/index.d.ts +30 -0
  356. package/dist/index.d.ts.map +1 -0
  357. package/dist/index.js +30 -0
  358. package/dist/index.js.map +1 -0
  359. package/dist/keychron/index.d.ts +194 -0
  360. package/dist/keychron/index.d.ts.map +1 -0
  361. package/dist/keychron/index.js +341 -0
  362. package/dist/keychron/index.js.map +1 -0
  363. package/dist/ksnake/index.d.ts +157 -0
  364. package/dist/ksnake/index.d.ts.map +1 -0
  365. package/dist/ksnake/index.js +314 -0
  366. package/dist/ksnake/index.js.map +1 -0
  367. package/dist/lamzu/atlantis.d.ts +237 -0
  368. package/dist/lamzu/atlantis.d.ts.map +1 -0
  369. package/dist/lamzu/atlantis.js +263 -0
  370. package/dist/lamzu/atlantis.js.map +1 -0
  371. package/dist/lamzu/index.d.ts +60 -0
  372. package/dist/lamzu/index.d.ts.map +1 -0
  373. package/dist/lamzu/index.js +86 -0
  374. package/dist/lamzu/index.js.map +1 -0
  375. package/dist/logitech/controls.d.ts +138 -0
  376. package/dist/logitech/controls.d.ts.map +1 -0
  377. package/dist/logitech/controls.js +184 -0
  378. package/dist/logitech/controls.js.map +1 -0
  379. package/dist/logitech/friendly-name.d.ts +50 -0
  380. package/dist/logitech/friendly-name.d.ts.map +1 -0
  381. package/dist/logitech/friendly-name.js +74 -0
  382. package/dist/logitech/friendly-name.js.map +1 -0
  383. package/dist/logitech/haptics.d.ts +97 -0
  384. package/dist/logitech/haptics.d.ts.map +1 -0
  385. package/dist/logitech/haptics.js +116 -0
  386. package/dist/logitech/haptics.js.map +1 -0
  387. package/dist/logitech/hosts.d.ts +55 -0
  388. package/dist/logitech/hosts.d.ts.map +1 -0
  389. package/dist/logitech/hosts.js +80 -0
  390. package/dist/logitech/hosts.js.map +1 -0
  391. package/dist/logitech/index.d.ts +127 -0
  392. package/dist/logitech/index.d.ts.map +1 -0
  393. package/dist/logitech/index.js +233 -0
  394. package/dist/logitech/index.js.map +1 -0
  395. package/dist/logitech/wheel.d.ts +117 -0
  396. package/dist/logitech/wheel.d.ts.map +1 -0
  397. package/dist/logitech/wheel.js +133 -0
  398. package/dist/logitech/wheel.js.map +1 -0
  399. package/dist/mchose/a5-gen1.d.ts +38 -0
  400. package/dist/mchose/a5-gen1.d.ts.map +1 -0
  401. package/dist/mchose/a5-gen1.js +60 -0
  402. package/dist/mchose/a5-gen1.js.map +1 -0
  403. package/dist/mchose/buttons.d.ts +66 -0
  404. package/dist/mchose/buttons.d.ts.map +1 -0
  405. package/dist/mchose/buttons.js +184 -0
  406. package/dist/mchose/buttons.js.map +1 -0
  407. package/dist/mchose/dock.d.ts +77 -0
  408. package/dist/mchose/dock.d.ts.map +1 -0
  409. package/dist/mchose/dock.js +133 -0
  410. package/dist/mchose/dock.js.map +1 -0
  411. package/dist/mchose/index.d.ts +299 -0
  412. package/dist/mchose/index.d.ts.map +1 -0
  413. package/dist/mchose/index.js +429 -0
  414. package/dist/mchose/index.js.map +1 -0
  415. package/dist/mchose/v3-buttons.d.ts +64 -0
  416. package/dist/mchose/v3-buttons.d.ts.map +1 -0
  417. package/dist/mchose/v3-buttons.js +258 -0
  418. package/dist/mchose/v3-buttons.js.map +1 -0
  419. package/dist/mchose/v3.d.ts +380 -0
  420. package/dist/mchose/v3.d.ts.map +1 -0
  421. package/dist/mchose/v3.js +608 -0
  422. package/dist/mchose/v3.js.map +1 -0
  423. package/dist/microsoft/index.d.ts +19 -0
  424. package/dist/microsoft/index.d.ts.map +1 -0
  425. package/dist/microsoft/index.js +22 -0
  426. package/dist/microsoft/index.js.map +1 -0
  427. package/dist/moddo/index.d.ts +72 -0
  428. package/dist/moddo/index.d.ts.map +1 -0
  429. package/dist/moddo/index.js +147 -0
  430. package/dist/moddo/index.js.map +1 -0
  431. package/dist/ninjutso/index.d.ts +74 -0
  432. package/dist/ninjutso/index.d.ts.map +1 -0
  433. package/dist/ninjutso/index.js +133 -0
  434. package/dist/ninjutso/index.js.map +1 -0
  435. package/dist/orbital/index.d.ts +14 -0
  436. package/dist/orbital/index.d.ts.map +1 -0
  437. package/dist/orbital/index.js +19 -0
  438. package/dist/orbital/index.js.map +1 -0
  439. package/dist/pulsar/index.d.ts +81 -0
  440. package/dist/pulsar/index.d.ts.map +1 -0
  441. package/dist/pulsar/index.js +185 -0
  442. package/dist/pulsar/index.js.map +1 -0
  443. package/dist/rawm/index.d.ts +55 -0
  444. package/dist/rawm/index.d.ts.map +1 -0
  445. package/dist/rawm/index.js +229 -0
  446. package/dist/rawm/index.js.map +1 -0
  447. package/dist/razer/codec.d.ts +504 -0
  448. package/dist/razer/codec.d.ts.map +1 -0
  449. package/dist/razer/codec.js +648 -0
  450. package/dist/razer/codec.js.map +1 -0
  451. package/dist/razer/devices.d.ts +156 -0
  452. package/dist/razer/devices.d.ts.map +1 -0
  453. package/dist/razer/devices.js +540 -0
  454. package/dist/razer/devices.js.map +1 -0
  455. package/dist/razer/index.d.ts +2 -0
  456. package/dist/razer/index.d.ts.map +1 -0
  457. package/dist/razer/index.js +2 -0
  458. package/dist/razer/index.js.map +1 -0
  459. package/dist/razer/v4.d.ts +19 -0
  460. package/dist/razer/v4.d.ts.map +1 -0
  461. package/dist/razer/v4.js +51 -0
  462. package/dist/razer/v4.js.map +1 -0
  463. package/dist/steelseries/aerox3.d.ts +236 -0
  464. package/dist/steelseries/aerox3.d.ts.map +1 -0
  465. package/dist/steelseries/aerox3.js +311 -0
  466. package/dist/steelseries/aerox3.js.map +1 -0
  467. package/dist/steelseries/aerox5-wireless.d.ts +300 -0
  468. package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
  469. package/dist/steelseries/aerox5-wireless.js +389 -0
  470. package/dist/steelseries/aerox5-wireless.js.map +1 -0
  471. package/dist/steelseries/aerox5.d.ts +228 -0
  472. package/dist/steelseries/aerox5.d.ts.map +1 -0
  473. package/dist/steelseries/aerox5.js +294 -0
  474. package/dist/steelseries/aerox5.js.map +1 -0
  475. package/dist/steelseries/aerox9-wireless.d.ts +213 -0
  476. package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
  477. package/dist/steelseries/aerox9-wireless.js +305 -0
  478. package/dist/steelseries/aerox9-wireless.js.map +1 -0
  479. package/dist/steelseries/devices.d.ts +82 -0
  480. package/dist/steelseries/devices.d.ts.map +1 -0
  481. package/dist/steelseries/devices.js +310 -0
  482. package/dist/steelseries/devices.js.map +1 -0
  483. package/dist/steelseries/index.d.ts +13 -0
  484. package/dist/steelseries/index.d.ts.map +1 -0
  485. package/dist/steelseries/index.js +13 -0
  486. package/dist/steelseries/index.js.map +1 -0
  487. package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
  488. package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
  489. package/dist/steelseries/prime-mini-wireless.js +351 -0
  490. package/dist/steelseries/prime-mini-wireless.js.map +1 -0
  491. package/dist/steelseries/prime-plus.d.ts +179 -0
  492. package/dist/steelseries/prime-plus.d.ts.map +1 -0
  493. package/dist/steelseries/prime-plus.js +275 -0
  494. package/dist/steelseries/prime-plus.js.map +1 -0
  495. package/dist/steelseries/rival3-wireless.d.ts +222 -0
  496. package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
  497. package/dist/steelseries/rival3-wireless.js +308 -0
  498. package/dist/steelseries/rival3-wireless.js.map +1 -0
  499. package/dist/steelseries/rival3.d.ts +99 -0
  500. package/dist/steelseries/rival3.d.ts.map +1 -0
  501. package/dist/steelseries/rival3.js +147 -0
  502. package/dist/steelseries/rival3.js.map +1 -0
  503. package/dist/steelseries/rival310.d.ts +230 -0
  504. package/dist/steelseries/rival310.d.ts.map +1 -0
  505. package/dist/steelseries/rival310.js +322 -0
  506. package/dist/steelseries/rival310.js.map +1 -0
  507. package/dist/steelseries/rival650.d.ts +215 -0
  508. package/dist/steelseries/rival650.d.ts.map +1 -0
  509. package/dist/steelseries/rival650.js +284 -0
  510. package/dist/steelseries/rival650.js.map +1 -0
  511. package/dist/steelseries/sensei-ten.d.ts +283 -0
  512. package/dist/steelseries/sensei-ten.d.ts.map +1 -0
  513. package/dist/steelseries/sensei-ten.js +389 -0
  514. package/dist/steelseries/sensei-ten.js.map +1 -0
  515. package/dist/teevolution/index.d.ts +211 -0
  516. package/dist/teevolution/index.d.ts.map +1 -0
  517. package/dist/teevolution/index.js +458 -0
  518. package/dist/teevolution/index.js.map +1 -0
  519. package/dist/valkyrie/index.d.ts +19 -0
  520. package/dist/valkyrie/index.d.ts.map +1 -0
  521. package/dist/valkyrie/index.js +43 -0
  522. package/dist/valkyrie/index.js.map +1 -0
  523. package/dist/valkyrie/settings.d.ts +28 -0
  524. package/dist/valkyrie/settings.d.ts.map +1 -0
  525. package/dist/valkyrie/settings.js +84 -0
  526. package/dist/valkyrie/settings.js.map +1 -0
  527. package/dist/vgn/index.d.ts +59 -0
  528. package/dist/vgn/index.d.ts.map +1 -0
  529. package/dist/vgn/index.js +165 -0
  530. package/dist/vgn/index.js.map +1 -0
  531. package/dist/wallhack/index.d.ts +165 -0
  532. package/dist/wallhack/index.d.ts.map +1 -0
  533. package/dist/wallhack/index.js +226 -0
  534. package/dist/wallhack/index.js.map +1 -0
  535. package/dist/wlmouse/index.d.ts +4 -0
  536. package/dist/wlmouse/index.d.ts.map +1 -0
  537. package/dist/wlmouse/index.js +7 -0
  538. package/dist/wlmouse/index.js.map +1 -0
  539. package/dist/wooting/index.d.ts +225 -0
  540. package/dist/wooting/index.d.ts.map +1 -0
  541. package/dist/wooting/index.js +296 -0
  542. package/dist/wooting/index.js.map +1 -0
  543. package/dist/zaunkoenig/index.d.ts +49 -0
  544. package/dist/zaunkoenig/index.d.ts.map +1 -0
  545. package/dist/zaunkoenig/index.js +127 -0
  546. package/dist/zaunkoenig/index.js.map +1 -0
  547. 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":"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"}
@@ -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"}