aboutsummaryrefslogtreecommitdiff
path: root/quantum
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 /quantum
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>
Diffstat (limited to 'quantum')
-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
28 files changed, 110 insertions, 57 deletions
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;