Skip to main content

rmk_q6_he_ansi/backlight/
mapping.rs

1//! LED mapping for the Q6 HE ANSI backlight layout.
2
3use snled27351_driver::{
4    driver::Led,
5    led_address::{
6        CB1_CA1,
7        CB1_CA2,
8        CB1_CA3,
9        CB1_CA4,
10        CB1_CA5,
11        CB1_CA6,
12        CB1_CA7,
13        CB1_CA8,
14        CB1_CA9,
15        CB1_CA10,
16        CB1_CA11,
17        CB1_CA12,
18        CB1_CA13,
19        CB1_CA14,
20        CB1_CA15,
21        CB1_CA16,
22        CB2_CA1,
23        CB2_CA2,
24        CB2_CA3,
25        CB2_CA4,
26        CB2_CA5,
27        CB2_CA6,
28        CB2_CA7,
29        CB2_CA8,
30        CB2_CA9,
31        CB2_CA10,
32        CB2_CA11,
33        CB2_CA12,
34        CB2_CA13,
35        CB2_CA14,
36        CB2_CA15,
37        CB2_CA16,
38        CB3_CA1,
39        CB3_CA2,
40        CB3_CA3,
41        CB3_CA4,
42        CB3_CA5,
43        CB3_CA6,
44        CB3_CA7,
45        CB3_CA8,
46        CB3_CA9,
47        CB3_CA10,
48        CB3_CA11,
49        CB3_CA12,
50        CB3_CA13,
51        CB3_CA14,
52        CB3_CA15,
53        CB3_CA16,
54        CB4_CA1,
55        CB4_CA2,
56        CB4_CA3,
57        CB4_CA4,
58        CB4_CA5,
59        CB4_CA6,
60        CB4_CA7,
61        CB4_CA8,
62        CB4_CA9,
63        CB4_CA10,
64        CB4_CA11,
65        CB4_CA12,
66        CB4_CA13,
67        CB4_CA14,
68        CB4_CA15,
69        CB4_CA16,
70        CB5_CA1,
71        CB5_CA2,
72        CB5_CA3,
73        CB5_CA4,
74        CB5_CA5,
75        CB5_CA6,
76        CB5_CA7,
77        CB5_CA8,
78        CB5_CA9,
79        CB5_CA10,
80        CB5_CA11,
81        CB5_CA12,
82        CB5_CA13,
83        CB5_CA14,
84        CB5_CA15,
85        CB5_CA16,
86        CB6_CA1,
87        CB6_CA2,
88        CB6_CA3,
89        CB6_CA4,
90        CB6_CA5,
91        CB6_CA6,
92        CB6_CA7,
93        CB6_CA8,
94        CB6_CA9,
95        CB6_CA10,
96        CB6_CA11,
97        CB6_CA12,
98        CB6_CA13,
99        CB6_CA14,
100        CB6_CA15,
101        CB6_CA16,
102        CB7_CA1,
103        CB7_CA2,
104        CB7_CA3,
105        CB7_CA4,
106        CB7_CA5,
107        CB7_CA6,
108        CB7_CA7,
109        CB7_CA8,
110        CB7_CA9,
111        CB7_CA10,
112        CB7_CA11,
113        CB7_CA12,
114        CB7_CA13,
115        CB7_CA14,
116        CB7_CA15,
117        CB7_CA16,
118        CB8_CA1,
119        CB8_CA2,
120        CB8_CA3,
121        CB8_CA4,
122        CB8_CA5,
123        CB8_CA6,
124        CB8_CA7,
125        CB8_CA8,
126        CB8_CA9,
127        CB8_CA10,
128        CB8_CA11,
129        CB8_CA12,
130        CB8_CA13,
131        CB8_CA14,
132        CB8_CA15,
133        CB8_CA16,
134        CB9_CA1,
135        CB9_CA2,
136        CB9_CA3,
137        CB9_CA4,
138        CB9_CA5,
139        CB9_CA6,
140        CB9_CA7,
141        CB9_CA8,
142        CB9_CA9,
143        CB9_CA10,
144        CB9_CA11,
145        CB9_CA12,
146        CB9_CA13,
147        CB9_CA14,
148        CB9_CA15,
149        CB9_CA16,
150        CB10_CA1,
151        CB10_CA2,
152        CB10_CA3,
153        CB10_CA4,
154        CB10_CA5,
155        CB10_CA6,
156        CB10_CA7,
157        CB10_CA8,
158        CB10_CA9,
159        CB10_CA10,
160        CB10_CA11,
161        CB10_CA12,
162        CB11_CA1,
163        CB11_CA2,
164        CB11_CA3,
165        CB11_CA4,
166        CB11_CA5,
167        CB11_CA6,
168        CB11_CA7,
169        CB11_CA8,
170        CB11_CA9,
171        CB11_CA10,
172        CB11_CA11,
173        CB11_CA12,
174        CB12_CA1,
175        CB12_CA2,
176        CB12_CA3,
177        CB12_CA4,
178        CB12_CA5,
179        CB12_CA6,
180        CB12_CA7,
181        CB12_CA8,
182        CB12_CA9,
183        CB12_CA10,
184        CB12_CA11,
185        CB12_CA12,
186    },
187};
188
189/// LED layout table mapping LED indices to LED driver channels.
190pub const LED_LAYOUT: &[Led] = &[
191    Led { driver: 0, red: CB7_CA16, green: CB9_CA16, blue: CB8_CA16 },
192    Led { driver: 0, red: CB7_CA15, green: CB9_CA15, blue: CB8_CA15 },
193    Led { driver: 0, red: CB7_CA14, green: CB9_CA14, blue: CB8_CA14 },
194    Led { driver: 0, red: CB7_CA13, green: CB9_CA13, blue: CB8_CA13 },
195    Led { driver: 0, red: CB7_CA12, green: CB9_CA12, blue: CB8_CA12 },
196    Led { driver: 0, red: CB7_CA11, green: CB9_CA11, blue: CB8_CA11 },
197    Led { driver: 0, red: CB7_CA10, green: CB9_CA10, blue: CB8_CA10 },
198    Led { driver: 0, red: CB7_CA9, green: CB9_CA9, blue: CB8_CA9 },
199    Led { driver: 0, red: CB7_CA8, green: CB9_CA8, blue: CB8_CA8 },
200    Led { driver: 0, red: CB7_CA7, green: CB9_CA7, blue: CB8_CA7 },
201    Led { driver: 0, red: CB7_CA6, green: CB9_CA6, blue: CB8_CA6 },
202    Led { driver: 0, red: CB7_CA5, green: CB9_CA5, blue: CB8_CA5 },
203    Led { driver: 0, red: CB7_CA4, green: CB9_CA4, blue: CB8_CA4 },
204    Led { driver: 0, red: CB7_CA2, green: CB9_CA2, blue: CB8_CA2 },
205    Led { driver: 0, red: CB7_CA1, green: CB9_CA1, blue: CB8_CA1 },
206    Led { driver: 1, red: CB1_CA3, green: CB3_CA3, blue: CB2_CA3 },
207    Led { driver: 0, red: CB10_CA4, green: CB12_CA4, blue: CB11_CA4 },
208    Led { driver: 0, red: CB10_CA3, green: CB12_CA3, blue: CB11_CA3 },
209    Led { driver: 0, red: CB10_CA2, green: CB12_CA2, blue: CB11_CA2 },
210    Led { driver: 0, red: CB10_CA1, green: CB12_CA1, blue: CB11_CA1 },
211    Led { driver: 0, red: CB1_CA16, green: CB3_CA16, blue: CB2_CA16 },
212    Led { driver: 0, red: CB1_CA15, green: CB3_CA15, blue: CB2_CA15 },
213    Led { driver: 0, red: CB1_CA14, green: CB3_CA14, blue: CB2_CA14 },
214    Led { driver: 0, red: CB1_CA13, green: CB3_CA13, blue: CB2_CA13 },
215    Led { driver: 0, red: CB1_CA12, green: CB3_CA12, blue: CB2_CA12 },
216    Led { driver: 0, red: CB1_CA11, green: CB3_CA11, blue: CB2_CA11 },
217    Led { driver: 0, red: CB1_CA10, green: CB3_CA10, blue: CB2_CA10 },
218    Led { driver: 0, red: CB1_CA9, green: CB3_CA9, blue: CB2_CA9 },
219    Led { driver: 0, red: CB1_CA8, green: CB3_CA8, blue: CB2_CA8 },
220    Led { driver: 0, red: CB1_CA7, green: CB3_CA7, blue: CB2_CA7 },
221    Led { driver: 0, red: CB1_CA6, green: CB3_CA6, blue: CB2_CA6 },
222    Led { driver: 0, red: CB1_CA5, green: CB3_CA5, blue: CB2_CA5 },
223    Led { driver: 0, red: CB1_CA4, green: CB3_CA4, blue: CB2_CA4 },
224    Led { driver: 0, red: CB1_CA3, green: CB3_CA3, blue: CB2_CA3 },
225    Led { driver: 0, red: CB1_CA2, green: CB3_CA2, blue: CB2_CA2 },
226    Led { driver: 0, red: CB1_CA1, green: CB3_CA1, blue: CB2_CA1 },
227    Led { driver: 1, red: CB1_CA2, green: CB3_CA2, blue: CB2_CA2 },
228    Led { driver: 0, red: CB10_CA8, green: CB12_CA8, blue: CB11_CA8 },
229    Led { driver: 0, red: CB10_CA7, green: CB12_CA7, blue: CB11_CA7 },
230    Led { driver: 0, red: CB10_CA6, green: CB12_CA6, blue: CB11_CA6 },
231    Led { driver: 0, red: CB10_CA5, green: CB12_CA5, blue: CB11_CA5 },
232    Led { driver: 0, red: CB4_CA16, green: CB6_CA16, blue: CB5_CA16 },
233    Led { driver: 0, red: CB4_CA15, green: CB6_CA15, blue: CB5_CA15 },
234    Led { driver: 0, red: CB4_CA14, green: CB6_CA14, blue: CB5_CA14 },
235    Led { driver: 0, red: CB4_CA13, green: CB6_CA13, blue: CB5_CA13 },
236    Led { driver: 0, red: CB4_CA12, green: CB6_CA12, blue: CB5_CA12 },
237    Led { driver: 0, red: CB4_CA11, green: CB6_CA11, blue: CB5_CA11 },
238    Led { driver: 0, red: CB4_CA10, green: CB6_CA10, blue: CB5_CA10 },
239    Led { driver: 0, red: CB4_CA9, green: CB6_CA9, blue: CB5_CA9 },
240    Led { driver: 0, red: CB4_CA8, green: CB6_CA8, blue: CB5_CA8 },
241    Led { driver: 0, red: CB4_CA7, green: CB6_CA7, blue: CB5_CA7 },
242    Led { driver: 0, red: CB4_CA6, green: CB6_CA6, blue: CB5_CA6 },
243    Led { driver: 0, red: CB4_CA5, green: CB6_CA5, blue: CB5_CA5 },
244    Led { driver: 0, red: CB4_CA4, green: CB6_CA4, blue: CB5_CA4 },
245    Led { driver: 0, red: CB4_CA3, green: CB6_CA3, blue: CB5_CA3 },
246    Led { driver: 0, red: CB4_CA2, green: CB6_CA2, blue: CB5_CA2 },
247    Led { driver: 0, red: CB4_CA1, green: CB6_CA1, blue: CB5_CA1 },
248    Led { driver: 1, red: CB1_CA1, green: CB3_CA1, blue: CB2_CA1 },
249    Led { driver: 0, red: CB10_CA12, green: CB12_CA12, blue: CB11_CA12 },
250    Led { driver: 0, red: CB10_CA11, green: CB12_CA11, blue: CB11_CA11 },
251    Led { driver: 0, red: CB10_CA10, green: CB12_CA10, blue: CB11_CA10 },
252    Led { driver: 0, red: CB10_CA9, green: CB12_CA9, blue: CB11_CA9 },
253    Led { driver: 1, red: CB1_CA16, green: CB3_CA16, blue: CB2_CA16 },
254    Led { driver: 1, red: CB1_CA15, green: CB3_CA15, blue: CB2_CA15 },
255    Led { driver: 1, red: CB1_CA14, green: CB3_CA14, blue: CB2_CA14 },
256    Led { driver: 1, red: CB1_CA13, green: CB3_CA13, blue: CB2_CA13 },
257    Led { driver: 1, red: CB1_CA12, green: CB3_CA12, blue: CB2_CA12 },
258    Led { driver: 1, red: CB1_CA11, green: CB3_CA11, blue: CB2_CA11 },
259    Led { driver: 1, red: CB1_CA10, green: CB3_CA10, blue: CB2_CA10 },
260    Led { driver: 1, red: CB1_CA9, green: CB3_CA9, blue: CB2_CA9 },
261    Led { driver: 1, red: CB1_CA8, green: CB3_CA8, blue: CB2_CA8 },
262    Led { driver: 1, red: CB1_CA7, green: CB3_CA7, blue: CB2_CA7 },
263    Led { driver: 1, red: CB1_CA6, green: CB3_CA6, blue: CB2_CA6 },
264    Led { driver: 1, red: CB1_CA5, green: CB3_CA5, blue: CB2_CA5 },
265    Led { driver: 1, red: CB1_CA4, green: CB3_CA4, blue: CB2_CA4 },
266    Led { driver: 1, red: CB10_CA9, green: CB12_CA9, blue: CB11_CA9 },
267    Led { driver: 1, red: CB10_CA8, green: CB12_CA8, blue: CB11_CA8 },
268    Led { driver: 1, red: CB10_CA7, green: CB12_CA7, blue: CB11_CA7 },
269    Led { driver: 1, red: CB7_CA16, green: CB9_CA16, blue: CB8_CA16 },
270    Led { driver: 1, red: CB7_CA14, green: CB9_CA14, blue: CB8_CA14 },
271    Led { driver: 1, red: CB7_CA13, green: CB9_CA13, blue: CB8_CA13 },
272    Led { driver: 1, red: CB7_CA12, green: CB9_CA12, blue: CB8_CA12 },
273    Led { driver: 1, red: CB7_CA11, green: CB9_CA11, blue: CB8_CA11 },
274    Led { driver: 1, red: CB7_CA10, green: CB9_CA10, blue: CB8_CA10 },
275    Led { driver: 1, red: CB7_CA9, green: CB9_CA9, blue: CB8_CA9 },
276    Led { driver: 1, red: CB7_CA8, green: CB9_CA8, blue: CB8_CA8 },
277    Led { driver: 1, red: CB7_CA7, green: CB9_CA7, blue: CB8_CA7 },
278    Led { driver: 1, red: CB7_CA6, green: CB9_CA6, blue: CB8_CA6 },
279    Led { driver: 1, red: CB7_CA5, green: CB9_CA5, blue: CB8_CA5 },
280    Led { driver: 1, red: CB7_CA3, green: CB9_CA3, blue: CB8_CA3 },
281    Led { driver: 1, red: CB7_CA1, green: CB9_CA1, blue: CB8_CA1 },
282    Led { driver: 1, red: CB10_CA6, green: CB12_CA6, blue: CB11_CA6 },
283    Led { driver: 1, red: CB10_CA5, green: CB12_CA5, blue: CB11_CA5 },
284    Led { driver: 1, red: CB10_CA4, green: CB12_CA4, blue: CB11_CA4 },
285    Led { driver: 1, red: CB10_CA3, green: CB12_CA3, blue: CB11_CA3 },
286    Led { driver: 1, red: CB4_CA16, green: CB6_CA16, blue: CB5_CA16 },
287    Led { driver: 1, red: CB4_CA15, green: CB6_CA15, blue: CB5_CA15 },
288    Led { driver: 1, red: CB4_CA14, green: CB6_CA14, blue: CB5_CA14 },
289    Led { driver: 1, red: CB4_CA10, green: CB6_CA10, blue: CB5_CA10 },
290    Led { driver: 1, red: CB4_CA7, green: CB6_CA7, blue: CB5_CA7 },
291    Led { driver: 1, red: CB4_CA6, green: CB6_CA6, blue: CB5_CA6 },
292    Led { driver: 1, red: CB4_CA5, green: CB6_CA5, blue: CB5_CA5 },
293    Led { driver: 1, red: CB4_CA4, green: CB6_CA4, blue: CB5_CA4 },
294    Led { driver: 1, red: CB4_CA2, green: CB6_CA2, blue: CB5_CA2 },
295    Led { driver: 1, red: CB4_CA1, green: CB6_CA1, blue: CB5_CA1 },
296    Led { driver: 1, red: CB7_CA2, green: CB9_CA2, blue: CB8_CA2 },
297    Led { driver: 1, red: CB10_CA2, green: CB12_CA2, blue: CB11_CA2 },
298    Led { driver: 1, red: CB10_CA1, green: CB12_CA1, blue: CB11_CA1 },
299];
300
301/// Maps matrix position `[row][col]` to a LED index into [`LED_LAYOUT`].
302///
303/// Derived directly from `vial.json` layout and the sequential LED indices
304/// assigned in `LED_LAYOUT`. `None` for dead matrix cells (`a!(No)` in the
305/// keymap), the layer-toggle columns (5,7 and 5,8), and physical gaps where
306/// no key or LED exists.
307///
308/// To re-verify: for each `"row,col"` entry in `vial.json`s keymap array,
309/// assign the next sequential LED index in reading order (left-to-right,
310/// top-to-bottom), skipping entries that have only position modifiers
311/// (`x`, `y`, `w`, `h`) and no matrix coordinate.
312pub const MATRIX_TO_LED: [[Option<u8>; 21]; 6] = [
313    // Row 0: col 13 = AudioMute (encoder button, no LED).
314    [
315        Some(0),
316        Some(1),
317        Some(2),
318        Some(3),
319        Some(4),
320        Some(5),
321        Some(6),
322        Some(7),
323        Some(8),
324        Some(9),
325        Some(10),
326        Some(11),
327        Some(12),
328        None,
329        Some(13),
330        Some(14),
331        Some(15),
332        Some(16),
333        Some(17),
334        Some(18),
335        Some(19),
336    ],
337    // Row 1: all 21 keys present. LEDs 20–40.
338    [
339        Some(20),
340        Some(21),
341        Some(22),
342        Some(23),
343        Some(24),
344        Some(25),
345        Some(26),
346        Some(27),
347        Some(28),
348        Some(29),
349        Some(30),
350        Some(31),
351        Some(32),
352        Some(33),
353        Some(34),
354        Some(35),
355        Some(36),
356        Some(37),
357        Some(38),
358        Some(39),
359        Some(40),
360    ],
361    // Row 2: all 21 keys present. LEDs 41–61.
362    [
363        Some(41),
364        Some(42),
365        Some(43),
366        Some(44),
367        Some(45),
368        Some(46),
369        Some(47),
370        Some(48),
371        Some(49),
372        Some(50),
373        Some(51),
374        Some(52),
375        Some(53),
376        Some(54),
377        Some(55),
378        Some(56),
379        Some(57),
380        Some(58),
381        Some(59),
382        Some(60),
383        Some(61),
384    ],
385    // Row 3: keys at cols 0–12, 17–19. LEDs 62–77.
386    // cols 13–16 = a!(No). col 20 = a!(No) (KpPlus h:2 bottom).
387    [
388        Some(62),
389        Some(63),
390        Some(64),
391        Some(65),
392        Some(66),
393        Some(67),
394        Some(68),
395        Some(69),
396        Some(70),
397        Some(71),
398        Some(72),
399        Some(73),
400        Some(74),
401        None,
402        None,
403        None,
404        None,
405        Some(75),
406        Some(76),
407        Some(77),
408        None,
409    ],
410    // Row 4: keys at cols 0,2–11,13,15,17–20. LEDs 78–94.
411    // col 1 = a!(No). col 12 = a!(No). col 14 = a!(No). col 16 = a!(No).
412    [
413        Some(78),
414        None,
415        Some(79),
416        Some(80),
417        Some(81),
418        Some(82),
419        Some(83),
420        Some(84),
421        Some(85),
422        Some(86),
423        Some(87),
424        Some(88),
425        None,
426        Some(89),
427        None,
428        Some(90),
429        None,
430        Some(91),
431        Some(92),
432        Some(93),
433        Some(94),
434    ],
435    // Row 5: keys at cols 0–2,6,9–12,14–18. LEDs 95–107.
436    // cols 3–5 = a!(No). cols 7–8 = layer toggle. col 13 = a!(No). cols 19–20 = a!(No).
437    [
438        Some(95),
439        Some(96),
440        Some(97),
441        None,
442        None,
443        None,
444        Some(98),
445        None,
446        None,
447        Some(99),
448        Some(100),
449        Some(101),
450        Some(102),
451        None,
452        Some(103),
453        Some(104),
454        Some(105),
455        Some(106),
456        Some(107),
457        None,
458        None,
459    ],
460];
461
462/// Compile-time guard: [`LED_LAYOUT`] must fit within the 128-bit
463/// `calib_leds_done` bitset used in the backlight task.
464const _: () = assert!(LED_LAYOUT.len() <= 128, "LED_LAYOUT exceeds the 128-LED capacity of the calib_leds_done bitset");
465
466/// Compile-time guard: every `Some(idx)` in [`MATRIX_TO_LED`] must be a valid
467/// index into [`LED_LAYOUT`]. Catches mismatches when either table is edited.
468const _: () = {
469    let led_count = LED_LAYOUT.len();
470    let mut row = 0;
471    while row < MATRIX_TO_LED.len() {
472        let mut col = 0;
473        while col < MATRIX_TO_LED[row].len() {
474            if let Some(idx) = MATRIX_TO_LED[row][col] {
475                assert!(
476                    usize::from(idx) < led_count,
477                    "MATRIX_TO_LED contains an LED index that exceeds LED_LAYOUT length"
478                );
479            }
480            col = col.saturating_add(1);
481        }
482        row = row.saturating_add(1);
483    }
484};