Skip to content

Commit f293658

Browse files
authored
RGB/LED matrix use limits size optimisation (#22325)
1 parent 896d3dc commit f293658

File tree

4 files changed

+89
-66
lines changed

4 files changed

+89
-66
lines changed

quantum/led_matrix/led_matrix.c

+31-8
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,7 @@ void led_matrix_indicators_advanced(effect_params_t *params) {
375375
* and not sure which would be better. Otherwise, this should be called from
376376
* led_task_render, right before the iter++ line.
377377
*/
378-
#if defined(LED_MATRIX_LED_PROCESS_LIMIT) && LED_MATRIX_LED_PROCESS_LIMIT > 0 && LED_MATRIX_LED_PROCESS_LIMIT < LED_MATRIX_LED_COUNT
379-
uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * (params->iter - 1);
380-
uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT;
381-
if (max > LED_MATRIX_LED_COUNT) max = LED_MATRIX_LED_COUNT;
382-
#else
383-
uint8_t min = 0;
384-
uint8_t max = LED_MATRIX_LED_COUNT;
385-
#endif
378+
LED_MATRIX_USE_LIMITS_ITER(min, max, params->iter - 1);
386379
led_matrix_indicators_advanced_kb(min, max);
387380
}
388381

@@ -394,6 +387,36 @@ __attribute__((weak)) bool led_matrix_indicators_advanced_user(uint8_t led_min,
394387
return true;
395388
}
396389

390+
struct led_matrix_limits_t led_matrix_get_limits(uint8_t iter) {
391+
struct led_matrix_limits_t limits = {0};
392+
#if defined(LED_MATRIX_LED_PROCESS_LIMIT) && LED_MATRIX_LED_PROCESS_LIMIT > 0 && LED_MATRIX_LED_PROCESS_LIMIT < LED_MATRIX_LED_COUNT
393+
# if defined(LED_MATRIX_SPLIT)
394+
limits.led_min_index = LED_MATRIX_LED_PROCESS_LIMIT * (iter);
395+
limits.led_max_index = limits.led_min_index + LED_MATRIX_LED_PROCESS_LIMIT;
396+
if (limits.led_max_index > LED_MATRIX_LED_COUNT) limits.led_max_index = LED_MATRIX_LED_COUNT;
397+
uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
398+
if (is_keyboard_left() && (limits.led_max_index > k_led_matrix_split[0])) limits.led_max_index = k_led_matrix_split[0];
399+
if (!(is_keyboard_left()) && (limits.led_min_index < k_led_matrix_split[0])) limits.led_min_index = k_led_matrix_split[0];
400+
# else
401+
limits.led_min_index = LED_MATRIX_LED_PROCESS_LIMIT * (iter);
402+
limits.led_max_index = limits.led_min_index + LED_MATRIX_LED_PROCESS_LIMIT;
403+
if (limits.led_max_index > LED_MATRIX_LED_COUNT) limits.led_max_index = LED_MATRIX_LED_COUNT;
404+
# endif
405+
#else
406+
# if defined(LED_MATRIX_SPLIT)
407+
limits.led_min_index = 0;
408+
limits.led_max_index = LED_MATRIX_LED_COUNT;
409+
const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
410+
if (is_keyboard_left() && (limits.led_max_index > k_led_matrix_split[0])) limits.led_max_index = k_led_matrix_split[0];
411+
if (!(is_keyboard_left()) && (limits.led_min_index < k_led_matrix_split[0])) limits.led_min_index = k_led_matrix_split[0];
412+
# else
413+
limits.led_min_index = 0;
414+
limits.led_max_index = LED_MATRIX_LED_COUNT;
415+
# endif
416+
#endif
417+
return limits;
418+
}
419+
397420
void led_matrix_init(void) {
398421
led_matrix_driver.init();
399422

quantum/led_matrix/led_matrix.h

+15-29
Original file line numberDiff line numberDiff line change
@@ -89,35 +89,21 @@
8989
# define LED_MATRIX_LED_PROCESS_LIMIT ((LED_MATRIX_LED_COUNT + 4) / 5)
9090
#endif
9191

92-
#if defined(LED_MATRIX_LED_PROCESS_LIMIT) && LED_MATRIX_LED_PROCESS_LIMIT > 0 && LED_MATRIX_LED_PROCESS_LIMIT < LED_MATRIX_LED_COUNT
93-
# if defined(LED_MATRIX_SPLIT)
94-
# define LED_MATRIX_USE_LIMITS(min, max) \
95-
uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * params->iter; \
96-
uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT; \
97-
if (max > LED_MATRIX_LED_COUNT) max = LED_MATRIX_LED_COUNT; \
98-
uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT; \
99-
if (is_keyboard_left() && (max > k_led_matrix_split[0])) max = k_led_matrix_split[0]; \
100-
if (!(is_keyboard_left()) && (min < k_led_matrix_split[0])) min = k_led_matrix_split[0];
101-
# else
102-
# define LED_MATRIX_USE_LIMITS(min, max) \
103-
uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * params->iter; \
104-
uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT; \
105-
if (max > LED_MATRIX_LED_COUNT) max = LED_MATRIX_LED_COUNT;
106-
# endif
107-
#else
108-
# if defined(LED_MATRIX_SPLIT)
109-
# define LED_MATRIX_USE_LIMITS(min, max) \
110-
uint8_t min = 0; \
111-
uint8_t max = LED_MATRIX_LED_COUNT; \
112-
const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT; \
113-
if (is_keyboard_left() && (max > k_led_matrix_split[0])) max = k_led_matrix_split[0]; \
114-
if (!(is_keyboard_left()) && (min < k_led_matrix_split[0])) min = k_led_matrix_split[0];
115-
# else
116-
# define LED_MATRIX_USE_LIMITS(min, max) \
117-
uint8_t min = 0; \
118-
uint8_t max = LED_MATRIX_LED_COUNT;
119-
# endif
120-
#endif
92+
struct led_matrix_limits_t {
93+
uint8_t led_min_index;
94+
uint8_t led_max_index;
95+
};
96+
97+
struct led_matrix_limits_t led_matrix_get_limits(uint8_t iter);
98+
99+
#define LED_MATRIX_USE_LIMITS_ITER(min, max, iter) \
100+
struct led_matrix_limits_t limits = led_matrix_get_limits(iter); \
101+
uint8_t min = limits.led_min_index; \
102+
uint8_t max = limits.led_max_index; \
103+
(void)min; \
104+
(void)max;
105+
106+
#define LED_MATRIX_USE_LIMITS(min, max) LED_MATRIX_USE_LIMITS_ITER(min, max, params->iter)
121107

122108
#define LED_MATRIX_TEST_LED_FLAGS() \
123109
if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) continue

quantum/rgb_matrix/rgb_matrix.c

+30
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,36 @@ __attribute__((weak)) bool rgb_matrix_indicators_user(void) {
410410
return true;
411411
}
412412

413+
struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter) {
414+
struct rgb_matrix_limits_t limits = {0};
415+
#if defined(RGB_MATRIX_LED_PROCESS_LIMIT) && RGB_MATRIX_LED_PROCESS_LIMIT > 0 && RGB_MATRIX_LED_PROCESS_LIMIT < RGB_MATRIX_LED_COUNT
416+
# if defined(RGB_MATRIX_SPLIT)
417+
limits.led_min_index = RGB_MATRIX_LED_PROCESS_LIMIT * (iter);
418+
limits.led_max_index = limits.led_min_index + RGB_MATRIX_LED_PROCESS_LIMIT;
419+
if (limits.led_max_index > RGB_MATRIX_LED_COUNT) limits.led_max_index = RGB_MATRIX_LED_COUNT;
420+
uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
421+
if (is_keyboard_left() && (limits.led_max_index > k_rgb_matrix_split[0])) limits.led_max_index = k_rgb_matrix_split[0];
422+
if (!(is_keyboard_left()) && (limits.led_min_index < k_rgb_matrix_split[0])) limits.led_min_index = k_rgb_matrix_split[0];
423+
# else
424+
limits.led_min_index = RGB_MATRIX_LED_PROCESS_LIMIT * (iter);
425+
limits.led_max_index = limits.led_min_index + RGB_MATRIX_LED_PROCESS_LIMIT;
426+
if (limits.led_max_index > RGB_MATRIX_LED_COUNT) limits.led_max_index = RGB_MATRIX_LED_COUNT;
427+
# endif
428+
#else
429+
# if defined(RGB_MATRIX_SPLIT)
430+
limits.led_min_index = 0;
431+
limits.led_max_index = RGB_MATRIX_LED_COUNT;
432+
const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
433+
if (is_keyboard_left() && (limits.led_max_index > k_rgb_matrix_split[0])) limits.led_max_index = k_rgb_matrix_split[0];
434+
if (!(is_keyboard_left()) && (limits.led_min_index < k_rgb_matrix_split[0])) limits.led_min_index = k_rgb_matrix_split[0];
435+
# else
436+
limits.led_min_index = 0;
437+
limits.led_max_index = RGB_MATRIX_LED_COUNT;
438+
# endif
439+
#endif
440+
return limits;
441+
}
442+
413443
void rgb_matrix_indicators_advanced(effect_params_t *params) {
414444
/* special handling is needed for "params->iter", since it's already been incremented.
415445
* Could move the invocations to rgb_task_render, but then it's missing a few checks

quantum/rgb_matrix/rgb_matrix.h

+13-29
Original file line numberDiff line numberDiff line change
@@ -107,35 +107,19 @@
107107
# define RGB_MATRIX_LED_PROCESS_LIMIT ((RGB_MATRIX_LED_COUNT + 4) / 5)
108108
#endif
109109

110-
#if defined(RGB_MATRIX_LED_PROCESS_LIMIT) && RGB_MATRIX_LED_PROCESS_LIMIT > 0 && RGB_MATRIX_LED_PROCESS_LIMIT < RGB_MATRIX_LED_COUNT
111-
# if defined(RGB_MATRIX_SPLIT)
112-
# define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \
113-
uint8_t min = RGB_MATRIX_LED_PROCESS_LIMIT * (iter); \
114-
uint8_t max = min + RGB_MATRIX_LED_PROCESS_LIMIT; \
115-
if (max > RGB_MATRIX_LED_COUNT) max = RGB_MATRIX_LED_COUNT; \
116-
uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; \
117-
if (is_keyboard_left() && (max > k_rgb_matrix_split[0])) max = k_rgb_matrix_split[0]; \
118-
if (!(is_keyboard_left()) && (min < k_rgb_matrix_split[0])) min = k_rgb_matrix_split[0];
119-
# else
120-
# define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \
121-
uint8_t min = RGB_MATRIX_LED_PROCESS_LIMIT * (iter); \
122-
uint8_t max = min + RGB_MATRIX_LED_PROCESS_LIMIT; \
123-
if (max > RGB_MATRIX_LED_COUNT) max = RGB_MATRIX_LED_COUNT;
124-
# endif
125-
#else
126-
# if defined(RGB_MATRIX_SPLIT)
127-
# define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \
128-
uint8_t min = 0; \
129-
uint8_t max = RGB_MATRIX_LED_COUNT; \
130-
const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; \
131-
if (is_keyboard_left() && (max > k_rgb_matrix_split[0])) max = k_rgb_matrix_split[0]; \
132-
if (!(is_keyboard_left()) && (min < k_rgb_matrix_split[0])) min = k_rgb_matrix_split[0];
133-
# else
134-
# define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \
135-
uint8_t min = 0; \
136-
uint8_t max = RGB_MATRIX_LED_COUNT;
137-
# endif
138-
#endif
110+
struct rgb_matrix_limits_t {
111+
uint8_t led_min_index;
112+
uint8_t led_max_index;
113+
};
114+
115+
struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter);
116+
117+
#define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \
118+
struct rgb_matrix_limits_t limits = rgb_matrix_get_limits(iter); \
119+
uint8_t min = limits.led_min_index; \
120+
uint8_t max = limits.led_max_index; \
121+
(void)min; \
122+
(void)max;
139123

140124
#define RGB_MATRIX_USE_LIMITS(min, max) RGB_MATRIX_USE_LIMITS_ITER(min, max, params->iter)
141125

0 commit comments

Comments
 (0)