@openmouse/protocol 0.10.1 → 0.11.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 (93) hide show
  1. package/README.md +2 -1
  2. package/dist/compx/x11-dpi.d.ts +2 -0
  3. package/dist/compx/x11-dpi.d.ts.map +1 -1
  4. package/dist/compx/x11-dpi.js +2 -0
  5. package/dist/compx/x11-dpi.js.map +1 -1
  6. package/dist/delux/index.d.ts +21 -5
  7. package/dist/delux/index.d.ts.map +1 -1
  8. package/dist/delux/index.js +25 -5
  9. package/dist/delux/index.js.map +1 -1
  10. package/dist/drivers/attackshark/hid.d.ts +23 -2
  11. package/dist/drivers/attackshark/hid.d.ts.map +1 -1
  12. package/dist/drivers/attackshark/hid.js +150 -21
  13. package/dist/drivers/attackshark/hid.js.map +1 -1
  14. package/dist/drivers/delux/hid.d.ts +6 -0
  15. package/dist/drivers/delux/hid.d.ts.map +1 -1
  16. package/dist/drivers/delux/hid.js +35 -6
  17. package/dist/drivers/delux/hid.js.map +1 -1
  18. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -1
  19. package/dist/drivers/endgame/egg-we-hid.js +7 -1
  20. package/dist/drivers/endgame/egg-we-hid.js.map +1 -1
  21. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -1
  22. package/dist/drivers/glorious/classic-hid.js +2 -0
  23. package/dist/drivers/glorious/classic-hid.js.map +1 -1
  24. package/dist/drivers/glorious/hid.d.ts.map +1 -1
  25. package/dist/drivers/glorious/hid.js +2 -0
  26. package/dist/drivers/glorious/hid.js.map +1 -1
  27. package/dist/drivers/gwolves/hid.d.ts +6 -0
  28. package/dist/drivers/gwolves/hid.d.ts.map +1 -1
  29. package/dist/drivers/gwolves/hid.js +16 -0
  30. package/dist/drivers/gwolves/hid.js.map +1 -1
  31. package/dist/drivers/gwolves/products.d.ts.map +1 -1
  32. package/dist/drivers/gwolves/products.js +9 -52
  33. package/dist/drivers/gwolves/products.js.map +1 -1
  34. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -1
  35. package/dist/drivers/keychron/nape-hid.js +4 -1
  36. package/dist/drivers/keychron/nape-hid.js.map +1 -1
  37. package/dist/drivers/lamzu-atlantis/hid.d.ts +2 -0
  38. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -1
  39. package/dist/drivers/lamzu-atlantis/hid.js +16 -0
  40. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -1
  41. package/dist/drivers/logitech/hidpp.d.ts +6 -4
  42. package/dist/drivers/logitech/hidpp.d.ts.map +1 -1
  43. package/dist/drivers/logitech/hidpp.js +23 -12
  44. package/dist/drivers/logitech/hidpp.js.map +1 -1
  45. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -1
  46. package/dist/drivers/logitech/onboard-profiles.js +31 -8
  47. package/dist/drivers/logitech/onboard-profiles.js.map +1 -1
  48. package/dist/drivers/motospeed/hid.d.ts +51 -0
  49. package/dist/drivers/motospeed/hid.d.ts.map +1 -0
  50. package/dist/drivers/motospeed/hid.js +395 -0
  51. package/dist/drivers/motospeed/hid.js.map +1 -0
  52. package/dist/drivers/mouse-types.d.ts +1 -1
  53. package/dist/drivers/mouse-types.d.ts.map +1 -1
  54. package/dist/drivers/pulsar/pulsar-areson-hid.d.ts +13 -0
  55. package/dist/drivers/pulsar/pulsar-areson-hid.d.ts.map +1 -0
  56. package/dist/drivers/pulsar/pulsar-areson-hid.js +59 -0
  57. package/dist/drivers/pulsar/pulsar-areson-hid.js.map +1 -0
  58. package/dist/drivers/pulsar/pulsar-hid.d.ts +13 -1
  59. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -1
  60. package/dist/drivers/pulsar/pulsar-hid.js +22 -3
  61. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -1
  62. package/dist/drivers/registry.d.ts +2 -1
  63. package/dist/drivers/registry.d.ts.map +1 -1
  64. package/dist/drivers/registry.js +9 -1
  65. package/dist/drivers/registry.js.map +1 -1
  66. package/dist/drivers/teevolution/hid.d.ts.map +1 -1
  67. package/dist/drivers/teevolution/hid.js +2 -22
  68. package/dist/drivers/teevolution/hid.js.map +1 -1
  69. package/dist/drivers/vendors.d.ts +4 -2
  70. package/dist/drivers/vendors.d.ts.map +1 -1
  71. package/dist/drivers/vendors.js +15 -2
  72. package/dist/drivers/vendors.js.map +1 -1
  73. package/dist/drivers/vgn/hid.d.ts +9 -0
  74. package/dist/drivers/vgn/hid.d.ts.map +1 -1
  75. package/dist/drivers/vgn/hid.js +21 -3
  76. package/dist/drivers/vgn/hid.js.map +1 -1
  77. package/dist/index.d.ts +1 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/logitech/wheel.d.ts +9 -0
  82. package/dist/logitech/wheel.d.ts.map +1 -1
  83. package/dist/logitech/wheel.js +6 -0
  84. package/dist/logitech/wheel.js.map +1 -1
  85. package/dist/motospeed/index.d.ts +127 -0
  86. package/dist/motospeed/index.d.ts.map +1 -0
  87. package/dist/motospeed/index.js +282 -0
  88. package/dist/motospeed/index.js.map +1 -0
  89. package/dist/teevolution/index.d.ts +30 -1
  90. package/dist/teevolution/index.d.ts.map +1 -1
  91. package/dist/teevolution/index.js +56 -3
  92. package/dist/teevolution/index.js.map +1 -1
  93. package/package.json +5 -1
package/README.md CHANGED
@@ -42,7 +42,7 @@ checklist.
42
42
  | ATK | `@openmouse/protocol/atk` |
43
43
  | Corsair | `@openmouse/protocol/corsair` |
44
44
  | Dareu | `@openmouse/protocol/dareu` |
45
- | Delux M800 Mini | `@openmouse/protocol/delux` |
45
+ | Delux M800 Mini / M600 Pro | `@openmouse/protocol/delux` |
46
46
  | Endgame Gear OP1/XM2 8K | `@openmouse/protocol/endgame-gear-op1` |
47
47
  | Endgame Gear wireless | `@openmouse/protocol/endgame-gear-we` |
48
48
  | Fantech | `@openmouse/protocol/fantech` |
@@ -59,6 +59,7 @@ checklist.
59
59
  | Logitech | `@openmouse/protocol/logitech` |
60
60
  | MCHOSE | `@openmouse/protocol/mchose` |
61
61
  | Microsoft | `@openmouse/protocol/microsoft` |
62
+ | Motospeed | `@openmouse/protocol/motospeed` |
62
63
  | moddoMOUSE | `@openmouse/protocol/moddo` |
63
64
  | Ninjutso | `@openmouse/protocol/ninjutso` |
64
65
  | Orbital | `@openmouse/protocol/orbital` |
@@ -12,6 +12,8 @@ export declare const X11_DPI_DEFAULT_STAGES: readonly number[];
12
12
  * sensor's register page.
13
13
  */
14
14
  export declare const X11_DPI_STEP_MAP: Readonly<Record<number, number>>;
15
+ /** Every encodable DPI value, ascending (50-step to 10,000, 100-step above). */
16
+ export declare const X11_DPI_VALUES: readonly number[];
15
17
  /** Nearest supported DPI at or above `dpi`, clamped to the sensor's range. */
16
18
  export declare function nearestX11Dpi(dpi: number): number;
17
19
  /** Hardware byte for the nearest supported value. Throws only if unclamped. */
@@ -1 +1 @@
1
- {"version":3,"file":"x11-dpi.d.ts","sourceRoot":"","sources":["../../src/compx/x11-dpi.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB,IAAO,CAAC;AACtC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAyC,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwD7D,CAAC;AAMF,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAkBD,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CA2ClE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAqCxE"}
1
+ {"version":3,"file":"x11-dpi.d.ts","sourceRoot":"","sources":["../../src/compx/x11-dpi.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB,IAAO,CAAC;AACtC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAyC,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwD7D,CAAC;AAMF,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAqC,CAAC;AAElF,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAkBD,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CA2ClE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAqCxE"}
@@ -85,6 +85,8 @@ export const X11_DPI_STEP_MAP = {
85
85
  const STEP_ENTRIES = Object.entries(X11_DPI_STEP_MAP)
86
86
  .map(([dpi, byte]) => [Number(dpi), byte])
87
87
  .sort((a, b) => a[0] - b[0]);
88
+ /** Every encodable DPI value, ascending (50-step to 10,000, 100-step above). */
89
+ export const X11_DPI_VALUES = STEP_ENTRIES.map(([dpi]) => dpi);
88
90
  /** Nearest supported DPI at or above `dpi`, clamped to the sensor's range. */
89
91
  export function nearestX11Dpi(dpi) {
90
92
  const target = Math.min(X11_DPI_MAX, Math.max(X11_DPI_MIN, Math.round(dpi)));
@@ -1 +1 @@
1
- {"version":3,"file":"x11-dpi.js","sourceRoot":"","sources":["../../src/compx/x11-dpi.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,8DAA8D;AAC9D,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,6EAA6E;AAC7E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE9F;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IAC1E,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IAC3E,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC7E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC3D,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IACxB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5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"}
1
+ {"version":3,"file":"x11-dpi.js","sourceRoot":"","sources":["../../src/compx/x11-dpi.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,8DAA8D;AAC9D,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,6EAA6E;AAC7E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE9F;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IAC1E,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IAC3E,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC7E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC3D,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IACxB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5E,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IAC5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"}
@@ -1,15 +1,31 @@
1
1
  /**
2
- * Delux M800 Mini catalogue and protocol exports.
2
+ * Delux M800 Mini / M600 Pro catalogue and protocol exports.
3
3
  *
4
- * The Mini uses the 0x1d57 X11-style firmware under branded product names.
5
- * Its product IDs overlap other OEM mice, so IDs alone do not identify Delux
6
- * hardware.
4
+ * Both models use the 0x1d57 X11-style firmware. The Mini reports branded
5
+ * product names, and its product IDs overlap other OEM mice, so IDs alone do
6
+ * not identify it. The M600 Pro reports only generic Beken strings ("USB
7
+ * Gaming Mouse" wired, "2.4G Wireless Device" on its receiver). Its wired
8
+ * product ID is claimed by ID alone. Its receiver shares 0xfa60 with the X11
9
+ * family and is named by the model id in its messages instead
10
+ * (`DELUX_M600_PRO_MODEL_ID`). See docs/delux-m600-pro-testing.md.
7
11
  */
8
12
  export declare const DELUX_OEM_VENDOR_ID = 7511;
9
13
  export declare const DELUX_M800_MINI_WIRELESS_PID = 64096;
10
14
  export declare const DELUX_M800_MINI_WIRED_PID = 64085;
15
+ export declare const DELUX_M600_PRO_WIRED_PID = 64113;
11
16
  export declare const DELUX_PRODUCT_IDS: ReadonlySet<number>;
17
+ /**
18
+ * Model id the paired mouse sends in byte 1 of every receiver message
19
+ * (`03 <model> <event> ...`, e.g. battery `03 20 40 01 <pct>`). The shared
20
+ * 0xfa60 receiver carries no other identity; the X11 sends 0x55.
21
+ */
22
+ export declare const DELUX_M600_PRO_MODEL_ID = 32;
23
+ /**
24
+ * Delux product IDs whose firmware reports no Delux product string. Claimed by
25
+ * ID alone: no other 0x1d57 device in this catalogue uses them.
26
+ */
27
+ export declare const DELUX_UNBRANDED_PRODUCT_IDS: ReadonlySet<number>;
12
28
  export declare const DELUX_PRODUCT_NAMES: ReadonlyMap<number, string>;
13
29
  export declare const DELUX_POLLING_RATES: readonly number[];
14
- export { buildX11DpiReport as buildDeluxM800MiniDpiReport, decodeX11DpiReport as decodeDeluxM800MiniDpiReport, nearestX11Dpi as nearestDeluxM800MiniDpi, X11_DPI_DEFAULT_ACTIVE as DELUX_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES as DELUX_DPI_DEFAULT_STAGES, X11_DPI_MAX as DELUX_DPI_MAX, X11_DPI_MIN as DELUX_DPI_MIN, X11_DPI_REPORT_ID as DELUX_DPI_REPORT_ID, X11_DPI_STAGE_COUNT as DELUX_DPI_STAGE_COUNT, X11_DPI_STEP as DELUX_DPI_STEP, } from "../compx/x11-dpi.ts";
30
+ export { buildX11DpiReport as buildDeluxM800MiniDpiReport, decodeX11DpiReport as decodeDeluxM800MiniDpiReport, nearestX11Dpi as nearestDeluxM800MiniDpi, X11_DPI_DEFAULT_ACTIVE as DELUX_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES as DELUX_DPI_DEFAULT_STAGES, X11_DPI_MAX as DELUX_DPI_MAX, X11_DPI_MIN as DELUX_DPI_MIN, X11_DPI_REPORT_ID as DELUX_DPI_REPORT_ID, X11_DPI_STAGE_COUNT as DELUX_DPI_STAGE_COUNT, X11_DPI_STEP as DELUX_DPI_STEP, X11_DPI_VALUES as DELUX_DPI_VALUES, } from "../compx/x11-dpi.ts";
15
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delux/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,mBAAmB,OAAS,CAAC;AAE1C,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAGhD,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAG1D,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAA0B,CAAC;AAE5E,OAAO,EACL,iBAAiB,IAAI,2BAA2B,EAChD,kBAAkB,IAAI,4BAA4B,EAClD,aAAa,IAAI,uBAAuB,EACxC,sBAAsB,IAAI,wBAAwB,EAClD,sBAAsB,IAAI,wBAAwB,EAClD,WAAW,IAAI,aAAa,EAC5B,WAAW,IAAI,aAAa,EAC5B,iBAAiB,IAAI,mBAAmB,EACxC,mBAAmB,IAAI,qBAAqB,EAC5C,YAAY,IAAI,cAAc,GAC/B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delux/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,mBAAmB,OAAS,CAAC;AAE1C,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAIhD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAE1D,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAI1D,CAAC;AAEH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAA0B,CAAC;AAE5E,OAAO,EACL,iBAAiB,IAAI,2BAA2B,EAChD,kBAAkB,IAAI,4BAA4B,EAClD,aAAa,IAAI,uBAAuB,EACxC,sBAAsB,IAAI,wBAAwB,EAClD,sBAAsB,IAAI,wBAAwB,EAClD,WAAW,IAAI,aAAa,EAC5B,WAAW,IAAI,aAAa,EAC5B,iBAAiB,IAAI,mBAAmB,EACxC,mBAAmB,IAAI,qBAAqB,EAC5C,YAAY,IAAI,cAAc,EAC9B,cAAc,IAAI,gBAAgB,GACnC,MAAM,qBAAqB,CAAC"}
@@ -1,21 +1,41 @@
1
1
  /**
2
- * Delux M800 Mini catalogue and protocol exports.
2
+ * Delux M800 Mini / M600 Pro catalogue and protocol exports.
3
3
  *
4
- * The Mini uses the 0x1d57 X11-style firmware under branded product names.
5
- * Its product IDs overlap other OEM mice, so IDs alone do not identify Delux
6
- * hardware.
4
+ * Both models use the 0x1d57 X11-style firmware. The Mini reports branded
5
+ * product names, and its product IDs overlap other OEM mice, so IDs alone do
6
+ * not identify it. The M600 Pro reports only generic Beken strings ("USB
7
+ * Gaming Mouse" wired, "2.4G Wireless Device" on its receiver). Its wired
8
+ * product ID is claimed by ID alone. Its receiver shares 0xfa60 with the X11
9
+ * family and is named by the model id in its messages instead
10
+ * (`DELUX_M600_PRO_MODEL_ID`). See docs/delux-m600-pro-testing.md.
7
11
  */
8
12
  export const DELUX_OEM_VENDOR_ID = 0x1d57;
9
13
  export const DELUX_M800_MINI_WIRELESS_PID = 0xfa60;
10
14
  export const DELUX_M800_MINI_WIRED_PID = 0xfa55;
15
+ export const DELUX_M600_PRO_WIRED_PID = 0xfa71;
11
16
  export const DELUX_PRODUCT_IDS = new Set([
12
17
  DELUX_M800_MINI_WIRELESS_PID,
13
18
  DELUX_M800_MINI_WIRED_PID,
19
+ DELUX_M600_PRO_WIRED_PID,
20
+ ]);
21
+ /**
22
+ * Model id the paired mouse sends in byte 1 of every receiver message
23
+ * (`03 <model> <event> ...`, e.g. battery `03 20 40 01 <pct>`). The shared
24
+ * 0xfa60 receiver carries no other identity; the X11 sends 0x55.
25
+ */
26
+ export const DELUX_M600_PRO_MODEL_ID = 0x20;
27
+ /**
28
+ * Delux product IDs whose firmware reports no Delux product string. Claimed by
29
+ * ID alone: no other 0x1d57 device in this catalogue uses them.
30
+ */
31
+ export const DELUX_UNBRANDED_PRODUCT_IDS = new Set([
32
+ DELUX_M600_PRO_WIRED_PID,
14
33
  ]);
15
34
  export const DELUX_PRODUCT_NAMES = new Map([
16
35
  [DELUX_M800_MINI_WIRELESS_PID, "Delux M800 Mini (Wireless)"],
17
36
  [DELUX_M800_MINI_WIRED_PID, "Delux M800 Mini (Wired)"],
37
+ [DELUX_M600_PRO_WIRED_PID, "Delux M600 Pro (Wired)"],
18
38
  ]);
19
39
  export const DELUX_POLLING_RATES = [125, 250, 500, 1000];
20
- export { buildX11DpiReport as buildDeluxM800MiniDpiReport, decodeX11DpiReport as decodeDeluxM800MiniDpiReport, nearestX11Dpi as nearestDeluxM800MiniDpi, X11_DPI_DEFAULT_ACTIVE as DELUX_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES as DELUX_DPI_DEFAULT_STAGES, X11_DPI_MAX as DELUX_DPI_MAX, X11_DPI_MIN as DELUX_DPI_MIN, X11_DPI_REPORT_ID as DELUX_DPI_REPORT_ID, X11_DPI_STAGE_COUNT as DELUX_DPI_STAGE_COUNT, X11_DPI_STEP as DELUX_DPI_STEP, } from "../compx/x11-dpi.js";
40
+ export { buildX11DpiReport as buildDeluxM800MiniDpiReport, decodeX11DpiReport as decodeDeluxM800MiniDpiReport, nearestX11Dpi as nearestDeluxM800MiniDpi, X11_DPI_DEFAULT_ACTIVE as DELUX_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES as DELUX_DPI_DEFAULT_STAGES, X11_DPI_MAX as DELUX_DPI_MAX, X11_DPI_MIN as DELUX_DPI_MIN, X11_DPI_REPORT_ID as DELUX_DPI_REPORT_ID, X11_DPI_STAGE_COUNT as DELUX_DPI_STAGE_COUNT, X11_DPI_STEP as DELUX_DPI_STEP, X11_DPI_VALUES as DELUX_DPI_VALUES, } from "../compx/x11-dpi.js";
21
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delux/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IAC5D,4BAA4B;IAC5B,yBAAyB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgC,IAAI,GAAG,CAAC;IACtE,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;IAC5D,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE5E,OAAO,EACL,iBAAiB,IAAI,2BAA2B,EAChD,kBAAkB,IAAI,4BAA4B,EAClD,aAAa,IAAI,uBAAuB,EACxC,sBAAsB,IAAI,wBAAwB,EAClD,sBAAsB,IAAI,wBAAwB,EAClD,WAAW,IAAI,aAAa,EAC5B,WAAW,IAAI,aAAa,EAC5B,iBAAiB,IAAI,mBAAmB,EACxC,mBAAmB,IAAI,qBAAqB,EAC5C,YAAY,IAAI,cAAc,GAC/B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delux/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IAC5D,4BAA4B;IAC5B,yBAAyB;IACzB,wBAAwB;CACzB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAwB,IAAI,GAAG,CAAC;IACtE,wBAAwB;CACzB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAgC,IAAI,GAAG,CAAC;IACtE,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;IAC5D,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;IACtD,CAAC,wBAAwB,EAAE,wBAAwB,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE5E,OAAO,EACL,iBAAiB,IAAI,2BAA2B,EAChD,kBAAkB,IAAI,4BAA4B,EAClD,aAAa,IAAI,uBAAuB,EACxC,sBAAsB,IAAI,wBAAwB,EAClD,sBAAsB,IAAI,wBAAwB,EAClD,WAAW,IAAI,aAAa,EAC5B,WAAW,IAAI,aAAa,EAC5B,iBAAiB,IAAI,mBAAmB,EACxC,mBAAmB,IAAI,qBAAqB,EAC5C,YAAY,IAAI,cAAc,EAC9B,cAAc,IAAI,gBAAgB,GACnC,MAAM,qBAAqB,CAAC"}
@@ -24,12 +24,14 @@ export declare class AttackSharkHidClient {
24
24
  readonly device: HIDDevice;
25
25
  private readonly family;
26
26
  private readonly batteryWaitMs;
27
+ private readonly receiverWriteGapMs;
27
28
  private lastStatus;
28
29
  private queue;
29
30
  private batteryPercent;
30
31
  private listening;
31
32
  constructor(device: HIDDevice, options?: {
32
33
  batteryWaitMs?: number;
34
+ receiverWriteGapMs?: number;
33
35
  });
34
36
  /**
35
37
  * True when this client is running over a native HID adapter (Tauri's
@@ -39,15 +41,22 @@ export declare class AttackSharkHidClient {
39
41
  * through them.
40
42
  */
41
43
  private get nativeConfig();
42
- /** True when this unit's DPI report 0x04 can be driven over the native channel. */
44
+ /**
45
+ * True when the X11 config channel is writable: always over a native
46
+ * adapter, and over WebHID when the browser exposes it (Linux hidraw).
47
+ */
48
+ private get x11ConfigReachable();
49
+ /** True when this unit's DPI report 0x04 can be driven. */
43
50
  private get x11DpiSupported();
44
51
  static isSupported(device: HIDDevice): boolean;
45
52
  private readonly onInputReport;
46
53
  open(): Promise<void>;
47
54
  close(): Promise<void>;
48
55
  startNotifications(): Promise<boolean>;
56
+ /** The model a receiver message identified, if any. */
57
+ private get receiverModel();
49
58
  displayName(): string;
50
- deviceBrand(): string;
59
+ deviceBrand(): "Attack Shark" | "Delux";
51
60
  isWireless(): boolean;
52
61
  getSupportedPollingRates(): number[];
53
62
  getDpiOptions(): number[];
@@ -61,6 +70,12 @@ export declare class AttackSharkHidClient {
61
70
  * approach the reference driver takes.
62
71
  */
63
72
  private writeX11Dpi;
73
+ /**
74
+ * The DPI report is 52 bytes on the wired X11 and 56 over its receiver. A
75
+ * descriptor the browser exposes decides (the M600 Pro receiver declares
76
+ * the 52-byte form); without one, fall back to the product id.
77
+ */
78
+ private x11UsesShortDpiReport;
64
79
  /**
65
80
  * Best-effort read of the live table. The reference driver only documents
66
81
  * this for the wireless receiver (a GET on report 0x04); the wired unit
@@ -113,6 +128,12 @@ export declare class AttackSharkHidClient {
113
128
  private read25a7Status;
114
129
  private write1d57PollingRate;
115
130
  private read1d57PollingRate;
131
+ /**
132
+ * Send one config report, holding it back until the receiver gap since the
133
+ * previous write has passed. Runs inside the command queue so overlapping
134
+ * callers are spaced too.
135
+ */
136
+ private sendConfigReport;
116
137
  private run;
117
138
  private delay;
118
139
  private copyView;
@@ -1 +1 @@
1
- {"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/attackshark/hid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/attackshark/hid.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { VENDOR_ID } from "../vendors.js";
2
2
  import { LAMZU_PRODUCTS } from "@openmouse/protocol/lamzu";
3
- import { buildX11DpiReport, decodeX11DpiReport, nearestX11Dpi, X11_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES, X11_DPI_MAX, X11_DPI_MIN, X11_DPI_REPORT_ID, X11_DPI_STAGE_COUNT, X11_DPI_STEP, } from "../../compx/x11-dpi.js";
3
+ import { DELUX_M600_PRO_MODEL_ID, DELUX_UNBRANDED_PRODUCT_IDS } from "@openmouse/protocol/delux";
4
+ import { buildX11DpiReport, decodeX11DpiReport, nearestX11Dpi, X11_DPI_DEFAULT_ACTIVE, X11_DPI_DEFAULT_STAGES, X11_DPI_MAX, X11_DPI_MIN, X11_DPI_REPORT_ID, X11_DPI_STAGE_COUNT, X11_DPI_STEP, X11_DPI_VALUES, } from "../../compx/x11-dpi.js";
4
5
  // Attack Shark mice ship from multiple OEMs with different VIDs and protocols:
5
6
  //
6
7
  // 0x1d57 — R1, X11 family: HID feature reports, 250 ms cmd delay
@@ -23,6 +24,11 @@ import { buildX11DpiReport, decodeX11DpiReport, nearestX11Dpi, X11_DPI_DEFAULT_A
23
24
  // X11-family helper turns that refusal into a real explanation; the
24
25
  // collections-less native branch writes the same packets over such an adapter.
25
26
  //
27
+ // Linux is the exception: hidraw hands the browser interface 2's whole report
28
+ // descriptor, so WebHID sees the 0x0b collection with 0x04/0x06 and the same
29
+ // packets are written from the browser (verified on a Delux M600 Pro on the
30
+ // 0xfa60 receiver; see docs/delux-m600-pro-testing.md).
31
+ //
26
32
  // Protocol source: xb-bx/attack-shark-r1-driver (Odin)
27
33
  // HarukaYamamoto0/attack-shark-x11-driver (TypeScript)
28
34
  // qmk.top GearHub bundle (MU class — 0x25a7 protocol)
@@ -45,10 +51,19 @@ const POLLING_RATES_1D57 = [
45
51
  [0x01, 1000],
46
52
  ];
47
53
  const DPI_READ_REPORT_ID = 0xa0;
48
- // Battery arrives as input report with this 4-byte signature; byte 4 = %.
49
- // The leading 0x03 is the HID report id of the battery packet.
50
- const BATTERY_SIGNATURE = [0x03, 0x55, 0x40, 0x01];
51
- const BATTERY_REPORT_ID = BATTERY_SIGNATURE[0];
54
+ // Receiver messages arrive as input report 0x03: [0x03, model, event, p1, p2].
55
+ // Byte 1 is the paired mouse's model id (HarukaYamamoto0/attack-shark-x11-driver
56
+ // docs/messages/README.md); battery is event 0x40 with p1 = 0x01, p2 = percent.
57
+ // Only models whose battery percentage was checked are listed; other models
58
+ // in the family use other scales (the X6 reports 1-10).
59
+ const BATTERY_REPORT_ID = 0x03;
60
+ const X11_MODEL_ID = 0x55;
61
+ /** Models identified by the model id their receiver messages carry. */
62
+ const X11_RECEIVER_MODELS = new Map([
63
+ [X11_MODEL_ID, { brand: "Attack Shark", name: "Attack Shark X11" }],
64
+ // docs/delux-m600-pro-testing.md
65
+ [DELUX_M600_PRO_MODEL_ID, { brand: "Delux", name: "Delux M600 Pro (Wireless)" }],
66
+ ]);
52
67
  // ── 0x25a7 protocol (GearHub / MU class) ─────────────────────────────────
53
68
  // Reverse-engineered from the qmk.top GearHub web driver JS bundle.
54
69
  // Uses HID feature reports on report ID 0x00, 64 bytes total.
@@ -82,6 +97,34 @@ function hasVendorControl(collection) {
82
97
  return true;
83
98
  return collection.children.some(hasVendorControl);
84
99
  }
100
+ function featureReportBytes(collection, reportId) {
101
+ const report = collection.featureReports.find((entry) => entry.reportId === reportId);
102
+ if (report) {
103
+ const bits = (report.items ?? []).reduce((sum, item) => sum + (item.reportSize ?? 0) * (item.reportCount ?? 0), 0);
104
+ return Math.ceil(bits / 8);
105
+ }
106
+ for (const child of collection.children) {
107
+ const bytes = featureReportBytes(child, reportId);
108
+ if (bytes !== null)
109
+ return bytes;
110
+ }
111
+ return null;
112
+ }
113
+ /**
114
+ * Declared payload length of the X11 DPI report 0x04 when the browser exposes
115
+ * the config channel (0x04 beside the 0x06 polling report), else null. Linux
116
+ * hidraw hands WebHID interface 2's whole descriptor, so the channel is
117
+ * visible there; Windows keeps it on a sub-collection the browser cannot open.
118
+ * A length of 0 means the descriptor sizes were not available.
119
+ */
120
+ function x11ConfigReportBytes(device) {
121
+ for (const collection of device.collections) {
122
+ const dpiBytes = featureReportBytes(collection, X11_DPI_REPORT_ID);
123
+ if (dpiBytes !== null && featureReportBytes(collection, POLLING_REPORT_ID) !== null)
124
+ return dpiBytes;
125
+ }
126
+ return null;
127
+ }
85
128
  function declaresInputReport(collection, reportId) {
86
129
  if (collection.inputReports.some((report) => report.reportId === reportId))
87
130
  return true;
@@ -141,14 +184,23 @@ const x11RuntimeStates = new Map();
141
184
  function x11RuntimeFor(productId) {
142
185
  let state = x11RuntimeStates.get(productId);
143
186
  if (!state) {
144
- state = { pollingRateHz: X11_DEFAULT_POLLING_HZ, batteryPercent: null, batteryAt: 0 };
187
+ state = { pollingRateHz: X11_DEFAULT_POLLING_HZ, batteryPercent: null, batteryAt: 0, modelId: null };
145
188
  x11RuntimeStates.set(productId, state);
146
189
  }
147
190
  return state;
148
191
  }
192
+ // Two config writes through the 2.4 GHz receiver about 0.4-0.5 s apart froze
193
+ // the link until the receiver was replugged; pairs 1, 2 and 3 s apart did not
194
+ // (Delux M600 Pro, docs/delux-m600-pro-testing.md). The receiver answers each
195
+ // write within ~10 ms, so the gap is enforced from the last write rather than
196
+ // waiting on that answer. Module-level for the same short-lived-client reason
197
+ // as the state above.
198
+ const X11_RECEIVER_WRITE_GAP_MS = 1000;
199
+ const x11LastReceiverWriteAt = new Map();
149
200
  /** Test/diagnostic hook: forget cached X11 battery/polling state. */
150
201
  export function resetAttackSharkX11RuntimeState() {
151
202
  x11RuntimeStates.clear();
203
+ x11LastReceiverWriteAt.clear();
152
204
  }
153
205
  /**
154
206
  * If the granted devices include an X11-family unit that no driver could
@@ -171,7 +223,8 @@ export function attackSharkNativeOnlyMessage(devices) {
171
223
  }
172
224
  function detectFamily(device) {
173
225
  if (device.vendorId === VID_1D57) {
174
- if (/delux/i.test(device.productName || ""))
226
+ if (/delux/i.test(device.productName || "")
227
+ || DELUX_UNBRANDED_PRODUCT_IDS.has(device.productId))
175
228
  return null;
176
229
  // Native HID adapters (Tauri's TauriHidDevice, the Node/Bridge adapter)
177
230
  // cannot parse the report descriptor and report no collections at all,
@@ -187,6 +240,12 @@ function detectFamily(device) {
187
240
  // collection (usagePage 0xffff) which the GearHub interface exposes.
188
241
  if (device.collections.some(hasVendorControl))
189
242
  return "25a7";
243
+ // An X11-family unit whose config channel the browser can see (Linux) is
244
+ // still X11 firmware, not R1: the R1 read-back (0xa0 request, then 0x06)
245
+ // returns no polling code on it, and a 0x04 request stalls the channel.
246
+ if (X11_DPI_PIDS.has(device.productId) && x11ConfigReportBytes(device) !== null) {
247
+ return "1d57-x11";
248
+ }
190
249
  if (device.collections.some(hasFeatureReports))
191
250
  return "1d57";
192
251
  // Real X11/R1 units declare no feature reports anywhere (see header
@@ -247,6 +306,7 @@ export class AttackSharkHidClient {
247
306
  device;
248
307
  family;
249
308
  batteryWaitMs;
309
+ receiverWriteGapMs;
250
310
  lastStatus = null;
251
311
  queue = Promise.resolve();
252
312
  batteryPercent = null;
@@ -255,6 +315,7 @@ export class AttackSharkHidClient {
255
315
  this.device = device;
256
316
  this.family = detectFamily(device);
257
317
  this.batteryWaitMs = options.batteryWaitMs ?? X11_BATTERY_WAIT_MS;
318
+ this.receiverWriteGapMs = options.receiverWriteGapMs ?? X11_RECEIVER_WRITE_GAP_MS;
258
319
  }
259
320
  /**
260
321
  * True when this client is running over a native HID adapter (Tauri's
@@ -266,10 +327,17 @@ export class AttackSharkHidClient {
266
327
  get nativeConfig() {
267
328
  return this.device.collections.length === 0;
268
329
  }
269
- /** True when this unit's DPI report 0x04 can be driven over the native channel. */
330
+ /**
331
+ * True when the X11 config channel is writable: always over a native
332
+ * adapter, and over WebHID when the browser exposes it (Linux hidraw).
333
+ */
334
+ get x11ConfigReachable() {
335
+ return this.nativeConfig || x11ConfigReportBytes(this.device) !== null;
336
+ }
337
+ /** True when this unit's DPI report 0x04 can be driven. */
270
338
  get x11DpiSupported() {
271
339
  return this.family === "1d57-x11"
272
- && this.nativeConfig
340
+ && this.x11ConfigReachable
273
341
  && X11_DPI_PIDS.has(this.device.productId);
274
342
  }
275
343
  static isSupported(device) {
@@ -283,6 +351,9 @@ export class AttackSharkHidClient {
283
351
  const packet = new Uint8Array(data.length + 1);
284
352
  packet[0] = event.reportId;
285
353
  packet.set(data, 1);
354
+ if (packet[0] === BATTERY_REPORT_ID && X11_RECEIVER_MODELS.has(packet[1])) {
355
+ x11RuntimeFor(this.device.productId).modelId = packet[1];
356
+ }
286
357
  const percent = AttackSharkHidClient.parseBatteryReport(packet);
287
358
  if (percent !== null) {
288
359
  this.batteryPercent = percent;
@@ -314,7 +385,19 @@ export class AttackSharkHidClient {
314
385
  async startNotifications() {
315
386
  return false;
316
387
  }
388
+ /** The model a receiver message identified, if any. */
389
+ get receiverModel() {
390
+ if (this.family !== "1d57-x11")
391
+ return undefined;
392
+ const modelId = x11RuntimeFor(this.device.productId).modelId;
393
+ return modelId === null ? undefined : X11_RECEIVER_MODELS.get(modelId);
394
+ }
317
395
  displayName() {
396
+ // The shared 0xfa60 receiver names its paired mouse only through the
397
+ // model id in its messages; prefer that once one has arrived.
398
+ const identified = this.receiverModel;
399
+ if (identified)
400
+ return identified.name;
318
401
  // X11-family product strings are generic OEM labels ("2.4G Wireless
319
402
  // Device", "USB Gaming Mouse"), so name those models by PID instead.
320
403
  const model = this.device.vendorId === VID_1D57
@@ -328,7 +411,7 @@ export class AttackSharkHidClient {
328
411
  return /^attack\s*shark/i.test(name) ? name : `Attack Shark ${name}`;
329
412
  }
330
413
  deviceBrand() {
331
- return "Attack Shark";
414
+ return this.receiverModel?.brand ?? "Attack Shark";
332
415
  }
333
416
  isWireless() {
334
417
  if (this.device.vendorId === VID_1D57 && X11_FAMILY_PIDS.has(this.device.productId)) {
@@ -343,7 +426,7 @@ export class AttackSharkHidClient {
343
426
  return [...POLLING_CODES_25A7.keys()];
344
427
  // Native transport: the X11 exposes the same 0x06 polling command the
345
428
  // browser cannot reach, so advertise the rates it accepts.
346
- if (this.family === "1d57-x11" && this.nativeConfig)
429
+ if (this.family === "1d57-x11" && this.x11ConfigReachable)
347
430
  return POLLING_RATES_1D57.map(([, hz]) => hz);
348
431
  return [];
349
432
  }
@@ -354,6 +437,10 @@ export class AttackSharkHidClient {
354
437
  if (this.family === "25a7") {
355
438
  return [400, 800, 1200, 1600, 2400, 3200, 6400, 12000, 26000];
356
439
  }
440
+ // The app only accepts stage edits that appear in this list; without it
441
+ // the X11 stage editor could switch stages but never change a value.
442
+ if (this.x11DpiSupported)
443
+ return [...X11_DPI_VALUES];
357
444
  return [];
358
445
  }
359
446
  async readStatus() {
@@ -373,14 +460,18 @@ export class AttackSharkHidClient {
373
460
  }
374
461
  }
375
462
  const dpiState = this.x11DpiSupported ? x11DpiStateFor(this.device.productId) : null;
376
- if (dpiState) {
463
+ // Only native adapters try the read: over WebHID every GET_FEATURE on
464
+ // this firmware timed out (about 5 s each) on the measured hardware.
465
+ if (dpiState && this.nativeConfig) {
377
466
  await this.readX11DpiState();
467
+ }
468
+ if (dpiState) {
378
469
  dpi = dpiState.stages[dpiState.activeStage - 1] ?? 0;
379
470
  }
380
471
  // Native X11: polling rate has no read-back (report the last value this
381
472
  // process applied, defaulting to 1,000 Hz), and the wireless receiver
382
473
  // pushes battery on its own — give it a bounded moment to arrive.
383
- const x11Runtime = this.family === "1d57-x11" && this.nativeConfig
474
+ const x11Runtime = this.family === "1d57-x11" && this.x11ConfigReachable
384
475
  ? x11RuntimeFor(this.device.productId)
385
476
  : null;
386
477
  if (x11Runtime) {
@@ -390,13 +481,13 @@ export class AttackSharkHidClient {
390
481
  }
391
482
  const batteryPercent = x11Runtime ? x11Runtime.batteryPercent : this.batteryPercent;
392
483
  return this.lastStatus = {
393
- brand: "Attack Shark",
484
+ brand: this.deviceBrand(),
394
485
  name: this.displayName(),
395
486
  ui: {
396
487
  family: "attackshark",
397
488
  settingsReady: this.family === "1d57"
398
489
  || this.family === "25a7"
399
- || (this.family === "1d57-x11" && this.nativeConfig),
490
+ || (this.family === "1d57-x11" && this.x11ConfigReachable),
400
491
  hideUnsupportedPollingRates: true,
401
492
  hideProcessingCard: true,
402
493
  // Wireless X11-family units push battery on their own. WebHID only
@@ -408,7 +499,7 @@ export class AttackSharkHidClient {
408
499
  && this.isWireless()
409
500
  && (this.nativeConfig
410
501
  || this.device.collections.some((collection) => declaresInputReport(collection, BATTERY_REPORT_ID))),
411
- statusNote: this.family === "1d57-x11" && !this.nativeConfig
502
+ statusNote: this.family === "1d57-x11" && !this.x11ConfigReachable
412
503
  ? "Status only: this mouse's settings channel is not reachable from a browser and needs a native driver."
413
504
  : undefined,
414
505
  ...(dpiState
@@ -444,7 +535,7 @@ export class AttackSharkHidClient {
444
535
  }
445
536
  async setPollingRate(pollingRateHz) {
446
537
  if (this.family === "1d57-x11") {
447
- if (!this.nativeConfig) {
538
+ if (!this.x11ConfigReachable) {
448
539
  throw new Error("This mouse's settings channel is not reachable from a browser; "
449
540
  + "changing settings needs the native Attack Shark X11 driver.");
450
541
  }
@@ -506,15 +597,28 @@ export class AttackSharkHidClient {
506
597
  activeStage: state.activeStage,
507
598
  angleSnap: state.angleSnap,
508
599
  rippleControl: state.rippleControl,
509
- wired: this.device.productId === 0xfa55,
600
+ wired: this.x11UsesShortDpiReport(),
510
601
  });
511
602
  // The buffer's leading byte is the report id; WebHID/Tauri take it
512
603
  // separately. Copy so the payload is a plain ArrayBuffer-backed view.
513
604
  const payload = new Uint8Array(report.length - 1);
514
605
  payload.set(report.subarray(1));
515
- await this.run(() => this.device.sendFeatureReport(X11_DPI_REPORT_ID, payload));
606
+ await this.sendConfigReport(X11_DPI_REPORT_ID, payload);
516
607
  await this.delay(CMD_DELAY_MS);
517
608
  }
609
+ /**
610
+ * The DPI report is 52 bytes on the wired X11 and 56 over its receiver. A
611
+ * descriptor the browser exposes decides (the M600 Pro receiver declares
612
+ * the 52-byte form); without one, fall back to the product id.
613
+ */
614
+ x11UsesShortDpiReport() {
615
+ const declared = x11ConfigReportBytes(this.device);
616
+ if (declared === 51)
617
+ return true;
618
+ if (declared === 55)
619
+ return false;
620
+ return this.device.productId === 0xfa55;
621
+ }
518
622
  /**
519
623
  * Best-effort read of the live table. The reference driver only documents
520
624
  * this for the wireless receiver (a GET on report 0x04); the wired unit
@@ -688,7 +792,7 @@ export class AttackSharkHidClient {
688
792
  // 8 data bytes — browser prepends report ID 0x06.
689
793
  // Structure: [0x09, 0x01, rate, checksum, 0, 0, 0, 0]
690
794
  const data = new Uint8Array([0x09, 0x01, rateByte, (0xff - rateByte) & 0xff, 0, 0, 0, 0]);
691
- await this.run(() => this.device.sendFeatureReport(POLLING_REPORT_ID, data));
795
+ await this.sendConfigReport(POLLING_REPORT_ID, data);
692
796
  await this.delay(CMD_DELAY_MS);
693
797
  }
694
798
  async read1d57PollingRate() {
@@ -704,6 +808,28 @@ export class AttackSharkHidClient {
704
808
  return match ? match[1] : 0;
705
809
  }
706
810
  // ── shared helpers ────────────────────────────────────────────────────
811
+ /**
812
+ * Send one config report, holding it back until the receiver gap since the
813
+ * previous write has passed. Runs inside the command queue so overlapping
814
+ * callers are spaced too.
815
+ */
816
+ sendConfigReport(reportId, data) {
817
+ return this.run(async () => {
818
+ const paced = this.family === "1d57-x11" && this.isWireless();
819
+ if (paced) {
820
+ const wait = (x11LastReceiverWriteAt.get(this.device.productId) ?? 0) + this.receiverWriteGapMs - Date.now();
821
+ if (wait > 0)
822
+ await this.delay(wait);
823
+ }
824
+ try {
825
+ await this.device.sendFeatureReport(reportId, data);
826
+ }
827
+ finally {
828
+ if (paced)
829
+ x11LastReceiverWriteAt.set(this.device.productId, Date.now());
830
+ }
831
+ });
832
+ }
707
833
  run(task) {
708
834
  const next = this.queue.then(task, task);
709
835
  this.queue = next.catch(() => undefined);
@@ -717,7 +843,10 @@ export class AttackSharkHidClient {
717
843
  }
718
844
  /** Check if an input report matches the battery signature. */
719
845
  static isBatteryReport(data) {
720
- return BATTERY_SIGNATURE.every((byte, i) => data[i] === byte);
846
+ return data[0] === BATTERY_REPORT_ID
847
+ && X11_RECEIVER_MODELS.has(data[1])
848
+ && data[2] === 0x40
849
+ && data[3] === 0x01;
721
850
  }
722
851
  /** Extract battery percentage from a battery input report. */
723
852
  static parseBatteryReport(data) {