@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 Sensei TEN configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/sensei_ten.py` — the primary source for every
7
+ * command byte, default, and product id here.
8
+ * - rivalcfg `rivalcfg/test/devices/old_specs/test_sensei_ten.py` — the
9
+ * device-specific fixture test, which pins exact expected HID report bytes
10
+ * for polling rate, sensitivity presets, logo/wheel color gradients,
11
+ * buttons mapping, save, and the firmware query. Every byte sequence in
12
+ * this module's own tests was cross-checked against that file rather than
13
+ * re-derived solely from the handler source, since it is ground truth for
14
+ * how rivalcfg actually serializes this device's settings.
15
+ * - rivalcfg `rivalcfg/handlers/range.py` (the `range` value type the
16
+ * `multidpi_range` handler below builds on: linear input→output mapping,
17
+ * rounded to the nearest step) and `rivalcfg/handlers/rgbgradient.py` (the
18
+ * color/gradient wire format for `logo_color` and `wheel_color`).
19
+ * - `rivalcfg/devices/sensei_raw.py` and `rivalcfg/devices/sensei310.py` were
20
+ * read to confirm they are unrelated protocols (different command bytes,
21
+ * different DPI encodings) and were not a source for anything here.
22
+ *
23
+ * **Corroboration gap, flagged prominently per this rollout's instructions:**
24
+ * libratbag and the OpenRGB SteelSeries controller sources were not
25
+ * reachable from this environment (no network access to
26
+ * github.com/libratbag/libratbag or OpenRGB's SteelSeries controller files),
27
+ * so unlike some earlier SteelSeries clusters in this project, **nothing
28
+ * here has a second independent source** — rivalcfg (source + its own test
29
+ * fixture) is the only corroboration this module has. Treat every byte below
30
+ * as "rivalcfg says so", not "two independent projects agree".
31
+ *
32
+ * Every command is an HID **output report** (id `0x00`) except `logo_color`
33
+ * and `wheel_color`, which are HID **feature reports** — `sensei_ten.py`
34
+ * marks them `usbhid.HID_REPORT_TYPE_FEATURE` while every other setting is
35
+ * `HID_REPORT_TYPE_OUTPUT`. The functions here build the report *payload* —
36
+ * the bytes after the report id — unpadded, matching rivalcfg's `usbhid.py`
37
+ * writes (`_hid_write` always prepends `report_id = 0x00` and otherwise
38
+ * sends the payload as-is with no fixed packet length for this device).
39
+ *
40
+ * **This device is write-only except for firmware.** No public
41
+ * implementation has a getter for DPI, polling, or lighting/buttons; the
42
+ * single readable value is the two-byte firmware version behind `90 00`
43
+ * (`response_length: 2`, `report_type: OUTPUT`), the same shape as Rival 3
44
+ * Gen 1's `10 00` — see `steelseriesSenseiTenDecodeFirmware`, which reuses
45
+ * Rival 3's read-order-byte-join convention and the same byte-order caveat.
46
+ *
47
+ * Settings apply immediately; `save_command` (`59 00`) persists them to
48
+ * onboard flash — distinct from Rival 3 Gen 1's `09 00` and Aerox 3's
49
+ * `11 00`; do not reuse across families.
50
+ *
51
+ * ## Sensor / DPI encoding
52
+ *
53
+ * Unlike Rival 3 Gen 1 and Aerox 3 (TrueMove Core, a byte lookup table),
54
+ * Sensei TEN's `sensitivity` setting uses rivalcfg's plain `multidpi_range`
55
+ * handler with `input_range: [50, 18000, 50]` and `output_range: [1, 0x0168,
56
+ * 1]` — a **linear** mapping, not a table: `output = input / 50`, written as
57
+ * a 2-byte little-endian integer per preset (`dpi_length_byte: 2`). This
58
+ * matches SteelSeries marketing calling Sensei TEN's sensor a newer
59
+ * generation (TrueMove3+) than the TrueMove Core/Air families used by
60
+ * Rival 3 and Aerox 3/5 — confirmed here by the *shape* of the DPI handler
61
+ * (linear range vs. lookup table) rather than by an independent sensor-name
62
+ * source, which was not reachable (see corroboration gap above).
63
+ *
64
+ * `count_mode: "flag"` — like Aerox 3's `dpiPresets`, the on-wire preset
65
+ * count is a bitmask (`0b00000001` for 1 preset, `0b00001111` for 4, etc.),
66
+ * not a plain integer, unlike Rival 3 Gen 1's `count_mode: "number"`.
67
+ *
68
+ * ## RGB: `logo_color` / `wheel_color`
69
+ *
70
+ * Sensei TEN has two independently addressable RGB zones — the SteelSeries
71
+ * logo and the scroll-wheel light — both using rivalcfg's full `rgbgradient`
72
+ * value type (multi-stop animated gradients), not the simpler flat
73
+ * `rgbcolor`/zone-bitmask scheme Aerox 3 and Aerox 5 use. This module
74
+ * implements the complete gradient encoding (not just a solid-color special
75
+ * case), because the wire format is small and precisely pinned by
76
+ * `test_sensei_ten.py`'s `test_set_logo_color`/`test_set_wheel_color`
77
+ * fixtures, which this module's tests reproduce byte-for-byte.
78
+ *
79
+ * The packet layout, from `rgbgradient.py`'s `process_value` with Sensei
80
+ * TEN's `rgbgradient_header` (`header_length: 26`, `led_id_offsets: [0]`,
81
+ * `duration_offset: 1` (2 bytes, little-endian ms), `repeat_offset: 17`,
82
+ * `triggers_offset: 21`, `color_count_offset: 25`):
83
+ *
84
+ * ```
85
+ * 5B 00 <led_id> <duration_lo> <duration_hi> <14 zero bytes>
86
+ * <repeat> <3 zero bytes> <triggers> <3 zero bytes> <color_count>
87
+ * <initial_color r,g,b> <color1 r,g,b> <pos1> ... <colorN r,g,b> <posN>
88
+ * ```
89
+ *
90
+ * `led_id` is `0x00` for `logo_color`, `0x01` for `wheel_color` — the only
91
+ * difference between the two settings' commands. `repeat` is `0x01` for a
92
+ * solid color (no animation) or when the gradient has button triggers
93
+ * (`triggers` — not exposed by this module, always `0x00`, matching
94
+ * `sensei_ten.py`'s profile, which never sets it); `0x00` for an animated
95
+ * gradient with no trigger.
96
+ *
97
+ * **The per-stop `pos` byte is a *delta*, not an absolute position** — easy
98
+ * to get wrong reading `rgbgradient.py` casually, and this module's first
99
+ * draft did. Each stop's true 0–255 position is `Math.trunc(pos * 255 /
100
+ * 100)` (rivalcfg uses Python's `int()`, which truncates toward zero, not
101
+ * `round()`); the wire byte for that stop is the *difference* between this
102
+ * truncated position and the previous stop's, starting from 0. This was
103
+ * confirmed against `test_sensei_ten.py`'s `test_set_wheel_color` fixture:
104
+ * stops at 0/25/50/75/100% truncate to real positions 0/63/127/191/255, and
105
+ * the fixture's actual bytes are the deltas 0/63/64/64/64, not the absolute
106
+ * values — reproduced exactly by this module's own tests. rivalcfg
107
+ * auto-appends a final stop equal to the first color at pos 100 if the
108
+ * caller's last stop is not already at 100, "smoothing" the loop — this
109
+ * module requires the caller to pass every stop explicitly (including the
110
+ * closing one, if wanted) rather than silently appending one, to keep the
111
+ * encoder a pure function of its input.
112
+ *
113
+ * ## Buttons mapping — reduced scope, mirrors `aerox3.ts`
114
+ *
115
+ * `31 00` + one 40-byte (8 buttons × 5-byte field) packet, zero-filled
116
+ * except where a mapping is given — byte-identical field layout to Aerox 3's
117
+ * `buttons_mapping`, but Sensei TEN's `button_scroll_up`/`button_scroll_down`
118
+ * (`0x31`/`0x32`) are function **codes** a button's slot can hold (used when
119
+ * *another* button is remapped to act as a scroll action), unlike Aerox 3
120
+ * where `scrollUp`/`scrollDown` are physical button *sources* that cannot be
121
+ * remap targets. Sensei TEN has no such restriction — every one of its 8
122
+ * buttons is a valid remap target for another button's id (Button1–Button8,
123
+ * ids `0x01`–`0x08`). As with `aerox3.ts`, this module implements the exact
124
+ * packet shape and the mouse-button/disable/DPI-switch/scroll-up/scroll-down
125
+ * special actions, but does not re-implement rivalcfg's QWERTY/multimedia
126
+ * key-name tables — keyboard and multimedia targets are raw
127
+ * `{ type: "keyboard" | "multimedia", code }` scan-code bytes, matching
128
+ * `button_keyboard: 0x51` / `button_multimedia: 0x61` verbatim. The
129
+ * documented defaults (`test_set_buttons_mapping`'s `"default"` case) are
130
+ * exposed as `SENSEI_TEN_DEFAULT_BUTTONS_MAPPING` for callers/tests: Button6
131
+ * defaults to keyboard code `0x4E` (Page Down), Button7 to `0x4B` (Page Up),
132
+ * Button8 to DPI-switch — the rest map to themselves.
133
+ *
134
+ * None of this has been verified on physical Sensei TEN hardware by this
135
+ * project. The Sensei RAW (`sensei_raw.py`) and Sensei 310 (`sensei310.py`)
136
+ * use different, incompatible command sets and must not reuse this module.
137
+ */
138
+ export const SENSEI_TEN_REPORT_ID = 0x00;
139
+ /** Two-byte command prefixes; the payload is the prefix plus its arguments. */
140
+ export const SENSEI_TEN_COMMAND = {
141
+ buttonsMapping: [0x31, 0x00],
142
+ pollingRate: [0x54, 0x00],
143
+ sensitivity: [0x55, 0x00],
144
+ logoColor: [0x5b, 0x00],
145
+ wheelColor: [0x5b, 0x00],
146
+ save: [0x59, 0x00],
147
+ firmware: [0x90, 0x00],
148
+ };
149
+ export const SENSEI_TEN_POLLING_RATES = [125, 250, 500, 1000];
150
+ const POLLING_RATE_TO_BYTE = new Map([
151
+ [1000, 0x01],
152
+ [500, 0x02],
153
+ [250, 0x03],
154
+ [125, 0x04],
155
+ ]);
156
+ export const SENSEI_TEN_DPI_MIN = 50;
157
+ export const SENSEI_TEN_DPI_MAX = 18000;
158
+ export const SENSEI_TEN_DPI_STEP = 50;
159
+ export const SENSEI_TEN_MAX_DPI_PRESETS = 5;
160
+ export const SENSEI_TEN_FIRMWARE_RESPONSE_LENGTH = 2;
161
+ export class SenseiTenProtocolError extends Error {
162
+ }
163
+ /** Every DPI value the linear 50–18,000 (step 50) range can express, ascending. */
164
+ export function steelseriesSenseiTenDpiOptions() {
165
+ const options = [];
166
+ for (let dpi = SENSEI_TEN_DPI_MIN; dpi <= SENSEI_TEN_DPI_MAX; dpi += SENSEI_TEN_DPI_STEP) {
167
+ options.push(dpi);
168
+ }
169
+ return options;
170
+ }
171
+ function dpiToWord(dpi) {
172
+ if (!Number.isInteger(dpi) ||
173
+ dpi < SENSEI_TEN_DPI_MIN ||
174
+ dpi > SENSEI_TEN_DPI_MAX ||
175
+ dpi % SENSEI_TEN_DPI_STEP !== 0) {
176
+ throw new SenseiTenProtocolError(`SteelSeries Sensei TEN DPI must be ${SENSEI_TEN_DPI_MIN}–${SENSEI_TEN_DPI_MAX.toLocaleString()} in ${SENSEI_TEN_DPI_STEP} DPI steps.`);
177
+ }
178
+ return dpi / SENSEI_TEN_DPI_STEP;
179
+ }
180
+ /**
181
+ * `55 00 <count flag> <selected> <v1 lo,hi> ... <vN lo,hi>` — replaces the
182
+ * mouse's whole preset table. Each DPI is 2 bytes little-endian
183
+ * (`dpi_length_byte: 2`); `count` is a bitmask of the preset count
184
+ * (`count_mode: "flag"`), not a plain integer. `selectedIndex` is 0-based
185
+ * here and encoded 1-based on the wire (`first_preset: 1`).
186
+ */
187
+ export function steelseriesSenseiTenEncodeDpiPresets(presets, selectedIndex) {
188
+ if (presets.length < 1 || presets.length > SENSEI_TEN_MAX_DPI_PRESETS) {
189
+ throw new SenseiTenProtocolError(`SteelSeries Sensei TEN supports 1–${SENSEI_TEN_MAX_DPI_PRESETS} DPI presets.`);
190
+ }
191
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
192
+ throw new SenseiTenProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
193
+ }
194
+ const words = presets.map(dpiToWord);
195
+ const countFlag = 0b11111111 >> (8 - presets.length);
196
+ const bytes = [...SENSEI_TEN_COMMAND.sensitivity, countFlag, selectedIndex + 1];
197
+ for (const word of words) {
198
+ bytes.push(word & 0xff, (word >> 8) & 0xff);
199
+ }
200
+ return new Uint8Array(bytes);
201
+ }
202
+ /** `54 00 <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
203
+ export function steelseriesSenseiTenEncodePollingRate(pollingRateHz) {
204
+ const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
205
+ if (byte === undefined) {
206
+ throw new SenseiTenProtocolError("SteelSeries Sensei TEN supports 125, 250, 500, or 1000 Hz polling.");
207
+ }
208
+ return new Uint8Array([...SENSEI_TEN_COMMAND.pollingRate, byte]);
209
+ }
210
+ const LED_ID = { logo: 0x00, wheel: 0x01 };
211
+ const RGBGRADIENT_HEADER_LENGTH = 26;
212
+ const RGBGRADIENT_DURATION_OFFSET = 1;
213
+ const RGBGRADIENT_REPEAT_OFFSET = 17;
214
+ const RGBGRADIENT_TRIGGERS_OFFSET = 21;
215
+ const RGBGRADIENT_COLOR_COUNT_OFFSET = 25;
216
+ const RGBGRADIENT_MAX_STOPS = 14;
217
+ function validateColorChannel(value) {
218
+ if (!Number.isInteger(value) || value < 0 || value > 255) {
219
+ throw new SenseiTenProtocolError("RGB channels must be integers 0–255.");
220
+ }
221
+ }
222
+ /**
223
+ * `5B 00 <led_id> ...` — encodes a color or animated gradient for the logo
224
+ * (`led: "logo"`) or scroll-wheel (`led: "wheel"`) LED. See the module doc
225
+ * comment for the full packet layout.
226
+ *
227
+ * - A single stop (`stops.length === 1`) is treated as a solid, non-animated
228
+ * color: `repeat` is set to `0x01` regardless of that stop's `pos`
229
+ * (matching `rgbgradient.py`'s `is_gradient = False` path for a bare color
230
+ * string/tuple, which always uses `pos = 0` internally — pass `pos: 0`
231
+ * here for parity, though the wire format ignores it for a single stop
232
+ * since there is nothing to interpolate toward).
233
+ * - Two or more stops are encoded as an animated gradient at `durationMs`,
234
+ * `repeat` `0x00`. Unlike rivalcfg's CLI parser, this function does **not**
235
+ * auto-append a closing stop equal to the first color at pos 100 — pass it
236
+ * explicitly if a smooth loop is wanted (see `test_set_logo_color`'s
237
+ * fixture, which does include that stop as its 4th entry).
238
+ */
239
+ export function steelseriesSenseiTenEncodeLedColor(led, stops, durationMs = 1000) {
240
+ if (stops.length === 0) {
241
+ throw new SenseiTenProtocolError("SteelSeries Sensei TEN LED color needs at least one color stop.");
242
+ }
243
+ if (stops.length > RGBGRADIENT_MAX_STOPS) {
244
+ throw new SenseiTenProtocolError(`SteelSeries Sensei TEN allows a maximum of ${RGBGRADIENT_MAX_STOPS} color stops.`);
245
+ }
246
+ if (!Number.isInteger(durationMs) || durationMs < 0 || durationMs > 0xffff) {
247
+ throw new SenseiTenProtocolError("SteelSeries Sensei TEN gradient duration must be an integer 0–65535 ms.");
248
+ }
249
+ for (const stop of stops) {
250
+ validateColorChannel(stop.r);
251
+ validateColorChannel(stop.g);
252
+ validateColorChannel(stop.b);
253
+ if (!Number.isInteger(stop.pos) || stop.pos < 0 || stop.pos > 100) {
254
+ throw new SenseiTenProtocolError("SteelSeries Sensei TEN gradient stop positions must be integers 0–100.");
255
+ }
256
+ }
257
+ const header = new Array(RGBGRADIENT_HEADER_LENGTH).fill(0x00);
258
+ header[0] = LED_ID[led];
259
+ header[RGBGRADIENT_DURATION_OFFSET] = durationMs & 0xff;
260
+ header[RGBGRADIENT_DURATION_OFFSET + 1] = (durationMs >> 8) & 0xff;
261
+ header[RGBGRADIENT_REPEAT_OFFSET] = stops.length === 1 ? 0x01 : 0x00;
262
+ header[RGBGRADIENT_TRIGGERS_OFFSET] = 0x00;
263
+ header[RGBGRADIENT_COLOR_COUNT_OFFSET] = stops.length;
264
+ const body = [stops[0].r, stops[0].g, stops[0].b];
265
+ let lastRealPos = 0;
266
+ for (const stop of stops) {
267
+ const realPos = Math.trunc((stop.pos * 255) / 100);
268
+ body.push(stop.r, stop.g, stop.b, realPos - lastRealPos);
269
+ lastRealPos = realPos;
270
+ }
271
+ const command = led === "logo" ? SENSEI_TEN_COMMAND.logoColor : SENSEI_TEN_COMMAND.wheelColor;
272
+ return new Uint8Array([...command, ...header, ...body]);
273
+ }
274
+ /** `59 00` — commit the current settings to onboard flash. */
275
+ export function steelseriesSenseiTenSaveCommand() {
276
+ return new Uint8Array(SENSEI_TEN_COMMAND.save);
277
+ }
278
+ /** `90 00` — the two-byte firmware version query, this device's only readable value. */
279
+ export function steelseriesSenseiTenFirmwareQuery() {
280
+ return new Uint8Array(SENSEI_TEN_COMMAND.firmware);
281
+ }
282
+ /**
283
+ * Decode the two-byte firmware response, reusing Rival 3 Gen 1's read-order
284
+ * join convention (`steelseriesRival3DecodeFirmware`) — the byte order is
285
+ * contested between public implementations for that family, and no
286
+ * corroborating source (libratbag, OpenRGB) was reachable for Sensei TEN
287
+ * specifically to settle it independently. Both raw bytes are returned.
288
+ */
289
+ export function steelseriesSenseiTenDecodeFirmware(payload) {
290
+ if (payload.length < SENSEI_TEN_FIRMWARE_RESPONSE_LENGTH) {
291
+ throw new SenseiTenProtocolError("SteelSeries Sensei TEN firmware response is shorter than two bytes.");
292
+ }
293
+ const bytes = [payload[0], payload[1]];
294
+ return { bytes, display: `${bytes[0]}.${bytes[1]}` };
295
+ }
296
+ /** `buttons_mapping.buttons` from `sensei_ten.py`, id + byte offset into the packet. */
297
+ export const SENSEI_TEN_BUTTONS = {
298
+ button1: { id: 0x01, offset: 0x00 },
299
+ button2: { id: 0x02, offset: 0x05 },
300
+ button3: { id: 0x03, offset: 0x0a },
301
+ button4: { id: 0x04, offset: 0x0f },
302
+ button5: { id: 0x05, offset: 0x14 },
303
+ button6: { id: 0x06, offset: 0x19 },
304
+ button7: { id: 0x07, offset: 0x1e },
305
+ button8: { id: 0x08, offset: 0x23 },
306
+ };
307
+ const SENSEI_TEN_BUTTON_FIELD_LENGTH = 5;
308
+ const SENSEI_TEN_BUTTON_DISABLE = 0x00;
309
+ const SENSEI_TEN_BUTTON_DPI_SWITCH = 0x30;
310
+ const SENSEI_TEN_BUTTON_SCROLL_UP = 0x31;
311
+ const SENSEI_TEN_BUTTON_SCROLL_DOWN = 0x32;
312
+ const SENSEI_TEN_BUTTON_KEYBOARD = 0x51;
313
+ const SENSEI_TEN_BUTTON_MULTIMEDIA = 0x61;
314
+ /**
315
+ * `31 00` + one 40-byte (`8 buttons × 5-byte field length`) packet,
316
+ * zero-filled except where a mapping is given. Unmapped buttons are left as
317
+ * all-zero fields — pass every button explicitly for parity with rivalcfg's
318
+ * default profile (see `SENSEI_TEN_DEFAULT_BUTTONS_MAPPING`).
319
+ */
320
+ export function steelseriesSenseiTenEncodeButtonsMapping(mapping) {
321
+ const names = Object.keys(SENSEI_TEN_BUTTONS);
322
+ const packet = new Array(names.length * SENSEI_TEN_BUTTON_FIELD_LENGTH).fill(0x00);
323
+ for (const [name, action] of Object.entries(mapping)) {
324
+ const slot = SENSEI_TEN_BUTTONS[name];
325
+ if (!slot) {
326
+ throw new SenseiTenProtocolError(`Unknown SteelSeries Sensei TEN button "${name}".`);
327
+ }
328
+ const { offset } = slot;
329
+ switch (action.type) {
330
+ case "button": {
331
+ packet[offset] = SENSEI_TEN_BUTTONS[action.target].id;
332
+ break;
333
+ }
334
+ case "disabled": {
335
+ packet[offset] = SENSEI_TEN_BUTTON_DISABLE;
336
+ break;
337
+ }
338
+ case "dpiSwitch": {
339
+ packet[offset] = SENSEI_TEN_BUTTON_DPI_SWITCH;
340
+ break;
341
+ }
342
+ case "scrollUp": {
343
+ packet[offset] = SENSEI_TEN_BUTTON_SCROLL_UP;
344
+ break;
345
+ }
346
+ case "scrollDown": {
347
+ packet[offset] = SENSEI_TEN_BUTTON_SCROLL_DOWN;
348
+ break;
349
+ }
350
+ case "keyboard": {
351
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
352
+ throw new SenseiTenProtocolError("Keyboard scan codes must be integers 0–255.");
353
+ }
354
+ packet[offset] = SENSEI_TEN_BUTTON_KEYBOARD;
355
+ packet[offset + 1] = action.code;
356
+ break;
357
+ }
358
+ case "multimedia": {
359
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
360
+ throw new SenseiTenProtocolError("Multimedia key codes must be integers 0–255.");
361
+ }
362
+ packet[offset] = SENSEI_TEN_BUTTON_MULTIMEDIA;
363
+ packet[offset + 1] = action.code;
364
+ break;
365
+ }
366
+ default: {
367
+ throw new SenseiTenProtocolError(`Unsupported SteelSeries Sensei TEN button action.`);
368
+ }
369
+ }
370
+ }
371
+ return new Uint8Array([...SENSEI_TEN_COMMAND.buttonsMapping, ...packet]);
372
+ }
373
+ /**
374
+ * `sensei_ten.py`'s documented default mapping (`test_set_buttons_mapping`'s
375
+ * `"default"` fixture): buttons 1–5 map to themselves, Button6 to keyboard
376
+ * Page Down (`0x4E`), Button7 to keyboard Page Up (`0x4B`), Button8 to the
377
+ * DPI switch.
378
+ */
379
+ export const SENSEI_TEN_DEFAULT_BUTTONS_MAPPING = {
380
+ button1: { type: "button", target: "button1" },
381
+ button2: { type: "button", target: "button2" },
382
+ button3: { type: "button", target: "button3" },
383
+ button4: { type: "button", target: "button4" },
384
+ button5: { type: "button", target: "button5" },
385
+ button6: { type: "keyboard", code: 0x4e },
386
+ button7: { type: "keyboard", code: 0x4b },
387
+ button8: { type: "dpiSwitch" },
388
+ };
389
+ //# sourceMappingURL=sensei-ten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensei-ten.js","sourceRoot":"","sources":["../../src/steelseries/sensei-ten.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ export declare const TEEVOLUTION_REPORT_ID = 8;
2
+ export declare const TEEVOLUTION_PACKET_LENGTH = 16;
3
+ /** RapidSync 8K LCD clock — separate HID collection from Compx report 8. */
4
+ export declare const TEEVOLUTION_LCD_REPORT_ID = 10;
5
+ export declare const TEEVOLUTION_LCD_PACKET_LENGTH = 40;
6
+ export declare const TEEVOLUTION_LCD_USAGE_PAGE = 65288;
7
+ export declare const TEEVOLUTION_LCD_USAGE = 2;
8
+ export declare const TEEVOLUTION_LCD_SET_TIME = 16;
9
+ export declare const TEEVOLUTION_MAX_CHUNK = 10;
10
+ export declare const TEEVOLUTION_DPI_MAX = 42000;
11
+ export declare const TEEVOLUTION_PRODUCT_IDS: Set<number>;
12
+ export declare const TEEVOLUTION_POLLING_RATES: readonly [125, 250, 500, 1000, 2000, 4000, 8000];
13
+ export declare const TEEVOLUTION_SLEEP_OPTIONS: readonly [1, 3, 6, 12, 30, 60, 180];
14
+ /** Teevolink "Highest performance" duration codes (flash 0xB7). */
15
+ export declare const TEEVOLUTION_PERFORMANCE_TIME_OPTIONS: readonly [1, 3, 6, 12, 30, 60, 90];
16
+ export declare const TEEVOLUTION_PERFORMANCE_TIME_LABELS: ReadonlyArray<readonly [number, string]>;
17
+ export declare const TEEVOLUTION_DPI_LIGHT_MODES: readonly [0, 1, 2];
18
+ export type TeevolutionDpiLightMode = typeof TEEVOLUTION_DPI_LIGHT_MODES[number];
19
+ export type TeevolutionSensorMode = "Eco" | "High" | "Ultra";
20
+ export type TeevolutionLiftOffDistance = "Low" | "Medium" | "High";
21
+ export interface TeevolutionDeviceProfile {
22
+ cid: number;
23
+ name: string;
24
+ protocol: "compX-terra-v1";
25
+ dpiStageCount: number;
26
+ dpi: {
27
+ min: number;
28
+ standardMax: number;
29
+ max: number;
30
+ standardStep: number;
31
+ highStep: number;
32
+ };
33
+ pollingRates: readonly number[];
34
+ liftOffDistances: readonly TeevolutionLiftOffDistance[];
35
+ debounce: {
36
+ min: number;
37
+ max: number;
38
+ };
39
+ sleepOptions: readonly number[];
40
+ performanceTimeOptions: readonly number[];
41
+ sensorModes: readonly Exclude<TeevolutionSensorMode, "Ultra">[];
42
+ dpiLighting: {
43
+ modes: readonly TeevolutionDpiLightMode[];
44
+ brightness: {
45
+ min: number;
46
+ max: number;
47
+ };
48
+ speed: {
49
+ min: number;
50
+ max: number;
51
+ };
52
+ };
53
+ }
54
+ export declare const TEEVOLUTION_DEVICE_PROFILES: ReadonlyMap<number, TeevolutionDeviceProfile>;
55
+ export declare function teevolutionProfileForCid(cid: number): TeevolutionDeviceProfile | null;
56
+ export declare const TEEVOLUTION_COMMAND: {
57
+ readonly encryptionData: 1;
58
+ readonly deviceOnline: 3;
59
+ readonly batteryLevel: 4;
60
+ readonly writeFlashData: 7;
61
+ readonly readFlashData: 8;
62
+ readonly getCurrentConfig: 14;
63
+ readonly setCurrentConfig: 15;
64
+ readonly readVersionId: 18;
65
+ readonly getDongleVersion: 29;
66
+ readonly getRssi: 43;
67
+ };
68
+ /** Flash offsets used by Teevolink / Compx HUB for Terra Pro. */
69
+ export declare const TEEVOLUTION_FLASH: {
70
+ readonly reportRate: 0;
71
+ /** Number of enabled DPI stages (1…dpiStageCount). */
72
+ readonly maxDpiStage: 2;
73
+ /** Active DPI stage index (0-based). */
74
+ readonly currentDpi: 4;
75
+ readonly liftOffDistance: 10;
76
+ /** Base of 4-byte DPI stage records. */
77
+ readonly dpiValues: 12;
78
+ readonly dpiLightMode: 76;
79
+ readonly dpiLightBrightness: 78;
80
+ readonly dpiLightSpeed: 80;
81
+ readonly dpiLightState: 82;
82
+ /** Base of 4-byte key-function records (one per physical button). */
83
+ readonly keyFunction: 96;
84
+ readonly debounceTime: 169;
85
+ readonly motionSync: 171;
86
+ readonly sleepTime: 173;
87
+ readonly angleSnapping: 175;
88
+ readonly rippleControl: 177;
89
+ readonly performanceState: 181;
90
+ readonly performanceTime: 183;
91
+ readonly sensorMode: 185;
92
+ };
93
+ /** Teevolink MouseKeyFunction class byte stored at flash 0x60 + 4×index. */
94
+ export declare const TEEVOLUTION_KEY_CLASS: {
95
+ readonly disable: 0;
96
+ readonly mouse: 1;
97
+ readonly dpi: 2;
98
+ readonly tilt: 3;
99
+ };
100
+ export declare const TEEVOLUTION_BUTTONS: readonly [{
101
+ readonly name: "Left";
102
+ readonly index: 0;
103
+ }, {
104
+ readonly name: "Right";
105
+ readonly index: 1;
106
+ }, {
107
+ readonly name: "Middle";
108
+ readonly index: 2;
109
+ }, {
110
+ readonly name: "Back";
111
+ readonly index: 3;
112
+ }, {
113
+ readonly name: "Forward";
114
+ readonly index: 4;
115
+ }, {
116
+ readonly name: "DPI";
117
+ readonly index: 5;
118
+ }];
119
+ export type TeevolutionButtonName = (typeof TEEVOLUTION_BUTTONS)[number]["name"];
120
+ export interface TeevolutionButtonAction {
121
+ label: string;
122
+ cls: number;
123
+ param: number;
124
+ }
125
+ /** Simple assignments the generic remap dropdown can write. */
126
+ export declare const TEEVOLUTION_BUTTON_ACTIONS: readonly TeevolutionButtonAction[];
127
+ export declare const TEEVOLUTION_BUTTON_OPTIONS: string[];
128
+ export declare const TEEVOLUTION_KEY_RECORD_LENGTH = 4;
129
+ export declare const TEEVOLUTION_KEY_TABLE_LENGTH: number;
130
+ /** TeevoLink ProfileOptions: four firmware-managed flash banks. */
131
+ export declare const TEEVOLUTION_PROFILE_COUNT = 4;
132
+ export declare function teevolutionKeyFunctionAddress(index: number): number;
133
+ export declare function teevolutionEncodeKeyFunction(cls: number, param: number): Uint8Array;
134
+ export declare function teevolutionDecodeKeyFunction(data: Uint8Array | readonly number[]): {
135
+ cls: number;
136
+ param: number;
137
+ checksumValid: boolean;
138
+ };
139
+ export declare function teevolutionFindButtonAction(label: string): TeevolutionButtonAction | null;
140
+ export declare function teevolutionFindButton(name: string): (typeof TEEVOLUTION_BUTTONS)[number] | null;
141
+ export declare function teevolutionKeyFunctionLabel(data: Uint8Array | readonly number[]): string;
142
+ export declare function teevolutionIsLeftClick(cls: number, param: number): boolean;
143
+ export declare function teevolutionKeyTableHasLeftClick(table: Uint8Array | readonly number[]): boolean;
144
+ export declare function teevolutionDecodeButtonMappings(flash: Uint8Array | readonly number[]): Record<string, string>;
145
+ export declare const TEEVOLUTION_TYPE_MAX_POLL: Record<number, number>;
146
+ export interface TeevolutionBattery {
147
+ percent: number | null;
148
+ charging: boolean;
149
+ }
150
+ export declare function teevolutionPacketChecksum(packet: Uint8Array | readonly number[]): number;
151
+ export declare function teevolutionPacketChecksumIsValid(payload: Uint8Array | readonly number[]): boolean;
152
+ export declare function teevolutionDataChecksum(data: Uint8Array | readonly number[]): number;
153
+ export declare function teevolutionBuildSimplePayload(command: number): Uint8Array;
154
+ export declare function teevolutionBuildReadPayload(address: number, length: number): Uint8Array;
155
+ export declare function teevolutionBuildWritePayload(address: number, data: readonly number[]): Uint8Array;
156
+ export declare function teevolutionBuildWriteScalarPayload(address: number, value: number): Uint8Array;
157
+ export declare function teevolutionBuildOnlinePayload(enabled: boolean): Uint8Array;
158
+ /** Build SetCurrentConfig with TeevoLink's length byte and zero-based bank. */
159
+ export declare function teevolutionBuildSetCurrentProfile(profile: number): Uint8Array;
160
+ /**
161
+ * Decode GetCurrentConfig. TeevoLink treats status 1 as “no profile switch”
162
+ * (`supportChangeProfile = false`); only a 0–3 bank in byte 5 is usable.
163
+ */
164
+ export declare function teevolutionDecodeCurrentProfile(response: Uint8Array | readonly number[]): number | null;
165
+ export declare function teevolutionParseReadResponse(response: Uint8Array, address: number, length: number): Uint8Array | null;
166
+ export declare function teevolutionParseBattery(response: Uint8Array): TeevolutionBattery | null;
167
+ export declare function teevolutionEncodePollingRate(rate: number): number;
168
+ export declare function teevolutionDecodePollingRate(encoded: number): number;
169
+ /**
170
+ * PAW3950 Compx packing used by Teevolink: 50 DPI steps below 30,100, then
171
+ * 100 DPI steps to 42,000 via dpiEx 0x11 (halve before packing).
172
+ */
173
+ export declare function teevolutionEncodeDpi(dpi: number): Uint8Array;
174
+ export declare function teevolutionDecodeDpi(data: Uint8Array | readonly number[]): number;
175
+ export declare function teevolutionDecodeLiftOff(value: number): "Low" | "Medium" | "High" | null;
176
+ export declare function teevolutionEncodeLiftOff(liftOffDistance: "Low" | "Medium" | "High"): number;
177
+ export declare function teevolutionDecodeFirmwareVersion(label: string, response: Uint8Array): string;
178
+ export declare function teevolutionDpiOptions(profile: TeevolutionDeviceProfile): number[];
179
+ /** Converts Teevolink's 1–10 brightness slider to the byte stored in flash 0x4E. */
180
+ export declare function teevolutionEncodeDpiLightBrightness(level: number): number;
181
+ /** Mirrors Teevolink's fallback to level 5 for an unrecognised stored byte. */
182
+ export declare function teevolutionDecodeDpiLightBrightness(value: number): number;
183
+ export declare function teevolutionDecodeDpiLightMode(mode: number, state: number): TeevolutionDpiLightMode;
184
+ export declare function teevolutionEncodeSensorMode(mode: TeevolutionSensorMode): number;
185
+ export declare function teevolutionDecodeSensorModeStored(value: number): TeevolutionSensorMode;
186
+ /**
187
+ * Mirrors Teevolink Update_MS_SensorModeDisplay for PAW3950 Terra Pro links.
188
+ * Ultra (256) is display-only when high poll rates force corded tracking.
189
+ */
190
+ export declare function teevolutionSensorModeUi(options: {
191
+ storedMode: number;
192
+ pollingRateHz: number;
193
+ connection: "Wired" | "Wireless";
194
+ fps20k?: boolean;
195
+ }): {
196
+ mode: TeevolutionSensorMode;
197
+ editable: boolean;
198
+ storedValue: 0 | 1;
199
+ };
200
+ /**
201
+ * Teevolink Generate_CRC for RapidSync LCD writes: last byte is
202
+ * `(0x55 - sum(packet[0..len-2])) & 0xff`, including the report-id byte.
203
+ */
204
+ export declare function teevolutionLcdChecksum(packet: Uint8Array | readonly number[]): number;
205
+ /**
206
+ * 40-byte RapidSync set-time write, including report id 0x0A as byte 0.
207
+ * DateTime layout matches Teevolink GetCurrentTimer_Tick (year big-endian,
208
+ * Sunday = 0). WebHID sendReport uses bytes 1…39.
209
+ */
210
+ export declare function teevolutionBuildLcdTimePacket(now: Date): Uint8Array;
211
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/teevolution/index.ts"],"names":[],"mappings":"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"}