aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad K <vkvitnevski@gmail.com>2021-11-01 15:04:37 -0700
committerGitHub <noreply@github.com>2021-11-02 09:04:37 +1100
commita29ca1e7f1a5addfde163b158399684505453fc9 (patch)
tree3a98dc034d034c4a5e8a30b1e744d7793ecbc00b
parent7f8faa429e0c0662cec34a7d60e33ca58333d6d7 (diff)
downloadqmk_firmware-a29ca1e7f1a5addfde163b158399684505453fc9.tar.gz
qmk_firmware-a29ca1e7f1a5addfde163b158399684505453fc9.zip
Add support for ISSI drivers on both sides of a split keyboard (#13842)
* Gets RGB working on a split keyboard with IS31FL3733. Currently needs small tweak to re-enable WS2812 * Added helper function * Trying to integrate the function * Moved functionality into a macro * Swapped conditional for a macro everywhere * Tidying up * More code cleanup * Documentation updates * Fixed formatting via linter * Switching to a function from a macro * Fixed compile error * Fixing WS2812 behavior. UNTESTED. * Updated documentation about the driver addresses. * Fixed code for WS2812 * Trying to add in LED_MATRIX support * Updated effects for LED matrix * Updated third-party effect defines. * Ran format-c on modified files * Apply suggestions from code review Co-authored-by: Ryan <fauxpark@gmail.com> * Move to static inline. Avoids issues with gcc v8+ * Move helper function for LED_matrix to static inline to avoid issues with gcc v8+ Co-authored-by: Vlad Kvitnevskiy <vladkvit@outlook.com> Co-authored-by: Ryan <fauxpark@gmail.com>
-rw-r--r--docs/feature_led_matrix.md7
-rw-r--r--docs/feature_rgb_matrix.md7
-rw-r--r--keyboards/bandominedoni/rgb_matrix_user.inc6
-rw-r--r--keyboards/percent/canoe_gen2/rgb_matrix_kb.inc10
-rw-r--r--keyboards/yushakobo/quick17/rgb_matrix_kb.inc2
-rw-r--r--quantum/led_matrix/animations/alpha_mods_anim.h2
-rw-r--r--quantum/led_matrix/animations/breathing_anim.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_dx_dy.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_i.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_reactive.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h2
-rw-r--r--quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h2
-rw-r--r--quantum/led_matrix/animations/solid_anim.h2
-rw-r--r--quantum/led_matrix/led_matrix.c14
-rw-r--r--quantum/led_matrix/led_matrix.h45
-rw-r--r--quantum/rgb_matrix/animations/alpha_mods_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/breathing_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/gradient_left_right_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/gradient_up_down_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/hue_breathing_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/jellybean_raindrops_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/raindrops_anim.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_i.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_reactive.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h2
-rw-r--r--quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h2
-rw-r--r--quantum/rgb_matrix/animations/solid_color_anim.h2
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c9
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h45
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c8
33 files changed, 127 insertions, 72 deletions
diff --git a/docs/feature_led_matrix.md b/docs/feature_led_matrix.md
index ed92bffd9..d4b20b9aa 100644
--- a/docs/feature_led_matrix.md
+++ b/docs/feature_led_matrix.md
@@ -49,6 +49,8 @@ Here is an example using 2 drivers.
49 49
50!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`. 50!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
51 51
52For split keyboards using `LED_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
53
52Define these arrays listing all the LEDs in your `<keyboard>.c`: 54Define these arrays listing all the LEDs in your `<keyboard>.c`:
53 55
54```c 56```c
@@ -219,7 +221,7 @@ static bool my_cool_effect(effect_params_t* params) {
219 for (uint8_t i = led_min; i < led_max; i++) { 221 for (uint8_t i = led_min; i < led_max; i++) {
220 led_matrix_set_value(i, 0xFF); 222 led_matrix_set_value(i, 0xFF);
221 } 223 }
222 return led_max < DRIVER_LED_TOTAL; 224 return led_matrix_check_finished_leds(led_max);
223} 225}
224 226
225// e.g: A more complex effect, relying on external methods and state, with 227// e.g: A more complex effect, relying on external methods and state, with
@@ -233,8 +235,7 @@ static bool my_cool_effect2_complex_run(effect_params_t* params) {
233 for (uint8_t i = led_min; i < led_max; i++) { 235 for (uint8_t i = led_min; i < led_max; i++) {
234 led_matrix_set_value(i, some_global_state++); 236 led_matrix_set_value(i, some_global_state++);
235 } 237 }
236 238 return led_matrix_check_finished_leds(led_max);
237 return led_max < DRIVER_LED_TOTAL;
238} 239}
239static bool my_cool_effect2(effect_params_t* params) { 240static bool my_cool_effect2(effect_params_t* params) {
240 if (params->init) my_cool_effect2_complex_init(params); 241 if (params->init) my_cool_effect2_complex_init(params);
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 41d0bca37..fa06e46e4 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -49,6 +49,8 @@ Here is an example using 2 drivers.
49 49
50!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`. 50!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
51 51
52For split keyboards using `RGB_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
53
52Define these arrays listing all the LEDs in your `<keyboard>.c`: 54Define these arrays listing all the LEDs in your `<keyboard>.c`:
53 55
54```c 56```c
@@ -540,7 +542,7 @@ static bool my_cool_effect(effect_params_t* params) {
540 for (uint8_t i = led_min; i < led_max; i++) { 542 for (uint8_t i = led_min; i < led_max; i++) {
541 rgb_matrix_set_color(i, 0xff, 0xff, 0x00); 543 rgb_matrix_set_color(i, 0xff, 0xff, 0x00);
542 } 544 }
543 return led_max < DRIVER_LED_TOTAL; 545 return rgb_matrix_check_finished_leds(led_max);
544} 546}
545 547
546// e.g: A more complex effect, relying on external methods and state, with 548// e.g: A more complex effect, relying on external methods and state, with
@@ -554,8 +556,7 @@ static bool my_cool_effect2_complex_run(effect_params_t* params) {
554 for (uint8_t i = led_min; i < led_max; i++) { 556 for (uint8_t i = led_min; i < led_max; i++) {
555 rgb_matrix_set_color(i, 0xff, some_global_state++, 0xff); 557 rgb_matrix_set_color(i, 0xff, some_global_state++, 0xff);
556 } 558 }
557 559 return rgb_matrix_check_finished_leds(led_max);
558 return led_max < DRIVER_LED_TOTAL;
559} 560}
560static bool my_cool_effect2(effect_params_t* params) { 561static bool my_cool_effect2(effect_params_t* params) {
561 if (params->init) my_cool_effect2_complex_init(params); 562 if (params->init) my_cool_effect2_complex_init(params);
diff --git a/keyboards/bandominedoni/rgb_matrix_user.inc b/keyboards/bandominedoni/rgb_matrix_user.inc
index 72f5b4f66..77ad22c1c 100644
--- a/keyboards/bandominedoni/rgb_matrix_user.inc
+++ b/keyboards/bandominedoni/rgb_matrix_user.inc
@@ -9,8 +9,8 @@ bool my_party_rocks(effect_params_t* params) {
9 RGB rgb = rgb_matrix_hsv_to_rgb(hsv); 9 RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
10 // rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 10 // rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
11 rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b); 11 rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
12 return led_max < DRIVER_LED_TOTAL; 12 return rgb_matrix_check_finished_leds(led_max);
13} 13}
14 14
15# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 15# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
16#endif // RGB_MATRIX_KEYREACTIVE_ENABLED 16#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
diff --git a/keyboards/percent/canoe_gen2/rgb_matrix_kb.inc b/keyboards/percent/canoe_gen2/rgb_matrix_kb.inc
index df0a0b15c..94ff62b3a 100644
--- a/keyboards/percent/canoe_gen2/rgb_matrix_kb.inc
+++ b/keyboards/percent/canoe_gen2/rgb_matrix_kb.inc
@@ -25,13 +25,13 @@ static bool indicator_static(effect_params_t* params) {
25 HSV hsv = rgb_matrix_config.hsv; 25 HSV hsv = rgb_matrix_config.hsv;
26 RGB rgb = hsv_to_rgb(hsv); 26 RGB rgb = hsv_to_rgb(hsv);
27 RGB_MATRIX_USE_LIMITS(led_min, led_max); 27 RGB_MATRIX_USE_LIMITS(led_min, led_max);
28 for (uint8_t i = led_min ; i < 74; i++) { 28 for (uint8_t i = led_min; i < 74; i++) {
29 rgb_matrix_set_color(i, 0x00, 0x00, 0x00); 29 rgb_matrix_set_color(i, 0x00, 0x00, 0x00);
30 } 30 }
31 for (uint8_t i = 74 ; i < led_max; i++) { 31 for (uint8_t i = 74; i < led_max; i++) {
32 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 32 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
33 } 33 }
34 return led_max < DRIVER_LED_TOTAL; 34 return rgb_matrix_check_finished_leds(led_max);
35} 35}
36 36
37bool effect_runner_indicator(effect_params_t* params, i_f effect_func) { 37bool effect_runner_indicator(effect_params_t* params, i_f effect_func) {
@@ -47,7 +47,7 @@ bool effect_runner_indicator(effect_params_t* params, i_f effect_func) {
47 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 47 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
48 } 48 }
49 } 49 }
50 return led_max < DRIVER_LED_TOTAL; 50 return rgb_matrix_check_finished_leds(led_max);
51} 51}
52 52
53static HSV indicator_gradient_math(HSV hsv, uint8_t i, uint8_t time) { 53static HSV indicator_gradient_math(HSV hsv, uint8_t i, uint8_t time) {
@@ -64,4 +64,4 @@ static HSV indicator_cycle_all_math(HSV hsv, uint8_t i, uint8_t time) {
64 64
65bool indicator_cycle_all(effect_params_t* params) { return effect_runner_indicator(params, &indicator_cycle_all_math); } 65bool indicator_cycle_all(effect_params_t* params) { return effect_runner_indicator(params, &indicator_cycle_all_math); }
66 66
67#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 67#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/keyboards/yushakobo/quick17/rgb_matrix_kb.inc b/keyboards/yushakobo/quick17/rgb_matrix_kb.inc
index 87738389b..0232b05ab 100644
--- a/keyboards/yushakobo/quick17/rgb_matrix_kb.inc
+++ b/keyboards/yushakobo/quick17/rgb_matrix_kb.inc
@@ -111,7 +111,7 @@ static bool quick17_rgbm_effect (effect_params_t* params) {
111 led_color_set(i, rgb_keymaps[_CONTROL][i]); 111 led_color_set(i, rgb_keymaps[_CONTROL][i]);
112 } 112 }
113 } 113 }
114 return led_max < DRIVER_LED_TOTAL; 114 return rgb_matrix_check_finished_leds(led_max);
115} 115}
116 116
117#endif 117#endif
diff --git a/quantum/led_matrix/animations/alpha_mods_anim.h b/quantum/led_matrix/animations/alpha_mods_anim.h
index 14038cd08..c82b2aa38 100644
--- a/quantum/led_matrix/animations/alpha_mods_anim.h
+++ b/quantum/led_matrix/animations/alpha_mods_anim.h
@@ -17,7 +17,7 @@ bool ALPHAS_MODS(effect_params_t* params) {
17 led_matrix_set_value(i, val1); 17 led_matrix_set_value(i, val1);
18 } 18 }
19 } 19 }
20 return led_max < DRIVER_LED_TOTAL; 20 return led_matrix_check_finished_leds(led_max);
21} 21}
22 22
23# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS 23# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/led_matrix/animations/breathing_anim.h b/quantum/led_matrix/animations/breathing_anim.h
index e3f600c45..d9cc2de23 100644
--- a/quantum/led_matrix/animations/breathing_anim.h
+++ b/quantum/led_matrix/animations/breathing_anim.h
@@ -12,7 +12,7 @@ bool BREATHING(effect_params_t* params) {
12 LED_MATRIX_TEST_LED_FLAGS(); 12 LED_MATRIX_TEST_LED_FLAGS();
13 led_matrix_set_value(i, val); 13 led_matrix_set_value(i, val);
14 } 14 }
15 return led_max < DRIVER_LED_TOTAL; 15 return led_matrix_check_finished_leds(led_max);
16} 16}
17 17
18# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS 18# endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h b/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h
index ef97631b9..fa9b7dbbf 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_dx_dy.h
@@ -12,5 +12,5 @@ bool effect_runner_dx_dy(effect_params_t* params, dx_dy_f effect_func) {
12 int16_t dy = g_led_config.point[i].y - k_led_matrix_center.y; 12 int16_t dy = g_led_config.point[i].y - k_led_matrix_center.y;
13 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, dx, dy, time)); 13 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, dx, dy, time));
14 } 14 }
15 return led_max < DRIVER_LED_TOTAL; 15 return led_matrix_check_finished_leds(led_max);
16} 16}
diff --git a/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h b/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h
index 5ef5938be..061a5f07f 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_dx_dy_dist.h
@@ -13,5 +13,5 @@ bool effect_runner_dx_dy_dist(effect_params_t* params, dx_dy_dist_f effect_func)
13 uint8_t dist = sqrt16(dx * dx + dy * dy); 13 uint8_t dist = sqrt16(dx * dx + dy * dy);
14 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, dx, dy, dist, time)); 14 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, dx, dy, dist, time));
15 } 15 }
16 return led_max < DRIVER_LED_TOTAL; 16 return led_matrix_check_finished_leds(led_max);
17} 17}
diff --git a/quantum/led_matrix/animations/runners/effect_runner_i.h b/quantum/led_matrix/animations/runners/effect_runner_i.h
index b3015759b..f6f8c0dee 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_i.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_i.h
@@ -10,5 +10,5 @@ bool effect_runner_i(effect_params_t* params, i_f effect_func) {
10 LED_MATRIX_TEST_LED_FLAGS(); 10 LED_MATRIX_TEST_LED_FLAGS();
11 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, i, time)); 11 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, i, time));
12 } 12 }
13 return led_max < DRIVER_LED_TOTAL; 13 return led_matrix_check_finished_leds(led_max);
14} 14}
diff --git a/quantum/led_matrix/animations/runners/effect_runner_reactive.h b/quantum/led_matrix/animations/runners/effect_runner_reactive.h
index 4369ea8c4..be3090aa5 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_reactive.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_reactive.h
@@ -22,7 +22,7 @@ bool effect_runner_reactive(effect_params_t* params, reactive_f effect_func) {
22 uint16_t offset = scale16by8(tick, led_matrix_eeconfig.speed); 22 uint16_t offset = scale16by8(tick, led_matrix_eeconfig.speed);
23 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, offset)); 23 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, offset));
24 } 24 }
25 return led_max < DRIVER_LED_TOTAL; 25 return led_matrix_check_finished_leds(led_max);
26} 26}
27 27
28#endif // LED_MATRIX_KEYREACTIVE_ENABLED 28#endif // LED_MATRIX_KEYREACTIVE_ENABLED
diff --git a/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h b/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h
index d6eb9731e..f6ffc825a 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_reactive_splash.h
@@ -20,7 +20,7 @@ bool effect_runner_reactive_splash(uint8_t start, effect_params_t* params, react
20 } 20 }
21 led_matrix_set_value(i, scale8(val, led_matrix_eeconfig.val)); 21 led_matrix_set_value(i, scale8(val, led_matrix_eeconfig.val));
22 } 22 }
23 return led_max < DRIVER_LED_TOTAL; 23 return led_matrix_check_finished_leds(led_max);
24} 24}
25 25
26#endif // LED_MATRIX_KEYREACTIVE_ENABLED 26#endif // LED_MATRIX_KEYREACTIVE_ENABLED
diff --git a/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h b/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h
index 4a5219abd..3145e2713 100644
--- a/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h
+++ b/quantum/led_matrix/animations/runners/effect_runner_sin_cos_i.h
@@ -12,5 +12,5 @@ bool effect_runner_sin_cos_i(effect_params_t* params, sin_cos_i_f effect_func) {
12 LED_MATRIX_TEST_LED_FLAGS(); 12 LED_MATRIX_TEST_LED_FLAGS();
13 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, cos_value, sin_value, i, time)); 13 led_matrix_set_value(i, effect_func(led_matrix_eeconfig.val, cos_value, sin_value, i, time));
14 } 14 }
15 return led_max < DRIVER_LED_TOTAL; 15 return led_matrix_check_finished_leds(led_max);
16} 16}
diff --git a/quantum/led_matrix/animations/solid_anim.h b/quantum/led_matrix/animations/solid_anim.h
index 4c9e43c58..c728dbcc9 100644
--- a/quantum/led_matrix/animations/solid_anim.h
+++ b/quantum/led_matrix/animations/solid_anim.h
@@ -9,7 +9,7 @@ bool SOLID(effect_params_t* params) {
9 LED_MATRIX_TEST_LED_FLAGS(); 9 LED_MATRIX_TEST_LED_FLAGS();
10 led_matrix_set_value(i, val); 10 led_matrix_set_value(i, val);
11 } 11 }
12 return led_max < DRIVER_LED_TOTAL; 12 return led_matrix_check_finished_leds(led_max);
13} 13}
14 14
15#endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS 15#endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c
index 85556d157..8d6a56f27 100644
--- a/quantum/led_matrix/led_matrix.c
+++ b/quantum/led_matrix/led_matrix.c
@@ -156,20 +156,10 @@ uint8_t led_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *l
156void led_matrix_update_pwm_buffers(void) { led_matrix_driver.flush(); } 156void led_matrix_update_pwm_buffers(void) { led_matrix_driver.flush(); }
157 157
158void led_matrix_set_value(int index, uint8_t value) { 158void led_matrix_set_value(int index, uint8_t value) {
159#if defined(LED_MATRIX_ENABLE) && defined(LED_MATRIX_SPLIT)
160 if (!is_keyboard_left() && index >= k_led_matrix_split[0])
161# ifdef USE_CIE1931_CURVE
162 led_matrix_driver.set_value(index - k_led_matrix_split[0], pgm_read_byte(&CIE1931_CURVE[value]));
163# else
164 led_matrix_driver.set_value(index - k_led_matrix_split[0], value);
165# endif
166 else if (is_keyboard_left() && index < k_led_matrix_split[0])
167#endif
168#ifdef USE_CIE1931_CURVE 159#ifdef USE_CIE1931_CURVE
169 led_matrix_driver.set_value(index, pgm_read_byte(&CIE1931_CURVE[value])); 160 value = pgm_read_byte(&CIE1931_CURVE[value]);
170#else
171 led_matrix_driver.set_value(index, value);
172#endif 161#endif
162 led_matrix_driver.set_value(index, value);
173} 163}
174 164
175void led_matrix_set_value_all(uint8_t value) { 165void led_matrix_set_value_all(uint8_t value) {
diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h
index a7a1c983f..f540be44c 100644
--- a/quantum/led_matrix/led_matrix.h
+++ b/quantum/led_matrix/led_matrix.h
@@ -38,14 +38,33 @@
38#endif 38#endif
39 39
40#if defined(LED_MATRIX_LED_PROCESS_LIMIT) && LED_MATRIX_LED_PROCESS_LIMIT > 0 && LED_MATRIX_LED_PROCESS_LIMIT < DRIVER_LED_TOTAL 40#if defined(LED_MATRIX_LED_PROCESS_LIMIT) && LED_MATRIX_LED_PROCESS_LIMIT > 0 && LED_MATRIX_LED_PROCESS_LIMIT < DRIVER_LED_TOTAL
41# define LED_MATRIX_USE_LIMITS(min, max) \ 41# if defined(LED_MATRIX_SPLIT)
42 uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * params->iter; \ 42# define LED_MATRIX_USE_LIMITS(min, max)
43 uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT; \ 43uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * params->iter;
44 if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL; 44uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT;
45if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL;
46uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
47if (is_keyboard_left() && (max > k_led_matrix_split[0])) max = k_led_matrix_split[0];
48if (!(is_keyboard_left()) && (min < k_led_matrix_split[0])) min = k_led_matrix_split[0];
49# else
50# define LED_MATRIX_USE_LIMITS(min, max) \
51 uint8_t min = LED_MATRIX_LED_PROCESS_LIMIT * params->iter; \
52 uint8_t max = min + LED_MATRIX_LED_PROCESS_LIMIT; \
53 if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL;
54# endif
45#else 55#else
46# define LED_MATRIX_USE_LIMITS(min, max) \ 56# if defined(LED_MATRIX_SPLIT)
47 uint8_t min = 0; \ 57# define LED_MATRIX_USE_LIMITS(min, max) \
48 uint8_t max = DRIVER_LED_TOTAL; 58 uint8_t min = 0; \
59 uint8_t max = DRIVER_LED_TOTAL; \
60 const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT; \
61 if (is_keyboard_left() && (max > k_led_matrix_split[0])) max = k_led_matrix_split[0]; \
62 if (!(is_keyboard_left()) && (min < k_led_matrix_split[0])) min = k_led_matrix_split[0];
63# else
64# define LED_MATRIX_USE_LIMITS(min, max) \
65 uint8_t min = 0; \
66 uint8_t max = DRIVER_LED_TOTAL;
67# endif
49#endif 68#endif
50 69
51#define LED_MATRIX_TEST_LED_FLAGS() \ 70#define LED_MATRIX_TEST_LED_FLAGS() \
@@ -147,6 +166,18 @@ typedef struct {
147 void (*flush)(void); 166 void (*flush)(void);
148} led_matrix_driver_t; 167} led_matrix_driver_t;
149 168
169static inline bool led_matrix_check_finished_leds(uint8_t led_idx) {
170#if defined(LED_MATRIX_SPLIT)
171 if (is_keyboard_left()) {
172 uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
173 return led_idx < k_led_matrix_split[0];
174 } else
175 return led_idx < DRIVER_LED_TOTAL;
176#else
177 return led_idx < DRIVER_LED_TOTAL;
178#endif
179}
180
150extern const led_matrix_driver_t led_matrix_driver; 181extern const led_matrix_driver_t led_matrix_driver;
151 182
152extern led_eeconfig_t led_matrix_eeconfig; 183extern led_eeconfig_t led_matrix_eeconfig;
diff --git a/quantum/rgb_matrix/animations/alpha_mods_anim.h b/quantum/rgb_matrix/animations/alpha_mods_anim.h
index 3f2c9b799..b8f507268 100644
--- a/quantum/rgb_matrix/animations/alpha_mods_anim.h
+++ b/quantum/rgb_matrix/animations/alpha_mods_anim.h
@@ -19,7 +19,7 @@ bool ALPHAS_MODS(effect_params_t* params) {
19 rgb_matrix_set_color(i, rgb1.r, rgb1.g, rgb1.b); 19 rgb_matrix_set_color(i, rgb1.r, rgb1.g, rgb1.b);
20 } 20 }
21 } 21 }
22 return led_max < DRIVER_LED_TOTAL; 22 return rgb_matrix_check_finished_leds(led_max);
23} 23}
24 24
25# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 25# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/breathing_anim.h b/quantum/rgb_matrix/animations/breathing_anim.h
index a00ccb83a..baac51ed1 100644
--- a/quantum/rgb_matrix/animations/breathing_anim.h
+++ b/quantum/rgb_matrix/animations/breathing_anim.h
@@ -13,7 +13,7 @@ bool BREATHING(effect_params_t* params) {
13 RGB_MATRIX_TEST_LED_FLAGS(); 13 RGB_MATRIX_TEST_LED_FLAGS();
14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
15 } 15 }
16 return led_max < DRIVER_LED_TOTAL; 16 return rgb_matrix_check_finished_leds(led_max);
17} 17}
18 18
19# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 19# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/gradient_left_right_anim.h b/quantum/rgb_matrix/animations/gradient_left_right_anim.h
index b4f2752ff..8b13d4e48 100644
--- a/quantum/rgb_matrix/animations/gradient_left_right_anim.h
+++ b/quantum/rgb_matrix/animations/gradient_left_right_anim.h
@@ -15,7 +15,7 @@ bool GRADIENT_LEFT_RIGHT(effect_params_t* params) {
15 RGB rgb = rgb_matrix_hsv_to_rgb(hsv); 15 RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
17 } 17 }
18 return led_max < DRIVER_LED_TOTAL; 18 return rgb_matrix_check_finished_leds(led_max);
19} 19}
20 20
21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/gradient_up_down_anim.h b/quantum/rgb_matrix/animations/gradient_up_down_anim.h
index 3fd45cf99..7431ddcd9 100644
--- a/quantum/rgb_matrix/animations/gradient_up_down_anim.h
+++ b/quantum/rgb_matrix/animations/gradient_up_down_anim.h
@@ -15,7 +15,7 @@ bool GRADIENT_UP_DOWN(effect_params_t* params) {
15 RGB rgb = rgb_matrix_hsv_to_rgb(hsv); 15 RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
17 } 17 }
18 return led_max < DRIVER_LED_TOTAL; 18 return rgb_matrix_check_finished_leds(led_max);
19} 19}
20 20
21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/hue_breathing_anim.h b/quantum/rgb_matrix/animations/hue_breathing_anim.h
index 6d974b8c3..82be1a442 100644
--- a/quantum/rgb_matrix/animations/hue_breathing_anim.h
+++ b/quantum/rgb_matrix/animations/hue_breathing_anim.h
@@ -15,7 +15,7 @@ bool HUE_BREATHING(effect_params_t* params) {
15 RGB_MATRIX_TEST_LED_FLAGS(); 15 RGB_MATRIX_TEST_LED_FLAGS();
16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 16 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
17 } 17 }
18 return led_max < DRIVER_LED_TOTAL; 18 return rgb_matrix_check_finished_leds(led_max);
19} 19}
20 20
21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 21# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h b/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h
index 7d8eafffb..d639ba9b6 100644
--- a/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h
+++ b/quantum/rgb_matrix/animations/jellybean_raindrops_anim.h
@@ -22,7 +22,7 @@ bool JELLYBEAN_RAINDROPS(effect_params_t* params) {
22 for (int i = led_min; i < led_max; i++) { 22 for (int i = led_min; i < led_max; i++) {
23 jellybean_raindrops_set_color(i, params); 23 jellybean_raindrops_set_color(i, params);
24 } 24 }
25 return led_max < DRIVER_LED_TOTAL; 25 return rgb_matrix_check_finished_leds(led_max);
26} 26}
27 27
28# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 28# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/raindrops_anim.h b/quantum/rgb_matrix/animations/raindrops_anim.h
index c01688e2c..fa61f9e0b 100644
--- a/quantum/rgb_matrix/animations/raindrops_anim.h
+++ b/quantum/rgb_matrix/animations/raindrops_anim.h
@@ -32,7 +32,7 @@ bool RAINDROPS(effect_params_t* params) {
32 for (int i = led_min; i < led_max; i++) { 32 for (int i = led_min; i < led_max; i++) {
33 raindrops_set_color(i, params); 33 raindrops_set_color(i, params);
34 } 34 }
35 return led_max < DRIVER_LED_TOTAL; 35 return rgb_matrix_check_finished_leds(led_max);
36} 36}
37 37
38# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 38# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h
index 4867609c8..2ad0f22c2 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy.h
@@ -13,5 +13,5 @@ bool effect_runner_dx_dy(effect_params_t* params, dx_dy_f effect_func) {
13 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, dx, dy, time)); 13 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, dx, dy, time));
14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
15 } 15 }
16 return led_max < DRIVER_LED_TOTAL; 16 return rgb_matrix_check_finished_leds(led_max);
17} 17}
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h
index 9545b418d..bcae7c79b 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_dx_dy_dist.h
@@ -14,5 +14,5 @@ bool effect_runner_dx_dy_dist(effect_params_t* params, dx_dy_dist_f effect_func)
14 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, dx, dy, dist, time)); 14 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, dx, dy, dist, time));
15 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 15 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
16 } 16 }
17 return led_max < DRIVER_LED_TOTAL; 17 return rgb_matrix_check_finished_leds(led_max);
18} 18}
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_i.h b/quantum/rgb_matrix/animations/runners/effect_runner_i.h
index 1881cd6c6..b4de2992b 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_i.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_i.h
@@ -11,5 +11,5 @@ bool effect_runner_i(effect_params_t* params, i_f effect_func) {
11 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, i, time)); 11 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, i, time));
12 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 12 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
13 } 13 }
14 return led_max < DRIVER_LED_TOTAL; 14 return rgb_matrix_check_finished_leds(led_max);
15} 15}
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h b/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h
index 75b7c0df4..d5c1a26ce 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_reactive.h
@@ -23,7 +23,7 @@ bool effect_runner_reactive(effect_params_t* params, reactive_f effect_func) {
23 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, offset)); 23 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, offset));
24 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 24 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
25 } 25 }
26 return led_max < DRIVER_LED_TOTAL; 26 return rgb_matrix_check_finished_leds(led_max);
27} 27}
28 28
29#endif // RGB_MATRIX_KEYREACTIVE_ENABLED 29#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h b/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h
index 2e46ffb35..d3a6e4e72 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_reactive_splash.h
@@ -23,7 +23,7 @@ bool effect_runner_reactive_splash(uint8_t start, effect_params_t* params, react
23 RGB rgb = rgb_matrix_hsv_to_rgb(hsv); 23 RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
24 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 24 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
25 } 25 }
26 return led_max < DRIVER_LED_TOTAL; 26 return rgb_matrix_check_finished_leds(led_max);
27} 27}
28 28
29#endif // RGB_MATRIX_KEYREACTIVE_ENABLED 29#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
diff --git a/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h b/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h
index 02351de51..7776491d5 100644
--- a/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h
+++ b/quantum/rgb_matrix/animations/runners/effect_runner_sin_cos_i.h
@@ -13,5 +13,5 @@ bool effect_runner_sin_cos_i(effect_params_t* params, sin_cos_i_f effect_func) {
13 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, cos_value, sin_value, i, time)); 13 RGB rgb = rgb_matrix_hsv_to_rgb(effect_func(rgb_matrix_config.hsv, cos_value, sin_value, i, time));
14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 14 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
15 } 15 }
16 return led_max < DRIVER_LED_TOTAL; 16 return rgb_matrix_check_finished_leds(led_max);
17} 17}
diff --git a/quantum/rgb_matrix/animations/solid_color_anim.h b/quantum/rgb_matrix/animations/solid_color_anim.h
index 79d63cf13..420995946 100644
--- a/quantum/rgb_matrix/animations/solid_color_anim.h
+++ b/quantum/rgb_matrix/animations/solid_color_anim.h
@@ -9,7 +9,7 @@ bool SOLID_COLOR(effect_params_t* params) {
9 RGB_MATRIX_TEST_LED_FLAGS(); 9 RGB_MATRIX_TEST_LED_FLAGS();
10 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 10 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
11 } 11 }
12 return led_max < DRIVER_LED_TOTAL; 12 return rgb_matrix_check_finished_leds(led_max);
13} 13}
14 14
15#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS 15#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c
index c260b6e1e..558c7bd41 100644
--- a/quantum/rgb_matrix/rgb_matrix.c
+++ b/quantum/rgb_matrix/rgb_matrix.c
@@ -178,14 +178,7 @@ uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *l
178 178
179void rgb_matrix_update_pwm_buffers(void) { rgb_matrix_driver.flush(); } 179void rgb_matrix_update_pwm_buffers(void) { rgb_matrix_driver.flush(); }
180 180
181void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { 181void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { rgb_matrix_driver.set_color(index, red, green, blue); }
182#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
183 if (!is_keyboard_left() && index >= k_rgb_matrix_split[0])
184 rgb_matrix_driver.set_color(index - k_rgb_matrix_split[0], red, green, blue);
185 else if (is_keyboard_left() && index < k_rgb_matrix_split[0])
186#endif
187 rgb_matrix_driver.set_color(index, red, green, blue);
188}
189 182
190void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { 183void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
191#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) 184#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h
index f53e011c1..112dfaaae 100644
--- a/quantum/rgb_matrix/rgb_matrix.h
+++ b/quantum/rgb_matrix/rgb_matrix.h
@@ -48,14 +48,33 @@
48#endif 48#endif
49 49
50#if defined(RGB_MATRIX_LED_PROCESS_LIMIT) && RGB_MATRIX_LED_PROCESS_LIMIT > 0 && RGB_MATRIX_LED_PROCESS_LIMIT < DRIVER_LED_TOTAL 50#if defined(RGB_MATRIX_LED_PROCESS_LIMIT) && RGB_MATRIX_LED_PROCESS_LIMIT > 0 && RGB_MATRIX_LED_PROCESS_LIMIT < DRIVER_LED_TOTAL
51# define RGB_MATRIX_USE_LIMITS(min, max) \ 51# if defined(RGB_MATRIX_SPLIT)
52 uint8_t min = RGB_MATRIX_LED_PROCESS_LIMIT * params->iter; \ 52# define RGB_MATRIX_USE_LIMITS(min, max) \
53 uint8_t max = min + RGB_MATRIX_LED_PROCESS_LIMIT; \ 53 uint8_t min = RGB_MATRIX_LED_PROCESS_LIMIT * params->iter; \
54 if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL; 54 uint8_t max = min + RGB_MATRIX_LED_PROCESS_LIMIT; \
55 if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL; \
56 uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; \
57 if (is_keyboard_left() && (max > k_rgb_matrix_split[0])) max = k_rgb_matrix_split[0]; \
58 if (!(is_keyboard_left()) && (min < k_rgb_matrix_split[0])) min = k_rgb_matrix_split[0];
59# else
60# define RGB_MATRIX_USE_LIMITS(min, max) \
61 uint8_t min = RGB_MATRIX_LED_PROCESS_LIMIT * params->iter; \
62 uint8_t max = min + RGB_MATRIX_LED_PROCESS_LIMIT; \
63 if (max > DRIVER_LED_TOTAL) max = DRIVER_LED_TOTAL;
64# endif
55#else 65#else
56# define RGB_MATRIX_USE_LIMITS(min, max) \ 66# if defined(RGB_MATRIX_SPLIT)
57 uint8_t min = 0; \ 67# define RGB_MATRIX_USE_LIMITS(min, max) \
58 uint8_t max = DRIVER_LED_TOTAL; 68 uint8_t min = 0; \
69 uint8_t max = DRIVER_LED_TOTAL; \
70 const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; \
71 if (is_keyboard_left() && (max > k_rgb_matrix_split[0])) max = k_rgb_matrix_split[0]; \
72 if (!(is_keyboard_left()) && (min < k_rgb_matrix_split[0])) min = k_rgb_matrix_split[0];
73# else
74# define RGB_MATRIX_USE_LIMITS(min, max) \
75 uint8_t min = 0; \
76 uint8_t max = DRIVER_LED_TOTAL;
77# endif
59#endif 78#endif
60 79
61#define RGB_MATRIX_INDICATOR_SET_COLOR(i, r, g, b) \ 80#define RGB_MATRIX_INDICATOR_SET_COLOR(i, r, g, b) \
@@ -214,6 +233,18 @@ typedef struct {
214 void (*flush)(void); 233 void (*flush)(void);
215} rgb_matrix_driver_t; 234} rgb_matrix_driver_t;
216 235
236static inline bool rgb_matrix_check_finished_leds(uint8_t led_idx) {
237#if defined(RGB_MATRIX_SPLIT)
238 if (is_keyboard_left()) {
239 uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
240 return led_idx < k_rgb_matrix_split[0];
241 } else
242 return led_idx < DRIVER_LED_TOTAL;
243#else
244 return led_idx < DRIVER_LED_TOTAL;
245#endif
246}
247
217extern const rgb_matrix_driver_t rgb_matrix_driver; 248extern const rgb_matrix_driver_t rgb_matrix_driver;
218 249
219extern rgb_config_t rgb_matrix_config; 250extern rgb_config_t rgb_matrix_config;
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c
index 4335088eb..949cc3661 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.c
@@ -250,6 +250,14 @@ static void flush(void) {
250 250
251// Set an led in the buffer to a color 251// Set an led in the buffer to a color
252static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) { 252static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
253# if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
254 const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
255 if (!is_keyboard_left() && (i >= k_rgb_matrix_split[0])) {
256 i -= k_rgb_matrix_split[0];
257 } else if (is_keyboard_left() && (i >= k_rgb_matrix_split[0]))
258 return;
259# endif
260
253 rgb_matrix_ws2812_array[i].r = r; 261 rgb_matrix_ws2812_array[i].r = r;
254 rgb_matrix_ws2812_array[i].g = g; 262 rgb_matrix_ws2812_array[i].g = g;
255 rgb_matrix_ws2812_array[i].b = b; 263 rgb_matrix_ws2812_array[i].b = b;