@@ -246,6 +246,35 @@ byte[11] = enable: 0=off, 1=on
246246byte[12] = 0x55 - enable
247247```
248248
249+ Additional captures show the same ` 0x4C ` block also carries LED brightness and
250+ speed. This was captured while changing the receiver/DPI LED controls.
251+
252+ ``` txt
253+ off: 07 00 00 4c 08 00 00 ff 56 05 50 00 55 00 00 f3
254+ solid: 07 00 00 4c 08 01 54 ff 56 05 50 01 54 00 00 9e
255+ breathing: 07 00 00 4c 08 02 53 ff 56 05 50 01 54 00 00 9e
256+
257+ speed slow: 07 00 00 4c 08 02 53 ff 56 01 54 01 54 00 00 9e
258+ speed mid: 07 00 00 4c 08 02 53 ff 56 03 52 01 54 00 00 9e
259+
260+ brightness min: 07 00 00 4c 08 01 54 10 45 03 52 01 54 00 00 9e
261+ brightness mid: 07 00 00 4c 08 01 54 80 d5 03 52 01 54 00 00 9e
262+ brightness max: 07 00 00 4c 08 01 54 ff 56 03 52 01 54 00 00 9e
263+ ```
264+
265+ Observed ` 0x4C ` field layout:
266+
267+ ``` txt
268+ byte[5] mode: 0=off, 1=solid, 2=breathing
269+ byte[6] 0x55 - mode, except off has also been captured as 0x00
270+ byte[7] brightness raw: 0x10=min, 0x80=middle, 0xff=max
271+ byte[8] 0x55 - brightness
272+ byte[9] speed raw: 0x01=slow, 0x03=middle
273+ byte[10] 0x55 - speed
274+ byte[11] enable: 0=off, 1=on
275+ byte[12] 0x55 - enable
276+ ```
277+
249278### Debounce
250279
251280Debounce is stored in the ` 0xA9 ` block. Bytes 5/6 are the debounce value and
@@ -298,15 +327,27 @@ sleep-timer write sequence until a cleaner capture proves otherwise.
298327
299328### Lift-Off Distance
300329
301- Captured from decrease/increase controls:
330+ Captured from decrease/increase controls. This is command/address ` 0x0A ` with
331+ payload length ` 0x02 ` . Byte 5 is the raw value and byte 6 follows
332+ ` 0x55 - value ` .
302333
303334``` txt
335+ 07 00 00 0a 02 01 54 00 00 00 00 00 00 00 00 e5
336+ 07 00 00 0a 02 02 53 00 00 00 00 00 00 00 00 e5
337+ 07 00 00 0a 02 03 52 00 00 00 00 00 00 00 00 e5
338+ 07 00 00 0a 02 04 51 00 00 00 00 00 00 00 00 e5
30433907 00 00 0a 02 05 50 00 00 00 00 00 00 00 00 e5
30534007 00 00 0a 02 06 4f 00 00 00 00 00 00 00 00 e5
341+ 07 00 00 0a 02 07 4e 00 00 00 00 00 00 00 00 e5
342+ 07 00 00 0a 02 08 4d 00 00 00 00 00 00 00 00 e5
343+ 07 00 00 0a 02 09 4c 00 00 00 00 00 00 00 00 e5
344+ 07 00 00 0a 02 0a 4b 00 00 00 00 00 00 00 00 e5
345+ 07 00 00 0a 02 0b 4a 00 00 00 00 00 00 00 00 e5
306346```
307347
308- This differs from IPI's 0.7/1/2 mm mapping. The exact ATK UI values need one
309- clean capture per visible LOD option before implementing.
348+ This differs from IPI's 0.7/1/2 mm mapping. If this was captured from the ATK
349+ LOD control, the visible control likely maps to raw values ` 1..11 ` . The exact
350+ ATK UI label/unit still needs confirmation before implementing.
310351
311352### A9 Toggle Fields
312353
@@ -399,6 +440,52 @@ This indicates direct RGB bytes:
399440byte[6..8] = red, green, blue
400441```
401442
443+ ### DPI Preset / Receiver LED Color Table
444+
445+ Captured while changing the receiver LED color from red to green and back to
446+ red. ATK V HUB wrote a color table at addresses ` 0x2C ` , ` 0x34 ` , ` 0x3C ` and
447+ ` 0x44 ` . Each 8-byte block carries two RGB color groups.
448+
449+ Group format:
450+
451+ ``` txt
452+ [red, green, blue, check]
453+ check = (0x255 - red - green - blue) & 0xFF
454+ ```
455+
456+ Examples:
457+
458+ ``` txt
459+ red: ff 00 00 56
460+ green: 00 ff 00 56
461+ blue: 00 00 ff 56
462+ magenta: ff 00 ff 57
463+ ```
464+
465+ Observed block writes:
466+
467+ ``` txt
468+ 07 00 00 2c 08 ff 00 00 56 00 ff 00 56 00 00 68
469+ 07 00 00 34 08 00 00 ff 56 04 00 ff 52 00 00 60
470+ 07 00 00 3c 08 ff 00 ff 57 ff 00 ff 57 00 00 58
471+ 07 00 00 44 08 ff 00 ff 57 ff 00 ff 57 00 00 50
472+
473+ 07 00 00 34 08 00 00 ff 56 59 ff 00 fd 00 00 60
474+ 07 00 00 34 08 00 00 ff 56 ff 59 00 fd 00 00 60
475+ ```
476+
477+ This strongly suggests a palette/preset table with two color slots per address:
478+
479+ ``` txt
480+ 0x2C -> color slots 1 and 2
481+ 0x34 -> color slots 3 and 4
482+ 0x3C -> color slots 5 and 6
483+ 0x44 -> color slots 7 and 8
484+ ```
485+
486+ The exact UI mapping still needs clean one-slot captures because the color picker
487+ emitted several intermediate colors while dragging.
488+
402489## Initial Observations
403490
404491- ATK and IPI share enough framing that the current Rust checksum helpers can be reused.
@@ -411,6 +498,7 @@ byte[6..8] = red, green, blue
411498For each capture: click ` Clear ` , change exactly one setting, then use ` Copy hex ` .
412499
4135001 . DPI value: set stage 1 to known fixed values, especially ` 800 ` , ` 900 ` , ` 1600 ` and ` 1800 ` , to remove the remaining raw-value ambiguity.
414- 2 . LOD: set every visible lift-off distance option and record the exact UI label for each frame.
415- 3 . Firmware/version reads: identify which startup responses map to mouse and dongle firmware versions.
416- 4 . Button remapping: capture one simple remap, for example side button -> DPI cycle.
501+ 2 . Confirm the exact UI label/unit for the ` 0x0A ` numeric setting, likely LOD.
502+ 3 . DPI preset / receiver LED color slots: capture one slot at a time with a single click, not a drag, to map slot order exactly.
503+ 4 . Firmware/version reads: identify which startup responses map to mouse and dongle firmware versions.
504+ 5 . Button remapping: capture one simple remap, for example side button -> DPI cycle.
0 commit comments