@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,295 @@
1
+ import { VENDOR_ID } from "../vendors.js";
2
+ import { GEARHUB_PRODUCTS } from "@openmouse/protocol/gearhub";
3
+ // Fantech command IDs (from GearHub qmk.top protocol)
4
+ export const CMD = {
5
+ // Family B (older Fantech mice) command set
6
+ GET_ALL_PARAMS: 159, // Get all parameters (profile, report rate, etc.)
7
+ GET_DPI: 144, // Get DPI settings (SENSORDPI)
8
+ SET_DPI: 16, // Set DPI settings
9
+ GET_REPORT_RATE: 131, // Get report/polling rate
10
+ SET_REPORT_RATE: 8, // Set report/polling rate
11
+ GET_DEBOUNCE: 132, // Get debounce time
12
+ SET_DEBOUNCE: 4, // Set debounce time
13
+ SET_PROFILE: 2, // Set current profile
14
+ };
15
+ /**
16
+ * Report rate encoding for Fantech mice.
17
+ *
18
+ * This table is also the single source of truth for `supportedPollingRates`:
19
+ * a rate the driver cannot encode must never reach the UI, which renders one
20
+ * button per advertised rate and would throw on click. 250 Hz is deliberately
21
+ * absent — Fantech's own spec sheet lists it for the WG14P, but its wire
22
+ * encoding has never been captured, and inventing a code byte would silently
23
+ * set some other rate. Add it here, and nowhere else, once a capture confirms
24
+ * the value.
25
+ */
26
+ export const REPORT_RATE_ENCODE = {
27
+ 8000: 0,
28
+ 4000: 1,
29
+ 2000: 2,
30
+ 1000: 3,
31
+ 500: 4,
32
+ 125: 5,
33
+ };
34
+ export const REPORT_RATE_DECODE = Object.fromEntries(Object.entries(REPORT_RATE_ENCODE).map(([k, v]) => [v, Number(k)]));
35
+ export const FANTECH_REPORT_ID = 0x00;
36
+ export const FANTECH_REPORT_SIZE = 64;
37
+ /** DPI slots the Family B report layout has room for (bytes [8..23] X, [24..39] Y). */
38
+ export const FANTECH_MAX_DPI_SLOTS = 8;
39
+ /** First byte of the per-slot X DPI array, in both a GET_DPI response and a SET_DPI command. */
40
+ const DPI_X_OFFSET = 8;
41
+ /** First byte of the per-slot Y DPI array, immediately after the X array. */
42
+ const DPI_Y_OFFSET = DPI_X_OFFSET + FANTECH_MAX_DPI_SLOTS * 2;
43
+ /** One past the end of the Y array; the whole DPI table is [DPI_X_OFFSET, DPI_END). */
44
+ const DPI_END = DPI_Y_OFFSET + FANTECH_MAX_DPI_SLOTS * 2;
45
+ function rejectionMessage(result) {
46
+ return result.reason instanceof Error ? result.reason.message : String(result.reason);
47
+ }
48
+ /**
49
+ * Fantech vendor HID control.
50
+ *
51
+ * Transport: vendor usage page 0xFFFF, usage 0x02 under VID 0x3151.
52
+ * The WG14P Yari Pro exposes a 64-byte feature report on this interface
53
+ * for DPI and configuration settings.
54
+ *
55
+ * Protocol: Fantech command-based protocol (Family B).
56
+ * - Send command as first byte of 64-byte feature report
57
+ * - Read response as 64-byte feature report
58
+ * - DPI stored as LE uint16 in bytes [8+h*2..9+h*2] (X) and [24+h*2..25+h*2] (Y)
59
+ * - Report rate encoded as 0=8000, 1=4000, 2=2000, 3=1000, 4=500, 5=125
60
+ *
61
+ * NOT every VID 0x3151 mouse speaks Family B, and the ones that do not are
62
+ * indistinguishable from the ones that do until you ask them something. The
63
+ * 2.4G receiver sold as PID 0x402D presents byte-for-byte the interface
64
+ * described above — vendor page 0xFFFF, usage 0x02, one unnumbered 64-byte
65
+ * feature report — and ACKs every SET_FEATURE write without error, yet
66
+ * answers GET_DPI, GET_REPORT_RATE, GET_ALL_PARAMS and GET_DEBOUNCE alike
67
+ * with 64 zero bytes (measured on Windows across 0-500ms read delays and
68
+ * three different command layouts).
69
+ *
70
+ * Reading those zeros as data is worse than failing outright: byte 2 of a
71
+ * blank response decodes to report-rate code 0 = 8000 Hz, and a zero DPI used
72
+ * to fall back to 1600, so `readStatus()` returned a perfectly plausible
73
+ * "ready" mouse whose every number was invented. Each read below therefore
74
+ * rejects a blank response, and `readStatus()` throws when nothing answers at
75
+ * all — the caller treats that as "try the next candidate driver" (see
76
+ * `connectToInterface()` in the desktop app under `src/native-hid/scan.ts`).
77
+ */
78
+ export class FantechHidClient {
79
+ device;
80
+ currentProfile = 0;
81
+ constructor(device) {
82
+ this.device = device;
83
+ }
84
+ static isSupported(device) {
85
+ if (device.vendorId !== VENDOR_ID.fantech)
86
+ return false;
87
+ // 0x3151 is the MicLink/mlzn ODM vendor id, not Fantech's own, and the
88
+ // GearHub-V5 mice (Lingbao M5 Pro, Attack Shark R2, …) answer on the
89
+ // identical 0xFFFF/0x02 interface while speaking a different dialect
90
+ // entirely (2.4G relay + Bit7 checksum). They have their own driver;
91
+ // leave their product ids to it, or driverFor() would hand this one a
92
+ // device it cannot read.
93
+ if (GEARHUB_PRODUCTS.has(device.productId))
94
+ return false;
95
+ const hasVendorConfig = (collections) => collections.some((collection) => (collection.usagePage === 0xffff &&
96
+ collection.usage === 0x02) ||
97
+ hasVendorConfig(collection.children));
98
+ return hasVendorConfig(device.collections);
99
+ }
100
+ /**
101
+ * Only the rates this driver can actually put on the wire. Derived from
102
+ * REPORT_RATE_ENCODE so the list the UI renders and the list
103
+ * `setReportRate()` accepts cannot drift apart.
104
+ */
105
+ get supportedPollingRates() {
106
+ return Object.keys(REPORT_RATE_ENCODE)
107
+ .map(Number)
108
+ .sort((a, b) => a - b);
109
+ }
110
+ getDpiOptions() {
111
+ return [
112
+ 400, 800, 1200, 1600, 2000, 2400, 3200, 4000, 4800, 5600, 6400, 8000,
113
+ 10000, 12000, 16000, 20000, 26000, 30000,
114
+ ];
115
+ }
116
+ async open() {
117
+ if (!this.device.opened)
118
+ await this.device.open();
119
+ }
120
+ async close() {
121
+ if (this.device.opened)
122
+ await this.device.close();
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // Command I/O
126
+ // ---------------------------------------------------------------------------
127
+ /** Send a command and return the raw response, answered or not. */
128
+ async sendCommand(cmd, ...payload) {
129
+ const buf = new Uint8Array(FANTECH_REPORT_SIZE);
130
+ buf[0] = cmd;
131
+ for (let i = 0; i < payload.length && i + 1 < buf.length; i++) {
132
+ buf[i + 1] = payload[i];
133
+ }
134
+ await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
135
+ return this.readResponse();
136
+ }
137
+ /**
138
+ * Send a command that must be answered, rejecting a response that carries no
139
+ * answer at all. A device on a different protocol family still ACKs the
140
+ * feature write and hands back a zero-filled buffer, which is exactly what
141
+ * used to be decoded into invented DPI and polling-rate readings — see the
142
+ * class docs.
143
+ */
144
+ async sendQuery(cmd, ...payload) {
145
+ const resp = await this.sendCommand(cmd, ...payload);
146
+ if (resp.length < FANTECH_REPORT_SIZE) {
147
+ throw new Error(`Fantech command ${cmd} returned ${resp.length} bytes, expected ${FANTECH_REPORT_SIZE}.`);
148
+ }
149
+ if (resp.every((byte) => byte === 0)) {
150
+ throw new Error(`Fantech command ${cmd} was not answered (all-zero response); this device does not speak the Family B protocol.`);
151
+ }
152
+ return resp;
153
+ }
154
+ /** Read a response report. */
155
+ async readResponse() {
156
+ const view = await this.device.receiveFeatureReport(FANTECH_REPORT_ID);
157
+ return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // DPI Protocol
161
+ // ---------------------------------------------------------------------------
162
+ /**
163
+ * Read current DPI settings for the active slot. Throws when the device does
164
+ * not answer, or answers without a usable DPI — a caller must never be handed
165
+ * a fabricated default it cannot tell apart from a real reading.
166
+ */
167
+ async getDpi() {
168
+ await this.open();
169
+ const resp = await this.sendQuery(CMD.GET_DPI, this.currentProfile);
170
+ // Response structure (Family B):
171
+ // Byte 2: current DPI slot index
172
+ // Byte 3: number of DPI slots
173
+ // Bytes [8..23]: X DPI per slot (LE uint16, up to 8 slots)
174
+ // Bytes [24..39]: Y DPI per slot (LE uint16, up to 8 slots)
175
+ const slot = resp[2] >= FANTECH_MAX_DPI_SLOTS ? 0 : resp[2];
176
+ const numSlots = resp[3] || 1;
177
+ const dpiX = resp[DPI_X_OFFSET + slot * 2] | (resp[DPI_X_OFFSET + 1 + slot * 2] << 8);
178
+ const dpiY = resp[DPI_Y_OFFSET + slot * 2] | (resp[DPI_Y_OFFSET + 1 + slot * 2] << 8);
179
+ if (!dpiX) {
180
+ throw new Error(`Fantech GET_DPI answered, but slot ${slot} carries no DPI value.`);
181
+ }
182
+ return { dpiX, dpiY: dpiY || dpiX, slot, numSlots };
183
+ }
184
+ /** Set DPI for a specific slot, leaving every other slot exactly as it was. */
185
+ async setDpiForSlot(dpiX, dpiY, slot = 0) {
186
+ await this.open();
187
+ // Read current state first. SET_DPI carries the WHOLE per-slot DPI table,
188
+ // so every slot that is not being written has to be echoed back unchanged;
189
+ // sending a freshly zeroed buffer wiped the other DPI stages.
190
+ const readResp = await this.sendQuery(CMD.GET_DPI, this.currentProfile);
191
+ const numSlots = readResp[3] || 1;
192
+ const target = slot >= FANTECH_MAX_DPI_SLOTS ? 0 : slot;
193
+ // Build the Set DPI command
194
+ const buf = new Uint8Array(FANTECH_REPORT_SIZE);
195
+ buf[0] = CMD.SET_DPI;
196
+ buf[1] = this.currentProfile;
197
+ buf[2] = target;
198
+ buf[3] = numSlots;
199
+ // Carry every slot's existing X and Y over before overwriting the target's.
200
+ buf.set(readResp.subarray(DPI_X_OFFSET, DPI_END), DPI_X_OFFSET);
201
+ // Write X DPI as LE uint16
202
+ buf[DPI_X_OFFSET + target * 2] = dpiX & 0xff;
203
+ buf[DPI_X_OFFSET + 1 + target * 2] = (dpiX >> 8) & 0xff;
204
+ // Write Y DPI as LE uint16
205
+ buf[DPI_Y_OFFSET + target * 2] = dpiY & 0xff;
206
+ buf[DPI_Y_OFFSET + 1 + target * 2] = (dpiY >> 8) & 0xff;
207
+ await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
208
+ return dpiX;
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // Report Rate Protocol
212
+ // ---------------------------------------------------------------------------
213
+ /** Get current report/polling rate. Throws when the device does not answer. */
214
+ async getReportRate() {
215
+ await this.open();
216
+ const resp = await this.sendQuery(CMD.GET_REPORT_RATE);
217
+ const code = resp[2];
218
+ const hz = REPORT_RATE_DECODE[code];
219
+ if (hz === undefined) {
220
+ throw new Error(`Fantech GET_REPORT_RATE returned unknown rate code ${code}.`);
221
+ }
222
+ return hz;
223
+ }
224
+ /** Set report/polling rate. */
225
+ async setReportRate(hz) {
226
+ if (!(hz in REPORT_RATE_ENCODE)) {
227
+ throw new Error(`Unsupported rate ${hz} Hz. Supported: ${this.supportedPollingRates.join(", ")}`);
228
+ }
229
+ await this.open();
230
+ const code = REPORT_RATE_ENCODE[hz];
231
+ const buf = new Uint8Array(FANTECH_REPORT_SIZE);
232
+ buf[0] = CMD.SET_REPORT_RATE;
233
+ buf[1] = code;
234
+ await this.device.sendFeatureReport(FANTECH_REPORT_ID, buf);
235
+ return hz;
236
+ }
237
+ // ---------------------------------------------------------------------------
238
+ // High-Level API
239
+ // ---------------------------------------------------------------------------
240
+ async readStatus() {
241
+ await this.open();
242
+ const [dpiResult, pollRate] = await Promise.allSettled([
243
+ this.getDpi(),
244
+ this.getReportRate(),
245
+ ]);
246
+ // Nothing answered at all: this interface is not a Family B control
247
+ // channel, so fail instead of returning a status assembled from defaults.
248
+ if (dpiResult.status === "rejected" && pollRate.status === "rejected") {
249
+ throw new Error(`Fantech control interface did not answer. ${rejectionMessage(dpiResult)} ${rejectionMessage(pollRate)}`);
250
+ }
251
+ const dpiData = dpiResult.status === "fulfilled" ? dpiResult.value : null;
252
+ const pollRateVal = pollRate.status === "fulfilled" ? pollRate.value : 1000;
253
+ return {
254
+ brand: "Fantech",
255
+ name: this.device.productName || "Fantech Mouse",
256
+ ui: {
257
+ family: "fantech",
258
+ settingsReady: dpiData !== null,
259
+ hideLodLow: true,
260
+ hideUnsupportedPollingRates: true,
261
+ hideProcessingCard: true,
262
+ defaultDisplayName: this.device.productName || "Fantech Mouse",
263
+ },
264
+ batteryPercent: null,
265
+ batteryState: "Unknown",
266
+ dpi: dpiData?.dpiX ?? 1600,
267
+ dpiY: dpiData?.dpiY ?? dpiData?.dpiX ?? 1600,
268
+ pollingRateHz: pollRateVal,
269
+ supportedPollingRates: this.supportedPollingRates,
270
+ activeProfile: this.currentProfile,
271
+ // connectionType/connectionDetail are deliberately unset. Family B
272
+ // carries no link information, and VID 0x3151 covers both wired mice and
273
+ // 2.4G receivers, so the "Wired (USB)" that used to be hardcoded here
274
+ // mislabelled every wireless one. OverviewPage hides the row when absent.
275
+ liftOffDistance: null,
276
+ // No firmware command is implemented; an empty list hides the row instead
277
+ // of showing the placeholder string that used to sit here.
278
+ firmware: [],
279
+ };
280
+ }
281
+ async setDpi(dpi, dpiY = dpi) {
282
+ await this.open();
283
+ const current = await this.getDpi();
284
+ await this.setDpiForSlot(dpi, dpiY, current.slot);
285
+ return dpi;
286
+ }
287
+ async setPollingRate(rate) {
288
+ if (!this.supportedPollingRates.includes(rate)) {
289
+ throw new Error(`Fantech supports ${this.supportedPollingRates.join(", ")} Hz.`);
290
+ }
291
+ await this.setReportRate(rate);
292
+ return rate;
293
+ }
294
+ }
295
+ //# sourceMappingURL=hid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/fantech/hid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { MouseStatus } from "../mouse-types.js";
2
+ export declare const FINALMOUSE_VENDOR_ID = 13853;
3
+ export declare const FINALMOUSE_ULX_DONGLE_PRODUCT_ID = 256;
4
+ export declare const FINALMOUSE_DISPLAY_NAME = "Finalmouse UltralightX";
5
+ export declare class FinalmouseHidClient {
6
+ readonly device: HIDDevice;
7
+ private telemetry;
8
+ private reportRevision;
9
+ private listenerAttached;
10
+ private readonly reportWaiters;
11
+ private readonly onInputReport;
12
+ constructor(device: HIDDevice);
13
+ static isSupported(device: HIDDevice): boolean;
14
+ open(): Promise<void>;
15
+ close(): Promise<void>;
16
+ displayName(): string;
17
+ get pollIntervalMs(): number;
18
+ getDpiOptions(): number[];
19
+ readStatus(): Promise<MouseStatus>;
20
+ setDpi(dpi: number): Promise<number>;
21
+ setPollingRate(pollingRateHz: number): Promise<number>;
22
+ setMotionSync(enabled: boolean): Promise<boolean>;
23
+ setLiftOffDistance(value: NonNullable<MouseStatus["liftOffDistance"]>): Promise<NonNullable<MouseStatus["liftOffDistance"]>>;
24
+ setDongleLedMode(mode: number): Promise<number>;
25
+ setTournamentScrollMode(mode: number): Promise<number>;
26
+ setTournamentScrollTimeout(milliseconds: number): Promise<number>;
27
+ private writeU16;
28
+ private write;
29
+ private waitForReport;
30
+ }
31
+ //# sourceMappingURL=hid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/finalmouse/hid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,gCAAgC,MAAS,CAAC;AACvD,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAUhE,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAO5B;gBAEU,MAAM,EAAE,SAAS;IAI7B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAMxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,WAAW,IAAI,MAAM;IAIrB,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,aAAa,IAAI,MAAM,EAAE;IAInB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAqDlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAMjD,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAQ5H,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO/C,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAOzD,QAAQ;YAIR,KAAK;YAML,aAAa;CAa5B"}
@@ -0,0 +1,181 @@
1
+ import { buildFinalmouseReport, decodeFinalmouseReport, FINALMOUSE_COMMAND, FINALMOUSE_REPORT, } from "@openmouse/protocol/finalmouse";
2
+ export const FINALMOUSE_VENDOR_ID = 0x361d;
3
+ export const FINALMOUSE_ULX_DONGLE_PRODUCT_ID = 0x0100;
4
+ export const FINALMOUSE_DISPLAY_NAME = "Finalmouse UltralightX";
5
+ const POLLING_RATES = [500, 1000, 2000, 4000, 8000];
6
+ const DPI_MIN = 50;
7
+ const DPI_MAX = 26000;
8
+ function pause(milliseconds) {
9
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
10
+ }
11
+ export class FinalmouseHidClient {
12
+ device;
13
+ telemetry = {};
14
+ reportRevision = 0;
15
+ listenerAttached = false;
16
+ reportWaiters = new Set();
17
+ onInputReport = (event) => {
18
+ const bytes = new Uint8Array(event.data.buffer.slice(event.data.byteOffset, event.data.byteOffset + event.data.byteLength));
19
+ const update = decodeFinalmouseReport(event.reportId, bytes);
20
+ if (!update)
21
+ return;
22
+ Object.assign(this.telemetry, update);
23
+ this.reportRevision += 1;
24
+ for (const finish of [...this.reportWaiters])
25
+ finish();
26
+ };
27
+ constructor(device) {
28
+ this.device = device;
29
+ }
30
+ static isSupported(device) {
31
+ return device.vendorId === FINALMOUSE_VENDOR_ID
32
+ && device.productId === FINALMOUSE_ULX_DONGLE_PRODUCT_ID
33
+ && device.collections.some((collection) => collection.usagePage === 0xff00 && collection.usage === 0x0001);
34
+ }
35
+ async open() {
36
+ if (!this.device.opened)
37
+ await this.device.open();
38
+ if (!this.listenerAttached) {
39
+ this.device.addEventListener("inputreport", this.onInputReport);
40
+ this.listenerAttached = true;
41
+ }
42
+ }
43
+ async close() {
44
+ if (this.listenerAttached) {
45
+ this.device.removeEventListener("inputreport", this.onInputReport);
46
+ this.listenerAttached = false;
47
+ }
48
+ if (this.device.opened)
49
+ await this.device.close();
50
+ }
51
+ displayName() {
52
+ return FINALMOUSE_DISPLAY_NAME;
53
+ }
54
+ get pollIntervalMs() {
55
+ return 10_000;
56
+ }
57
+ getDpiOptions() {
58
+ return Array.from({ length: DPI_MAX - DPI_MIN + 1 }, (_, index) => DPI_MIN + index);
59
+ }
60
+ async readStatus() {
61
+ await this.open();
62
+ const revision = this.reportRevision;
63
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.liftOffDistance);
64
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.wakeAll);
65
+ await this.write(FINALMOUSE_REPORT.dongle, FINALMOUSE_COMMAND.dongleInfo);
66
+ await this.waitForReport(revision, 1000);
67
+ // Status arrives as a short burst of separate feature reports.
68
+ await pause(75);
69
+ const state = this.telemetry;
70
+ if (state.dpi === undefined || state.pollingRateHz === undefined) {
71
+ throw new Error("The Finalmouse UltralightX did not return its current settings. Make sure the mouse is on and close xpanel or other Finalmouse software.");
72
+ }
73
+ const firmware = [
74
+ state.mouseFirmware ? `Mouse ${state.mouseFirmware}` : null,
75
+ state.dongleRfFirmware ? `Dongle RF ${state.dongleRfFirmware}` : null,
76
+ state.dongleUsbFirmware ? `Dongle USB ${state.dongleUsbFirmware}` : null,
77
+ ].filter((value) => value !== null);
78
+ const connectionDetail = [
79
+ "2.4 GHz receiver",
80
+ state.rssiDbm === undefined ? null : `${state.rssiDbm} dBm`,
81
+ ].filter((value) => value !== null).join(" · ");
82
+ return {
83
+ brand: "Finalmouse",
84
+ name: this.displayName(),
85
+ ui: {
86
+ family: "finalmouse-ulx",
87
+ defaultDisplayName: FINALMOUSE_DISPLAY_NAME,
88
+ hideUnsupportedPollingRates: true,
89
+ forceShowBattery: true,
90
+ },
91
+ batteryPercent: state.batteryPercent ?? null,
92
+ batteryVoltageMv: state.batteryVoltageMv ?? null,
93
+ batteryState: state.chargingState === 1 ? "Charging" : state.chargingState === undefined ? "Unknown" : "Discharging",
94
+ dpi: state.dpi,
95
+ pollingRateHz: state.pollingRateHz,
96
+ supportedPollingRates: [...POLLING_RATES],
97
+ activeProfile: null,
98
+ unitId: state.mouseSerial ?? null,
99
+ connectionType: "Wireless",
100
+ connectionDetail,
101
+ motionSync: state.motionSync ?? null,
102
+ liftOffDistance: state.liftOffDistanceMm === 1 ? "Medium" : state.liftOffDistanceMm === 2 ? "High" : null,
103
+ supportedLiftOffDistances: ["Medium", "High"],
104
+ finalmouseDongleLedMode: state.dongleLedMode ?? null,
105
+ finalmouseTournamentScrollMode: state.tournamentScrollMode ?? null,
106
+ finalmouseTournamentScrollTimeoutMs: state.tournamentScrollTimeoutMs ?? null,
107
+ firmware,
108
+ };
109
+ }
110
+ async setDpi(dpi) {
111
+ if (!Number.isInteger(dpi) || dpi < DPI_MIN || dpi > DPI_MAX)
112
+ throw new Error("Finalmouse UltralightX DPI must be between 50 and 26,000.");
113
+ await this.writeU16(FINALMOUSE_COMMAND.dpi, dpi);
114
+ this.telemetry.dpi = dpi;
115
+ return dpi;
116
+ }
117
+ async setPollingRate(pollingRateHz) {
118
+ if (!POLLING_RATES.includes(pollingRateHz))
119
+ throw new Error("Unsupported Finalmouse UltralightX polling rate.");
120
+ await this.writeU16(FINALMOUSE_COMMAND.pollingRate, pollingRateHz);
121
+ this.telemetry.pollingRateHz = pollingRateHz;
122
+ return pollingRateHz;
123
+ }
124
+ async setMotionSync(enabled) {
125
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.motionSync, new Uint8Array([enabled ? 1 : 0]));
126
+ this.telemetry.motionSync = enabled;
127
+ return enabled;
128
+ }
129
+ async setLiftOffDistance(value) {
130
+ const millimeters = value === "Medium" ? 1 : value === "High" ? 2 : null;
131
+ if (millimeters === null)
132
+ throw new Error("Finalmouse UltralightX lift-off distance must be 1 mm or 2 mm.");
133
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.liftOffDistance, new Uint8Array([millimeters]));
134
+ this.telemetry.liftOffDistanceMm = millimeters;
135
+ return value;
136
+ }
137
+ async setDongleLedMode(mode) {
138
+ if (![0, 1, 2].includes(mode))
139
+ throw new Error("Unsupported Finalmouse dongle LED mode.");
140
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.dongleLed, new Uint8Array([mode]));
141
+ this.telemetry.dongleLedMode = mode;
142
+ return mode;
143
+ }
144
+ async setTournamentScrollMode(mode) {
145
+ if (![0, 1, 2, 3].includes(mode))
146
+ throw new Error("Unsupported Finalmouse tournament scroll mode.");
147
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.tournamentScrollMode, new Uint8Array([mode]));
148
+ this.telemetry.tournamentScrollMode = mode;
149
+ return mode;
150
+ }
151
+ async setTournamentScrollTimeout(milliseconds) {
152
+ if (![100, 500, 1000, 1500].includes(milliseconds))
153
+ throw new Error("Unsupported Finalmouse tournament scroll timeout.");
154
+ await this.write(FINALMOUSE_REPORT.main, FINALMOUSE_COMMAND.tournamentScrollTimeout, new Uint8Array([milliseconds / 100]));
155
+ this.telemetry.tournamentScrollTimeoutMs = milliseconds;
156
+ return milliseconds;
157
+ }
158
+ async writeU16(command, value) {
159
+ await this.write(FINALMOUSE_REPORT.main, command, new Uint8Array([value & 0xff, value >> 8]));
160
+ }
161
+ async write(reportId, command, payload = new Uint8Array()) {
162
+ await this.open();
163
+ const report = buildFinalmouseReport(command, payload);
164
+ await this.device.sendReport(reportId, report.buffer);
165
+ }
166
+ async waitForReport(afterRevision, timeoutMs) {
167
+ if (this.reportRevision > afterRevision)
168
+ return;
169
+ await new Promise((resolve) => {
170
+ let timer = 0;
171
+ const finish = () => {
172
+ clearTimeout(timer);
173
+ this.reportWaiters.delete(finish);
174
+ resolve();
175
+ };
176
+ timer = setTimeout(finish, timeoutMs);
177
+ this.reportWaiters.add(finish);
178
+ });
179
+ }
180
+ }
181
+ //# sourceMappingURL=hid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid.js","sourceRoot":"","sources":["../../../src/drivers/finalmouse/hid.ts"],"names":[],"mappings":"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"}