@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,389 @@
1
+ /**
2
+ * SteelSeries Aerox 5 Wireless configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox5_wireless_wired.py` — the primary source
7
+ * for every command byte, product id, and default here, for the mouse's
8
+ * USB-cabled mode (`1038:1854`, plus the Destiny 2 / Diablo IV cosmetic
9
+ * editions `0x185E`/`0x1862`).
10
+ * - rivalcfg `rivalcfg/devices/aerox5_wireless_wireless.py` — the 2.4 GHz
11
+ * dongle mode (`1038:1852`, editions `0x185C`/`0x1860`). Read in full: it
12
+ * is **not** a separate command set, it is `aerox5_wireless_wired.py`'s
13
+ * settings dict comprehended through one `_patch_command` helper that (1)
14
+ * ORs `0b01000000` into every command's first byte and (2) adds a 64-byte
15
+ * `readback_length`. This module implements that same transform
16
+ * (`applyWirelessFlag`) instead of hand-duplicating the wired-mode byte
17
+ * tables, so the two PID groups can never drift out of sync the way a
18
+ * copy-paste would risk.
19
+ * - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — same TrueMove Air
20
+ * sensor table as the plain (non-wireless) Aerox 5 — imported from
21
+ * `./rival3-wireless.ts`'s `TRUEMOVE_AIR_DPI_TO_BYTE`, not re-derived.
22
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — `dpi_length_byte: 1`,
23
+ * `first_preset: 0` (same as the plain Aerox 5 — **not** 1, unlike Aerox 3
24
+ * and Rival 3 Wireless).
25
+ * - rivalcfg `rivalcfg/handlers/range.py` — `sleep_timer`/`dim_timer`: linear
26
+ * range-to-range mapping, 3-byte little-endian output. Traced by hand:
27
+ * `sleep_timer`'s `output_range` is `[0x000000, 0x124F80, 60000]` against
28
+ * `input_range` `[0, 20, 1]` (minutes) — `0x124F80` is 1,200,000, i.e.
29
+ * 20 minutes × 60000 ms/min, so the output value is simply
30
+ * `minutes * 60000` — and `dim_timer`'s `output_range` is the same
31
+ * `[0x000000, 0x124F80, 1000]` against `input_range` `[0, 1200, 1]`
32
+ * (seconds), i.e. `seconds * 1000`. Both encode little-endian, 3 bytes
33
+ * (`range_length_byte: 3`), per `helpers.uint_to_little_endian_bytearray`.
34
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` / `reactive_rgbcolor.py` — RGB
35
+ * value encoding, same as `./aerox3.ts`/`./aerox5.ts`.
36
+ * - rivalcfg `rivalcfg/handlers/none.py` — `rainbow_effect` here is a
37
+ * fixed-argument `[0x22, 0xFF]` command with `value_type: "none"` (just
38
+ * enables the effect on all zones; disabled by writing a color instead),
39
+ * unlike the plain Aerox 5's zone-bitmask `rainbow_effect`.
40
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — 9 buttons + scroll
41
+ * up/down, byte-identical layout to `./aerox5.ts`'s `AEROX5_BUTTONS` (same
42
+ * ids and offsets, confirmed by direct comparison of the two device
43
+ * files) — reused here as `AEROX5_WIRELESS_BUTTONS`, a structurally
44
+ * identical constant, rather than re-derived from scratch, since the two
45
+ * device files' `buttons_mapping` blocks are identical.
46
+ *
47
+ * ## Why wired-cable-mode and 2.4 GHz-dongle-mode share one module
48
+ *
49
+ * This is the common SteelSeries wireless pattern also seen in Rival 3
50
+ * Wireless's sibling `rival3_wireless_gen2.py` (not implemented here, out of
51
+ * scope): one physical mouse, multiple USB product ids depending on how the
52
+ * host currently sees it, all driven by the same command set modulo a fixed
53
+ * per-transport transform. Concretely: `aerox5_wireless_wireless.py`'s
54
+ * `_patch_command` ORs `0b01000000` (`0x40`) into `command[0]` of every
55
+ * setting, `battery_level`, and `save_command` inherited from
56
+ * `aerox5_wireless_wired.py`, and adds `readback_length: 64` (an expected
57
+ * reply length this module does not need to model — no function here reads
58
+ * or validates a readback payload; callers that care can check the response
59
+ * length themselves). Every command byte in `AEROX5_WIRELESS_COMMAND` below
60
+ * is the wired-mode value; `applyWirelessFlag` produces the 2.4 GHz-mode
61
+ * byte from it on demand, so there is exactly one place either byte can be
62
+ * gotten wrong.
63
+ *
64
+ * ## Why this is a separate protocol family from the plain Aerox 5
65
+ *
66
+ * Despite the shared "Aerox 5" name and several identical command bytes
67
+ * (`0x2D`/`0x2B`/`0x26`/`0x2A`/`0x27`), `aerox5_wireless_wired.py` is a
68
+ * genuinely different command layout from `./aerox5.ts`'s plain
69
+ * `aerox5.py`, confirmed by direct comparison rather than assumed from the
70
+ * shared name:
71
+ *
72
+ * - Polling command `0x2B` shares the byte but **not** the value mapping:
73
+ * `{125:0x03, 250:0x02, 500:0x01, 1000:0x00}` here vs. the plain Aerox 5's
74
+ * `{125:0x04, 250:0x03, 500:0x02, 1000:0x01}` — writing the plain Aerox 5's
75
+ * byte to this device would select the wrong rate.
76
+ * - RGB zone commands are a different packing entirely:
77
+ * `21 01 <zone-index 0/1/2> <r> <g> <b>` here (fixed 6-byte packet, no
78
+ * bitmask, no zero-padding growth) vs. the plain Aerox 5's
79
+ * `21 <bitmask> <padding> <r> <g> <b>` (`./aerox5.ts`'s
80
+ * `steelseriesAerox5EncodeZoneColor`). Do not reuse that function here.
81
+ * - `rainbow_effect` is a fixed no-argument enable (`22 FF`) here vs. the
82
+ * plain Aerox 5's zone-bitmask choice.
83
+ * - This device has `sleep_timer` (`0x29`) and `dim_timer` (`0x23 0F 01 00 00`)
84
+ * settings the plain Aerox 5 profile does not define at all — note
85
+ * `dim_timer`'s command also collides on its first byte (`0x23`) with the
86
+ * plain Aerox 5's `led_brightness` command; they are unrelated settings on
87
+ * unrelated devices, not the same control.
88
+ * - This device has a `battery_level` read (`0x92`, 2-byte reply) the plain
89
+ * Aerox 5 profile has no equivalent of at all (write-only, no getters).
90
+ *
91
+ * PIDs are therefore registered under their own family (`"aerox5-wireless"`),
92
+ * never `"aerox5"`.
93
+ *
94
+ * No corroborating libratbag or OpenRGB source for any of these PIDs was
95
+ * available in this environment (no local libratbag checkout, and OpenRGB's
96
+ * SteelSeries controller files were not reachable this pass) — every command
97
+ * byte above is sourced from rivalcfg alone. This should be treated as
98
+ * unverified beyond rivalcfg until corroborated or hardware-tested.
99
+ *
100
+ * Every command is an HID output report, report id `0x00`, on the vendor
101
+ * configuration interface (`"endpoint": 3` for every model in both rivalcfg
102
+ * files). DPI presets, polling rate, zone colors, reactive color, sleep/dim
103
+ * timers, rainbow, default lighting, and buttons are write-only — neither
104
+ * rivalcfg file defines a getter for any of them. Battery level **is**
105
+ * readable (see below). Settings apply immediately; the save command
106
+ * (`11 00`, wireless-mode `51 00`) persists them to onboard flash. None of
107
+ * this has been verified on physical hardware by this project.
108
+ *
109
+ * ## Battery read
110
+ *
111
+ * `aerox5_wireless_wired.py` defines a `battery_level` block: an
112
+ * output-report write of `0x92` gets a 2-byte input-report reply, where
113
+ * `data[1] & 0b10000000` is the charging flag and
114
+ * `((data[1] & ~0b10000000) - 1) * 5` is the percentage (a coarse 0–100
115
+ * scale in steps of 5, `- 1` because the raw byte is 1-indexed). This module
116
+ * exposes `steelseriesAerox5WirelessBatteryQuery` /
117
+ * `steelseriesAerox5WirelessDecodeBattery` for both transports (2.4 GHz mode
118
+ * additionally needs `0x92 | 0x40 = 0xD2`, produced by
119
+ * `applyWirelessFlag`). This is a **different battery-response shape** from
120
+ * `./rival3-wireless.ts`'s `AA 01` / 3-byte-reply / plain-percentage-byte
121
+ * battery read — do not conflate the two devices' battery decoding.
122
+ */
123
+ import { TRUEMOVE_AIR_DPI_TO_BYTE } from "./rival3-wireless.js";
124
+ export const AEROX5_WIRELESS_REPORT_ID = 0x00;
125
+ /** `_WIRELESS_FLAG = 0b01000000` in `aerox5_wireless_wireless.py`. */
126
+ const WIRELESS_FLAG = 0b01000000;
127
+ /** Wired-cable-mode command bytes; OR `WIRELESS_FLAG` into byte 0 for 2.4 GHz mode. */
128
+ export const AEROX5_WIRELESS_COMMAND = {
129
+ dpiPresets: [0x2d],
130
+ pollingRate: [0x2b],
131
+ zoneColor: [0x21, 0x01],
132
+ reactiveColor: [0x26],
133
+ sleepTimer: [0x29],
134
+ dimTimer: [0x23, 0x0f, 0x01, 0x00, 0x00],
135
+ buttonsMapping: [0x2a],
136
+ rainbowEffect: [0x22, 0xff],
137
+ defaultLighting: [0x27],
138
+ batteryLevel: [0x92],
139
+ };
140
+ /** `11 00` wired-mode / `51 00` 2.4 GHz-mode — see `applyWirelessFlag`. */
141
+ export const AEROX5_WIRELESS_SAVE_COMMAND = [0x11, 0x00];
142
+ /**
143
+ * `_patch_command`: OR `0b01000000` into the command's first byte. Pass the
144
+ * wired-mode command bytes from `AEROX5_WIRELESS_COMMAND` /
145
+ * `AEROX5_WIRELESS_SAVE_COMMAND`; returns the 2.4 GHz-mode equivalent.
146
+ */
147
+ export function applyWirelessFlag(command) {
148
+ if (command.length === 0) {
149
+ throw new Aerox5WirelessProtocolError("Cannot apply the wireless flag to an empty command.");
150
+ }
151
+ return [command[0] | WIRELESS_FLAG, ...command.slice(1)];
152
+ }
153
+ export const AEROX5_WIRELESS_POLLING_RATES = [125, 250, 500, 1000];
154
+ /** Different byte values than the plain Aerox 5's `POLLING_RATE_TO_BYTE` — see module doc comment. */
155
+ const POLLING_RATE_TO_BYTE = new Map([
156
+ [1000, 0x00],
157
+ [500, 0x01],
158
+ [250, 0x02],
159
+ [125, 0x03],
160
+ ]);
161
+ export const AEROX5_WIRELESS_DPI_MIN = 100;
162
+ export const AEROX5_WIRELESS_DPI_MAX = 18000;
163
+ export const AEROX5_WIRELESS_DPI_STEP = 100;
164
+ export const AEROX5_WIRELESS_MAX_DPI_PRESETS = 5;
165
+ export const AEROX5_WIRELESS_BATTERY_RESPONSE_LENGTH = 2;
166
+ const BATTERY_CHARGING_FLAG = 0b10000000;
167
+ export class Aerox5WirelessProtocolError extends Error {
168
+ }
169
+ /** The 180 DPI values the shared TrueMove Air sensor table can express, ascending. */
170
+ export function steelseriesAerox5WirelessDpiOptions() {
171
+ return [...TRUEMOVE_AIR_DPI_TO_BYTE.keys()].sort((a, b) => a - b);
172
+ }
173
+ /**
174
+ * `2D <count> <selected> <v1>…<vN>` (or `6D …` in 2.4 GHz mode). One byte
175
+ * per DPI; `selectedIndex` is 0-based and encoded 0-based on the wire
176
+ * (`first_preset: 0`, same as the plain Aerox 5).
177
+ */
178
+ export function steelseriesAerox5WirelessEncodeDpiPresets(presets, selectedIndex, wireless) {
179
+ if (presets.length < 1 || presets.length > AEROX5_WIRELESS_MAX_DPI_PRESETS) {
180
+ throw new Aerox5WirelessProtocolError(`SteelSeries Aerox 5 Wireless supports 1–${AEROX5_WIRELESS_MAX_DPI_PRESETS} DPI presets.`);
181
+ }
182
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
183
+ throw new Aerox5WirelessProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
184
+ }
185
+ const encoded = presets.map((dpi) => {
186
+ const byte = TRUEMOVE_AIR_DPI_TO_BYTE.get(dpi);
187
+ if (byte === undefined) {
188
+ throw new Aerox5WirelessProtocolError(`SteelSeries Aerox 5 Wireless DPI must be ${AEROX5_WIRELESS_DPI_MIN}–${AEROX5_WIRELESS_DPI_MAX.toLocaleString()} in ${AEROX5_WIRELESS_DPI_STEP} DPI steps.`);
189
+ }
190
+ return byte;
191
+ });
192
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.dpiPresets) : AEROX5_WIRELESS_COMMAND.dpiPresets;
193
+ return new Uint8Array([...command, presets.length, selectedIndex, ...encoded]);
194
+ }
195
+ /** `2B <v>` (`6B` wireless) with 1000→0x00, 500→0x01, 250→0x02, 125→0x03. */
196
+ export function steelseriesAerox5WirelessEncodePollingRate(pollingRateHz, wireless) {
197
+ const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
198
+ if (byte === undefined) {
199
+ throw new Aerox5WirelessProtocolError("SteelSeries Aerox 5 Wireless supports 125, 250, 500, or 1000 Hz polling.");
200
+ }
201
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.pollingRate) : AEROX5_WIRELESS_COMMAND.pollingRate;
202
+ return new Uint8Array([...command, byte]);
203
+ }
204
+ function encodeRgb(r, g, b) {
205
+ for (const channel of [r, g, b]) {
206
+ if (!Number.isInteger(channel) || channel < 0 || channel > 255) {
207
+ throw new Aerox5WirelessProtocolError("RGB channels must be integers 0–255.");
208
+ }
209
+ }
210
+ return [r, g, b];
211
+ }
212
+ const ZONE_INDEX = { 1: 0x00, 2: 0x01, 3: 0x02 };
213
+ /**
214
+ * `21 01 <zone-index> <r> <g> <b>` (`61 01 …` wireless) — a fixed 6-byte
215
+ * packet, **not** the plain Aerox 5's bitmask-plus-padding shape. Zone 1 =
216
+ * top LED, zone 2 = middle LED, zone 3 = bottom LED (strip order, per the
217
+ * source's CLI flag labels).
218
+ */
219
+ export function steelseriesAerox5WirelessEncodeZoneColor(zone, r, g, b, wireless) {
220
+ const zoneIndex = ZONE_INDEX[zone];
221
+ if (zoneIndex === undefined) {
222
+ throw new Aerox5WirelessProtocolError("SteelSeries Aerox 5 Wireless has zones 1 (top), 2 (middle), and 3 (bottom) only.");
223
+ }
224
+ const [red, green, blue] = encodeRgb(r, g, b);
225
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.zoneColor) : AEROX5_WIRELESS_COMMAND.zoneColor;
226
+ return new Uint8Array([...command, zoneIndex, red, green, blue]);
227
+ }
228
+ /**
229
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled
230
+ * (`66 …` wireless) — same shape as `./aerox3.ts`/`./aerox5.ts`.
231
+ */
232
+ export function steelseriesAerox5WirelessEncodeReactiveColor(color, wireless) {
233
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.reactiveColor) : AEROX5_WIRELESS_COMMAND.reactiveColor;
234
+ if (color === null) {
235
+ return new Uint8Array([...command, 0x00, 0x00, 0x00, 0x00, 0x00]);
236
+ }
237
+ const [r, g, b] = encodeRgb(color.r, color.g, color.b);
238
+ return new Uint8Array([...command, 0x01, 0x00, r, g, b]);
239
+ }
240
+ function encodeRangeLE3(value, min, max, unit, msPerUnit) {
241
+ if (!Number.isInteger(value) || value < min || value > max) {
242
+ throw new Aerox5WirelessProtocolError(`SteelSeries Aerox 5 Wireless ${unit} must be an integer ${min}–${max}.`);
243
+ }
244
+ const ms = value * msPerUnit;
245
+ return [ms & 0xff, (ms >> 8) & 0xff, (ms >> 16) & 0xff];
246
+ }
247
+ /**
248
+ * `29 <ms LE24>` (`69 …` wireless) — idle minutes before sleep, `0` disables.
249
+ * Encoded as `minutes * 60000` milliseconds, little-endian 3 bytes (see
250
+ * module doc comment for the range-handler derivation).
251
+ */
252
+ export function steelseriesAerox5WirelessEncodeSleepTimer(minutes, wireless) {
253
+ const bytes = encodeRangeLE3(minutes, 0, 20, "sleep timer minutes", 60_000);
254
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.sleepTimer) : AEROX5_WIRELESS_COMMAND.sleepTimer;
255
+ return new Uint8Array([...command, ...bytes]);
256
+ }
257
+ /**
258
+ * `23 0F 01 00 00 <ms LE24>` (`63 …` wireless) — idle seconds before the LEDs
259
+ * dim, `0` disables. Encoded as `seconds * 1000` milliseconds, little-endian
260
+ * 3 bytes.
261
+ */
262
+ export function steelseriesAerox5WirelessEncodeDimTimer(seconds, wireless) {
263
+ const bytes = encodeRangeLE3(seconds, 0, 1200, "dim timer seconds", 1_000);
264
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.dimTimer) : AEROX5_WIRELESS_COMMAND.dimTimer;
265
+ return new Uint8Array([...command, ...bytes]);
266
+ }
267
+ /** `22 FF` (`62 FF` wireless) — enables the rainbow effect on all zones; a color write clears it. */
268
+ export function steelseriesAerox5WirelessEncodeRainbowEffect(wireless) {
269
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.rainbowEffect) : AEROX5_WIRELESS_COMMAND.rainbowEffect;
270
+ return new Uint8Array(command);
271
+ }
272
+ /** Byte-identical to the plain Aerox 5's `AEROX5_DEFAULT_LIGHTING` table. */
273
+ export const AEROX5_WIRELESS_DEFAULT_LIGHTING = {
274
+ off: [0x00, 0x00],
275
+ reactive: [0x00, 0x01],
276
+ rainbow: [0x01, 0x00],
277
+ "reactive-rainbow": [0x01, 0x01],
278
+ };
279
+ /** `27 <v1> <v2>` (`67 …` wireless) — what the mouse lights up as before a host ever connects. */
280
+ export function steelseriesAerox5WirelessEncodeDefaultLighting(mode, wireless) {
281
+ const bytes = AEROX5_WIRELESS_DEFAULT_LIGHTING[mode];
282
+ if (bytes === undefined) {
283
+ throw new Aerox5WirelessProtocolError(`SteelSeries Aerox 5 Wireless default lighting must be one of: ${Object.keys(AEROX5_WIRELESS_DEFAULT_LIGHTING).join(", ")}.`);
284
+ }
285
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.defaultLighting) : AEROX5_WIRELESS_COMMAND.defaultLighting;
286
+ return new Uint8Array([...command, ...bytes]);
287
+ }
288
+ /** `11 00` wired-mode / `51 00` 2.4 GHz-mode — commit the current settings to onboard flash. */
289
+ export function steelseriesAerox5WirelessSaveCommand(wireless) {
290
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_SAVE_COMMAND) : AEROX5_WIRELESS_SAVE_COMMAND;
291
+ return new Uint8Array(command);
292
+ }
293
+ /** `92` wired-mode / `D2` 2.4 GHz-mode — the device answers with a two-byte input report. */
294
+ export function steelseriesAerox5WirelessBatteryQuery(wireless) {
295
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.batteryLevel) : AEROX5_WIRELESS_COMMAND.batteryLevel;
296
+ return new Uint8Array(command);
297
+ }
298
+ /**
299
+ * Decode the two-byte battery response: `data[0]` is unused by rivalcfg's
300
+ * lambdas, `data[1]`'s top bit is the charging flag and the remaining 7 bits
301
+ * (1-indexed, hence `- 1`) scaled by 5 give the percentage.
302
+ */
303
+ export function steelseriesAerox5WirelessDecodeBattery(payload) {
304
+ if (payload.length < AEROX5_WIRELESS_BATTERY_RESPONSE_LENGTH) {
305
+ throw new Aerox5WirelessProtocolError("SteelSeries Aerox 5 Wireless battery response is shorter than two bytes.");
306
+ }
307
+ const statusByte = payload[1];
308
+ const isCharging = (statusByte & BATTERY_CHARGING_FLAG) !== 0;
309
+ const level = ((statusByte & ~BATTERY_CHARGING_FLAG) - 1) * 5;
310
+ return { level, isCharging };
311
+ }
312
+ /**
313
+ * `buttons_mapping.buttons` from `aerox5_wireless_wired.py` — byte-identical
314
+ * ids/offsets to `./aerox5.ts`'s `AEROX5_BUTTONS`, confirmed by direct
315
+ * comparison of the two device files, defined separately here rather than
316
+ * imported so each family's button table stays self-contained.
317
+ */
318
+ export const AEROX5_WIRELESS_BUTTONS = {
319
+ button1: { id: 0x01, offset: 0x00 },
320
+ button2: { id: 0x02, offset: 0x05 },
321
+ button3: { id: 0x03, offset: 0x0a },
322
+ button4: { id: 0x04, offset: 0x0f },
323
+ button5: { id: 0x05, offset: 0x14 },
324
+ button6: { id: 0x06, offset: 0x19 },
325
+ button7: { id: 0x07, offset: 0x1e },
326
+ button8: { id: 0x08, offset: 0x23 },
327
+ button9: { id: 0x09, offset: 0x28 },
328
+ scrollUp: { id: 0x31, offset: 0x2d },
329
+ scrollDown: { id: 0x32, offset: 0x32 },
330
+ };
331
+ const AEROX5_WIRELESS_BUTTON_FIELD_LENGTH = 5;
332
+ const AEROX5_WIRELESS_BUTTON_DISABLE = 0x00;
333
+ const AEROX5_WIRELESS_BUTTON_DPI_SWITCH = 0x30;
334
+ const AEROX5_WIRELESS_BUTTON_KEYBOARD = 0x51;
335
+ const AEROX5_WIRELESS_BUTTON_MULTIMEDIA = 0x61;
336
+ /**
337
+ * `2A` (`6A` wireless) + one 55-byte (`11 buttons × 5-byte field length`)
338
+ * packet, zero-filled except where a mapping is given. Unmapped buttons are
339
+ * left as all-zero fields (rivalcfg instead fills in per-button defaults;
340
+ * this codec leaves that policy to the caller — pass every button
341
+ * explicitly for parity with rivalcfg's default profile).
342
+ */
343
+ export function steelseriesAerox5WirelessEncodeButtonsMapping(mapping, wireless) {
344
+ const names = Object.keys(AEROX5_WIRELESS_BUTTONS);
345
+ const packet = new Array(names.length * AEROX5_WIRELESS_BUTTON_FIELD_LENGTH).fill(0x00);
346
+ for (const [name, action] of Object.entries(mapping)) {
347
+ const slot = AEROX5_WIRELESS_BUTTONS[name];
348
+ if (!slot) {
349
+ throw new Aerox5WirelessProtocolError(`Unknown SteelSeries Aerox 5 Wireless button "${name}".`);
350
+ }
351
+ const { offset } = slot;
352
+ switch (action.type) {
353
+ case "button": {
354
+ packet[offset] = AEROX5_WIRELESS_BUTTONS[action.target].id;
355
+ break;
356
+ }
357
+ case "disabled": {
358
+ packet[offset] = AEROX5_WIRELESS_BUTTON_DISABLE;
359
+ break;
360
+ }
361
+ case "dpiSwitch": {
362
+ packet[offset] = AEROX5_WIRELESS_BUTTON_DPI_SWITCH;
363
+ break;
364
+ }
365
+ case "keyboard": {
366
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
367
+ throw new Aerox5WirelessProtocolError("Keyboard scan codes must be integers 0–255.");
368
+ }
369
+ packet[offset] = AEROX5_WIRELESS_BUTTON_KEYBOARD;
370
+ packet[offset + 1] = action.code;
371
+ break;
372
+ }
373
+ case "multimedia": {
374
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
375
+ throw new Aerox5WirelessProtocolError("Multimedia key codes must be integers 0–255.");
376
+ }
377
+ packet[offset] = AEROX5_WIRELESS_BUTTON_MULTIMEDIA;
378
+ packet[offset + 1] = action.code;
379
+ break;
380
+ }
381
+ default: {
382
+ throw new Aerox5WirelessProtocolError("Unsupported SteelSeries Aerox 5 Wireless button action.");
383
+ }
384
+ }
385
+ }
386
+ const command = wireless ? applyWirelessFlag(AEROX5_WIRELESS_COMMAND.buttonsMapping) : AEROX5_WIRELESS_COMMAND.buttonsMapping;
387
+ return new Uint8Array([...command, ...packet]);
388
+ }
389
+ //# sourceMappingURL=aerox5-wireless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox5-wireless.js","sourceRoot":"","sources":["../../src/steelseries/aerox5-wireless.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * SteelSeries Aerox 5 (wired-only) configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox5.py` — the primary source for every
7
+ * command byte and default here. This profile covers only `1038:1850`
8
+ * ("SteelSeries Aerox 5", endpoint 3) — the plain wired mouse, **not** the
9
+ * separately-sold Aerox 5 Wireless. See `./aerox5-wireless.ts` for that
10
+ * device: it is a genuinely different command layout (different DPI
11
+ * command polling-rate byte values, different RGB zone packing, extra
12
+ * sleep/dim timers, a fixed-argument rainbow command, and a battery read),
13
+ * not just this module with different product ids swapped in. Do not
14
+ * assume the two share a codec.
15
+ * - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — the DPI byte table for
16
+ * this device's TrueMove Air sensor. **Not** `./rival3.ts`'s
17
+ * `TRUEMOVE_CORE_DPI_TO_BYTE` (Aerox 3's sensor) — reused verbatim here
18
+ * from `./rival3-wireless.ts`'s `TRUEMOVE_AIR_DPI_TO_BYTE` instead, since
19
+ * `aerox5.py`'s `output_choices: truemove_air.choices` is byte-for-byte
20
+ * the same table rivalcfg already uses for the Rival 3 Wireless (both spot
21
+ * checked: 400→0x04, 1600→0x12, 18000→0xD6).
22
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — the DPI preset
23
+ * packet shape, same handler as Aerox 3/Rival 3 Wireless, `dpi_length_byte: 1`
24
+ * (one byte per preset, unlike Rival 3 Wireless's two). **`first_preset: 0`
25
+ * here** — unlike Aerox 3 and Rival 3 Wireless (both `first_preset: 1`),
26
+ * `aerox5.py` encodes the selected index directly with no +1 offset. This
27
+ * is the one place this device's DPI framing differs from Aerox 3's
28
+ * despite sharing the same command byte and one-byte preset width.
29
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` / `reactive_rgbcolor.py` — RGB
30
+ * value encoding, byte-identical to `./aerox3.ts`'s usage.
31
+ * - rivalcfg `rivalcfg/handlers/range.py` — LED brightness (linear 0–100
32
+ * passthrough, `range_length_byte` omitted so 1 byte).
33
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
34
+ * field layout, 5 bytes/button, but **9 physical buttons plus scroll
35
+ * up/down** (`button1`…`button9`, `scrollup`, `scrolldown` — 11 slots, 55
36
+ * bytes total) instead of Aerox 3's 6 buttons plus scroll (8 slots).
37
+ * Offsets step by 5 for buttons 1–9 (`0x00`…`0x28`) then scroll up/down
38
+ * continue the same stride (`0x2D`, `0x32`).
39
+ *
40
+ * ## Why this is a separate protocol family from Aerox 3 despite similar shape
41
+ *
42
+ * Superficially close to `./aerox3.ts` (same `0x2D`/`0x2B`/`0x21`/`0x26`/
43
+ * `0x23`/`0x22`/`0x2A`/`0x27`/`0x11 00` command bytes, same RGB zone
44
+ * bitmask-and-padding packing), but genuinely different in the details that
45
+ * matter for correctness:
46
+ *
47
+ * - Different DPI sensor table (TrueMove Air vs. TrueMove Core) — same
48
+ * command byte, disjoint value bytes.
49
+ * - `first_preset: 0` vs. Aerox 3's `first_preset: 1` (see above).
50
+ * - 9 buttons + scroll vs. Aerox 3's 6 buttons + scroll — different packet
51
+ * length and offsets past button 5.
52
+ * - `aerox5.py`'s `rainbow_effect` and `default_lighting` choice tables are
53
+ * byte-identical to `aerox3.py`'s, confirmed by direct comparison, not
54
+ * assumed — reused as identical constants rather than re-derived.
55
+ *
56
+ * Given these differences, PID `0x1850` is registered under its own family
57
+ * (`"aerox5"`), not folded into `"aerox3"`.
58
+ *
59
+ * No corroborating libratbag or OpenRGB source for `1038:1850` specifically
60
+ * was available in this environment (no local libratbag checkout, and
61
+ * OpenRGB's SteelSeries controller files were not reachable this pass) —
62
+ * every command byte above is sourced from rivalcfg alone, same
63
+ * single-source caveat cluster 2 flagged for the Rival 3 Wireless. This
64
+ * should be treated as unverified beyond rivalcfg until corroborated or
65
+ * hardware-tested.
66
+ *
67
+ * Every command is an HID output report, report id `0x00`, on the vendor
68
+ * configuration interface (`"endpoint": 3`). This module is write-only —
69
+ * `aerox5.py` defines no getter for any setting and no firmware-query
70
+ * command, same as Aerox 3. Settings apply immediately; the save command
71
+ * (`11 00`) persists them to onboard flash. None of this has been verified
72
+ * on physical hardware by this project.
73
+ */
74
+ export declare const AEROX5_REPORT_ID = 0;
75
+ /** One-byte command prefixes; the payload is the prefix plus its arguments. */
76
+ export declare const AEROX5_COMMAND: {
77
+ readonly dpiPresets: readonly [45];
78
+ readonly pollingRate: readonly [43];
79
+ readonly reactiveColor: readonly [38];
80
+ readonly ledBrightness: readonly [35];
81
+ readonly rainbowEffect: readonly [34];
82
+ readonly buttonsMapping: readonly [42];
83
+ readonly defaultLighting: readonly [39];
84
+ readonly zoneColor: readonly [33];
85
+ };
86
+ /** `11 00` — same byte-pair as Aerox 3's save command. */
87
+ export declare const AEROX5_SAVE_COMMAND: readonly [17, 0];
88
+ export declare const AEROX5_POLLING_RATES: readonly [125, 250, 500, 1000];
89
+ export declare const AEROX5_DPI_MIN = 100;
90
+ export declare const AEROX5_DPI_MAX = 18000;
91
+ export declare const AEROX5_DPI_STEP = 100;
92
+ export declare const AEROX5_MAX_DPI_PRESETS = 5;
93
+ export declare class Aerox5ProtocolError extends Error {
94
+ }
95
+ /** The 180 DPI values the shared TrueMove Air sensor table can express, ascending. */
96
+ export declare function steelseriesAerox5DpiOptions(): number[];
97
+ /**
98
+ * `2D <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
99
+ * table. One byte per DPI (`dpi_length_byte: 1`). `selectedIndex` is 0-based
100
+ * and encoded 0-based on the wire (`first_preset: 0` — unlike Aerox 3's
101
+ * `first_preset: 1`, no +1 offset here).
102
+ */
103
+ export declare function steelseriesAerox5EncodeDpiPresets(presets: readonly number[], selectedIndex: number): Uint8Array;
104
+ /** `2B <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04 — same mapping as Aerox 3. */
105
+ export declare function steelseriesAerox5EncodePollingRate(pollingRateHz: number): Uint8Array;
106
+ export type Aerox5Zone = 1 | 2 | 3;
107
+ /**
108
+ * `21 <bitmask> <padding for skipped zones> <r> <g> <b>` — identical packing
109
+ * to `./aerox3.ts`'s zone-color command: zone 1 = top LED, zone 2 = middle
110
+ * LED, zone 3 = bottom LED.
111
+ */
112
+ export declare function steelseriesAerox5EncodeZoneColor(zone: Aerox5Zone, r: number, g: number, b: number): Uint8Array;
113
+ /**
114
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled —
115
+ * byte-identical to `./aerox3.ts`'s reactive-color command.
116
+ */
117
+ export declare function steelseriesAerox5EncodeReactiveColor(color: {
118
+ r: number;
119
+ g: number;
120
+ b: number;
121
+ } | null): Uint8Array;
122
+ /** `23 <v>` — linear 0–100 passthrough. */
123
+ export declare function steelseriesAerox5EncodeLedBrightness(percent: number): Uint8Array;
124
+ /** Byte-identical to `AEROX3_RAINBOW_ZONES`, confirmed by direct comparison of the two device files. */
125
+ export declare const AEROX5_RAINBOW_ZONES: {
126
+ readonly all: 7;
127
+ readonly bottom: 4;
128
+ readonly middle: 2;
129
+ readonly top: 1;
130
+ readonly "bottom-middle": 6;
131
+ readonly "middle-top": 3;
132
+ readonly "bottom-top": 5;
133
+ };
134
+ export type Aerox5RainbowZones = keyof typeof AEROX5_RAINBOW_ZONES;
135
+ /** `22 <bitmask>` — rainbow effect on the selected zone(s); cleared by setting a color. */
136
+ export declare function steelseriesAerox5EncodeRainbowEffect(zones: Aerox5RainbowZones): Uint8Array;
137
+ /** Byte-identical to `AEROX3_DEFAULT_LIGHTING`, confirmed by direct comparison of the two device files. */
138
+ export declare const AEROX5_DEFAULT_LIGHTING: {
139
+ readonly off: readonly [0, 0];
140
+ readonly reactive: readonly [0, 1];
141
+ readonly rainbow: readonly [1, 0];
142
+ readonly "reactive-rainbow": readonly [1, 1];
143
+ };
144
+ export type Aerox5DefaultLighting = keyof typeof AEROX5_DEFAULT_LIGHTING;
145
+ /** `27 <v1> <v2>` — what the mouse lights up as before a host ever connects. */
146
+ export declare function steelseriesAerox5EncodeDefaultLighting(mode: Aerox5DefaultLighting): Uint8Array;
147
+ /** `11 00` — commit the current settings to onboard flash. */
148
+ export declare function steelseriesAerox5SaveCommand(): Uint8Array;
149
+ /**
150
+ * `buttons_mapping.buttons` from `aerox5.py`, id + byte offset into the
151
+ * packet — 9 physical buttons (this mouse's extra side-button cluster over
152
+ * Aerox 3's 6) plus scroll up/down, 11 slots total.
153
+ */
154
+ export declare const AEROX5_BUTTONS: {
155
+ readonly button1: {
156
+ readonly id: 1;
157
+ readonly offset: 0;
158
+ };
159
+ readonly button2: {
160
+ readonly id: 2;
161
+ readonly offset: 5;
162
+ };
163
+ readonly button3: {
164
+ readonly id: 3;
165
+ readonly offset: 10;
166
+ };
167
+ readonly button4: {
168
+ readonly id: 4;
169
+ readonly offset: 15;
170
+ };
171
+ readonly button5: {
172
+ readonly id: 5;
173
+ readonly offset: 20;
174
+ };
175
+ readonly button6: {
176
+ readonly id: 6;
177
+ readonly offset: 25;
178
+ };
179
+ readonly button7: {
180
+ readonly id: 7;
181
+ readonly offset: 30;
182
+ };
183
+ readonly button8: {
184
+ readonly id: 8;
185
+ readonly offset: 35;
186
+ };
187
+ readonly button9: {
188
+ readonly id: 9;
189
+ readonly offset: 40;
190
+ };
191
+ readonly scrollUp: {
192
+ readonly id: 49;
193
+ readonly offset: 45;
194
+ };
195
+ readonly scrollDown: {
196
+ readonly id: 50;
197
+ readonly offset: 50;
198
+ };
199
+ };
200
+ export type Aerox5ButtonName = keyof typeof AEROX5_BUTTONS;
201
+ /**
202
+ * One button's target. `scrollUp`/`scrollDown` cannot be remap *targets*
203
+ * (`button_scroll_up`/`button_scroll_down` are `None` in `aerox5.py`) — only
204
+ * sources; attempting to target them is rejected, same rule as Aerox 3.
205
+ */
206
+ export type Aerox5ButtonAction = {
207
+ type: "button";
208
+ target: Exclude<Aerox5ButtonName, "scrollUp" | "scrollDown">;
209
+ } | {
210
+ type: "disabled";
211
+ } | {
212
+ type: "dpiSwitch";
213
+ } | {
214
+ type: "keyboard";
215
+ code: number;
216
+ } | {
217
+ type: "multimedia";
218
+ code: number;
219
+ };
220
+ /**
221
+ * `2A` + one 55-byte (`11 buttons × 5-byte field length`) packet, zero-filled
222
+ * except where a mapping is given. Unmapped buttons are left as all-zero
223
+ * fields (rivalcfg instead fills in per-button defaults; this codec leaves
224
+ * that policy to the caller — pass every button explicitly for parity with
225
+ * rivalcfg's default profile).
226
+ */
227
+ export declare function steelseriesAerox5EncodeButtonsMapping(mapping: Partial<Record<Aerox5ButtonName, Aerox5ButtonAction>>): Uint8Array;
228
+ //# sourceMappingURL=aerox5.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox5.d.ts","sourceRoot":"","sources":["../../src/steelseries/aerox5.ts"],"names":[],"mappings":"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"}