@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,263 @@
1
+ import { PULSAR_COMMAND, PULSAR_CONFIG_PACKET_LENGTH, PULSAR_CONFIG_REPORT_ID, PULSAR_FLASH, pulsarPacketChecksum, } from "../pulsar/index.js";
2
+ /**
3
+ * Lamzu's "Atlantis" generation — CompX vendor id 0x3554.
4
+ *
5
+ * These mice do not speak the page/command feature-report protocol in
6
+ * `../compx/codec.ts` that the 0x373e and 0x37b0 Lamzu models use. They speak
7
+ * the *other* CompX stack: report 8, 16-byte interrupt reports, settings in a
8
+ * flash image addressed by byte offset — the same wire protocol this package
9
+ * already implements for the Pulsar 4K receiver and the VGN and Teevolution
10
+ * mice that share vendor id 0x3554. CompX is the ODM for all of them; the
11
+ * user's own device reports `manufacturer: "compx"`.
12
+ *
13
+ * So the framing, command ids, checksum and 50-step DPI encoding are imported
14
+ * from the Pulsar entry point rather than restated here. What this module adds
15
+ * is only what is genuinely Lamzu: the product catalog, the flash fields
16
+ * Lamzu's firmware uses that the Pulsar driver never reads, the lift-off
17
+ * encoding (which differs), and the polling-rate table (which differs).
18
+ *
19
+ * Verified on a Lamzu Atlantis Mini 4K, firmware 1.24, wired 0x3554:0xf50f —
20
+ * see docs/lamzu-atlantis-testing.md. Protocol groundwork: LeadSun/lamzu-cfg
21
+ * (Apache-2.0/MIT), reverse-engineered from an Atlantis Mini Pro.
22
+ */
23
+ export const LAMZU_ATLANTIS_VENDOR_ID = 0x3554;
24
+ /** The one collection that answers: interface 1, usage page 0xff02, usage 2. */
25
+ export const LAMZU_ATLANTIS_USAGE_PAGE = 0xff02;
26
+ export const LAMZU_ATLANTIS_USAGE = 0x02;
27
+ /** Shared CompX report-8 framing, re-stated under Lamzu names for callers. */
28
+ export const LAMZU_ATLANTIS_REPORT_ID = PULSAR_CONFIG_REPORT_ID;
29
+ export const LAMZU_ATLANTIS_PACKET_LENGTH = PULSAR_CONFIG_PACKET_LENGTH;
30
+ export const LAMZU_ATLANTIS_PAYLOAD_OFFSET = 5;
31
+ export const LAMZU_ATLANTIS_MAX_PAYLOAD = 10;
32
+ /**
33
+ * The commands are CompX's, not Lamzu's, so the whole Pulsar set is aliased
34
+ * here rather than a Lamzu-specific subset. Only six have been exercised on
35
+ * Atlantis hardware: 0x04 battery, 0x07/0x08 flash write/read, 0x0e active
36
+ * profile, 0x0f set active profile, and 0x12 firmware version (returned
37
+ * 0x01 0x24 — v1.24, matching both the USB bcdDevice and the version Lamzu's
38
+ * download page lists for this model). The dongle-only commands (0x15, 0x1d,
39
+ * 0x2b) answer status 1 over the cable; the rest — `encryptionData`,
40
+ * `deviceOnline`, `setDongleRgb` — are inherited names this driver never
41
+ * sends and are unverified on this family.
42
+ */
43
+ export const LAMZU_ATLANTIS_COMMAND = PULSAR_COMMAND;
44
+ /**
45
+ * Switching the active onboard profile. It is the write counterpart of
46
+ * `getCurrentConfig` (0x0e) and is absent from `PULSAR_COMMAND` because the
47
+ * Pulsar driver only reads the profile. Documented by lamzu-cfg as
48
+ * `WriteActiveProfile` and exercised here on an Atlantis Mini 4K.
49
+ */
50
+ export const LAMZU_ATLANTIS_WRITE_ACTIVE_PROFILE = 0x0f;
51
+ /**
52
+ * Flash offsets. Everything in `PULSAR_FLASH` matched byte for byte on Lamzu
53
+ * hardware — same firmware family, same layout — so those are inherited rather
54
+ * than re-typed, and only the fields Lamzu's configurator exposes that the
55
+ * Pulsar driver never reads are added here.
56
+ *
57
+ * `sleepTime` deserves a note: the byte is a count of ten-second units, not
58
+ * seconds. Lamzu's configurator showed a 1-minute timeout while address 173
59
+ * held 0x06, and 10 seconds while it held 0x01.
60
+ */
61
+ export const LAMZU_ATLANTIS_FLASH = {
62
+ ...PULSAR_FLASH,
63
+ dpiStageCount: 2,
64
+ dpiStageColors: 44,
65
+ buttonActions: 96,
66
+ highPerformance: 185,
67
+ };
68
+ export const LAMZU_ATLANTIS_STAGE_STRIDE = 4;
69
+ export const LAMZU_ATLANTIS_MAX_DPI_STAGES = 8;
70
+ /**
71
+ * Onboard profiles, 1-based in Lamzu's UI and 0-based on the wire. Probed on
72
+ * hardware: writing indices 0-3 is accepted and reads back, while 4 and above
73
+ * are rejected with status 1 and leave the mouse on its previous profile.
74
+ */
75
+ export const LAMZU_ATLANTIS_PROFILE_COUNT = 4;
76
+ /** PAW3395: 50-26,000 DPI in 50 DPI steps, per Lamzu's own device table. */
77
+ export const LAMZU_ATLANTIS_DPI_STEP = 50;
78
+ export const LAMZU_ATLANTIS_MIN_DPI = 50;
79
+ export const LAMZU_ATLANTIS_MAX_DPI = 26000;
80
+ /**
81
+ * Both timers this firmware stores — the peak-performance window and the sleep
82
+ * timeout — count ten-second units in a single byte.
83
+ */
84
+ export const LAMZU_ATLANTIS_TIMER_STEP_SECONDS = 10;
85
+ export const LAMZU_ATLANTIS_MAX_TIMER_SECONDS = 0xff * LAMZU_ATLANTIS_TIMER_STEP_SECONDS;
86
+ /** Sleep timeouts Lamzu's own configurator offers, in seconds. */
87
+ export const LAMZU_ATLANTIS_SLEEP_OPTIONS = [10, 30, 60, 300, 600, 1800];
88
+ const RATES_WIRED = [125, 250, 500, 1000];
89
+ const RATES_4K = [500, 1000, 2000, 4000];
90
+ /**
91
+ * Six models share these ids — Atlantis OG V2, Atlantis Mini, Atlantis Mini
92
+ * Pro, Thorn, Maya and Paro of this generation — and nothing on the wire
93
+ * separates them: same product id, same USB product string ("LAMZU Atlantis
94
+ * Pro" on the cable, "LAMZU 4K Receiver" on the dongle), same firmware
95
+ * version. Lamzu's own Windows configurator has the same problem and solves it
96
+ * by making the user pick the model from a list, so this catalog names the
97
+ * family rather than pretending to identify one model.
98
+ *
99
+ * 0xf50f (the mouse on its cable) is confirmed on hardware. The three receiver
100
+ * ids come from Lamzu's shipped device table and nothing more: no receiver has
101
+ * been exercised, so neither their rate lists nor the transport itself is
102
+ * established, and they stay `verified: false` until one is.
103
+ */
104
+ export const LAMZU_ATLANTIS_PRODUCTS = new Map([
105
+ [0xf50f, { model: "Atlantis", wireless: false, pollingRates: RATES_WIRED, rateFamily: "wired", verified: true }],
106
+ [0xf50d, { model: "Atlantis", wireless: true, pollingRates: RATES_WIRED, rateFamily: "wired", verified: false }],
107
+ [0xf510, { model: "Atlantis", wireless: true, pollingRates: RATES_4K, rateFamily: "receiver", verified: false }],
108
+ [0xf517, { model: "Atlantis", wireless: true, pollingRates: RATES_4K, rateFamily: "receiver", verified: false }],
109
+ ]);
110
+ /**
111
+ * The rate byte uses the encoding the other Lamzu generations use, where
112
+ * 1,000 Hz appears twice: 0x01 in the wired 125-1000 family and 0x10 in the
113
+ * receiver family. Both were read from the same mouse — 0x10 before Lamzu's
114
+ * configurator touched the profile and 0x01 after it wrote 1,000 Hz over the
115
+ * cable, with the vendor UI reading "1000Hz" both times — and selecting
116
+ * 500 Hz in that UI wrote 0x02.
117
+ *
118
+ * This is why the Lamzu units need their own table rather than
119
+ * `pulsarDecodePollingRate`, which reads 0x10 as 2,000 Hz.
120
+ */
121
+ export const LAMZU_ATLANTIS_POLLING_RATES = [
122
+ [0x08, 125], [0x04, 250], [0x02, 500], [0x01, 1000],
123
+ [0x10, 1000], [0x20, 2000], [0x40, 4000], [0x80, 8000],
124
+ ];
125
+ /**
126
+ * Only two lift-off heights exist on this generation, 1 mm and 2 mm, and they
127
+ * encode as 1 and 2. The Pulsar driver's 3/1/2 → Low/Medium/High mapping would
128
+ * report a Lamzu's 1 mm as "Medium".
129
+ */
130
+ export const LAMZU_ATLANTIS_LIFT_OFF_DISTANCES = [
131
+ [0x01, "Low"], [0x02, "Medium"],
132
+ ];
133
+ /**
134
+ * Builds the 16 bytes WebHID sends for report 8. The report id is excluded
135
+ * from the buffer but included in the checksum, which is what
136
+ * `pulsarPacketChecksum` accounts for.
137
+ */
138
+ export function lamzuAtlantisEncodeRequest(spec) {
139
+ const payload = spec.payload ?? [];
140
+ if (payload.length > LAMZU_ATLANTIS_MAX_PAYLOAD) {
141
+ throw new Error(`A CompX report-8 frame carries at most ${LAMZU_ATLANTIS_MAX_PAYLOAD} payload bytes.`);
142
+ }
143
+ const address = spec.address ?? 0;
144
+ const packet = new Uint8Array(LAMZU_ATLANTIS_PACKET_LENGTH);
145
+ packet[0] = spec.command;
146
+ packet[2] = (address >> 8) & 0xff;
147
+ packet[3] = address & 0xff;
148
+ packet[4] = payload.length;
149
+ packet.set(payload, LAMZU_ATLANTIS_PAYLOAD_OFFSET);
150
+ packet[LAMZU_ATLANTIS_PACKET_LENGTH - 1] = pulsarPacketChecksum(packet);
151
+ return packet;
152
+ }
153
+ /**
154
+ * Decodes an input report body (the 16 bytes WebHID delivers, report id
155
+ * excluded). Returns null for a truncated frame or a failed checksum so a
156
+ * caller waiting on a reply can skip the unsolicited reports this firmware
157
+ * emits rather than throwing on them.
158
+ */
159
+ export function lamzuAtlantisDecodeReply(body) {
160
+ if (body.length < LAMZU_ATLANTIS_PACKET_LENGTH)
161
+ return null;
162
+ const packet = body.subarray(0, LAMZU_ATLANTIS_PACKET_LENGTH);
163
+ if (pulsarPacketChecksum(packet) !== packet[LAMZU_ATLANTIS_PACKET_LENGTH - 1])
164
+ return null;
165
+ return {
166
+ command: packet[0] ?? 0,
167
+ error: packet[1] ?? 0,
168
+ address: ((packet[2] ?? 0) << 8) | (packet[3] ?? 0),
169
+ payload: packet.slice(LAMZU_ATLANTIS_PAYLOAD_OFFSET, LAMZU_ATLANTIS_PAYLOAD_OFFSET + LAMZU_ATLANTIS_MAX_PAYLOAD),
170
+ declaredLength: Math.min(packet[4] ?? 0, LAMZU_ATLANTIS_MAX_PAYLOAD),
171
+ };
172
+ }
173
+ /**
174
+ * A flash field is stored with a trailing checksum byte, so the value bytes
175
+ * and that byte together must sum to 0x55.
176
+ */
177
+ export function lamzuAtlantisFieldIsIntact(field) {
178
+ let sum = 0;
179
+ for (const byte of field)
180
+ sum = (sum + byte) & 0xff;
181
+ return sum === 0x55;
182
+ }
183
+ /** Appends the trailing checksum a flash field is stored with. */
184
+ export function lamzuAtlantisSealField(values) {
185
+ let sum = 0;
186
+ for (const value of values)
187
+ sum = (sum + value) & 0xff;
188
+ return [...values, (0x55 - sum) & 0xff];
189
+ }
190
+ /**
191
+ * Decodes a DPI stage field: `[x, y, flags, checksum]`, where the flags byte
192
+ * carries each axis's ninth and tenth bits — bits 2-3 for x, bits 6-7 for y,
193
+ * which is how `pulsarVgnEncodeDpi` lays them out.
194
+ *
195
+ * `pulsarVgnDecodeDpi` cannot be used for reads here: it returns null unless
196
+ * the two axis bytes are identical, because the Pulsar driver only ever
197
+ * writes them in lockstep. A Lamzu configured with separate axes stores a
198
+ * perfectly valid field that would then read as corrupt.
199
+ */
200
+ export function lamzuAtlantisDecodeDpiStage(field) {
201
+ if (field.length < LAMZU_ATLANTIS_STAGE_STRIDE || !lamzuAtlantisFieldIsIntact(field))
202
+ return null;
203
+ const flags = field[2] ?? 0;
204
+ const axis = (low, high) => (((high & 0x03) << 8) + low + 1) * LAMZU_ATLANTIS_DPI_STEP;
205
+ return {
206
+ x: axis(field[0] ?? 0, flags >> 2),
207
+ y: axis(field[1] ?? 0, flags >> 6),
208
+ };
209
+ }
210
+ export function lamzuAtlantisDecodePollingRate(raw) {
211
+ return LAMZU_ATLANTIS_POLLING_RATES.find(([encoded]) => encoded === raw)?.[1] ?? null;
212
+ }
213
+ /**
214
+ * Picks the byte for a rate. Only 1,000 Hz is ambiguous, and the transport's
215
+ * declared family decides it rather than anything inferred from the rate list.
216
+ */
217
+ export function lamzuAtlantisEncodePollingRate(hertz, family) {
218
+ const candidates = LAMZU_ATLANTIS_POLLING_RATES.filter(([, rate]) => rate === hertz);
219
+ if (candidates.length === 0)
220
+ return null;
221
+ const preferred = family === "receiver"
222
+ ? candidates.find(([encoded]) => encoded >= 0x10)
223
+ : candidates.find(([encoded]) => encoded <= 0x08);
224
+ return (preferred ?? candidates[0])?.[0] ?? null;
225
+ }
226
+ export function lamzuAtlantisDecodeLiftOffDistance(raw) {
227
+ return LAMZU_ATLANTIS_LIFT_OFF_DISTANCES.find(([encoded]) => encoded === raw)?.[1] ?? null;
228
+ }
229
+ export function lamzuAtlantisEncodeLiftOffDistance(value) {
230
+ return LAMZU_ATLANTIS_LIFT_OFF_DISTANCES.find(([, name]) => name === value)?.[0] ?? null;
231
+ }
232
+ /**
233
+ * Battery reply payload: [percent, charging, millivolts high, millivolts low].
234
+ *
235
+ * lamzu-cfg reads only the millivolts and derives a percentage linearly
236
+ * between 3,050 and 4,200 mV, which disagrees with the mouse while it charges:
237
+ * at 4,239 mV that estimate says 100%, where both the reported byte and
238
+ * Lamzu's configurator said 95%. The reported byte wins; the voltage is kept
239
+ * for display.
240
+ */
241
+ export function lamzuAtlantisDecodeBattery(payload) {
242
+ if (payload.length < 4)
243
+ return { percent: null, millivolts: null, charging: false };
244
+ const percent = payload[0] ?? 0;
245
+ const millivolts = ((payload[2] ?? 0) << 8) | (payload[3] ?? 0);
246
+ return {
247
+ percent: percent <= 100 ? percent : null,
248
+ millivolts: millivolts > 0 ? millivolts : null,
249
+ charging: (payload[1] ?? 0) === 1,
250
+ };
251
+ }
252
+ /** Formats the 0x12 firmware reply the same way the Pulsar driver does. */
253
+ export function lamzuAtlantisDecodeFirmware(label, payload) {
254
+ if (payload.length < 2)
255
+ return null;
256
+ return `${label} v${payload[0] ?? 0}.${(payload[1] ?? 0).toString(16).padStart(2, "0")}`;
257
+ }
258
+ export function lamzuAtlantisProduct(vendorId, productId) {
259
+ if (vendorId !== LAMZU_ATLANTIS_VENDOR_ID)
260
+ return undefined;
261
+ return LAMZU_ATLANTIS_PRODUCTS.get(productId);
262
+ }
263
+ //# sourceMappingURL=atlantis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atlantis.js","sourceRoot":"","sources":["../../src/lamzu/atlantis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,2BAA2B,EAC3B,uBAAuB,EACvB,YAAY,EACZ,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AAChE,MAAM,CAAC,MAAM,4BAA4B,GAAG,2BAA2B,CAAC;AACxE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAErD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,YAAY;IACf,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE;IACjB,eAAe,EAAE,GAAG;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,GAAG,iCAAiC,CAAC;AAEzF,kEAAkE;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAmBlF,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AACnD,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAElD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA8C,IAAI,GAAG,CAAC;IACxF,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChH,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChH,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChH,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CACjH,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACnD,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CAC9C,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;CACkD,CAAC;AAsBpF;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAA0B;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0CAA0C,0BAA0B,iBAAiB,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IAC5D,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACzB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC;IACnD,MAAM,CAAC,4BAA4B,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAgB;IACvD,IAAI,IAAI,CAAC,MAAM,GAAG,4BAA4B;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAC9D,IAAI,oBAAoB,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,4BAA4B,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3F,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,CAAC,KAAK,CACnB,6BAA6B,EAC7B,6BAA6B,GAAG,0BAA0B,CAC3D;QACD,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,0BAA0B,CAAC;KACrE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAiB;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;IACvD,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAOD;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAiB;IAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,2BAA2B,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,uBAAuB,CAAC;IACvG,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QAClC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAAW;IACxD,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAAa,EACb,MAA+B;IAE/B,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,KAAK,UAAU;QACrC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC;QACjD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,GAAW;IAC5D,OAAO,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAAa;IAC9D,OAAO,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC3F,CAAC;AAQD;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAmB;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpF,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACxC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC9C,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,2BAA2B,CAAC,KAAa,EAAE,OAAmB;IAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,SAAiB;IACtE,IAAI,QAAQ,KAAK,wBAAwB;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,60 @@
1
+ export * from "../compx/codec.js";
2
+ export * from "./atlantis.js";
3
+ export interface LamzuProduct {
4
+ model: string;
5
+ wireless: boolean;
6
+ pollingRates: readonly number[];
7
+ brand?: "Lamzu" | "CRDRAKO" | "Attack Shark";
8
+ uiFamily?: string;
9
+ mouseTarget?: number;
10
+ maxDpi?: number;
11
+ sleepOptions?: readonly number[];
12
+ }
13
+ export declare const LAMZU_VENDOR_ID = 14142;
14
+ export declare const CRDRAKO_PRODUCT_IDS: readonly [106, 107];
15
+ export declare const ATTACKSHARK_PRODUCT_IDS: readonly [70, 71];
16
+ export declare const LAMZU_PRODUCTS: ReadonlyMap<number, LamzuProduct>;
17
+ /**
18
+ * Lamzu's own vendor id, introduced with the Inca 8K. Every earlier Lamzu
19
+ * model enumerates under the shared CompX ODM id 0x373e above, which CRDRAKO
20
+ * and Attack Shark also use, so the two catalogs are kept apart: the same
21
+ * product id means different hardware depending on which vendor id it arrived
22
+ * under. The Inca answers the identical CompX framing, so only the lookup
23
+ * needed splitting, not the protocol.
24
+ */
25
+ export declare const LAMZU_INCA_VENDOR_ID = 14256;
26
+ export declare const LAMZU_VENDOR_IDS: readonly number[];
27
+ /**
28
+ * Products under Lamzu's own vendor id. 0x0009 (the mouse on its cable) and
29
+ * 0x0010 (the 8K receiver) are confirmed on hardware — see
30
+ * docs/lamzu-inca-testing.md. Both answer the mouse on target 0x02, so neither
31
+ * needs a `mouseTarget` override.
32
+ *
33
+ * The rate split shows up in the capture itself: LAMZU_POLLING_RATES encodes
34
+ * 1000 Hz twice, 0x01 in the 125/250/500/1000 family and 0x10 in the
35
+ * 1000/2000/4000/8000 family, and the cable answered 0x01 where the 8K
36
+ * receiver answered 0x40. Lamzu's Aurora configurator agrees — its device
37
+ * table gives the Inca `PollingRateWired` 125-1000 and `_8KDonglePollingRate`
38
+ * 500-8000 — and its `DPIMax` of 30000 is already the driver default, so no
39
+ * `maxDpi` override is needed.
40
+ *
41
+ * 0x000f is the 1K receiver the Inca can also ship with. It is taken from that
42
+ * same Aurora table (`_1KDongle` 000F, `_1KDonglePollingRate` 125-1000) and
43
+ * has NOT been exercised on hardware; the protocol is the receiver protocol
44
+ * either way, so the risk is a wrong rate list rather than a dead device.
45
+ *
46
+ * Deliberately absent: 0x000a and 0x0002, which Aurora lists as
47
+ * `DeviceBLPID` and `Receiver4K8KBLPID` — the DFU bootloader identities the
48
+ * mouse and dongle take while flashing firmware. They never speak this
49
+ * protocol and must not be offered in the picker.
50
+ */
51
+ export declare const LAMZU_INCA_PRODUCTS: ReadonlyMap<number, LamzuProduct>;
52
+ /**
53
+ * Resolves a product against the catalog its vendor id belongs to. A vendor id
54
+ * this brand does not use resolves to nothing rather than falling through to
55
+ * the 0x373e catalog, so the same product id under a foreign vendor id is never
56
+ * mistaken for a Lamzu.
57
+ */
58
+ export declare function lamzuProduct(vendorId: number, productId: number): LamzuProduct | undefined;
59
+ export declare const LAMZU_POLLING_RATES: readonly [readonly [8, 125], readonly [4, 250], readonly [2, 500], readonly [1, 1000], readonly [16, 1000], readonly [32, 2000], readonly [64, 4000], readonly [128, 8000]];
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lamzu/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AACD,eAAO,MAAM,eAAe,QAAS,CAAC;AAItC,eAAO,MAAM,mBAAmB,qBAA4B,CAAC;AAC7D,eAAO,MAAM,uBAAuB,mBAA4B,CAAC;AACjE,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAoB3D,CAAC;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA4C,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAIhE,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAI1F;AAED,eAAO,MAAM,mBAAmB,6KAGtB,CAAC"}
@@ -0,0 +1,86 @@
1
+ export * from "../compx/codec.js";
2
+ export * from "./atlantis.js";
3
+ export const LAMZU_VENDOR_ID = 0x373e;
4
+ const RATES_1K = [125, 250, 500, 1000];
5
+ const RATES_8K = [500, 1000, 2000, 4000, 8000];
6
+ const RATES_8K_FULL = [125, 250, 500, 1000, 2000, 4000, 8000];
7
+ export const CRDRAKO_PRODUCT_IDS = [0x006a, 0x006b];
8
+ export const ATTACKSHARK_PRODUCT_IDS = [0x0046, 0x0047];
9
+ export const LAMZU_PRODUCTS = new Map([
10
+ [0x001c, { model: "Maya X", wireless: false, pollingRates: RATES_1K }],
11
+ [0x001d, { model: "Maya X", wireless: true, pollingRates: RATES_1K }],
12
+ [0x001e, { model: "Maya X", wireless: true, pollingRates: RATES_8K }],
13
+ [0x006a, {
14
+ brand: "CRDRAKO", model: "KO-ONE", wireless: false,
15
+ pollingRates: RATES_8K_FULL, mouseTarget: 0x00, uiFamily: "crdrako",
16
+ }],
17
+ [0x006b, {
18
+ brand: "CRDRAKO", model: "KO-ONE", wireless: true,
19
+ pollingRates: RATES_8K_FULL, mouseTarget: 0x02, uiFamily: "crdrako",
20
+ }],
21
+ [0x0046, {
22
+ brand: "Attack Shark", model: "R5 Ultra", wireless: false,
23
+ pollingRates: RATES_1K, maxDpi: 42000, uiFamily: "attack-shark",
24
+ }],
25
+ [0x0047, {
26
+ brand: "Attack Shark", model: "R5 Ultra", wireless: true,
27
+ pollingRates: RATES_8K, maxDpi: 42000, uiFamily: "attack-shark",
28
+ }],
29
+ ]);
30
+ /**
31
+ * Lamzu's own vendor id, introduced with the Inca 8K. Every earlier Lamzu
32
+ * model enumerates under the shared CompX ODM id 0x373e above, which CRDRAKO
33
+ * and Attack Shark also use, so the two catalogs are kept apart: the same
34
+ * product id means different hardware depending on which vendor id it arrived
35
+ * under. The Inca answers the identical CompX framing, so only the lookup
36
+ * needed splitting, not the protocol.
37
+ */
38
+ export const LAMZU_INCA_VENDOR_ID = 0x37b0;
39
+ export const LAMZU_VENDOR_IDS = [LAMZU_VENDOR_ID, LAMZU_INCA_VENDOR_ID];
40
+ /**
41
+ * Products under Lamzu's own vendor id. 0x0009 (the mouse on its cable) and
42
+ * 0x0010 (the 8K receiver) are confirmed on hardware — see
43
+ * docs/lamzu-inca-testing.md. Both answer the mouse on target 0x02, so neither
44
+ * needs a `mouseTarget` override.
45
+ *
46
+ * The rate split shows up in the capture itself: LAMZU_POLLING_RATES encodes
47
+ * 1000 Hz twice, 0x01 in the 125/250/500/1000 family and 0x10 in the
48
+ * 1000/2000/4000/8000 family, and the cable answered 0x01 where the 8K
49
+ * receiver answered 0x40. Lamzu's Aurora configurator agrees — its device
50
+ * table gives the Inca `PollingRateWired` 125-1000 and `_8KDonglePollingRate`
51
+ * 500-8000 — and its `DPIMax` of 30000 is already the driver default, so no
52
+ * `maxDpi` override is needed.
53
+ *
54
+ * 0x000f is the 1K receiver the Inca can also ship with. It is taken from that
55
+ * same Aurora table (`_1KDongle` 000F, `_1KDonglePollingRate` 125-1000) and
56
+ * has NOT been exercised on hardware; the protocol is the receiver protocol
57
+ * either way, so the risk is a wrong rate list rather than a dead device.
58
+ *
59
+ * Deliberately absent: 0x000a and 0x0002, which Aurora lists as
60
+ * `DeviceBLPID` and `Receiver4K8KBLPID` — the DFU bootloader identities the
61
+ * mouse and dongle take while flashing firmware. They never speak this
62
+ * protocol and must not be offered in the picker.
63
+ */
64
+ export const LAMZU_INCA_PRODUCTS = new Map([
65
+ [0x0009, { model: "Inca 8K", wireless: false, pollingRates: RATES_1K }],
66
+ [0x000f, { model: "Inca 8K", wireless: true, pollingRates: RATES_1K }],
67
+ [0x0010, { model: "Inca 8K", wireless: true, pollingRates: RATES_8K }],
68
+ ]);
69
+ /**
70
+ * Resolves a product against the catalog its vendor id belongs to. A vendor id
71
+ * this brand does not use resolves to nothing rather than falling through to
72
+ * the 0x373e catalog, so the same product id under a foreign vendor id is never
73
+ * mistaken for a Lamzu.
74
+ */
75
+ export function lamzuProduct(vendorId, productId) {
76
+ if (vendorId === LAMZU_INCA_VENDOR_ID)
77
+ return LAMZU_INCA_PRODUCTS.get(productId);
78
+ if (vendorId === LAMZU_VENDOR_ID)
79
+ return LAMZU_PRODUCTS.get(productId);
80
+ return undefined;
81
+ }
82
+ export const LAMZU_POLLING_RATES = [
83
+ [0x08, 125], [0x04, 250], [0x02, 500], [0x01, 1000],
84
+ [0x10, 1000], [0x20, 2000], [0x40, 4000], [0x80, 8000],
85
+ ];
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lamzu/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
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 declare const LOGITECH_REPROG_CONTROLS: {
16
+ /** getCount: [count]. */
17
+ readonly count: 0;
18
+ /** getControlIdInfo(index): [cid(2), tid(2), flags, pos, group, gmask, ...]. */
19
+ readonly info: 16;
20
+ /** getControlIdReporting(cid): [cid(2), flagsLow, remap(2), flagsHigh]. */
21
+ readonly reporting: 32;
22
+ /** setControlIdReporting(cid, flags, remap(2)). */
23
+ readonly setReporting: 48;
24
+ };
25
+ /** Control ids — the physical (or virtual) buttons a device exposes. */
26
+ export declare const LOGITECH_CONTROL_NAMES: Readonly<Record<number, string>>;
27
+ /** Native task each control performs when it is neither remapped nor diverted. */
28
+ export declare const LOGITECH_TASK_NAMES: Readonly<Record<number, string>>;
29
+ /**
30
+ * Bits of the flags byte from getControlIdInfo. Confirmed against an
31
+ * MX Master 4: left click reports 0x01 (a plain mouse button, not
32
+ * reprogrammable), the gesture button 0x31, and the virtual gesture button
33
+ * 0xA0 — virtual and divertable, but not a physical key.
34
+ */
35
+ export declare const LOGITECH_KEY_FLAG: {
36
+ readonly mouseButton: 1;
37
+ readonly fkey: 2;
38
+ readonly hotkey: 4;
39
+ readonly fnToggle: 8;
40
+ readonly reprogrammable: 16;
41
+ readonly divertable: 32;
42
+ readonly persistentlyDivertable: 64;
43
+ readonly virtual: 128;
44
+ };
45
+ /**
46
+ * Bits of the mapping flags from getControlIdReporting, which is one 16-bit
47
+ * field split across two non-adjacent payload bytes — low at [2], high at [5],
48
+ * with the remap target wedged between them.
49
+ */
50
+ export declare const LOGITECH_MAPPING_FLAG: {
51
+ readonly diverted: 1;
52
+ readonly persistentlyDiverted: 4;
53
+ readonly rawXy: 16;
54
+ readonly forceRawXy: 64;
55
+ readonly analyticsKeyEvents: 256;
56
+ readonly rawWheel: 1024;
57
+ };
58
+ export interface LogitechControlInfo {
59
+ controlId: number;
60
+ taskId: number;
61
+ /** The getControlIdInfo capability flags — LOGITECH_KEY_FLAG bits. */
62
+ flags: number;
63
+ /** Group this control belongs to when it is used as a remap target. */
64
+ group: number;
65
+ /** Bitmask of the groups this control may be remapped into. */
66
+ groupMask: number;
67
+ }
68
+ export interface LogitechControlReporting {
69
+ controlId: number;
70
+ /**
71
+ * The 16-bit mapping field, reassembled from its two payload bytes.
72
+ * Named apart from LogitechControlInfo.flags on purpose: the two are
73
+ * different fields, and a control merges both, so a shared name would have
74
+ * one silently overwrite the other.
75
+ */
76
+ mappingFlags: number;
77
+ /** Control id this button currently acts as. */
78
+ mappedTo: number;
79
+ /** Another application is consuming this button's events. */
80
+ diverted: boolean;
81
+ }
82
+ export interface LogitechReprogrammableControl extends LogitechControlInfo, LogitechControlReporting {
83
+ name: string;
84
+ taskName: string;
85
+ reprogrammable: boolean;
86
+ /** A software-side control, not a physical button anyone can press. */
87
+ virtual: boolean;
88
+ /** Control ids this button may legally be remapped to. */
89
+ remappableTo: number[];
90
+ }
91
+ export declare const logitechControlName: (controlId: number) => string;
92
+ export declare const logitechTaskName: (taskId: number) => string;
93
+ /** Decodes the getControlIdInfo payload (function 0x10). */
94
+ export declare function decodeControlInfo(payload: Uint8Array | readonly number[]): LogitechControlInfo | null;
95
+ /**
96
+ * Decodes the getControlIdReporting payload (function 0x20).
97
+ *
98
+ * The mapping flags are one 16-bit field whose halves are not adjacent: the
99
+ * low byte sits at [2] and the high byte at [5], with the remap target at
100
+ * [3..4] between them. Reading the two as a contiguous pair puts the remap
101
+ * target's high byte where the flags belong, which reports a button remapped
102
+ * to anything in 0x01.. as diverted.
103
+ */
104
+ export declare function decodeControlReporting(payload: Uint8Array | readonly number[]): LogitechControlReporting | null;
105
+ /**
106
+ * Which controls a given control may be remapped to.
107
+ *
108
+ * The device's group mask names the groups it accepts, and only controls
109
+ * belonging to one of those groups are legal targets. Left and right click
110
+ * report a mask of zero, so they come back with nothing.
111
+ */
112
+ export declare function remappableControlTargets(control: LogitechControlInfo, all: readonly LogitechControlInfo[]): number[];
113
+ /**
114
+ * Builds the setControlIdReporting payload for a pure remap.
115
+ *
116
+ * Each mapping flag occupies two bits — the value, and a companion "valid" bit
117
+ * one position higher — and the device ignores any flag whose valid bit is
118
+ * clear. A flags byte of zero therefore changes no flag at all, which is
119
+ * exactly what is wanted here: turning diversion on would route the button to
120
+ * HID++ notifications that nothing consumes, leaving it dead.
121
+ */
122
+ export declare function buildControlRemapWrite(controlId: number, targetControlId: number): number[];
123
+ /**
124
+ * Builds the payload that hands a button back to the hardware.
125
+ *
126
+ * A diverted button emits HID++ notifications instead of acting, which is how
127
+ * a vendor application implements behaviours of its own. Logi Options+ uses
128
+ * the temporary flag, which the device clears when its owner stops — but the
129
+ * persistent flag survives, and a button left that way does nothing at all
130
+ * until something clears it.
131
+ *
132
+ * Only the valid bits are set, with both value bits left clear, so this can
133
+ * only ever turn diversion off. There is deliberately no way to turn it on:
134
+ * nothing here consumes those notifications. A remap target of zero leaves the
135
+ * existing mapping untouched.
136
+ */
137
+ export declare function buildControlDiversionClearWrite(controlId: number): number[];
138
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/logitech/controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,wBAAwB;IACnC,yBAAyB;;IAEzB,gFAAgF;;IAEhF,2EAA2E;;IAE3E,mDAAmD;;CAE3C,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BnE,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUhE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;CASpB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,6BAA8B,SAAQ,mBAAmB,EAAE,wBAAwB;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,KAAG,MAEiB,CAAC;AAE1E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAC6C,CAAC;AAEhG,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CAWrG;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,GACtC,wBAAwB,GAAG,IAAI,CAWjC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,SAAS,mBAAmB,EAAE,GAClC,MAAM,EAAE,CAQV;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3E"}