@openmouse/protocol 0.8.0 → 0.10.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 (39) hide show
  1. package/dist/atk/index.d.ts +29 -0
  2. package/dist/atk/index.d.ts.map +1 -1
  3. package/dist/atk/index.js +74 -0
  4. package/dist/atk/index.js.map +1 -1
  5. package/dist/drivers/atk/hid.d.ts +22 -0
  6. package/dist/drivers/atk/hid.d.ts.map +1 -1
  7. package/dist/drivers/atk/hid.js +90 -4
  8. package/dist/drivers/atk/hid.js.map +1 -1
  9. package/dist/drivers/atk/products.js +1 -1
  10. package/dist/drivers/atk/products.js.map +1 -1
  11. package/dist/drivers/mouse-types.d.ts +16 -0
  12. package/dist/drivers/mouse-types.d.ts.map +1 -1
  13. package/dist/drivers/registry.d.ts +2 -1
  14. package/dist/drivers/registry.d.ts.map +1 -1
  15. package/dist/drivers/registry.js +2 -0
  16. package/dist/drivers/registry.js.map +1 -1
  17. package/dist/drivers/vendors.d.ts +2 -2
  18. package/dist/drivers/vendors.d.ts.map +1 -1
  19. package/dist/drivers/vendors.js +5 -3
  20. package/dist/drivers/vendors.js.map +1 -1
  21. package/dist/drivers/wlmouse/beast-x-4k-hid.d.ts +45 -0
  22. package/dist/drivers/wlmouse/beast-x-4k-hid.d.ts.map +1 -0
  23. package/dist/drivers/wlmouse/beast-x-4k-hid.js +262 -0
  24. package/dist/drivers/wlmouse/beast-x-4k-hid.js.map +1 -0
  25. package/dist/drivers/wlmouse/hid.js +4 -4
  26. package/dist/drivers/wlmouse/hid.js.map +1 -1
  27. package/dist/logitech/index.d.ts +39 -1
  28. package/dist/logitech/index.d.ts.map +1 -1
  29. package/dist/logitech/index.js +63 -1
  30. package/dist/logitech/index.js.map +1 -1
  31. package/dist/wlmouse/beast-x-4k.d.ts +77 -0
  32. package/dist/wlmouse/beast-x-4k.d.ts.map +1 -0
  33. package/dist/wlmouse/beast-x-4k.js +110 -0
  34. package/dist/wlmouse/beast-x-4k.js.map +1 -0
  35. package/dist/wlmouse/index.d.ts +1 -0
  36. package/dist/wlmouse/index.d.ts.map +1 -1
  37. package/dist/wlmouse/index.js +1 -0
  38. package/dist/wlmouse/index.js.map +1 -1
  39. package/package.json +1 -1
@@ -56,11 +56,16 @@ export declare const BOLT_PAIRING_SLOTS: readonly [1, 2, 3, 4, 5, 6];
56
56
  *
57
57
  * G Pro X Superlight generation:
58
58
  * - 0xc094 — G Pro X Superlight (wired)
59
+ * - 0xc09b — PRO X SUPERLIGHT 2 (USB)
60
+ * - 0xc0a0 — PRO X SUPERLIGHT 2 DEX (USB)
61
+ *
62
+ * G PRO 2 / next-gen G Pro family:
63
+ * - 0xc09a — G PRO 2 LIGHTSPEED (USB)
59
64
  *
60
65
  * This module deliberately imports nothing, so both the driver and the WebHID
61
66
  * filters in ../vendors can read it without a cycle.
62
67
  */
63
- export declare const LOGITECH_DIRECT_PRODUCT_IDS: readonly [49284, 49289, 49298, 49277, 49278, 49280, 49285, 49287, 49291, 49292, 49294, 49295, 49300, 49301, 49304, 49305];
68
+ export declare const LOGITECH_DIRECT_PRODUCT_IDS: readonly [49284, 49289, 49298, 49277, 49278, 49280, 49285, 49287, 49291, 49292, 49294, 49295, 49300, 49307, 49312, 49306, 49301, 49304, 49305];
64
69
  /**
65
70
  * Logi Bolt receivers. Unlike Lightspeed, device HID++ 2.0 rides long reports
66
71
  * (report id 0x11) on usage `ff00:2`, and the mouse may sit on any pairing
@@ -69,6 +74,39 @@ export declare const LOGITECH_DIRECT_PRODUCT_IDS: readonly [49284, 49289, 49298,
69
74
  * - 0xc548 — Logi Bolt USB receiver (MX Master 3S and other Bolt mice)
70
75
  */
71
76
  export declare const LOGITECH_BOLT_PRODUCT_IDS: readonly [50504];
77
+ /**
78
+ * Named catalog of the Logitech mice the HID++ driver directly covers, keyed
79
+ * by product id. This is the named counterpart to the bare-PID registries above
80
+ * (`LOGITECH_DIRECT_PRODUCT_IDS` etc.) and exists for the same reason every
81
+ * other vendor registry carries names: the supported-devices page auto-lists
82
+ * from it, so a covered Logitech model can never go missing because someone
83
+ * forgot to hand-write a row.
84
+ *
85
+ * Only *direct-connect* models get a PID here. Wireless Logitech mice have no
86
+ * dedicated USB product id of their own — they answer behind a Lightspeed/Bolt
87
+ * receiver or over HID++, and the driver claims them by protocol on the
88
+ * receiver's single control interface, not by a per-mouse PID. Listing them in
89
+ * a PID-keyed map would be a lie; they are receiver-supported and the page
90
+ * carries them as static receiver rows with an honest note (see the wall of
91
+ * "receiver" notes in the supported-mice table). That asymmetry is structural
92
+ * Logitech, not a maintenance gap — the same way WLMouse's wireless rows stay
93
+ * receiver-curated.
94
+ *
95
+ * `status` is per-model and honest: everything in `LOGITECH_DIRECT_PRODUCT_IDS`
96
+ * is genuinely writable (DPI via 0x2202 where the model has it, report rate
97
+ * 0x8060, onboard profiles), so every entry here is `supported`. The auto-list
98
+ * loop must honor `status` rather than hardcoding it, so adding a not-yet-
99
+ * implemented model here later cannot silently over-claim.
100
+ *
101
+ * Names mirror the landing page's static rows exactly ("G502 (all variants)",
102
+ * "G Pro (2017)", "G703 (wired)"), because the registry loop dedupes against
103
+ * the table by exact normalized key before falling back to fuzzy matching.
104
+ */
105
+ export declare const LOGITECH_PRODUCTS: ReadonlyMap<number, {
106
+ name: string;
107
+ wireless: boolean;
108
+ status: "supported";
109
+ }>;
72
110
  export declare function isDirectConnectProduct(productId: number): boolean;
73
111
  export declare function isBoltReceiverProduct(productId: number): boolean;
74
112
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logitech/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAM3B,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,MAAO,CAAC;AACxC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,6BAAgD,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,2BAA2B,2HAW9B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,kBAAoB,CAAC;AAK3D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAItF;AA+BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACxB,MAAM,GAAG,IAAI,CAKf;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjE;AAED,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GAAG,iBAAiB,GAAG,aAAa,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB,CAUpF;AAED,iDAAiD;AACjD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAUjF;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;gBAE5B,eAAe,EAAE,MAAM,GAAG,IAAI;CAU3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logitech/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAM3B,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,MAAO,CAAC;AACxC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,6BAAgD,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,2BAA2B,gJAa9B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,kBAAoB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CA2BxG,CAAC;AAKL,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAItF;AA+BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACxB,MAAM,GAAG,IAAI,CAKf;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAMjE;AAED,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GAAG,iBAAiB,GAAG,aAAa,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB,CAUpF;AAED,iDAAiD;AACjD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAUjF;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;gBAE5B,eAAe,EAAE,MAAM,GAAG,IAAI;CAU3C"}
@@ -61,6 +61,11 @@ export const BOLT_PAIRING_SLOTS = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06];
61
61
  *
62
62
  * G Pro X Superlight generation:
63
63
  * - 0xc094 — G Pro X Superlight (wired)
64
+ * - 0xc09b — PRO X SUPERLIGHT 2 (USB)
65
+ * - 0xc0a0 — PRO X SUPERLIGHT 2 DEX (USB)
66
+ *
67
+ * G PRO 2 / next-gen G Pro family:
68
+ * - 0xc09a — G PRO 2 LIGHTSPEED (USB)
64
69
  *
65
70
  * This module deliberately imports nothing, so both the driver and the WebHID
66
71
  * filters in ../vendors can read it without a cycle.
@@ -73,7 +78,9 @@ export const LOGITECH_DIRECT_PRODUCT_IDS = [
73
78
  // G Pro / G502 / G403 HERO / G703 generation
74
79
  0xc085, 0xc087, 0xc08b, 0xc08c, 0xc08e, 0xc08f,
75
80
  // G Pro X Superlight generation
76
- 0xc094,
81
+ 0xc094, 0xc09b, 0xc0a0,
82
+ // G PRO 2 / next-gen G Pro family
83
+ 0xc09a,
77
84
  // G502 X generation
78
85
  0xc095, 0xc098, 0xc099,
79
86
  ];
@@ -85,6 +92,61 @@ export const LOGITECH_DIRECT_PRODUCT_IDS = [
85
92
  * - 0xc548 — Logi Bolt USB receiver (MX Master 3S and other Bolt mice)
86
93
  */
87
94
  export const LOGITECH_BOLT_PRODUCT_IDS = [0xc548];
95
+ /**
96
+ * Named catalog of the Logitech mice the HID++ driver directly covers, keyed
97
+ * by product id. This is the named counterpart to the bare-PID registries above
98
+ * (`LOGITECH_DIRECT_PRODUCT_IDS` etc.) and exists for the same reason every
99
+ * other vendor registry carries names: the supported-devices page auto-lists
100
+ * from it, so a covered Logitech model can never go missing because someone
101
+ * forgot to hand-write a row.
102
+ *
103
+ * Only *direct-connect* models get a PID here. Wireless Logitech mice have no
104
+ * dedicated USB product id of their own — they answer behind a Lightspeed/Bolt
105
+ * receiver or over HID++, and the driver claims them by protocol on the
106
+ * receiver's single control interface, not by a per-mouse PID. Listing them in
107
+ * a PID-keyed map would be a lie; they are receiver-supported and the page
108
+ * carries them as static receiver rows with an honest note (see the wall of
109
+ * "receiver" notes in the supported-mice table). That asymmetry is structural
110
+ * Logitech, not a maintenance gap — the same way WLMouse's wireless rows stay
111
+ * receiver-curated.
112
+ *
113
+ * `status` is per-model and honest: everything in `LOGITECH_DIRECT_PRODUCT_IDS`
114
+ * is genuinely writable (DPI via 0x2202 where the model has it, report rate
115
+ * 0x8060, onboard profiles), so every entry here is `supported`. The auto-list
116
+ * loop must honor `status` rather than hardcoding it, so adding a not-yet-
117
+ * implemented model here later cannot silently over-claim.
118
+ *
119
+ * Names mirror the landing page's static rows exactly ("G502 (all variants)",
120
+ * "G Pro (2017)", "G703 (wired)"), because the registry loop dedupes against
121
+ * the table by exact normalized key before falling back to fuzzy matching.
122
+ */
123
+ export const LOGITECH_PRODUCTS = new Map([
124
+ // G203 / G102 generation
125
+ [0xc084, { name: "G203 PRODIGY", wireless: false, status: "supported" }],
126
+ [0xc089, { name: "G102 LIGHTSYNC", wireless: false, status: "supported" }],
127
+ [0xc092, { name: "G203 LIGHTSYNC", wireless: false, status: "supported" }],
128
+ // G303 / G402 generation
129
+ [0xc07d, { name: "G502 (all variants)", wireless: false, status: "supported" }],
130
+ [0xc07e, { name: "G402 Hyperion Fury", wireless: false, status: "supported" }],
131
+ [0xc080, { name: "G303 Daedalus Apex", wireless: false, status: "supported" }],
132
+ // G Pro / G502 / G403 HERO / G703 generation
133
+ [0xc085, { name: "G Pro (2017)", wireless: false, status: "supported" }],
134
+ [0xc087, { name: "G703 (wired)", wireless: false, status: "supported" }],
135
+ [0xc08b, { name: "G502 HERO", wireless: false, status: "supported" }],
136
+ [0xc08c, { name: "G Pro Hero", wireless: false, status: "supported" }],
137
+ [0xc08e, { name: "G903 HERO", wireless: false, status: "supported" }],
138
+ [0xc08f, { name: "G403 HERO", wireless: false, status: "supported" }],
139
+ // G Pro X Superlight generation
140
+ [0xc094, { name: "G Pro X Superlight", wireless: false, status: "supported" }],
141
+ [0xc09b, { name: "PRO X SUPERLIGHT 2", wireless: false, status: "supported" }],
142
+ [0xc0a0, { name: "PRO X SUPERLIGHT 2 DEX", wireless: false, status: "supported" }],
143
+ // G PRO 2 / next-gen G Pro family
144
+ [0xc09a, { name: "G PRO 2 LIGHTSPEED", wireless: false, status: "supported" }],
145
+ // G502 X generation
146
+ [0xc095, { name: "G502 X PLUS", wireless: false, status: "supported" }],
147
+ [0xc098, { name: "G502 X LIGHTSPEED", wireless: false, status: "supported" }],
148
+ [0xc099, { name: "G502 X", wireless: false, status: "supported" }],
149
+ ]);
88
150
  const DIRECT_PRODUCT_ID_SET = new Set(LOGITECH_DIRECT_PRODUCT_IDS);
89
151
  const BOLT_PRODUCT_ID_SET = new Set(LOGITECH_BOLT_PRODUCT_IDS);
90
152
  export function isDirectConnectProduct(productId) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logitech/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logitech/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Beast X 4K (36a7:a887) settings protocol. Unlike the rest of the WLmouse
3
+ * range it never answers compx feature reports: commands go out as 64-byte
4
+ * output report 4 and each answer comes back as input report 4.
5
+ *
6
+ * Report body, after the report id:
7
+ * [0..1] CRC-16/MODBUS of [2..30], little-endian
8
+ * [2] command; [3] data length; [4..5] address, little-endian
9
+ * [6] reply status, 0xfe or 0xff on error (0 in requests)
10
+ * [7..30] data, at most 24 bytes
11
+ *
12
+ * Decoded from a USB capture of WLmouse's desktop software driving a Beast X
13
+ * 4K, and from that software's V0109 build for the read command and the
14
+ * settings layout. V0109 checksums with a plain byte sum; the newer build in
15
+ * the capture, which the firmware answered, uses the CRC above.
16
+ */
17
+ export declare const WLMOUSE_4K_PRODUCT_ID = 43143;
18
+ export declare const WLMOUSE_4K_REPORT_ID = 4;
19
+ export declare const WLMOUSE_4K_PACKET_LENGTH = 63;
20
+ export declare const WLMOUSE_4K_CHUNK_LENGTH = 24;
21
+ export declare const WLMOUSE_4K_COMMAND: {
22
+ readonly openSession: 1;
23
+ readonly closeSession: 2;
24
+ readonly readSettings: 5;
25
+ readonly writeSettings: 6;
26
+ };
27
+ export declare const WLMOUSE_4K_STATUS_ERRORS: ReadonlySet<number>;
28
+ /**
29
+ * One onboard profile's settings, read and written at `profile << 7`. The
30
+ * active profile number is the byte at address 0.
31
+ * [01..08] lighting, [58..59] a fixed 600, [6b..70] the PC clock the vendor
32
+ * software pushes on every write; all preserved as read.
33
+ */
34
+ export declare const WLMOUSE_4K_SETTINGS_LENGTH = 117;
35
+ export declare const WLMOUSE_4K_SETTINGS: {
36
+ readonly stageCount: 9;
37
+ readonly highMode: 10;
38
+ readonly pollingIndex: 11;
39
+ readonly activeStage: 12;
40
+ /** 0 = 1 mm, 1 = 2 mm. */
41
+ readonly liftOff: 13;
42
+ /** Eight 9-byte slots: [enabled][separate axes][X u16 LE][Y u16 LE][R][G][B]. */
43
+ readonly stages: 14;
44
+ readonly sleepSeconds: 86;
45
+ readonly debounceMs: 90;
46
+ readonly slamClickPrevention: 91;
47
+ readonly motionSync: 92;
48
+ };
49
+ export declare const WLMOUSE_4K_STAGE_LENGTH = 9;
50
+ export declare const WLMOUSE_4K_STAGE_SLOTS = 8;
51
+ export declare const WLMOUSE_4K_POLLING_RATES: readonly [125, 250, 500, 1000, 2000, 4000];
52
+ export interface Wlmouse4kReply {
53
+ command: number;
54
+ length: number;
55
+ address: number;
56
+ status: number;
57
+ data: Uint8Array;
58
+ }
59
+ export interface Wlmouse4kSettings {
60
+ stageCount: number;
61
+ activeStage: number;
62
+ /** X DPI of all eight slots; only the first `stageCount` are cycled. */
63
+ stageDpis: number[];
64
+ pollingRateHz: number | null;
65
+ highMode: boolean;
66
+ liftOffMm: number;
67
+ sleepSeconds: number;
68
+ debounceMs: number;
69
+ slamClickPrevention: boolean;
70
+ motionSync: boolean;
71
+ }
72
+ export declare function wlmouse4kCrc(bytes: ArrayLike<number>): number;
73
+ /** A request body; reads pass `length` and no data. */
74
+ export declare function wlmouse4kEncodeRequest(command: number, address?: number, data?: ArrayLike<number>, length?: number): Uint8Array<ArrayBuffer>;
75
+ export declare function wlmouse4kDecodeReply(body: Uint8Array): Wlmouse4kReply | null;
76
+ export declare function wlmouse4kDecodeSettings(block: Uint8Array): Wlmouse4kSettings;
77
+ //# sourceMappingURL=beast-x-4k.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beast-x-4k.d.ts","sourceRoot":"","sources":["../../src/wlmouse/beast-x-4k.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AACX,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAyB,CAAC;AAEnF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,MAAO,CAAC;AAC/C,eAAO,MAAM,mBAAmB;;;;;IAK9B,0BAA0B;;IAE1B,iFAAiF;;;;;;CAMzE,CAAC;AACX,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,wBAAwB,4CAA6C,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAO7D;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,SAAI,EACX,IAAI,GAAE,SAAS,CAAC,MAAM,CAAM,EAC5B,MAAM,SAAc,GACnB,UAAU,CAAC,WAAW,CAAC,CAczB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI,CAU5E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,iBAAiB,CAmB5E"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Beast X 4K (36a7:a887) settings protocol. Unlike the rest of the WLmouse
3
+ * range it never answers compx feature reports: commands go out as 64-byte
4
+ * output report 4 and each answer comes back as input report 4.
5
+ *
6
+ * Report body, after the report id:
7
+ * [0..1] CRC-16/MODBUS of [2..30], little-endian
8
+ * [2] command; [3] data length; [4..5] address, little-endian
9
+ * [6] reply status, 0xfe or 0xff on error (0 in requests)
10
+ * [7..30] data, at most 24 bytes
11
+ *
12
+ * Decoded from a USB capture of WLmouse's desktop software driving a Beast X
13
+ * 4K, and from that software's V0109 build for the read command and the
14
+ * settings layout. V0109 checksums with a plain byte sum; the newer build in
15
+ * the capture, which the firmware answered, uses the CRC above.
16
+ */
17
+ export const WLMOUSE_4K_PRODUCT_ID = 0xa887;
18
+ export const WLMOUSE_4K_REPORT_ID = 4;
19
+ export const WLMOUSE_4K_PACKET_LENGTH = 63;
20
+ export const WLMOUSE_4K_CHUNK_LENGTH = 24;
21
+ export const WLMOUSE_4K_COMMAND = {
22
+ openSession: 0x01,
23
+ closeSession: 0x02,
24
+ readSettings: 0x05,
25
+ writeSettings: 0x06,
26
+ };
27
+ export const WLMOUSE_4K_STATUS_ERRORS = new Set([0xfe, 0xff]);
28
+ /**
29
+ * One onboard profile's settings, read and written at `profile << 7`. The
30
+ * active profile number is the byte at address 0.
31
+ * [01..08] lighting, [58..59] a fixed 600, [6b..70] the PC clock the vendor
32
+ * software pushes on every write; all preserved as read.
33
+ */
34
+ export const WLMOUSE_4K_SETTINGS_LENGTH = 0x75;
35
+ export const WLMOUSE_4K_SETTINGS = {
36
+ stageCount: 0x09,
37
+ highMode: 0x0a,
38
+ pollingIndex: 0x0b,
39
+ activeStage: 0x0c,
40
+ /** 0 = 1 mm, 1 = 2 mm. */
41
+ liftOff: 0x0d,
42
+ /** Eight 9-byte slots: [enabled][separate axes][X u16 LE][Y u16 LE][R][G][B]. */
43
+ stages: 0x0e,
44
+ sleepSeconds: 0x56,
45
+ debounceMs: 0x5a,
46
+ slamClickPrevention: 0x5b,
47
+ motionSync: 0x5c,
48
+ };
49
+ export const WLMOUSE_4K_STAGE_LENGTH = 9;
50
+ export const WLMOUSE_4K_STAGE_SLOTS = 8;
51
+ export const WLMOUSE_4K_POLLING_RATES = [125, 250, 500, 1000, 2000, 4000];
52
+ export function wlmouse4kCrc(bytes) {
53
+ let crc = 0xffff;
54
+ for (let index = 0; index < bytes.length; index += 1) {
55
+ crc ^= bytes[index] & 0xff;
56
+ for (let bit = 0; bit < 8; bit += 1)
57
+ crc = crc & 1 ? (crc >>> 1) ^ 0xa001 : crc >>> 1;
58
+ }
59
+ return crc;
60
+ }
61
+ /** A request body; reads pass `length` and no data. */
62
+ export function wlmouse4kEncodeRequest(command, address = 0, data = [], length = data.length) {
63
+ if (length > WLMOUSE_4K_CHUNK_LENGTH || data.length > length) {
64
+ throw new Error(`A Beast X 4K request carries at most ${WLMOUSE_4K_CHUNK_LENGTH} bytes.`);
65
+ }
66
+ const body = new Uint8Array(WLMOUSE_4K_PACKET_LENGTH);
67
+ body[2] = command;
68
+ body[3] = length;
69
+ body[4] = address & 0xff;
70
+ body[5] = (address >> 8) & 0xff;
71
+ body.set(Array.from(data), 7);
72
+ const crc = wlmouse4kCrc(body.subarray(2, 31));
73
+ body[0] = crc & 0xff;
74
+ body[1] = crc >> 8;
75
+ return body;
76
+ }
77
+ export function wlmouse4kDecodeReply(body) {
78
+ if (body.length < 31)
79
+ return null;
80
+ const length = Math.min(body[3], WLMOUSE_4K_CHUNK_LENGTH);
81
+ return {
82
+ command: body[2],
83
+ length,
84
+ address: body[4] | (body[5] << 8),
85
+ status: body[6],
86
+ data: body.slice(7, 7 + length),
87
+ };
88
+ }
89
+ export function wlmouse4kDecodeSettings(block) {
90
+ if (block.length < WLMOUSE_4K_SETTINGS_LENGTH)
91
+ throw new Error("The Beast X 4K returned a truncated settings block.");
92
+ const at = WLMOUSE_4K_SETTINGS;
93
+ const stageCount = Math.min(Math.max(block[at.stageCount], 1), WLMOUSE_4K_STAGE_SLOTS);
94
+ return {
95
+ stageCount,
96
+ activeStage: Math.min(block[at.activeStage], stageCount - 1),
97
+ stageDpis: Array.from({ length: WLMOUSE_4K_STAGE_SLOTS }, (_, stage) => {
98
+ const x = at.stages + stage * WLMOUSE_4K_STAGE_LENGTH + 2;
99
+ return block[x] | (block[x + 1] << 8);
100
+ }),
101
+ pollingRateHz: WLMOUSE_4K_POLLING_RATES[block[at.pollingIndex]] ?? null,
102
+ highMode: block[at.highMode] === 1,
103
+ liftOffMm: block[at.liftOff] === 1 ? 2 : 1,
104
+ sleepSeconds: block[at.sleepSeconds] | (block[at.sleepSeconds + 1] << 8),
105
+ debounceMs: block[at.debounceMs],
106
+ slamClickPrevention: block[at.slamClickPrevention] === 1,
107
+ motionSync: block[at.motionSync] === 1,
108
+ };
109
+ }
110
+ //# sourceMappingURL=beast-x-4k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beast-x-4k.js","sourceRoot":"","sources":["../../src/wlmouse/beast-x-4k.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from "../compx/codec.js";
2
+ export * from "./beast-x-4k.js";
2
3
  export declare const WLMOUSE_VENDOR_ID = 13991;
3
4
  export declare const WLMOUSE_POLLING_RATES: readonly [readonly [8, 125], readonly [4, 250], readonly [2, 500], readonly [1, 1000], readonly [16, 1000], readonly [32, 2000], readonly [64, 4000], readonly [128, 8000]];
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wlmouse/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,eAAO,MAAM,qBAAqB,6KAGxB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wlmouse/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,eAAO,MAAM,qBAAqB,6KAGxB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "../compx/codec.js";
2
+ export * from "./beast-x-4k.js";
2
3
  export const WLMOUSE_VENDOR_ID = 0x36a7;
3
4
  export const WLMOUSE_POLLING_RATES = [
4
5
  [0x08, 125], [0x04, 250], [0x02, 500], [0x01, 1000],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wlmouse/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACnD,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CAC9C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wlmouse/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACnD,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CAC9C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmouse/protocol",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Gaming mouse protocol codecs and WebHID drivers used by OpenMouse.",
5
5
  "type": "module",
6
6
  "publishConfig": {