@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,133 @@
1
+ /**
2
+ * Scroll-wheel features on the MX line: 0x2111 (SmartShift Enhanced),
3
+ * 0x2121 (Hi-Res Wheel) and 0x2150 (Thumb Wheel).
4
+ *
5
+ * Byte layouts were established on an MX Master 4 by pressing the physical
6
+ * wheel-mode button and diffing dumps — exactly two bytes moved — and by
7
+ * moving Logi Options+'s own sliders and watching which value followed.
8
+ */
9
+ export const LOGITECH_SMART_SHIFT = {
10
+ /** getCapabilities: [?, min, max, ...] on an MX Master 4, 01 0A 4B 0E. */
11
+ capabilities: 0x00,
12
+ /** getRatchetControlMode: [mode, threshold, defaultThreshold]. */
13
+ get: 0x10,
14
+ /** setRatchetControlMode(mode, threshold, defaultThreshold). */
15
+ set: 0x20,
16
+ };
17
+ /**
18
+ * 0x2111 byte 0 is the wheel's ratchet mode — the same thing the button behind
19
+ * the wheel toggles, and NOT SmartShift on/off. It was first shipped labelled
20
+ * "SmartShift / Always ratchet", which was naming a control after inferred
21
+ * behaviour rather than demonstrated behaviour.
22
+ */
23
+ export const LOGITECH_WHEEL_MODE = { freespin: 1, ratchet: 2 };
24
+ /**
25
+ * Byte 1 is the SmartShift threshold: 255 disables it, and a lower value
26
+ * releases the ratchet on a gentler flick. Proven by moving the Options+
27
+ * sensitivity slider — 9% wrote 46 and 75% wrote 15, with the mode byte stuck
28
+ * at 2 throughout.
29
+ */
30
+ export const LOGITECH_SMART_SHIFT_OFF = 0xff;
31
+ export const LOGITECH_HIRES_WHEEL = {
32
+ /** getCapabilities: [multiplier, flags, ...]. */
33
+ capabilities: 0x00,
34
+ /** getMode / setMode, a single bitmask byte. */
35
+ get: 0x10,
36
+ set: 0x20,
37
+ /** getRatchetSwitchState: byte 0 is 1 while the wheel is ratcheted. */
38
+ ratchetState: 0x30,
39
+ };
40
+ /**
41
+ * Bits of the 0x2121 mode byte.
42
+ *
43
+ * NEVER set divert. It routes wheel movement to HID++ instead of ordinary HID
44
+ * scrolling, and unless something is consuming those notifications the wheel
45
+ * simply stops working. Writes read-modify-write a single bit and carry this
46
+ * one through untouched.
47
+ */
48
+ export const LOGITECH_HIRES_WHEEL_BIT = { divert: 0x01, hiRes: 0x02, invert: 0x04 };
49
+ /** Byte 1 of getCapabilities; bit 3 is set when inversion is supported. */
50
+ export const LOGITECH_HIRES_WHEEL_SUPPORTS_INVERT = 0x08;
51
+ export const LOGITECH_THUMB_WHEEL = {
52
+ /** getThumbwheelInfo: [nativeRes(2), divertedRes(2), capabilities(2), ...]. */
53
+ info: 0x00,
54
+ /** getThumbwheelStatus: [diverted, inverted]. */
55
+ get: 0x10,
56
+ /** setThumbwheelReporting(diverted, inverted). */
57
+ set: 0x20,
58
+ };
59
+ /** Bit 0 of the two-byte capability field at payload[4..5]. */
60
+ export const LOGITECH_THUMB_WHEEL_SUPPORTS_INVERT = 0x01;
61
+ export function decodeRatchetControl(payload) {
62
+ const mode = payload[0];
63
+ const threshold = payload[1];
64
+ if (mode === undefined || threshold === undefined)
65
+ return null;
66
+ return {
67
+ mode: mode === LOGITECH_WHEEL_MODE.freespin
68
+ ? "Freespin"
69
+ : mode === LOGITECH_WHEEL_MODE.ratchet ? "Ratchet" : null,
70
+ threshold,
71
+ defaultThreshold: payload[2] ?? 0,
72
+ };
73
+ }
74
+ /**
75
+ * A 0x2111 write carries all three bytes, so each setter reads the trio first
76
+ * and changes only its own field. A write that drops the companion silently
77
+ * discards a setting it was never asked to touch.
78
+ */
79
+ export function buildRatchetControlWrite(current, change) {
80
+ const mode = change.mode ?? current.mode;
81
+ const encoded = mode === "Freespin" ? LOGITECH_WHEEL_MODE.freespin : LOGITECH_WHEEL_MODE.ratchet;
82
+ return [encoded, (change.threshold ?? current.threshold) & 0xff, current.defaultThreshold & 0xff];
83
+ }
84
+ /**
85
+ * getCapabilities is [multiplier, flags]. Reading those two the other way
86
+ * round yields a nonsense multiplier of 28 on a wheel whose real multiplier
87
+ * is 15.
88
+ */
89
+ export function decodeHiresWheelCapabilities(payload) {
90
+ const multiplier = payload[0];
91
+ const flags = payload[1];
92
+ if (multiplier === undefined || flags === undefined)
93
+ return null;
94
+ return { multiplier, supportsInvert: (flags & LOGITECH_HIRES_WHEEL_SUPPORTS_INVERT) !== 0 };
95
+ }
96
+ export function decodeHiresWheelMode(modeByte) {
97
+ return {
98
+ hiRes: (modeByte & LOGITECH_HIRES_WHEEL_BIT.hiRes) !== 0,
99
+ inverted: (modeByte & LOGITECH_HIRES_WHEEL_BIT.invert) !== 0,
100
+ diverted: (modeByte & LOGITECH_HIRES_WHEEL_BIT.divert) !== 0,
101
+ };
102
+ }
103
+ /** Sets one bit and carries every other through, diversion included. */
104
+ export function encodeHiresWheelMode(modeByte, bit, on) {
105
+ return (on ? modeByte | bit : modeByte & ~bit) & 0xff;
106
+ }
107
+ /**
108
+ * Thumb-wheel capabilities are the TWO-byte field at payload[4..5] — an
109
+ * MX Master 4 answers 0x0003 there and demonstrably honours inversion, which
110
+ * reading the single byte at payload[4] would have reported as unsupported.
111
+ */
112
+ export function decodeThumbWheelSupportsInvert(payload) {
113
+ const high = payload[4];
114
+ const low = payload[5];
115
+ if (high === undefined || low === undefined)
116
+ return null;
117
+ return (((high << 8) | low) & LOGITECH_THUMB_WHEEL_SUPPORTS_INVERT) !== 0;
118
+ }
119
+ export function decodeThumbWheelStatus(payload) {
120
+ const diverted = payload[0];
121
+ const inverted = payload[1];
122
+ if (diverted === undefined || inverted === undefined)
123
+ return null;
124
+ return { diverted: diverted !== 0, inverted: inverted !== 0 };
125
+ }
126
+ /**
127
+ * Logi Options+ sets the diversion bit to implement horizontal scrolling, so a
128
+ * write that clears it takes that away. Diversion is preserved from the read.
129
+ */
130
+ export function buildThumbWheelWrite(current, inverted) {
131
+ return [current.diverted ? 1 : 0, inverted ? 1 : 0];
132
+ }
133
+ //# sourceMappingURL=wheel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel.js","sourceRoot":"","sources":["../../src/logitech/wheel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** First-generation MCHOSE A5 protocol, distinct from the current M HUB protocol. */
2
+ export declare const MCHOSE_A5_GEN1_VENDOR_ID = 8227;
3
+ export declare const MCHOSE_A5_GEN1_USAGE_PAGE = 65535;
4
+ export declare const MCHOSE_A5_GEN1_REPORT_LENGTH = 64;
5
+ export interface MchoseA5Gen1Product {
6
+ name: string;
7
+ connection: "Wired" | "Wireless";
8
+ verified: boolean;
9
+ }
10
+ /** A5 Pro Max identities exercised by the standalone WebHID driver. */
11
+ export declare const MCHOSE_A5_GEN1_PRODUCTS: ReadonlyMap<number, MchoseA5Gen1Product>;
12
+ export declare const MCHOSE_A5_GEN1_PROFILE_COUNT = 3;
13
+ export declare const MCHOSE_A5_GEN1_DPI_STAGES = 6;
14
+ export declare const MCHOSE_A5_GEN1_DPI_MIN = 50;
15
+ export declare const MCHOSE_A5_GEN1_DPI_MAX = 26000;
16
+ export declare const MCHOSE_A5_GEN1_DPI_STEP = 50;
17
+ export declare const MCHOSE_A5_GEN1_RECEIVER_RATES: readonly [125, 250, 500, 1000];
18
+ export declare const MCHOSE_A5_GEN1_WIRED_RATES: readonly [125, 500, 1000];
19
+ export interface MchoseA5Gen1Command {
20
+ length: number;
21
+ page: number;
22
+ command: number;
23
+ data?: readonly number[];
24
+ route?: number;
25
+ }
26
+ /** Build the 64-byte XVI feature-report body (the report id is passed separately). */
27
+ export declare function mchoseA5Gen1EncodeRequest(input: MchoseA5Gen1Command): Uint8Array<ArrayBuffer>;
28
+ /** Normalize WebHID implementations that include or omit the report id in returned data. */
29
+ export declare function mchoseA5Gen1DecodeReply(raw: Uint8Array, reportId: number): Uint8Array;
30
+ export declare function mchoseA5Gen1ReplyMatches(reply: Uint8Array, page: number, command: number): boolean;
31
+ export declare function mchoseA5Gen1DecodeFirmware(reply: Uint8Array): string;
32
+ export declare function mchoseA5Gen1DecodeDpi(reply: Uint8Array): {
33
+ count: number;
34
+ stages: number[];
35
+ };
36
+ export declare function mchoseA5Gen1NormalizeDpi(value: number): number;
37
+ export declare function mchoseA5Gen1EncodeDpi(profile: number, stages: readonly number[]): number[];
38
+ //# sourceMappingURL=a5-gen1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a5-gen1.d.ts","sourceRoot":"","sources":["../../src/mchose/a5-gen1.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,OAAS,CAAC;AAC/C,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAI3E,CAAC;AAEH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAC5C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,6BAA6B,gCAAiC,CAAC;AAC5E,eAAO,MAAM,0BAA0B,2BAA4B,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sFAAsF;AACtF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,CAQ7F;AAED,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAGrF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAElG;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAO5F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAK1F"}
@@ -0,0 +1,60 @@
1
+ /** First-generation MCHOSE A5 protocol, distinct from the current M HUB protocol. */
2
+ export const MCHOSE_A5_GEN1_VENDOR_ID = 0x2023;
3
+ export const MCHOSE_A5_GEN1_USAGE_PAGE = 0xffff;
4
+ export const MCHOSE_A5_GEN1_REPORT_LENGTH = 64;
5
+ /** A5 Pro Max identities exercised by the standalone WebHID driver. */
6
+ export const MCHOSE_A5_GEN1_PRODUCTS = new Map([
7
+ [0xf019, { name: "MCHOSE A5 Pro Max", connection: "Wired", verified: true }],
8
+ [0xf013, { name: "MCHOSE A5 Pro Max (1K receiver)", connection: "Wireless", verified: true }],
9
+ [0xf015, { name: "MCHOSE A5 Pro Max (4K receiver)", connection: "Wireless", verified: false }],
10
+ ]);
11
+ export const MCHOSE_A5_GEN1_PROFILE_COUNT = 3;
12
+ export const MCHOSE_A5_GEN1_DPI_STAGES = 6;
13
+ export const MCHOSE_A5_GEN1_DPI_MIN = 50;
14
+ export const MCHOSE_A5_GEN1_DPI_MAX = 26000;
15
+ export const MCHOSE_A5_GEN1_DPI_STEP = 50;
16
+ export const MCHOSE_A5_GEN1_RECEIVER_RATES = [125, 250, 500, 1000];
17
+ export const MCHOSE_A5_GEN1_WIRED_RATES = [125, 500, 1000];
18
+ /** Build the 64-byte XVI feature-report body (the report id is passed separately). */
19
+ export function mchoseA5Gen1EncodeRequest(input) {
20
+ const payload = new Uint8Array(MCHOSE_A5_GEN1_REPORT_LENGTH);
21
+ payload[2] = input.route ?? 2;
22
+ payload[3] = input.length & 0xff;
23
+ payload[4] = input.page & 0xff;
24
+ payload[5] = input.command & 0xff;
25
+ payload.set((input.data ?? []).slice(0, 57), 6);
26
+ return payload;
27
+ }
28
+ /** Normalize WebHID implementations that include or omit the report id in returned data. */
29
+ export function mchoseA5Gen1DecodeReply(raw, reportId) {
30
+ if (raw.length === MCHOSE_A5_GEN1_REPORT_LENGTH + 1 && raw[0] === reportId)
31
+ return raw.slice(1);
32
+ return raw.slice(0, MCHOSE_A5_GEN1_REPORT_LENGTH);
33
+ }
34
+ export function mchoseA5Gen1ReplyMatches(reply, page, command) {
35
+ return reply[0] === 0xa1 && reply[4] === page && reply[5] === command;
36
+ }
37
+ export function mchoseA5Gen1DecodeFirmware(reply) {
38
+ return [reply[6], reply[7], reply[8], reply[9]]
39
+ .map((part) => String(part ?? 0).padStart(2, "0"))
40
+ .join(".");
41
+ }
42
+ export function mchoseA5Gen1DecodeDpi(reply) {
43
+ const count = Math.max(1, Math.min(MCHOSE_A5_GEN1_DPI_STAGES, reply[7] || MCHOSE_A5_GEN1_DPI_STAGES));
44
+ const stages = Array.from({ length: count }, (_, index) => {
45
+ const offset = 8 + index * 4;
46
+ return ((reply[offset] ?? 0) << 8) | (reply[offset + 1] ?? 0);
47
+ });
48
+ return { count, stages };
49
+ }
50
+ export function mchoseA5Gen1NormalizeDpi(value) {
51
+ return Math.max(MCHOSE_A5_GEN1_DPI_MIN, Math.min(MCHOSE_A5_GEN1_DPI_MAX, Math.round(value / MCHOSE_A5_GEN1_DPI_STEP) * MCHOSE_A5_GEN1_DPI_STEP));
52
+ }
53
+ export function mchoseA5Gen1EncodeDpi(profile, stages) {
54
+ const normalized = stages.slice(0, MCHOSE_A5_GEN1_DPI_STAGES).map(mchoseA5Gen1NormalizeDpi);
55
+ const data = [profile, normalized.length];
56
+ for (const dpi of normalized)
57
+ data.push((dpi >> 8) & 0xff, dpi & 0xff, (dpi >> 8) & 0xff, dpi & 0xff);
58
+ return data;
59
+ }
60
+ //# sourceMappingURL=a5-gen1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a5-gen1.js","sourceRoot":"","sources":["../../src/mchose/a5-gen1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MCHOSE button-remapping vocabulary.
3
+ *
4
+ * A button assignment is a `type` nibble plus a 24-bit big-endian value, and
5
+ * the type selects which table the value is looked up in — the same value means
6
+ * different things under different types (`0x010000` is left-click under type 1
7
+ * but "DPI switch" under type 5). All of it is transcribed from M HUB's own
8
+ * tables; see docs/mchose-protocol.md.
9
+ */
10
+ export declare const MCHOSE_BUTTON_TYPE: {
11
+ /** Restore the button's factory function. Always paired with value 0. */
12
+ readonly default: 0;
13
+ readonly mouse: 1;
14
+ readonly keyboard: 2;
15
+ readonly media: 3;
16
+ readonly macro: 4;
17
+ readonly dpi: 5;
18
+ readonly system: 8;
19
+ readonly disable: 9;
20
+ readonly profile: 10;
21
+ };
22
+ /** Physical buttons, in the order the config blob stores them. */
23
+ export declare const MCHOSE_BUTTONS: readonly string[];
24
+ export interface MchoseButtonAction {
25
+ label: string;
26
+ type: number;
27
+ value: number;
28
+ group: string;
29
+ }
30
+ /**
31
+ * Everything a button can be set to. "Default" restores the factory function
32
+ * and is the only entry whose value must be zero.
33
+ */
34
+ export declare const MCHOSE_BUTTON_ACTIONS: readonly MchoseButtonAction[];
35
+ /** Look up an action by its display label. */
36
+ export declare function mchoseFindButtonAction(label: string): MchoseButtonAction | null;
37
+ /**
38
+ * Name a stored assignment. Type and value must be matched together, since the
39
+ * same value means different things under different types.
40
+ */
41
+ export declare function mchoseDescribeButton(type: number, value: number): string;
42
+ /** Six four-byte entries starting at this offset of the 0x67 config payload. */
43
+ export declare const MCHOSE_BUTTON_TABLE_OFFSET = 20;
44
+ export declare const MCHOSE_BUTTON_ENTRY_LENGTH = 4;
45
+ export interface MchoseButtonAssignment {
46
+ /** Which physical button this entry belongs to, from the high nibble. */
47
+ buttonIndex: number;
48
+ type: number;
49
+ value: number;
50
+ label: string;
51
+ }
52
+ export declare function mchoseDecodeButtons(payload: Uint8Array): MchoseButtonAssignment[] | null;
53
+ /**
54
+ * Build the `0x52` write. Unlike DPI and polling this is a standalone command,
55
+ * not part of the config blob, so it only ever touches one button.
56
+ */
57
+ export declare function mchoseEncodeButton(buttonIndex: number, type: number, value: number): number[];
58
+ /**
59
+ * Per-button name, read with `0x12 0x63 <index>`. A button carrying a macro
60
+ * stores the macro's name here; every other button answers with a zero length.
61
+ * The reply echoes the button index, which is what makes it safe to match.
62
+ */
63
+ export declare const MCHOSE_READ_BUTTON_NAME = 99;
64
+ export declare function mchoseEncodeReadButtonName(buttonIndex: number): number[];
65
+ export declare function mchoseDecodeButtonName(payload: Uint8Array, buttonIndex: number): string | null;
66
+ //# sourceMappingURL=buttons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../src/mchose/buttons.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,kBAAkB;IAC7B,yEAAyE;;;;;;;;;;CAUjE,CAAC;AAEX,kEAAkE;AAClE,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAE3C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAiDD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAqC9D,CAAC;AAEF,8CAA8C;AAC9C,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAE/E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQxE;AAED,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,sBAAsB,EAAE,GAAG,IAAI,CAiBxF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAaV;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAG5C,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9F"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * MCHOSE button-remapping vocabulary.
3
+ *
4
+ * A button assignment is a `type` nibble plus a 24-bit big-endian value, and
5
+ * the type selects which table the value is looked up in — the same value means
6
+ * different things under different types (`0x010000` is left-click under type 1
7
+ * but "DPI switch" under type 5). All of it is transcribed from M HUB's own
8
+ * tables; see docs/mchose-protocol.md.
9
+ */
10
+ export const MCHOSE_BUTTON_TYPE = {
11
+ /** Restore the button's factory function. Always paired with value 0. */
12
+ default: 0,
13
+ mouse: 1,
14
+ keyboard: 2,
15
+ media: 3,
16
+ macro: 4,
17
+ dpi: 5,
18
+ system: 8,
19
+ disable: 9,
20
+ profile: 10,
21
+ };
22
+ /** Physical buttons, in the order the config blob stores them. */
23
+ export const MCHOSE_BUTTONS = [
24
+ "Left", "Middle", "Right", "Forward", "Back", "DPI",
25
+ ];
26
+ const action = (group, type) => (label, value) => ({ label, type, value, group });
27
+ const mouse = action("Mouse", MCHOSE_BUTTON_TYPE.mouse);
28
+ const key = action("Keyboard", MCHOSE_BUTTON_TYPE.keyboard);
29
+ const media = action("Media", MCHOSE_BUTTON_TYPE.media);
30
+ const dpi = action("DPI", MCHOSE_BUTTON_TYPE.dpi);
31
+ const system = action("System", MCHOSE_BUTTON_TYPE.system);
32
+ const profile = action("Profile", MCHOSE_BUTTON_TYPE.profile);
33
+ /** Keyboard entries, as `label` -> low 16 bits; the high byte is the modifier. */
34
+ const KEYS = [
35
+ ["A", 0x0400], ["B", 0x0500], ["C", 0x0600], ["D", 0x0700], ["E", 0x0800],
36
+ ["F", 0x0900], ["G", 0x0a00], ["H", 0x0b00], ["I", 0x0c00], ["J", 0x0d00],
37
+ ["K", 0x0e00], ["L", 0x0f00], ["M", 0x1000], ["N", 0x1100], ["O", 0x1200],
38
+ ["P", 0x1300], ["Q", 0x1400], ["R", 0x1500], ["S", 0x1600], ["T", 0x1700],
39
+ ["U", 0x1800], ["V", 0x1900], ["W", 0x1a00], ["X", 0x1b00], ["Y", 0x1c00],
40
+ ["Z", 0x1d00],
41
+ ["1", 0x1e00], ["2", 0x1f00], ["3", 0x2000], ["4", 0x2100], ["5", 0x2200],
42
+ ["6", 0x2300], ["7", 0x2400], ["8", 0x2500], ["9", 0x2600], ["0", 0x2700],
43
+ ["F1", 0x3a00], ["F2", 0x3b00], ["F3", 0x3c00], ["F4", 0x3d00], ["F5", 0x3e00],
44
+ ["F6", 0x3f00], ["F7", 0x4000], ["F8", 0x4100], ["F9", 0x4200], ["F10", 0x4300],
45
+ ["F11", 0x4400], ["F12", 0x4500],
46
+ ["Esc", 0x2900], ["Tab", 0x2b00], ["Space", 0x2c00], ["Enter", 0x2800],
47
+ ["Backspace", 0x2a00], ["Delete", 0x4c00], ["Insert", 0x4900],
48
+ ["Home", 0x4a00], ["End", 0x4d00], ["Page Up", 0x4b00], ["Page Down", 0x4e00],
49
+ ["Up", 0x5200], ["Down", 0x5100], ["Left", 0x5000], ["Right", 0x4f00],
50
+ ["Caps Lock", 0x3900], ["Num Lock", 0x5300], ["Scroll Lock", 0x4700],
51
+ ["Print Screen", 0x4600], ["Pause", 0x4800], ["Menu", 0x6500],
52
+ ["Left Ctrl", 0xe000], ["Left Shift", 0xe100], ["Left Alt", 0xe200],
53
+ ["Left Windows", 0xe300], ["Right Ctrl", 0xe400], ["Right Shift", 0xe500],
54
+ ["Right Alt", 0xe600], ["Right Windows", 0xe700],
55
+ ];
56
+ /** Shortcuts, where the top byte carries the modifier bitmask. */
57
+ const SHORTCUTS = [
58
+ ["Ctrl + A", 0x010400], ["Ctrl + C", 0x010600], ["Ctrl + N", 0x011100],
59
+ ["Ctrl + O", 0x011200], ["Ctrl + S", 0x011600], ["Ctrl + T", 0x011700],
60
+ ["Ctrl + V", 0x011900], ["Ctrl + W", 0x011a00], ["Ctrl + X", 0x011b00],
61
+ ["Ctrl + Y", 0x011c00], ["Ctrl + Z", 0x011d00], ["Ctrl + Esc", 0x012900],
62
+ ["Ctrl + Shift + Esc", 0x032900],
63
+ ["Alt + Tab", 0x042b00], ["Alt + F4", 0x043d00], ["Alt + Esc", 0x042900],
64
+ ["Alt + Left", 0x045000], ["Alt + Right", 0x044f00],
65
+ ["Win + D", 0x080700], ["Win + E", 0x080800], ["Win + L", 0x080f00],
66
+ ["Win + R", 0x081500], ["Win + S", 0x081600], ["Win + Tab", 0x082b00],
67
+ ];
68
+ /**
69
+ * Everything a button can be set to. "Default" restores the factory function
70
+ * and is the only entry whose value must be zero.
71
+ */
72
+ export const MCHOSE_BUTTON_ACTIONS = [
73
+ { label: "Default", type: MCHOSE_BUTTON_TYPE.default, value: 0, group: "Basic" },
74
+ { label: "Disabled", type: MCHOSE_BUTTON_TYPE.disable, value: 0xffffff, group: "Basic" },
75
+ mouse("Left click", 0x010000),
76
+ mouse("Right click", 0x020000),
77
+ mouse("Middle click", 0x040000),
78
+ mouse("Forward", 0x100000),
79
+ mouse("Back", 0x080000),
80
+ mouse("Wheel up", 0x000200),
81
+ mouse("Wheel down", 0x00fe00),
82
+ dpi("DPI switch", 0x010000),
83
+ dpi("DPI +", 0x020000),
84
+ dpi("DPI -", 0x030000),
85
+ media("Play / Pause", 0xcd0000),
86
+ media("Next track", 0xb50000),
87
+ media("Previous track", 0xb60000),
88
+ media("Stop", 0xb70000),
89
+ media("Volume +", 0xe90000),
90
+ media("Volume -", 0xea0000),
91
+ media("Mute", 0xe20000),
92
+ system("Copy", 0x070106),
93
+ system("Cut", 0x07011b),
94
+ system("Paste", 0x070119),
95
+ system("Screen brightness +", 0x0c6f00),
96
+ system("Screen brightness -", 0x0c7000),
97
+ profile("Switch to profile 1", 0x010000),
98
+ profile("Switch to profile 2", 0x020000),
99
+ profile("Switch to profile 3", 0x030000),
100
+ profile("Cycle profiles", 0x040000),
101
+ ...KEYS.map(([label, value]) => key(label, value)),
102
+ ...SHORTCUTS.map(([label, value]) => key(label, value)),
103
+ ];
104
+ /** Look up an action by its display label. */
105
+ export function mchoseFindButtonAction(label) {
106
+ return MCHOSE_BUTTON_ACTIONS.find((entry) => entry.label === label) ?? null;
107
+ }
108
+ /**
109
+ * Name a stored assignment. Type and value must be matched together, since the
110
+ * same value means different things under different types.
111
+ */
112
+ export function mchoseDescribeButton(type, value) {
113
+ if (type === MCHOSE_BUTTON_TYPE.default)
114
+ return "Default";
115
+ if (type === MCHOSE_BUTTON_TYPE.macro)
116
+ return "Macro";
117
+ const found = MCHOSE_BUTTON_ACTIONS.find((entry) => entry.type === type && entry.value === value);
118
+ if (found)
119
+ return found.label;
120
+ return `Unknown (type ${type}, 0x${value.toString(16).padStart(6, "0")})`;
121
+ }
122
+ /** Six four-byte entries starting at this offset of the 0x67 config payload. */
123
+ export const MCHOSE_BUTTON_TABLE_OFFSET = 20;
124
+ export const MCHOSE_BUTTON_ENTRY_LENGTH = 4;
125
+ export function mchoseDecodeButtons(payload) {
126
+ const end = MCHOSE_BUTTON_TABLE_OFFSET + MCHOSE_BUTTONS.length * MCHOSE_BUTTON_ENTRY_LENGTH;
127
+ if (payload.length < end)
128
+ return null;
129
+ return MCHOSE_BUTTONS.map((_, index) => {
130
+ const at = MCHOSE_BUTTON_TABLE_OFFSET + index * MCHOSE_BUTTON_ENTRY_LENGTH;
131
+ const header = payload[at] ?? 0;
132
+ const type = header & 0x0f;
133
+ const value = ((payload[at + 1] ?? 0) << 16)
134
+ | ((payload[at + 2] ?? 0) << 8)
135
+ | (payload[at + 3] ?? 0);
136
+ return {
137
+ buttonIndex: (header >> 4) & 0x0f,
138
+ type,
139
+ value,
140
+ label: mchoseDescribeButton(type, value),
141
+ };
142
+ });
143
+ }
144
+ /**
145
+ * Build the `0x52` write. Unlike DPI and polling this is a standalone command,
146
+ * not part of the config blob, so it only ever touches one button.
147
+ */
148
+ export function mchoseEncodeButton(buttonIndex, type, value) {
149
+ if (!Number.isInteger(buttonIndex) || buttonIndex < 0 || buttonIndex >= MCHOSE_BUTTONS.length) {
150
+ throw new Error(`Button index must be 0-${MCHOSE_BUTTONS.length - 1}.`);
151
+ }
152
+ return [
153
+ 0x52,
154
+ buttonIndex,
155
+ 0,
156
+ type & 0x0f,
157
+ (value >> 16) & 0xff,
158
+ (value >> 8) & 0xff,
159
+ value & 0xff,
160
+ ];
161
+ }
162
+ /**
163
+ * Per-button name, read with `0x12 0x63 <index>`. A button carrying a macro
164
+ * stores the macro's name here; every other button answers with a zero length.
165
+ * The reply echoes the button index, which is what makes it safe to match.
166
+ */
167
+ export const MCHOSE_READ_BUTTON_NAME = 0x63;
168
+ const MCHOSE_BUTTON_NAME_MAX = 20;
169
+ export function mchoseEncodeReadButtonName(buttonIndex) {
170
+ if (!Number.isInteger(buttonIndex) || buttonIndex < 0 || buttonIndex >= MCHOSE_BUTTONS.length) {
171
+ throw new Error(`Button index must be 0-${MCHOSE_BUTTONS.length - 1}.`);
172
+ }
173
+ return [MCHOSE_READ_BUTTON_NAME, buttonIndex];
174
+ }
175
+ export function mchoseDecodeButtonName(payload, buttonIndex) {
176
+ if (payload.length < 2 || payload[0] !== buttonIndex)
177
+ return null;
178
+ const size = payload[1] ?? 0;
179
+ if (size === 0 || size > MCHOSE_BUTTON_NAME_MAX || payload.length < 2 + size)
180
+ return null;
181
+ const name = String.fromCharCode(...payload.subarray(2, 2 + size)).trim();
182
+ return name.length ? name : null;
183
+ }
184
+ //# sourceMappingURL=buttons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../src/mchose/buttons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * MCHOSE MagDock — the magnetic charging base, which carries the RGB the mouse
3
+ * itself does not have.
4
+ *
5
+ * It is a **separate device with a separate protocol**: product id `0x1012` on
6
+ * usage page `0xff00`, a WCH controller rather than the mouse's RealTek, and
7
+ * plain (non-inverted) frames on unnumbered output report 0:
8
+ *
9
+ * [0] 0xaa start
10
+ * [1] command
11
+ * [2] command type — 0 request, 2 response
12
+ * [3] frame sequence
13
+ * [4] total frames
14
+ * [5] parameter length
15
+ * [6…] parameters
16
+ *
17
+ * Replies use the same layout, so a reply's payload begins at offset 6.
18
+ */
19
+ export declare const MCHOSE_DOCK_PRODUCT_ID = 4114;
20
+ export declare const MCHOSE_DOCK_USAGE_PAGE = 65280;
21
+ export declare const MCHOSE_DOCK_USAGE = 1;
22
+ /** Unnumbered report: the id byte is 0. */
23
+ export declare const MCHOSE_DOCK_REPORT_ID = 0;
24
+ export declare const MCHOSE_DOCK_FRAME_LENGTH = 63;
25
+ export declare const MCHOSE_DOCK_PAYLOAD_OFFSET = 6;
26
+ export declare const MCHOSE_DOCK_COMMAND: {
27
+ readonly readLighting: 7;
28
+ readonly writeLighting: 39;
29
+ };
30
+ export declare function mchoseDockEncode(command: number, params?: readonly number[]): Uint8Array<ArrayBuffer>;
31
+ /** Payload of a reply to `command`, or null when this is not that reply. */
32
+ export declare function mchoseDockPayload(raw: Uint8Array, command: number): Uint8Array | null;
33
+ /**
34
+ * Effect ids, from MCHOSE's own enum
35
+ * (`{static:0, breath:1, shiningBrightly:2, loop:3, goFlow:4, music:5}`).
36
+ */
37
+ export declare const MCHOSE_DOCK_EFFECT: {
38
+ readonly static: 0;
39
+ readonly breathing: 1;
40
+ readonly shining: 2;
41
+ readonly cycling: 3;
42
+ readonly flow: 4;
43
+ readonly music: 5;
44
+ };
45
+ /**
46
+ * The shared `MouseLightingMode` union has no MCHOSE-specific names, so each
47
+ * effect is mapped to its nearest shared label. "Shining" and "music" have no
48
+ * exact counterpart — they are approximated by Spectrum and Reactive, which is
49
+ * how they read in the panel.
50
+ */
51
+ export declare const MCHOSE_DOCK_MODE_LABELS: ReadonlyArray<readonly [number, string]>;
52
+ /** Effects that actually use the base colour; the rest animate their own. */
53
+ export declare const MCHOSE_DOCK_COLOR_MODES: readonly string[];
54
+ /** Brightness and speed are both 0-4 in the protocol. */
55
+ export declare const MCHOSE_DOCK_LEVELS: readonly number[];
56
+ export interface MchoseDockLighting {
57
+ enabled: boolean;
58
+ effect: number;
59
+ /** Count of effects the firmware reports; echoed back on write. */
60
+ effectCount: number;
61
+ speed: number;
62
+ brightness: number;
63
+ musicSync: boolean;
64
+ color: [number, number, number];
65
+ direction: number;
66
+ }
67
+ export declare function mchoseDockDecodeLighting(payload: Uint8Array): MchoseDockLighting | null;
68
+ /**
69
+ * The write takes every field at once — there is no partial update — so a
70
+ * caller changing one thing must supply the rest as they were.
71
+ */
72
+ export declare function mchoseDockEncodeLighting(state: MchoseDockLighting): Uint8Array<ArrayBuffer>;
73
+ export declare function mchoseDockModeLabel(effect: number): string;
74
+ export declare function mchoseDockEffectFor(label: string): number | null;
75
+ export declare function mchoseDockColorToHex(color: readonly [number, number, number]): string;
76
+ export declare function mchoseDockColorFromHex(hex: string): [number, number, number] | null;
77
+ //# sourceMappingURL=dock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dock.d.ts","sourceRoot":"","sources":["../../src/mchose/dock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,sBAAsB,OAAS,CAAC;AAC7C,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,eAAO,MAAM,iBAAiB,IAAS,CAAC;AAExC,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAM5C,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAUzG;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAKrF;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;CAOrB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAO5E,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAmC,CAAC;AAEzF,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,GAAG,IAAI,CAYvF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,CAa3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEhE;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAErF;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKnF"}