@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,200 @@
1
+ /**
2
+ * Pure ATK (A9 family) and VXE R1 (Beken) codecs, unit-tested without WebHID.
3
+ *
4
+ * ATK shares the Endgame Gear WE framing (see endgame-gear-we.ts): feature
5
+ * command 0x08 reads an EEPROM address, 0x07 writes one, every frame and every
6
+ * value/checksum pair sums to 0x55. Only the DPI stage encoding differs — ATK
7
+ * packs a mode nibble per axis so newer sensors reach 42,000 DPI.
8
+ *
9
+ * VXE R1 SE/SE+ ("Wireless mouse -1k dongle", 0x373b:0x1085, Beken MCU) uses
10
+ * the same framing and the same DPI/advanced registers as the A9 family, but
11
+ * stores the polling rate in a live-settings row at 0x0070 keyed by a selector
12
+ * byte. The mapping below comes from the OpenVXE tracker (BuSd777/OpenVXE),
13
+ * the only reverse-engineering project that targets this exact receiver PID.
14
+ */
15
+ export type AtkSensor = "PAW3950Ultra" | "PAW3950" | "PAW3950DM" | "PAW3395Ultra" | "PAW3395" | "PAW3395SE" | "CORE26K" | "PAW3955Master";
16
+ export type AtkDpiFamily = "ultra" | "step50" | "paw3395se" | "paw3955master";
17
+ export interface AtkSensorProfile {
18
+ family: AtkDpiFamily;
19
+ minDpi: number;
20
+ maxDpi: number;
21
+ }
22
+ /** Limits and encoding families transcribed from ATK HUB 3.2.21. */
23
+ export declare const ATK_SENSORS: Record<AtkSensor, AtkSensorProfile>;
24
+ /**
25
+ * Per-axis mode nibble: bits 2-3 extend the value byte, bit 1 selects the
26
+ * 50-DPI step range above 10,000, bit 0 doubles the result above 30,000.
27
+ */
28
+ export declare function atkEncodeDpiAxis(dpi: number): {
29
+ byte: number;
30
+ nibble: number;
31
+ };
32
+ export declare function atkDecodeDpiAxis(byte: number, nibble: number): number;
33
+ /** One DPI stage: [x, y, packed nibbles, checksum]. */
34
+ export declare function atkPackDpiStage(x: number, y: number): number[];
35
+ export declare function atkUnpackDpiStage(data: Uint8Array | readonly number[]): {
36
+ x: number;
37
+ y: number;
38
+ } | null;
39
+ /** Byte length of one DPI stage row for this sensor: 6 for PAW3955 Master, 4 otherwise. */
40
+ export declare function atkDpiStageLength(sensor: AtkSensor | null): number;
41
+ export declare function atkPackDpiStageForSensor(sensor: AtkSensor | null, x: number, y: number): number[] | null;
42
+ export declare function atkUnpackDpiStageForSensor(sensor: AtkSensor | null, data: Uint8Array | readonly number[]): {
43
+ x: number;
44
+ y: number;
45
+ } | null;
46
+ export declare function atkDpiOptionsForSensor(sensor: AtkSensor): number[];
47
+ /** Register holds tenths of a millimetre offset by 6 (code 1 = 0.7 mm). */
48
+ export declare function atkDecodeLiftOff(code: number): number | null;
49
+ export declare const ATK_LIFT_OFF_MIN_CODE = 1;
50
+ export declare const ATK_LIFT_OFF_MAX_CODE = 11;
51
+ export declare function atkEncodeLiftOff(millimetres: number): number;
52
+ /**
53
+ * Address of the R1's live-settings row. It carries several settings as
54
+ * [selector, value, 0x00, checksum], so a write must always include the
55
+ * selector byte. Applying an entry over the row updates that setting live
56
+ * without rewriting the persisted EEPROM.
57
+ */
58
+ export declare const ATK_VXE_R1_SETTINGS_REGISTER = 112;
59
+ /** Selector for the angle-snapping flag (value 0x10 on, 0x00 off). */
60
+ export declare const ATK_VXE_R1_ANGLE_SELECTOR = 1;
61
+ /** Selector for the debounce entry (value is milliseconds, 1-20). */
62
+ export declare const ATK_VXE_R1_DEBOUNCE_SELECTOR = 2;
63
+ /** Selector for the lift-off level (value 1 low, 2 high). */
64
+ export declare const ATK_VXE_R1_LOD_SELECTOR = 3;
65
+ /** Selector for the 250/500/1000 Hz polling-rate entry. */
66
+ export declare const ATK_VXE_R1_POLLING_SELECTOR = 11;
67
+ /** Rates the R1 SE/SE+ offers on its stock 1K receiver. */
68
+ export declare const ATK_VXE_R1_POLLING_RATES: readonly number[];
69
+ /** Build the 4-byte live-settings row for a given selector/value pair. */
70
+ export declare function atkPackVxeR1LiveSetting(selector: number, value: number): number[];
71
+ /** Build the 4-byte live-settings polling row, or null for an unsupported rate. */
72
+ export declare function atkPackVxeR1PollingSetting(pollingRateHz: number): number[] | null;
73
+ /** Decode the value byte of an R1 polling row, or null if unrecognised. */
74
+ export declare function atkDecodeVxeR1PollingCode(code: number): number | null;
75
+ /** Command ids used by the COMPX configuration transport. */
76
+ export declare const ATK_COMPX_COMMAND: {
77
+ readonly getWirelessMouseOnline: 3;
78
+ readonly setWirelessDonglePair: 5;
79
+ readonly getWirelessDonglePairResult: 6;
80
+ readonly restoreFactory: 9;
81
+ readonly enterUsbUpgradeMode: 13;
82
+ readonly getCurrentConfig: 14;
83
+ readonly setCurrentConfig: 15;
84
+ readonly dongleExitPair: 19;
85
+ readonly getDongleVersion: 29;
86
+ readonly reportMouseUpgradeError: 90;
87
+ readonly reportMouseUpgradeStatus: 91;
88
+ };
89
+ /** The R1 HUB profile picker exposes four firmware-managed configuration banks. */
90
+ export declare const ATK_R1_PROFILE_COUNT = 4;
91
+ export declare function atkDecodeCurrentProfile(data: Uint8Array | readonly number[]): number | null;
92
+ /** Build SetCurrentConfig with the vendor's length byte and zero-based bank. */
93
+ export declare function atkBuildSetCurrentProfile(profile: number): Uint8Array;
94
+ /** Build SetWirelessDonglePair for one exact mouse model identity. */
95
+ export declare function atkBuildReceiverPairRequest(cid: number, mid: number): Uint8Array;
96
+ export declare const ATK_R1_BUTTONS: readonly [{
97
+ readonly id: "left";
98
+ readonly label: "Left button";
99
+ readonly address: 96;
100
+ }, {
101
+ readonly id: "right";
102
+ readonly label: "Right button";
103
+ readonly address: 100;
104
+ }, {
105
+ readonly id: "middle";
106
+ readonly label: "Middle button";
107
+ readonly address: 104;
108
+ }, {
109
+ readonly id: "back";
110
+ readonly label: "Back button";
111
+ readonly address: 108;
112
+ }, {
113
+ readonly id: "forward";
114
+ readonly label: "Forward button";
115
+ readonly address: 112;
116
+ }, {
117
+ readonly id: "bottom";
118
+ readonly label: "Bottom button";
119
+ readonly address: 116;
120
+ }];
121
+ export declare const ATK_R1_SHORTCUT_BASE = 256;
122
+ export declare const ATK_R1_SHORTCUT_SLOT_LENGTH = 32;
123
+ export declare const ATK_R1_MACRO_BASE = 768;
124
+ export declare const ATK_R1_MACRO_SLOT_LENGTH = 384;
125
+ export declare const ATK_R1_MACRO_SLOT_COUNT = 12;
126
+ export type AtkR1ButtonId = (typeof ATK_R1_BUTTONS)[number]["id"];
127
+ /** Four-byte EEPROM button assignment: class, value 1, value 2, checksum. */
128
+ export interface AtkButtonAssignment {
129
+ keyClass: number;
130
+ value1: number;
131
+ value2: number;
132
+ checksum: number;
133
+ checksumValid: boolean;
134
+ label: string;
135
+ raw: string;
136
+ }
137
+ export declare const ATK_BUTTON_CLASS: {
138
+ readonly disabled: 0;
139
+ readonly mouse: 1;
140
+ readonly dpi: 2;
141
+ readonly horizontalScroll: 3;
142
+ readonly firepower: 4;
143
+ readonly shortcut: 5;
144
+ readonly macro: 6;
145
+ readonly reportRate: 7;
146
+ readonly lighting: 8;
147
+ readonly profile: 9;
148
+ readonly dpiLock: 10;
149
+ readonly wheel: 11;
150
+ };
151
+ /** Describe only action values whose meaning is present in the vendor enum. */
152
+ export declare function atkDescribeButtonAction(keyClass: number, value1: number, value2: number): string;
153
+ export declare function atkDecodeButtonAssignment(data: Uint8Array | readonly number[]): AtkButtonAssignment | null;
154
+ export interface AtkReceiverStatus {
155
+ online: boolean;
156
+ status: number;
157
+ /** RF id in the firmware's rfId1/rfId2/rfId3 display order. */
158
+ rfId: string;
159
+ }
160
+ export declare function atkDecodeReceiverStatus(data: Uint8Array | readonly number[]): AtkReceiverStatus | null;
161
+ export interface AtkPairingStatus {
162
+ status: number;
163
+ secondsRemaining: number;
164
+ }
165
+ export declare function atkDecodePairingStatus(data: Uint8Array | readonly number[]): AtkPairingStatus | null;
166
+ export declare const ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET = 8192;
167
+ export declare const ATK_COMPX_FIRMWARE_HEADER_LENGTH = 720;
168
+ export interface AtkFirmwareEndpoint {
169
+ vendorId: number;
170
+ productId: number;
171
+ path: string;
172
+ }
173
+ export interface AtkCompxFirmwareInfo {
174
+ headerCrc: number;
175
+ headerLength: number;
176
+ firmwareLength: number;
177
+ nextFileAddress: number;
178
+ version: string;
179
+ deviceType: number;
180
+ cid: number;
181
+ mid: number;
182
+ fileId: string;
183
+ icName: string;
184
+ sensorName: string;
185
+ productName: string;
186
+ bootInput: AtkFirmwareEndpoint;
187
+ bootOutput: AtkFirmwareEndpoint;
188
+ normalInput: AtkFirmwareEndpoint;
189
+ normalOutput: AtkFirmwareEndpoint;
190
+ resetCommand: Uint8Array;
191
+ prepareCommand: Uint8Array;
192
+ downloadCommand: Uint8Array;
193
+ payloadCrc: number;
194
+ payloadCrcValid: boolean;
195
+ }
196
+ /** CRC-32 register state used by COMPX packages: init 0xffffffff, no final xor. */
197
+ export declare function atkCompxPayloadCrc(data: Uint8Array): number;
198
+ /** Parse and integrity-check the first firmware image in a COMPX package. */
199
+ export declare function atkParseCompxFirmware(data: Uint8Array): AtkCompxFirmwareInfo;
200
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/atk/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Pure ATK (A9 family) and VXE R1 (Beken) codecs, unit-tested without WebHID.
3
+ *
4
+ * ATK shares the Endgame Gear WE framing (see endgame-gear-we.ts): feature
5
+ * command 0x08 reads an EEPROM address, 0x07 writes one, every frame and every
6
+ * value/checksum pair sums to 0x55. Only the DPI stage encoding differs — ATK
7
+ * packs a mode nibble per axis so newer sensors reach 42,000 DPI.
8
+ *
9
+ * VXE R1 SE/SE+ ("Wireless mouse -1k dongle", 0x373b:0x1085, Beken MCU) uses
10
+ * the same framing and the same DPI/advanced registers as the A9 family, but
11
+ * stores the polling rate in a live-settings row at 0x0070 keyed by a selector
12
+ * byte. The mapping below comes from the OpenVXE tracker (BuSd777/OpenVXE),
13
+ * the only reverse-engineering project that targets this exact receiver PID.
14
+ */
15
+ const CHECKSUM_TOTAL = 0x55;
16
+ /** Limits and encoding families transcribed from ATK HUB 3.2.21. */
17
+ export const ATK_SENSORS = {
18
+ PAW3950Ultra: { family: "ultra", minDpi: 10, maxDpi: 42000 },
19
+ PAW3950: { family: "step50", minDpi: 50, maxDpi: 36000 },
20
+ PAW3950DM: { family: "step50", minDpi: 50, maxDpi: 36000 },
21
+ PAW3395Ultra: { family: "step50", minDpi: 100, maxDpi: 30000 },
22
+ PAW3395: { family: "step50", minDpi: 100, maxDpi: 30000 },
23
+ PAW3395SE: { family: "paw3395se", minDpi: 200, maxDpi: 18000 },
24
+ CORE26K: { family: "step50", minDpi: 50, maxDpi: 26000 },
25
+ PAW3955Master: { family: "paw3955master", minDpi: 50, maxDpi: 40000 },
26
+ };
27
+ const PAW3395SE_INVALID_CODES = new Set([
28
+ 7, 13, 20, 26, 33, 40, 46, 53, 60, 66, 73, 80, 86, 93, 100, 106, 113,
29
+ 120, 126, 133, 140, 146, 153, 160, 166, 173, 180, 186, 193, 200, 206,
30
+ 213, 220, 226, 233,
31
+ ]);
32
+ const PAW3395SE_CODES = Array.from({ length: 235 }, (_, index) => index + 1)
33
+ .filter((code) => !PAW3395SE_INVALID_CODES.has(code));
34
+ /**
35
+ * Per-axis mode nibble: bits 2-3 extend the value byte, bit 1 selects the
36
+ * 50-DPI step range above 10,000, bit 0 doubles the result above 30,000.
37
+ */
38
+ export function atkEncodeDpiAxis(dpi) {
39
+ let value = dpi;
40
+ let doubled = 0;
41
+ if (value > 30000) {
42
+ doubled = 1;
43
+ value = Math.round(value / 2);
44
+ }
45
+ if (value <= 10000) {
46
+ const code = Math.floor(value / 10) - 1;
47
+ return { byte: code & 0xff, nibble: ((code >> 8) << 2) | doubled };
48
+ }
49
+ const code = Math.floor((value - 10050) / 50);
50
+ return { byte: code & 0xff, nibble: ((code >> 8) << 2) | 2 | doubled };
51
+ }
52
+ export function atkDecodeDpiAxis(byte, nibble) {
53
+ const code = (((nibble >> 2) & 0x03) << 8) | (byte & 0xff);
54
+ const base = (nibble & 2) !== 0 ? 10050 + code * 50 : (code + 1) * 10;
55
+ return (nibble & 1) !== 0 ? base * 2 : base;
56
+ }
57
+ /** One DPI stage: [x, y, packed nibbles, checksum]. */
58
+ export function atkPackDpiStage(x, y) {
59
+ const encodedX = atkEncodeDpiAxis(x);
60
+ const encodedY = atkEncodeDpiAxis(y);
61
+ const mode = ((encodedY.nibble & 0x0f) << 4) | (encodedX.nibble & 0x0f);
62
+ const sum = (encodedX.byte + encodedY.byte + mode) & 0xff;
63
+ return [encodedX.byte, encodedY.byte, mode, (CHECKSUM_TOTAL - sum) & 0xff];
64
+ }
65
+ export function atkUnpackDpiStage(data) {
66
+ if (data.length < 4)
67
+ return null;
68
+ const sum = (data[0] + data[1] + data[2] + data[3]) & 0xff;
69
+ if (sum !== CHECKSUM_TOTAL)
70
+ return null;
71
+ return {
72
+ x: atkDecodeDpiAxis(data[0], data[2] & 0x0f),
73
+ y: atkDecodeDpiAxis(data[1], (data[2] >> 4) & 0x0f),
74
+ };
75
+ }
76
+ function atkEncodeDpiAxisStep50(dpi) {
77
+ const doubled = dpi > 30000;
78
+ const count = Math.round(dpi / (doubled ? 100 : 50)) - 1;
79
+ return { byte: count & 0xff, nibble: (((count >> 8) & 0x03) << 2) | (doubled ? 1 : 0) };
80
+ }
81
+ function atkDecodeDpiAxisStep50(byte, nibble) {
82
+ const count = (byte & 0xff) | (((nibble >> 2) & 0x03) << 8);
83
+ const dpi = (count + 1) * 50;
84
+ return (nibble & 1) !== 0 ? dpi * 2 : dpi;
85
+ }
86
+ function atkEncodeDpiAxisPaw3395Se(dpi) {
87
+ const doubled = dpi > 10000;
88
+ const baseDpi = doubled ? dpi / 2 : dpi;
89
+ if (!Number.isInteger(baseDpi) || baseDpi < 50 || baseDpi > 10000 || baseDpi % 50 !== 0)
90
+ return null;
91
+ const code = PAW3395SE_CODES[baseDpi / 50 - 1];
92
+ return code === undefined ? null : { byte: code, nibble: doubled ? 2 : 0 };
93
+ }
94
+ function atkDecodeDpiAxisPaw3395Se(byte, nibble) {
95
+ if ((nibble & ~2) !== 0)
96
+ return null;
97
+ const index = PAW3395SE_CODES.indexOf(byte & 0xff);
98
+ if (index < 0)
99
+ return null;
100
+ const baseDpi = (index + 1) * 50;
101
+ if ((nibble & 2) !== 0)
102
+ return baseDpi > 5000 ? baseDpi * 2 : null;
103
+ return baseDpi;
104
+ }
105
+ function atkEncodeDpiAxisPaw3955Master(dpi) {
106
+ if (!Number.isInteger(dpi) || dpi < 1 || dpi > 40000)
107
+ return null;
108
+ const base = dpi - 1;
109
+ return { lo: base & 0xff, hi: (base >> 8) & 0xff };
110
+ }
111
+ function atkDecodeDpiAxisPaw3955Master(lo, hi, doubled) {
112
+ const dpi = (lo | (hi << 8)) + 1;
113
+ return doubled ? dpi * 2 : dpi;
114
+ }
115
+ function atkPackDpiStagePaw3955Master(x, y) {
116
+ const encodedX = atkEncodeDpiAxisPaw3955Master(x);
117
+ const encodedY = atkEncodeDpiAxisPaw3955Master(y);
118
+ if (!encodedX || !encodedY)
119
+ return null;
120
+ const row = [encodedX.lo, encodedX.hi, encodedY.lo, encodedY.hi, 0];
121
+ const sum = row.reduce((total, byte) => total + byte, 0) & 0xff;
122
+ return [...row, (CHECKSUM_TOTAL - sum) & 0xff];
123
+ }
124
+ function atkUnpackDpiStagePaw3955Master(data) {
125
+ if (data.length < 6)
126
+ return null;
127
+ const sum = (data[0] + data[1] + data[2] + data[3] + data[4] + data[5]) & 0xff;
128
+ if (sum !== CHECKSUM_TOTAL)
129
+ return null;
130
+ const flags = data[4];
131
+ return {
132
+ x: atkDecodeDpiAxisPaw3955Master(data[0], data[1], (flags & 0x01) !== 0),
133
+ y: atkDecodeDpiAxisPaw3955Master(data[2], data[3], (flags & 0x10) !== 0),
134
+ };
135
+ }
136
+ /** Byte length of one DPI stage row for this sensor: 6 for PAW3955 Master, 4 otherwise. */
137
+ export function atkDpiStageLength(sensor) {
138
+ return sensor && ATK_SENSORS[sensor].family === "paw3955master" ? 6 : 4;
139
+ }
140
+ export function atkPackDpiStageForSensor(sensor, x, y) {
141
+ if (sensor) {
142
+ const options = atkDpiOptionsForSensor(sensor);
143
+ if (!options.includes(x) || !options.includes(y))
144
+ return null;
145
+ }
146
+ const family = sensor ? ATK_SENSORS[sensor].family : "ultra";
147
+ if (family === "paw3955master")
148
+ return atkPackDpiStagePaw3955Master(x, y);
149
+ const encode = family === "paw3395se"
150
+ ? atkEncodeDpiAxisPaw3395Se
151
+ : family === "step50"
152
+ ? atkEncodeDpiAxisStep50
153
+ : atkEncodeDpiAxis;
154
+ const encodedX = encode(x);
155
+ const encodedY = encode(y);
156
+ if (!encodedX || !encodedY)
157
+ return null;
158
+ const mode = ((encodedY.nibble & 0x0f) << 4) | (encodedX.nibble & 0x0f);
159
+ const sum = (encodedX.byte + encodedY.byte + mode) & 0xff;
160
+ return [encodedX.byte, encodedY.byte, mode, (CHECKSUM_TOTAL - sum) & 0xff];
161
+ }
162
+ export function atkUnpackDpiStageForSensor(sensor, data) {
163
+ const family = sensor ? ATK_SENSORS[sensor].family : "ultra";
164
+ if (family === "paw3955master")
165
+ return atkUnpackDpiStagePaw3955Master(data);
166
+ if (data.length < 4 || (data[0] + data[1] + data[2] + data[3]) % 0x100 !== CHECKSUM_TOTAL)
167
+ return null;
168
+ const decode = family === "paw3395se"
169
+ ? atkDecodeDpiAxisPaw3395Se
170
+ : family === "step50"
171
+ ? atkDecodeDpiAxisStep50
172
+ : atkDecodeDpiAxis;
173
+ const x = decode(data[0], data[2] & 0x0f);
174
+ const y = decode(data[1], (data[2] >> 4) & 0x0f);
175
+ return x === null || y === null ? null : { x, y };
176
+ }
177
+ export function atkDpiOptionsForSensor(sensor) {
178
+ const profile = ATK_SENSORS[sensor];
179
+ if (profile.family === "ultra") {
180
+ const options = [];
181
+ for (let dpi = profile.minDpi; dpi <= 10000; dpi += 10)
182
+ options.push(dpi);
183
+ for (let dpi = 10050; dpi <= 30000; dpi += 50)
184
+ options.push(dpi);
185
+ for (let dpi = 30100; dpi <= profile.maxDpi; dpi += 100)
186
+ options.push(dpi);
187
+ return options;
188
+ }
189
+ if (profile.family === "paw3395se") {
190
+ const options = [];
191
+ for (let dpi = profile.minDpi; dpi <= 10000; dpi += 50)
192
+ options.push(dpi);
193
+ for (let dpi = 10100; dpi <= profile.maxDpi; dpi += 100)
194
+ options.push(dpi);
195
+ return options;
196
+ }
197
+ if (profile.family === "paw3955master") {
198
+ const options = [];
199
+ for (let dpi = profile.minDpi; dpi <= profile.maxDpi; dpi += 10)
200
+ options.push(dpi);
201
+ if (options[options.length - 1] !== profile.maxDpi)
202
+ options.push(profile.maxDpi);
203
+ return options;
204
+ }
205
+ const options = [];
206
+ for (let dpi = profile.minDpi; dpi <= Math.min(profile.maxDpi, 30000); dpi += 50)
207
+ options.push(dpi);
208
+ for (let dpi = 30100; dpi <= profile.maxDpi; dpi += 100)
209
+ options.push(dpi);
210
+ return options;
211
+ }
212
+ /** Register holds tenths of a millimetre offset by 6 (code 1 = 0.7 mm). */
213
+ export function atkDecodeLiftOff(code) {
214
+ return code ? (code + 6) / 10 : null;
215
+ }
216
+ export const ATK_LIFT_OFF_MIN_CODE = 1;
217
+ export const ATK_LIFT_OFF_MAX_CODE = 11;
218
+ export function atkEncodeLiftOff(millimetres) {
219
+ return Math.round(millimetres * 10) - 6;
220
+ }
221
+ // ── VXE R1 SE/SE+ live-settings polling ────────────────────────────────────
222
+ /**
223
+ * Address of the R1's live-settings row. It carries several settings as
224
+ * [selector, value, 0x00, checksum], so a write must always include the
225
+ * selector byte. Applying an entry over the row updates that setting live
226
+ * without rewriting the persisted EEPROM.
227
+ */
228
+ export const ATK_VXE_R1_SETTINGS_REGISTER = 0x0070;
229
+ /** Selector for the angle-snapping flag (value 0x10 on, 0x00 off). */
230
+ export const ATK_VXE_R1_ANGLE_SELECTOR = 0x01;
231
+ /** Selector for the debounce entry (value is milliseconds, 1-20). */
232
+ export const ATK_VXE_R1_DEBOUNCE_SELECTOR = 0x02;
233
+ /** Selector for the lift-off level (value 1 low, 2 high). */
234
+ export const ATK_VXE_R1_LOD_SELECTOR = 0x03;
235
+ /** Selector for the 250/500/1000 Hz polling-rate entry. */
236
+ export const ATK_VXE_R1_POLLING_SELECTOR = 0x0b;
237
+ /** Rates the R1 SE/SE+ offers on its stock 1K receiver. */
238
+ export const ATK_VXE_R1_POLLING_RATES = [250, 500, 1000];
239
+ const VXE_POLLING_CODES = [
240
+ [0x03, 250],
241
+ [0x02, 500],
242
+ [0x01, 1000],
243
+ ];
244
+ /** Build the 4-byte live-settings row for a given selector/value pair. */
245
+ export function atkPackVxeR1LiveSetting(selector, value) {
246
+ return [selector, value, 0x00, (CHECKSUM_TOTAL - value) & 0xff];
247
+ }
248
+ /** Build the 4-byte live-settings polling row, or null for an unsupported rate. */
249
+ export function atkPackVxeR1PollingSetting(pollingRateHz) {
250
+ const rate = VXE_POLLING_CODES.find(([, hertz]) => hertz === pollingRateHz);
251
+ if (!rate)
252
+ return null;
253
+ return atkPackVxeR1LiveSetting(ATK_VXE_R1_POLLING_SELECTOR, rate[0]);
254
+ }
255
+ /** Decode the value byte of an R1 polling row, or null if unrecognised. */
256
+ export function atkDecodeVxeR1PollingCode(code) {
257
+ return VXE_POLLING_CODES.find(([value]) => (value & 0xff) === (code & 0xff))?.[1] ?? null;
258
+ }
259
+ // ── COMPX command and stored-profile inspection ────────────────────────────
260
+ /** Command ids used by the COMPX configuration transport. */
261
+ export const ATK_COMPX_COMMAND = {
262
+ getWirelessMouseOnline: 0x03,
263
+ setWirelessDonglePair: 0x05,
264
+ getWirelessDonglePairResult: 0x06,
265
+ restoreFactory: 0x09,
266
+ enterUsbUpgradeMode: 0x0d,
267
+ getCurrentConfig: 0x0e,
268
+ setCurrentConfig: 0x0f,
269
+ dongleExitPair: 0x13,
270
+ getDongleVersion: 0x1d,
271
+ reportMouseUpgradeError: 0x5a,
272
+ reportMouseUpgradeStatus: 0x5b,
273
+ };
274
+ /** The R1 HUB profile picker exposes four firmware-managed configuration banks. */
275
+ export const ATK_R1_PROFILE_COUNT = 4;
276
+ export function atkDecodeCurrentProfile(data) {
277
+ const profile = data[0];
278
+ return profile !== undefined && profile < ATK_R1_PROFILE_COUNT ? profile : null;
279
+ }
280
+ /** Build SetCurrentConfig with the vendor's length byte and zero-based bank. */
281
+ export function atkBuildSetCurrentProfile(profile) {
282
+ if (!Number.isInteger(profile) || profile < 0 || profile >= ATK_R1_PROFILE_COUNT) {
283
+ throw new Error(`ATK profile must be between 0 and ${ATK_R1_PROFILE_COUNT - 1}.`);
284
+ }
285
+ const payload = new Uint8Array(16);
286
+ payload[0] = ATK_COMPX_COMMAND.setCurrentConfig;
287
+ payload[4] = 1;
288
+ payload[5] = profile;
289
+ const sum = 0x08 + payload.subarray(0, 15).reduce((total, byte) => total + byte, 0);
290
+ payload[15] = (CHECKSUM_TOTAL - (sum & 0xff)) & 0xff;
291
+ return payload;
292
+ }
293
+ /** Build SetWirelessDonglePair for one exact mouse model identity. */
294
+ export function atkBuildReceiverPairRequest(cid, mid) {
295
+ if (![cid, mid].every((value) => Number.isInteger(value) && value >= 0 && value <= 0xff)) {
296
+ throw new Error("ATK receiver pairing CID and MID must be bytes.");
297
+ }
298
+ const payload = new Uint8Array(16);
299
+ payload[0] = ATK_COMPX_COMMAND.setWirelessDonglePair;
300
+ payload[4] = 2;
301
+ payload[5] = cid;
302
+ payload[6] = mid;
303
+ const sum = 0x08 + payload.subarray(0, 15).reduce((total, byte) => total + byte, 0);
304
+ payload[15] = (CHECKSUM_TOTAL - (sum & 0xff)) & 0xff;
305
+ return payload;
306
+ }
307
+ export const ATK_R1_BUTTONS = [
308
+ { id: "left", label: "Left button", address: 0x0060 },
309
+ { id: "right", label: "Right button", address: 0x0064 },
310
+ { id: "middle", label: "Middle button", address: 0x0068 },
311
+ { id: "back", label: "Back button", address: 0x006c },
312
+ { id: "forward", label: "Forward button", address: 0x0070 },
313
+ { id: "bottom", label: "Bottom button", address: 0x0074 },
314
+ ];
315
+ export const ATK_R1_SHORTCUT_BASE = 0x0100;
316
+ export const ATK_R1_SHORTCUT_SLOT_LENGTH = 32;
317
+ export const ATK_R1_MACRO_BASE = 0x0300;
318
+ export const ATK_R1_MACRO_SLOT_LENGTH = 384;
319
+ export const ATK_R1_MACRO_SLOT_COUNT = 12;
320
+ export const ATK_BUTTON_CLASS = {
321
+ disabled: 0x00,
322
+ mouse: 0x01,
323
+ dpi: 0x02,
324
+ horizontalScroll: 0x03,
325
+ firepower: 0x04,
326
+ shortcut: 0x05,
327
+ macro: 0x06,
328
+ reportRate: 0x07,
329
+ lighting: 0x08,
330
+ profile: 0x09,
331
+ dpiLock: 0x0a,
332
+ wheel: 0x0b,
333
+ };
334
+ const BUTTON_CLASS_LABELS = {
335
+ [ATK_BUTTON_CLASS.disabled]: "Disabled",
336
+ [ATK_BUTTON_CLASS.mouse]: "Mouse button",
337
+ [ATK_BUTTON_CLASS.dpi]: "DPI control",
338
+ [ATK_BUTTON_CLASS.horizontalScroll]: "Horizontal scroll",
339
+ [ATK_BUTTON_CLASS.firepower]: "Fire key",
340
+ [ATK_BUTTON_CLASS.shortcut]: "Shortcut",
341
+ [ATK_BUTTON_CLASS.macro]: "Macro",
342
+ [ATK_BUTTON_CLASS.reportRate]: "Polling rate",
343
+ [ATK_BUTTON_CLASS.lighting]: "Lighting control",
344
+ [ATK_BUTTON_CLASS.profile]: "Profile control",
345
+ [ATK_BUTTON_CLASS.dpiLock]: "DPI lock",
346
+ [ATK_BUTTON_CLASS.wheel]: "Wheel",
347
+ };
348
+ const MOUSE_ACTION_LABELS = {
349
+ 0x00: "Disabled",
350
+ 0x01: "Left click",
351
+ 0x02: "Right click",
352
+ 0x04: "Middle click",
353
+ 0x08: "Back",
354
+ 0x10: "Forward",
355
+ };
356
+ const DPI_ACTION_LABELS = {
357
+ 0x01: "DPI cycle",
358
+ 0x02: "DPI up",
359
+ 0x03: "DPI down",
360
+ };
361
+ function hexByte(value) {
362
+ return value.toString(16).padStart(2, "0");
363
+ }
364
+ /** Describe only action values whose meaning is present in the vendor enum. */
365
+ export function atkDescribeButtonAction(keyClass, value1, value2) {
366
+ if (keyClass === ATK_BUTTON_CLASS.disabled)
367
+ return "Disabled";
368
+ if (keyClass === ATK_BUTTON_CLASS.mouse)
369
+ return MOUSE_ACTION_LABELS[value1] ?? `Mouse button 0x${hexByte(value1)}`;
370
+ if (keyClass === ATK_BUTTON_CLASS.dpi)
371
+ return DPI_ACTION_LABELS[value1] ?? `DPI control 0x${hexByte(value1)}`;
372
+ if (keyClass === ATK_BUTTON_CLASS.horizontalScroll) {
373
+ return value1 === 1 ? "Horizontal scroll left" : value1 === 2 ? "Horizontal scroll right" : `Horizontal scroll 0x${hexByte(value1)}`;
374
+ }
375
+ if (keyClass === ATK_BUTTON_CLASS.wheel) {
376
+ return value1 === 1 ? "Wheel up" : value1 === 2 ? "Wheel down" : `Wheel 0x${hexByte(value1)}`;
377
+ }
378
+ const kind = BUTTON_CLASS_LABELS[keyClass] ?? `Unknown class 0x${hexByte(keyClass)}`;
379
+ return `${kind} (0x${hexByte(value1)}, 0x${hexByte(value2)})`;
380
+ }
381
+ export function atkDecodeButtonAssignment(data) {
382
+ if (data.length < 4)
383
+ return null;
384
+ const [keyClass, value1, value2, checksum] = data;
385
+ const raw = [keyClass, value1, value2, checksum].map(hexByte).join(" ");
386
+ return {
387
+ keyClass: keyClass,
388
+ value1: value1,
389
+ value2: value2,
390
+ checksum: checksum,
391
+ checksumValid: (keyClass + value1 + value2 + checksum) % 0x100 === CHECKSUM_TOTAL,
392
+ label: atkDescribeButtonAction(keyClass, value1, value2),
393
+ raw,
394
+ };
395
+ }
396
+ export function atkDecodeReceiverStatus(data) {
397
+ if (data.length < 4)
398
+ return null;
399
+ return {
400
+ online: data[0] === 1,
401
+ status: data[0],
402
+ rfId: [data[3], data[2], data[1]].map(hexByte).join("").toUpperCase(),
403
+ };
404
+ }
405
+ export function atkDecodePairingStatus(data) {
406
+ return data.length < 2 ? null : { status: data[0], secondsRemaining: data[1] };
407
+ }
408
+ // ── COMPX firmware package inspection ──────────────────────────────────────
409
+ export const ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET = 8192;
410
+ export const ATK_COMPX_FIRMWARE_HEADER_LENGTH = 720;
411
+ const ATK_FIRMWARE_FIELD_LENGTH = 64;
412
+ const ATK_FIRMWARE_FIELD_BASE = 23;
413
+ function firmwareField(data, index) {
414
+ const start = ATK_FIRMWARE_FIELD_BASE + index * ATK_FIRMWARE_FIELD_LENGTH;
415
+ return data.subarray(start, start + ATK_FIRMWARE_FIELD_LENGTH);
416
+ }
417
+ function asciiField(data, index) {
418
+ const field = firmwareField(data, index);
419
+ const end = field.indexOf(0);
420
+ return new TextDecoder("ascii").decode(end < 0 ? field : field.subarray(0, end));
421
+ }
422
+ function firmwareEndpoint(path) {
423
+ const match = /(?:^|&)vid_([0-9a-f]+)&pid_([0-9a-f]+)(?:&|$)/i.exec(path);
424
+ if (!match)
425
+ throw new Error(`Invalid COMPX firmware endpoint: ${path || "empty"}.`);
426
+ return { vendorId: Number.parseInt(match[1], 16), productId: Number.parseInt(match[2], 16), path };
427
+ }
428
+ /** CRC-32 register state used by COMPX packages: init 0xffffffff, no final xor. */
429
+ export function atkCompxPayloadCrc(data) {
430
+ let crc = 0xffffffff;
431
+ for (const byte of data) {
432
+ crc ^= byte;
433
+ for (let bit = 0; bit < 8; bit += 1)
434
+ crc = (crc >>> 1) ^ ((crc & 1) === 0 ? 0 : 0xedb88320);
435
+ }
436
+ return crc >>> 0;
437
+ }
438
+ function commandField(data, index) {
439
+ return new Uint8Array(firmwareField(data, index));
440
+ }
441
+ /** Parse and integrity-check the first firmware image in a COMPX package. */
442
+ export function atkParseCompxFirmware(data) {
443
+ if (data.length < ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET)
444
+ throw new Error("COMPX firmware package is shorter than its header area.");
445
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
446
+ const headerLength = view.getUint32(4, true);
447
+ const firmwareLength = view.getUint32(8, true);
448
+ if (headerLength !== ATK_COMPX_FIRMWARE_HEADER_LENGTH)
449
+ throw new Error(`Unsupported COMPX header length ${headerLength}.`);
450
+ if (firmwareLength < 1 || ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET + firmwareLength > data.length) {
451
+ throw new Error("COMPX firmware payload length exceeds the package.");
452
+ }
453
+ const prepareCommand = commandField(data, 7);
454
+ const payloadCrc = new DataView(prepareCommand.buffer, prepareCommand.byteOffset, prepareCommand.byteLength).getUint32(19, false);
455
+ const payload = data.subarray(ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET, ATK_COMPX_FIRMWARE_PAYLOAD_OFFSET + firmwareLength);
456
+ return {
457
+ headerCrc: view.getUint32(0, true),
458
+ headerLength,
459
+ firmwareLength,
460
+ nextFileAddress: view.getUint32(12, true),
461
+ version: view.getUint32(16, true).toString(16),
462
+ deviceType: view.getUint8(20),
463
+ cid: view.getUint8(21),
464
+ mid: view.getUint8(22),
465
+ fileId: asciiField(data, 0),
466
+ icName: asciiField(data, 1),
467
+ bootInput: firmwareEndpoint(asciiField(data, 2)),
468
+ bootOutput: firmwareEndpoint(asciiField(data, 3)),
469
+ normalInput: firmwareEndpoint(asciiField(data, 4)),
470
+ normalOutput: firmwareEndpoint(asciiField(data, 5)),
471
+ resetCommand: commandField(data, 6),
472
+ prepareCommand,
473
+ downloadCommand: commandField(data, 8),
474
+ sensorName: asciiField(data, 9),
475
+ productName: asciiField(data, 10),
476
+ payloadCrc,
477
+ payloadCrcValid: atkCompxPayloadCrc(payload) === payloadCrc,
478
+ };
479
+ }
480
+ //# sourceMappingURL=index.js.map