@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,51 @@
1
+ export const RAZER_V4_REPORT_ID = 0;
2
+ export const RAZER_V4_REPORT_LENGTH = 90;
3
+ export const RAZER_V4_PRODUCTS = new Map([
4
+ [0x00e5, { wireless: false }],
5
+ [0x00e6, { wireless: true }],
6
+ ]);
7
+ export const RAZER_V4_MAX_DPI_STAGES = 5;
8
+ export const RAZER_V4_POLLING_CODES = new Map([
9
+ [125, 0x40], [500, 0x10], [1000, 0x08], [2000, 0x04], [4000, 0x02], [8000, 0x01],
10
+ ]);
11
+ export function razerV4Crc(report) {
12
+ let crc = 0;
13
+ for (let index = 2; index <= 87; index += 1)
14
+ crc ^= report[index] ?? 0;
15
+ return crc;
16
+ }
17
+ export function buildRazerV4Report(commandClass, commandId, dataSize, args = new Uint8Array()) {
18
+ if (args.length > 80)
19
+ throw new Error("Razer command payload is too large.");
20
+ if (!Number.isInteger(dataSize) || dataSize < 0 || dataSize > 80)
21
+ throw new Error("Razer command data size is invalid.");
22
+ const report = new Uint8Array(RAZER_V4_REPORT_LENGTH);
23
+ report[1] = 0x1f;
24
+ report[5] = dataSize;
25
+ report[6] = commandClass;
26
+ report[7] = commandId;
27
+ report.set(args, 8);
28
+ report[88] = razerV4Crc(report);
29
+ return report;
30
+ }
31
+ export function decodeRazerV4DpiState(args) {
32
+ const count = Math.min(args[2] ?? 0, RAZER_V4_MAX_DPI_STAGES);
33
+ const stages = [];
34
+ for (let index = 0; index < count; index += 1) {
35
+ const offset = 3 + index * 7;
36
+ stages.push({
37
+ x: ((args[offset + 1] ?? 0) << 8) | (args[offset + 2] ?? 0),
38
+ y: ((args[offset + 3] ?? 0) << 8) | (args[offset + 4] ?? 0),
39
+ });
40
+ }
41
+ if (!stages.length)
42
+ throw new Error("The Viper V4 Pro reported no DPI stages.");
43
+ return { activeStage: Math.min(Math.max((args[1] ?? 1) - 1, 0), stages.length - 1), stages };
44
+ }
45
+ export function decodeRazerV4PollingCode(code) {
46
+ const rate = [...RAZER_V4_POLLING_CODES].find(([, candidate]) => candidate === code)?.[0];
47
+ if (!rate)
48
+ throw new Error(`The Viper V4 Pro reported unknown polling code 0x${(code ?? 0).toString(16)}.`);
49
+ return rate;
50
+ }
51
+ //# sourceMappingURL=v4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v4.js","sourceRoot":"","sources":["../../src/razer/v4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * SteelSeries Aerox 3 configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox3.py` — the primary source for every
7
+ * command byte and default here.
8
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` (DPI presets, shared
9
+ * with Rival 3 Gen 1 but with a one-byte command prefix instead of two) and
10
+ * `rivalcfg/devices/dpi/truemove_core.py` (the DPI byte table — reused from
11
+ * `./rival3.ts`'s `TRUEMOVE_CORE_DPI_TO_BYTE`, not re-derived, since both
12
+ * devices use the same TrueMove Core sensor and rivalcfg quotes the same
13
+ * table for both).
14
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` and `reactive_rgbcolor.py` — RGB
15
+ * value encoding (`[r,g,b]`, and `[0x01,0x00,r,g,b]` / `[0x00,0x00,0x00,0x00,0x00]`
16
+ * for the on/off reactive-color field).
17
+ * - rivalcfg `rivalcfg/handlers/range.py` and `choice.py` — LED brightness
18
+ * (linear 0–100 passthrough) and the rainbow-effect/default-lighting
19
+ * choice tables.
20
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
21
+ * field layout (5 bytes/button, zero-filled, `offset`/`id` per button).
22
+ * - rivalcfg `rivalcfg/devices/rival3_gen2.py` — corroborates that `0x1038:0x1870`
23
+ * (Rival 3 Gen 2) shares the Aerox 3's color/brightness/rainbow/buttons/
24
+ * default-lighting/save commands, but see the PR #269 note below: its DPI
25
+ * command differs, so this module intentionally does not claim that PID.
26
+ *
27
+ * ## PR #269 reconciliation (SteelSeries Rival 3 Gen 2, `1038:1870`)
28
+ *
29
+ * flozz/rivalcfg#269 (closed, hardware-confirmed by its author for DPI,
30
+ * polling, and RGB) claims the Rival 3 Gen 2 uses "the identical Aerox 3
31
+ * protocol" at `1038:1870`, endpoint 3. rivalcfg's own mainline
32
+ * `devices/rival3_gen2.py` does ship that exact vendor/product/endpoint
33
+ * triple, confirming the PID half of the PR's claim. **The protocols are not
34
+ * byte-identical, though**: Aerox 3's DPI-preset command is `0x2D` using the
35
+ * `multidpi_range_choice` handler (one DPI byte per preset), while mainline
36
+ * Rival 3 Gen 2 uses command `0x34` with the `multidpi_range_choice_xy`
37
+ * handler (independent X/Y DPI per preset, `"xy_mapping": "xyxy"`, two bytes
38
+ * per axis pair). Every other setting (polling rate `0x2B`, RGB zones `0x21`,
39
+ * reactive color `0x26`, brightness `0x23`, rainbow `0x22`, buttons `0x2A`,
40
+ * default lighting `0x27`, save `0x11 0x00`) is byte-identical between the
41
+ * two mainline device files. Per this rollout's instructions, rivalcfg's
42
+ * mainline file is treated as authoritative over the PR description, and
43
+ * because the DPI command genuinely differs, `1038:0x1870` is **not** added
44
+ * to this module's or any registry's product table here — a Rival 3 Gen 2
45
+ * driver needs its own DPI encoder and is out of scope for this cluster
46
+ * (Aerox 3 only). Nothing in this file claims or matches that PID.
47
+ *
48
+ * Every command is an HID **output report** with report id 0x00 on the
49
+ * vendor configuration interface (hidapi `endpoint` / `interface_number ==
50
+ * 3`, per the `"endpoint": 3` model entry — same interface convention as
51
+ * Rival 3 Gen 1). The functions here build the report *payload* — the bytes
52
+ * after the report id — unpadded, matching rivalcfg's `usbhid.py` writes.
53
+ *
54
+ * **This device is write-only, like Rival 3 Gen 1.** `aerox3.py` defines no
55
+ * getter for any setting and no firmware-query command (Rival 3 Gen 1's
56
+ * `10 00` has no Aerox 3 counterpart in rivalcfg, libratbag, or the OpenRGB
57
+ * SteelSeries controller files checked for this device). There is nothing to
58
+ * probe the mouse with, so the HID client cannot use a firmware read as a
59
+ * connectivity check the way `SteelSeriesRival3HidClient` does; it must treat
60
+ * a successful `open()` as the only available signal. Session state must be
61
+ * tracked client-side with `valuesVerified: false`, exactly as Rival 3 does.
62
+ *
63
+ * Settings apply immediately; the save command (`11 00`, distinct from Rival
64
+ * 3 Gen 1's `09 00` — do not confuse the two) persists them to onboard flash.
65
+ * None of this has been verified on physical Aerox 3 hardware by this
66
+ * project.
67
+ *
68
+ * ## RGB zone command layout
69
+ *
70
+ * All three zone-color settings share one underlying packet shape, visible
71
+ * once the escalating prefixes in `aerox3.py` are read against the LED_ID
72
+ * bitmask comment preserved in rivalcfg's `rival3_gen2.py` (same command
73
+ * family): `21 <LED_ID bitmask> <zone1 r,g,b> <zone2 r,g,b> <zone3 r,g,b>`.
74
+ * `LED_ID` selects which zone(s) the device should actually update; the RGB
75
+ * slots for zones the bitmask does not select are sent as zero padding and
76
+ * ignored by the device. That is why `z1_color`'s command is `[0x21,0x01]`
77
+ * (bitmask `0b001`, immediately followed by that zone's RGB — no padding
78
+ * needed, its slot is first), `z2_color`'s is `[0x21,0x02,0x00,0x00,0x00]`
79
+ * (bitmask `0b010`, three zero bytes filling the skipped zone-1 slot before
80
+ * zone 2's RGB), and `z3_color`'s is `[0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00]`
81
+ * (bitmask `0b100`, six zero bytes filling the skipped zone-1 and zone-2
82
+ * slots before zone 3's RGB). This module exposes one `steelseriesAerox3EncodeZoneColor`
83
+ * function parameterized on zone 1–3 rather than three near-duplicate
84
+ * functions, producing byte-identical output to each `aerox3.py` command.
85
+ *
86
+ * ## Button mapping — deliberately reduced scope
87
+ *
88
+ * rivalcfg's `buttons` handler supports remapping to another mouse button,
89
+ * a disable/DPI-switch/scroll special action, or a keyboard/multimedia key
90
+ * chosen from large per-layout tables (`handlers/buttons/layout_qwerty.py`,
91
+ * `layout_multimedia.py`). This module implements the exact 5-byte/button,
92
+ * zero-filled packet shape and the mouse-button/disable/DPI-switch/scroll
93
+ * special actions, but does not re-implement rivalcfg's QWERTY or multimedia
94
+ * key-name tables: keyboard and multimedia targets are taken here as raw
95
+ * `{ type: "keyboard" | "multimedia", code }` scan-code bytes rather than
96
+ * name strings, matching `button_keyboard: 0x51` / `button_multimedia: 0x61`
97
+ * verbatim. This is the same kind of scope line `rival3.ts` draws around
98
+ * lighting effects it documents but does not implement.
99
+ */
100
+ export declare const AEROX3_REPORT_ID = 0;
101
+ /** One-byte command prefixes; the payload is the prefix plus its arguments. */
102
+ export declare const AEROX3_COMMAND: {
103
+ readonly dpiPresets: readonly [45];
104
+ readonly pollingRate: readonly [43];
105
+ readonly reactiveColor: readonly [38];
106
+ readonly ledBrightness: readonly [35];
107
+ readonly rainbowEffect: readonly [34];
108
+ readonly buttonsMapping: readonly [42];
109
+ readonly defaultLighting: readonly [39];
110
+ readonly zoneColor: readonly [33];
111
+ };
112
+ /** `11 00` — distinct from Rival 3 Gen 1's `09 00`; do not reuse across families. */
113
+ export declare const AEROX3_SAVE_COMMAND: readonly [17, 0];
114
+ export declare const AEROX3_POLLING_RATES: readonly [125, 250, 500, 1000];
115
+ export declare const AEROX3_DPI_MIN = 200;
116
+ export declare const AEROX3_DPI_MAX = 8500;
117
+ export declare const AEROX3_DPI_STEP = 100;
118
+ export declare const AEROX3_MAX_DPI_PRESETS = 5;
119
+ export declare class Aerox3ProtocolError extends Error {
120
+ }
121
+ /** The 84 DPI values the shared TrueMove Core sensor table can express, ascending. */
122
+ export declare function steelseriesAerox3DpiOptions(): number[];
123
+ /**
124
+ * `2D <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
125
+ * table. One byte per DPI (`dpi_length_byte: 1`); `selectedIndex` is 0-based
126
+ * here and encoded 1-based on the wire (`first_preset: 1`).
127
+ */
128
+ export declare function steelseriesAerox3EncodeDpiPresets(presets: readonly number[], selectedIndex: number): Uint8Array;
129
+ /** `2B <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
130
+ export declare function steelseriesAerox3EncodePollingRate(pollingRateHz: number): Uint8Array;
131
+ export type Aerox3Zone = 1 | 2 | 3;
132
+ /**
133
+ * `21 <bitmask> <padding for skipped zones> <r> <g> <b>` — see the module
134
+ * doc comment for how the zero-padding length grows with the zone number.
135
+ * Zone 1 = top LED, zone 2 = middle LED, zone 3 = bottom LED (strip order,
136
+ * per `aerox3.py`'s CLI flag labels).
137
+ */
138
+ export declare function steelseriesAerox3EncodeZoneColor(zone: Aerox3Zone, r: number, g: number, b: number): Uint8Array;
139
+ /**
140
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled —
141
+ * the color the LEDs flash to in reaction to a button click.
142
+ */
143
+ export declare function steelseriesAerox3EncodeReactiveColor(color: {
144
+ r: number;
145
+ g: number;
146
+ b: number;
147
+ } | null): Uint8Array;
148
+ /** `23 <v>` — linear 0–100 passthrough (`output_range` matches `input_range`). */
149
+ export declare function steelseriesAerox3EncodeLedBrightness(percent: number): Uint8Array;
150
+ export declare const AEROX3_RAINBOW_ZONES: {
151
+ readonly all: 7;
152
+ readonly bottom: 4;
153
+ readonly middle: 2;
154
+ readonly top: 1;
155
+ readonly "bottom-middle": 6;
156
+ readonly "middle-top": 3;
157
+ readonly "bottom-top": 5;
158
+ };
159
+ export type Aerox3RainbowZones = keyof typeof AEROX3_RAINBOW_ZONES;
160
+ /** `22 <bitmask>` — rainbow effect on the selected zone(s); cleared by setting a color. */
161
+ export declare function steelseriesAerox3EncodeRainbowEffect(zones: Aerox3RainbowZones): Uint8Array;
162
+ export declare const AEROX3_DEFAULT_LIGHTING: {
163
+ readonly off: readonly [0, 0];
164
+ readonly reactive: readonly [0, 1];
165
+ readonly rainbow: readonly [1, 0];
166
+ readonly "reactive-rainbow": readonly [1, 1];
167
+ };
168
+ export type Aerox3DefaultLighting = keyof typeof AEROX3_DEFAULT_LIGHTING;
169
+ /** `27 <v1> <v2>` — what the mouse lights up as before a host ever connects. */
170
+ export declare function steelseriesAerox3EncodeDefaultLighting(mode: Aerox3DefaultLighting): Uint8Array;
171
+ /** `11 00` — commit the current settings to onboard flash. */
172
+ export declare function steelseriesAerox3SaveCommand(): Uint8Array;
173
+ /** `buttons_mapping.buttons` from `aerox3.py`, id + byte offset into the packet. */
174
+ export declare const AEROX3_BUTTONS: {
175
+ readonly button1: {
176
+ readonly id: 1;
177
+ readonly offset: 0;
178
+ };
179
+ readonly button2: {
180
+ readonly id: 2;
181
+ readonly offset: 5;
182
+ };
183
+ readonly button3: {
184
+ readonly id: 3;
185
+ readonly offset: 10;
186
+ };
187
+ readonly button4: {
188
+ readonly id: 4;
189
+ readonly offset: 15;
190
+ };
191
+ readonly button5: {
192
+ readonly id: 5;
193
+ readonly offset: 20;
194
+ };
195
+ readonly button6: {
196
+ readonly id: 6;
197
+ readonly offset: 25;
198
+ };
199
+ readonly scrollUp: {
200
+ readonly id: 49;
201
+ readonly offset: 30;
202
+ };
203
+ readonly scrollDown: {
204
+ readonly id: 50;
205
+ readonly offset: 35;
206
+ };
207
+ };
208
+ export type Aerox3ButtonName = keyof typeof AEROX3_BUTTONS;
209
+ /**
210
+ * One button's target. `scrollUp`/`scrollDown` cannot be remap *targets*
211
+ * (`button_scroll_up`/`button_scroll_down` are `None` in `aerox3.py`) — only
212
+ * sources; attempting to target them is rejected.
213
+ */
214
+ export type Aerox3ButtonAction = {
215
+ type: "button";
216
+ target: Exclude<Aerox3ButtonName, "scrollUp" | "scrollDown">;
217
+ } | {
218
+ type: "disabled";
219
+ } | {
220
+ type: "dpiSwitch";
221
+ } | {
222
+ type: "keyboard";
223
+ code: number;
224
+ } | {
225
+ type: "multimedia";
226
+ code: number;
227
+ };
228
+ /**
229
+ * `2A` + one 40-byte (`8 buttons × 5-byte field length`) packet, zero-filled
230
+ * except where a mapping is given. Unmapped buttons are left as all-zero
231
+ * fields (rivalcfg instead fills in per-button defaults; this codec leaves
232
+ * that policy to the caller — pass every button explicitly for parity with
233
+ * rivalcfg's default profile).
234
+ */
235
+ export declare function steelseriesAerox3EncodeButtonsMapping(mapping: Partial<Record<Aerox3ButtonName, Aerox3ButtonAction>>): Uint8Array;
236
+ //# sourceMappingURL=aerox3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox3.d.ts","sourceRoot":"","sources":["../../src/steelseries/aerox3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ /**
2
+ * SteelSeries Aerox 3 configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/aerox3.py` — the primary source for every
7
+ * command byte and default here.
8
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` (DPI presets, shared
9
+ * with Rival 3 Gen 1 but with a one-byte command prefix instead of two) and
10
+ * `rivalcfg/devices/dpi/truemove_core.py` (the DPI byte table — reused from
11
+ * `./rival3.ts`'s `TRUEMOVE_CORE_DPI_TO_BYTE`, not re-derived, since both
12
+ * devices use the same TrueMove Core sensor and rivalcfg quotes the same
13
+ * table for both).
14
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` and `reactive_rgbcolor.py` — RGB
15
+ * value encoding (`[r,g,b]`, and `[0x01,0x00,r,g,b]` / `[0x00,0x00,0x00,0x00,0x00]`
16
+ * for the on/off reactive-color field).
17
+ * - rivalcfg `rivalcfg/handlers/range.py` and `choice.py` — LED brightness
18
+ * (linear 0–100 passthrough) and the rainbow-effect/default-lighting
19
+ * choice tables.
20
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
21
+ * field layout (5 bytes/button, zero-filled, `offset`/`id` per button).
22
+ * - rivalcfg `rivalcfg/devices/rival3_gen2.py` — corroborates that `0x1038:0x1870`
23
+ * (Rival 3 Gen 2) shares the Aerox 3's color/brightness/rainbow/buttons/
24
+ * default-lighting/save commands, but see the PR #269 note below: its DPI
25
+ * command differs, so this module intentionally does not claim that PID.
26
+ *
27
+ * ## PR #269 reconciliation (SteelSeries Rival 3 Gen 2, `1038:1870`)
28
+ *
29
+ * flozz/rivalcfg#269 (closed, hardware-confirmed by its author for DPI,
30
+ * polling, and RGB) claims the Rival 3 Gen 2 uses "the identical Aerox 3
31
+ * protocol" at `1038:1870`, endpoint 3. rivalcfg's own mainline
32
+ * `devices/rival3_gen2.py` does ship that exact vendor/product/endpoint
33
+ * triple, confirming the PID half of the PR's claim. **The protocols are not
34
+ * byte-identical, though**: Aerox 3's DPI-preset command is `0x2D` using the
35
+ * `multidpi_range_choice` handler (one DPI byte per preset), while mainline
36
+ * Rival 3 Gen 2 uses command `0x34` with the `multidpi_range_choice_xy`
37
+ * handler (independent X/Y DPI per preset, `"xy_mapping": "xyxy"`, two bytes
38
+ * per axis pair). Every other setting (polling rate `0x2B`, RGB zones `0x21`,
39
+ * reactive color `0x26`, brightness `0x23`, rainbow `0x22`, buttons `0x2A`,
40
+ * default lighting `0x27`, save `0x11 0x00`) is byte-identical between the
41
+ * two mainline device files. Per this rollout's instructions, rivalcfg's
42
+ * mainline file is treated as authoritative over the PR description, and
43
+ * because the DPI command genuinely differs, `1038:0x1870` is **not** added
44
+ * to this module's or any registry's product table here — a Rival 3 Gen 2
45
+ * driver needs its own DPI encoder and is out of scope for this cluster
46
+ * (Aerox 3 only). Nothing in this file claims or matches that PID.
47
+ *
48
+ * Every command is an HID **output report** with report id 0x00 on the
49
+ * vendor configuration interface (hidapi `endpoint` / `interface_number ==
50
+ * 3`, per the `"endpoint": 3` model entry — same interface convention as
51
+ * Rival 3 Gen 1). The functions here build the report *payload* — the bytes
52
+ * after the report id — unpadded, matching rivalcfg's `usbhid.py` writes.
53
+ *
54
+ * **This device is write-only, like Rival 3 Gen 1.** `aerox3.py` defines no
55
+ * getter for any setting and no firmware-query command (Rival 3 Gen 1's
56
+ * `10 00` has no Aerox 3 counterpart in rivalcfg, libratbag, or the OpenRGB
57
+ * SteelSeries controller files checked for this device). There is nothing to
58
+ * probe the mouse with, so the HID client cannot use a firmware read as a
59
+ * connectivity check the way `SteelSeriesRival3HidClient` does; it must treat
60
+ * a successful `open()` as the only available signal. Session state must be
61
+ * tracked client-side with `valuesVerified: false`, exactly as Rival 3 does.
62
+ *
63
+ * Settings apply immediately; the save command (`11 00`, distinct from Rival
64
+ * 3 Gen 1's `09 00` — do not confuse the two) persists them to onboard flash.
65
+ * None of this has been verified on physical Aerox 3 hardware by this
66
+ * project.
67
+ *
68
+ * ## RGB zone command layout
69
+ *
70
+ * All three zone-color settings share one underlying packet shape, visible
71
+ * once the escalating prefixes in `aerox3.py` are read against the LED_ID
72
+ * bitmask comment preserved in rivalcfg's `rival3_gen2.py` (same command
73
+ * family): `21 <LED_ID bitmask> <zone1 r,g,b> <zone2 r,g,b> <zone3 r,g,b>`.
74
+ * `LED_ID` selects which zone(s) the device should actually update; the RGB
75
+ * slots for zones the bitmask does not select are sent as zero padding and
76
+ * ignored by the device. That is why `z1_color`'s command is `[0x21,0x01]`
77
+ * (bitmask `0b001`, immediately followed by that zone's RGB — no padding
78
+ * needed, its slot is first), `z2_color`'s is `[0x21,0x02,0x00,0x00,0x00]`
79
+ * (bitmask `0b010`, three zero bytes filling the skipped zone-1 slot before
80
+ * zone 2's RGB), and `z3_color`'s is `[0x21,0x04,0x00,0x00,0x00,0x00,0x00,0x00]`
81
+ * (bitmask `0b100`, six zero bytes filling the skipped zone-1 and zone-2
82
+ * slots before zone 3's RGB). This module exposes one `steelseriesAerox3EncodeZoneColor`
83
+ * function parameterized on zone 1–3 rather than three near-duplicate
84
+ * functions, producing byte-identical output to each `aerox3.py` command.
85
+ *
86
+ * ## Button mapping — deliberately reduced scope
87
+ *
88
+ * rivalcfg's `buttons` handler supports remapping to another mouse button,
89
+ * a disable/DPI-switch/scroll special action, or a keyboard/multimedia key
90
+ * chosen from large per-layout tables (`handlers/buttons/layout_qwerty.py`,
91
+ * `layout_multimedia.py`). This module implements the exact 5-byte/button,
92
+ * zero-filled packet shape and the mouse-button/disable/DPI-switch/scroll
93
+ * special actions, but does not re-implement rivalcfg's QWERTY or multimedia
94
+ * key-name tables: keyboard and multimedia targets are taken here as raw
95
+ * `{ type: "keyboard" | "multimedia", code }` scan-code bytes rather than
96
+ * name strings, matching `button_keyboard: 0x51` / `button_multimedia: 0x61`
97
+ * verbatim. This is the same kind of scope line `rival3.ts` draws around
98
+ * lighting effects it documents but does not implement.
99
+ */
100
+ import { TRUEMOVE_CORE_DPI_TO_BYTE } from "./rival3.js";
101
+ export const AEROX3_REPORT_ID = 0x00;
102
+ /** One-byte command prefixes; the payload is the prefix plus its arguments. */
103
+ export const AEROX3_COMMAND = {
104
+ dpiPresets: [0x2d],
105
+ pollingRate: [0x2b],
106
+ reactiveColor: [0x26],
107
+ ledBrightness: [0x23],
108
+ rainbowEffect: [0x22],
109
+ buttonsMapping: [0x2a],
110
+ defaultLighting: [0x27],
111
+ zoneColor: [0x21],
112
+ };
113
+ /** `11 00` — distinct from Rival 3 Gen 1's `09 00`; do not reuse across families. */
114
+ export const AEROX3_SAVE_COMMAND = [0x11, 0x00];
115
+ export const AEROX3_POLLING_RATES = [125, 250, 500, 1000];
116
+ const POLLING_RATE_TO_BYTE = new Map([
117
+ [1000, 0x01],
118
+ [500, 0x02],
119
+ [250, 0x03],
120
+ [125, 0x04],
121
+ ]);
122
+ export const AEROX3_DPI_MIN = 200;
123
+ export const AEROX3_DPI_MAX = 8500;
124
+ export const AEROX3_DPI_STEP = 100;
125
+ export const AEROX3_MAX_DPI_PRESETS = 5;
126
+ export class Aerox3ProtocolError extends Error {
127
+ }
128
+ /** The 84 DPI values the shared TrueMove Core sensor table can express, ascending. */
129
+ export function steelseriesAerox3DpiOptions() {
130
+ return [...TRUEMOVE_CORE_DPI_TO_BYTE.keys()].sort((a, b) => a - b);
131
+ }
132
+ /**
133
+ * `2D <count> <selected> <v1>…<vN>` — replaces the mouse's whole preset
134
+ * table. One byte per DPI (`dpi_length_byte: 1`); `selectedIndex` is 0-based
135
+ * here and encoded 1-based on the wire (`first_preset: 1`).
136
+ */
137
+ export function steelseriesAerox3EncodeDpiPresets(presets, selectedIndex) {
138
+ if (presets.length < 1 || presets.length > AEROX3_MAX_DPI_PRESETS) {
139
+ throw new Aerox3ProtocolError(`SteelSeries Aerox 3 supports 1–${AEROX3_MAX_DPI_PRESETS} DPI presets.`);
140
+ }
141
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
142
+ throw new Aerox3ProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
143
+ }
144
+ const encoded = presets.map((dpi) => {
145
+ const byte = TRUEMOVE_CORE_DPI_TO_BYTE.get(dpi);
146
+ if (byte === undefined) {
147
+ throw new Aerox3ProtocolError(`SteelSeries Aerox 3 DPI must be ${AEROX3_DPI_MIN}–${AEROX3_DPI_MAX.toLocaleString()} in ${AEROX3_DPI_STEP} DPI steps.`);
148
+ }
149
+ return byte;
150
+ });
151
+ return new Uint8Array([...AEROX3_COMMAND.dpiPresets, presets.length, selectedIndex + 1, ...encoded]);
152
+ }
153
+ /** `2B <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
154
+ export function steelseriesAerox3EncodePollingRate(pollingRateHz) {
155
+ const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
156
+ if (byte === undefined) {
157
+ throw new Aerox3ProtocolError("SteelSeries Aerox 3 supports 125, 250, 500, or 1000 Hz polling.");
158
+ }
159
+ return new Uint8Array([...AEROX3_COMMAND.pollingRate, byte]);
160
+ }
161
+ function encodeRgb(r, g, b) {
162
+ for (const channel of [r, g, b]) {
163
+ if (!Number.isInteger(channel) || channel < 0 || channel > 255) {
164
+ throw new Aerox3ProtocolError("RGB channels must be integers 0–255.");
165
+ }
166
+ }
167
+ return [r, g, b];
168
+ }
169
+ /**
170
+ * `21 <bitmask> <padding for skipped zones> <r> <g> <b>` — see the module
171
+ * doc comment for how the zero-padding length grows with the zone number.
172
+ * Zone 1 = top LED, zone 2 = middle LED, zone 3 = bottom LED (strip order,
173
+ * per `aerox3.py`'s CLI flag labels).
174
+ */
175
+ export function steelseriesAerox3EncodeZoneColor(zone, r, g, b) {
176
+ const [red, green, blue] = encodeRgb(r, g, b);
177
+ if (zone === 1) {
178
+ return new Uint8Array([...AEROX3_COMMAND.zoneColor, 0x01, red, green, blue]);
179
+ }
180
+ if (zone === 2) {
181
+ return new Uint8Array([...AEROX3_COMMAND.zoneColor, 0x02, 0x00, 0x00, 0x00, red, green, blue]);
182
+ }
183
+ if (zone === 3) {
184
+ return new Uint8Array([
185
+ ...AEROX3_COMMAND.zoneColor, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, red, green, blue,
186
+ ]);
187
+ }
188
+ throw new Aerox3ProtocolError("SteelSeries Aerox 3 has zones 1 (top), 2 (middle), and 3 (bottom) only.");
189
+ }
190
+ /**
191
+ * `26 00 00 00 00 00` when disabled, `26 01 00 <r> <g> <b>` when enabled —
192
+ * the color the LEDs flash to in reaction to a button click.
193
+ */
194
+ export function steelseriesAerox3EncodeReactiveColor(color) {
195
+ if (color === null) {
196
+ return new Uint8Array([...AEROX3_COMMAND.reactiveColor, 0x00, 0x00, 0x00, 0x00, 0x00]);
197
+ }
198
+ const [r, g, b] = encodeRgb(color.r, color.g, color.b);
199
+ return new Uint8Array([...AEROX3_COMMAND.reactiveColor, 0x01, 0x00, r, g, b]);
200
+ }
201
+ /** `23 <v>` — linear 0–100 passthrough (`output_range` matches `input_range`). */
202
+ export function steelseriesAerox3EncodeLedBrightness(percent) {
203
+ if (!Number.isInteger(percent) || percent < 0 || percent > 100) {
204
+ throw new Aerox3ProtocolError("SteelSeries Aerox 3 LED brightness must be an integer 0–100.");
205
+ }
206
+ return new Uint8Array([...AEROX3_COMMAND.ledBrightness, percent]);
207
+ }
208
+ export const AEROX3_RAINBOW_ZONES = {
209
+ all: 0b111,
210
+ bottom: 0b100,
211
+ middle: 0b010,
212
+ top: 0b001,
213
+ "bottom-middle": 0b110,
214
+ "middle-top": 0b011,
215
+ "bottom-top": 0b101,
216
+ };
217
+ /** `22 <bitmask>` — rainbow effect on the selected zone(s); cleared by setting a color. */
218
+ export function steelseriesAerox3EncodeRainbowEffect(zones) {
219
+ const byte = AEROX3_RAINBOW_ZONES[zones];
220
+ if (byte === undefined) {
221
+ throw new Aerox3ProtocolError(`SteelSeries Aerox 3 rainbow zones must be one of: ${Object.keys(AEROX3_RAINBOW_ZONES).join(", ")}.`);
222
+ }
223
+ return new Uint8Array([...AEROX3_COMMAND.rainbowEffect, byte]);
224
+ }
225
+ export const AEROX3_DEFAULT_LIGHTING = {
226
+ off: [0x00, 0x00],
227
+ reactive: [0x00, 0x01],
228
+ rainbow: [0x01, 0x00],
229
+ "reactive-rainbow": [0x01, 0x01],
230
+ };
231
+ /** `27 <v1> <v2>` — what the mouse lights up as before a host ever connects. */
232
+ export function steelseriesAerox3EncodeDefaultLighting(mode) {
233
+ const bytes = AEROX3_DEFAULT_LIGHTING[mode];
234
+ if (bytes === undefined) {
235
+ throw new Aerox3ProtocolError(`SteelSeries Aerox 3 default lighting must be one of: ${Object.keys(AEROX3_DEFAULT_LIGHTING).join(", ")}.`);
236
+ }
237
+ return new Uint8Array([...AEROX3_COMMAND.defaultLighting, ...bytes]);
238
+ }
239
+ /** `11 00` — commit the current settings to onboard flash. */
240
+ export function steelseriesAerox3SaveCommand() {
241
+ return new Uint8Array(AEROX3_SAVE_COMMAND);
242
+ }
243
+ /** `buttons_mapping.buttons` from `aerox3.py`, id + byte offset into the packet. */
244
+ export const AEROX3_BUTTONS = {
245
+ button1: { id: 0x01, offset: 0x00 },
246
+ button2: { id: 0x02, offset: 0x05 },
247
+ button3: { id: 0x03, offset: 0x0a },
248
+ button4: { id: 0x04, offset: 0x0f },
249
+ button5: { id: 0x05, offset: 0x14 },
250
+ button6: { id: 0x06, offset: 0x19 },
251
+ scrollUp: { id: 0x31, offset: 0x1e },
252
+ scrollDown: { id: 0x32, offset: 0x23 },
253
+ };
254
+ const AEROX3_BUTTON_FIELD_LENGTH = 5;
255
+ const AEROX3_BUTTON_DISABLE = 0x00;
256
+ const AEROX3_BUTTON_DPI_SWITCH = 0x30;
257
+ const AEROX3_BUTTON_KEYBOARD = 0x51;
258
+ const AEROX3_BUTTON_MULTIMEDIA = 0x61;
259
+ /**
260
+ * `2A` + one 40-byte (`8 buttons × 5-byte field length`) packet, zero-filled
261
+ * except where a mapping is given. Unmapped buttons are left as all-zero
262
+ * fields (rivalcfg instead fills in per-button defaults; this codec leaves
263
+ * that policy to the caller — pass every button explicitly for parity with
264
+ * rivalcfg's default profile).
265
+ */
266
+ export function steelseriesAerox3EncodeButtonsMapping(mapping) {
267
+ const names = Object.keys(AEROX3_BUTTONS);
268
+ const packet = new Array(names.length * AEROX3_BUTTON_FIELD_LENGTH).fill(0x00);
269
+ for (const [name, action] of Object.entries(mapping)) {
270
+ const slot = AEROX3_BUTTONS[name];
271
+ if (!slot) {
272
+ throw new Aerox3ProtocolError(`Unknown SteelSeries Aerox 3 button "${name}".`);
273
+ }
274
+ const { offset } = slot;
275
+ switch (action.type) {
276
+ case "button": {
277
+ packet[offset] = AEROX3_BUTTONS[action.target].id;
278
+ break;
279
+ }
280
+ case "disabled": {
281
+ packet[offset] = AEROX3_BUTTON_DISABLE;
282
+ break;
283
+ }
284
+ case "dpiSwitch": {
285
+ packet[offset] = AEROX3_BUTTON_DPI_SWITCH;
286
+ break;
287
+ }
288
+ case "keyboard": {
289
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
290
+ throw new Aerox3ProtocolError("Keyboard scan codes must be integers 0–255.");
291
+ }
292
+ packet[offset] = AEROX3_BUTTON_KEYBOARD;
293
+ packet[offset + 1] = action.code;
294
+ break;
295
+ }
296
+ case "multimedia": {
297
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
298
+ throw new Aerox3ProtocolError("Multimedia key codes must be integers 0–255.");
299
+ }
300
+ packet[offset] = AEROX3_BUTTON_MULTIMEDIA;
301
+ packet[offset + 1] = action.code;
302
+ break;
303
+ }
304
+ default: {
305
+ throw new Aerox3ProtocolError(`Unsupported SteelSeries Aerox 3 button action.`);
306
+ }
307
+ }
308
+ }
309
+ return new Uint8Array([...AEROX3_COMMAND.buttonsMapping, ...packet]);
310
+ }
311
+ //# sourceMappingURL=aerox3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aerox3.js","sourceRoot":"","sources":["../../src/steelseries/aerox3.ts"],"names":[],"mappings":"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"}