diff options
-rw-r--r-- | common_features.mk | 8 | ||||
-rw-r--r-- | docs/feature_rgb_matrix.md | 57 | ||||
-rw-r--r-- | quantum/rgb_matrix.c | 43 | ||||
-rw-r--r-- | quantum/rgb_matrix.h | 12 |
4 files changed, 107 insertions, 13 deletions
diff --git a/common_features.mk b/common_features.mk index fbfbc3ebc..8e9bcf0b9 100644 --- a/common_features.mk +++ b/common_features.mk | |||
@@ -178,6 +178,14 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812) | |||
178 | SRC += ws2812.c | 178 | SRC += ws2812.c |
179 | endif | 179 | endif |
180 | 180 | ||
181 | ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes) | ||
182 | OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB | ||
183 | endif | ||
184 | |||
185 | ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes) | ||
186 | OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER | ||
187 | endif | ||
188 | |||
181 | ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) | 189 | ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) |
182 | OPT_DEFS += -DTAP_DANCE_ENABLE | 190 | OPT_DEFS += -DTAP_DANCE_ENABLE |
183 | SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c | 191 | SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c |
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index f2168ab16..4ce9d15f0 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md | |||
@@ -177,7 +177,7 @@ enum rgb_matrix_effects { | |||
177 | RGB_MATRIX_GRADIENT_UP_DOWN, // Static gradient top to bottom, speed controls how much gradient changes | 177 | RGB_MATRIX_GRADIENT_UP_DOWN, // Static gradient top to bottom, speed controls how much gradient changes |
178 | RGB_MATRIX_BREATHING, // Single hue brightness cycling animation | 178 | RGB_MATRIX_BREATHING, // Single hue brightness cycling animation |
179 | RGB_MATRIX_CYCLE_ALL, // Full keyboard solid hue cycling through full gradient | 179 | RGB_MATRIX_CYCLE_ALL, // Full keyboard solid hue cycling through full gradient |
180 | RGB_MATRIX_CYCLE_LEFT_RIGHT, // Full gradient scrolling left to right | 180 | RGB_MATRIX_CYCLE_LEFT_RIGHT, // Full gradient scrolling left to right |
181 | RGB_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom | 181 | RGB_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom |
182 | RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradent Chevron shapped scrolling left to right | 182 | RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradent Chevron shapped scrolling left to right |
183 | RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard | 183 | RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard |
@@ -203,7 +203,7 @@ enum rgb_matrix_effects { | |||
203 | RGB_MATRIX_EFFECT_MAX | 203 | RGB_MATRIX_EFFECT_MAX |
204 | }; | 204 | }; |
205 | ``` | 205 | ``` |
206 | 206 | ||
207 | You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`: | 207 | You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`: |
208 | 208 | ||
209 | 209 | ||
@@ -236,17 +236,60 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con | |||
236 | |`#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH` |Disables `RGB_MATRIX_SOLID_MULTISPLASH` | | 236 | |`#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH` |Disables `RGB_MATRIX_SOLID_MULTISPLASH` | |
237 | 237 | ||
238 | 238 | ||
239 | ## Custom layer effects | 239 | ## Custom RGB Matrix Effects |
240 | |||
241 | By setting `RGB_MATRIX_CUSTOM_USER` (and/or `RGB_MATRIX_CUSTOM_KB`) in `rule.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files. | ||
242 | |||
243 | To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks something like this: | ||
240 | 244 | ||
241 | Custom layer effects can be done by defining this in your `<keyboard>.c`: | 245 | `rgb_matrix_user.inc` should go in the root of the keymap directory. |
246 | `rgb_matrix_kb.inc` should go in the root of the keyboard directory. | ||
242 | 247 | ||
243 | ```C | 248 | ```C |
244 | void rgb_matrix_indicators_kb(void) { | 249 | // !!! DO NOT ADD #pragma once !!! // |
245 | rgb_matrix_set_color(index, red, green, blue); | 250 | |
251 | // Step 1. | ||
252 | // Declare custom effects using the RGB_MATRIX_EFFECT macro | ||
253 | // (note the lack of semicolon after the macro!) | ||
254 | RGB_MATRIX_EFFECT(my_cool_effect) | ||
255 | RGB_MATRIX_EFFECT(my_cool_effect2) | ||
256 | |||
257 | // Step 2. | ||
258 | // Define effects inside the `RGB_MATRIX_CUSTOM_EFFECT_IMPLS` ifdef block | ||
259 | #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS | ||
260 | |||
261 | // e.g: A simple effect, self-contained within a single method | ||
262 | static bool my_cool_effect(effect_params_t* params) { | ||
263 | RGB_MATRIX_USE_LIMITS(led_min, led_max); | ||
264 | for (uint8_t i = led_min; i < led_max; i++) { | ||
265 | rgb_matrix_set_color(i, 0xff, 0xff, 0x00); | ||
266 | } | ||
267 | return led_max < DRIVER_LED_TOTAL; | ||
268 | } | ||
269 | |||
270 | // e.g: A more complex effect, relying on external methods and state, with | ||
271 | // dedicated init and run methods | ||
272 | static uint8_t some_global_state; | ||
273 | static void my_cool_effect2_complex_init(effect_params_t* params) { | ||
274 | some_global_state = 1; | ||
246 | } | 275 | } |
276 | static bool my_cool_effect2_complex_run(effect_params_t* params) { | ||
277 | RGB_MATRIX_USE_LIMITS(led_min, led_max); | ||
278 | for (uint8_t i = led_min; i < led_max; i++) { | ||
279 | rgb_matrix_set_color(i, 0xff, some_global_state++, 0xff); | ||
280 | } | ||
281 | |||
282 | return led_max < DRIVER_LED_TOTAL; | ||
283 | } | ||
284 | static bool my_cool_effect2(effect_params_t* params) { | ||
285 | if (params->init) my_cool_effect2_complex_init(params); | ||
286 | return my_cool_effect2_complex_run(params); | ||
287 | } | ||
288 | |||
289 | #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS | ||
247 | ``` | 290 | ``` |
248 | 291 | ||
249 | A similar function works in the keymap as `rgb_matrix_indicators_user`. | 292 | For inspiration and examples, check out the built-in effects under `quantum/rgb_matrix_animation/` |
250 | 293 | ||
251 | 294 | ||
252 | ## Colors | 295 | ## Colors |
diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 41ed8983e..5ca9b87a6 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c | |||
@@ -48,6 +48,19 @@ | |||
48 | #include "rgb_matrix_animations/solid_splash_anim.h" | 48 | #include "rgb_matrix_animations/solid_splash_anim.h" |
49 | #include "rgb_matrix_animations/breathing_anim.h" | 49 | #include "rgb_matrix_animations/breathing_anim.h" |
50 | 50 | ||
51 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) | ||
52 | #define RGB_MATRIX_CUSTOM_EFFECT_IMPLS | ||
53 | #define RGB_MATRIX_EFFECT(name, ...) | ||
54 | #ifdef RGB_MATRIX_CUSTOM_KB | ||
55 | #include "rgb_matrix_kb.inc" | ||
56 | #endif | ||
57 | #ifdef RGB_MATRIX_CUSTOM_USER | ||
58 | #include "rgb_matrix_user.inc" | ||
59 | #endif | ||
60 | #undef RGB_MATRIX_EFFECT | ||
61 | #undef RGB_MATRIX_CUSTOM_EFFECT_IMPLS | ||
62 | #endif | ||
63 | |||
51 | #ifndef RGB_DISABLE_AFTER_TIMEOUT | 64 | #ifndef RGB_DISABLE_AFTER_TIMEOUT |
52 | #define RGB_DISABLE_AFTER_TIMEOUT 0 | 65 | #define RGB_DISABLE_AFTER_TIMEOUT 0 |
53 | #endif | 66 | #endif |
@@ -81,6 +94,15 @@ | |||
81 | #define RGB_MATRIX_SPD_STEP 16 | 94 | #define RGB_MATRIX_SPD_STEP 16 |
82 | #endif | 95 | #endif |
83 | 96 | ||
97 | #if !defined(RGB_MATRIX_STARTUP_MODE) | ||
98 | #ifndef DISABLE_RGB_MATRIX_CYCLE_ALL | ||
99 | #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT | ||
100 | #else | ||
101 | // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace | ||
102 | #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR | ||
103 | #endif | ||
104 | #endif | ||
105 | |||
84 | bool g_suspend_state = false; | 106 | bool g_suspend_state = false; |
85 | 107 | ||
86 | rgb_config_t rgb_matrix_config; | 108 | rgb_config_t rgb_matrix_config; |
@@ -104,12 +126,7 @@ void eeconfig_update_rgb_matrix(uint32_t val) { | |||
104 | void eeconfig_update_rgb_matrix_default(void) { | 126 | void eeconfig_update_rgb_matrix_default(void) { |
105 | dprintf("eeconfig_update_rgb_matrix_default\n"); | 127 | dprintf("eeconfig_update_rgb_matrix_default\n"); |
106 | rgb_matrix_config.enable = 1; | 128 | rgb_matrix_config.enable = 1; |
107 | #ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT | 129 | rgb_matrix_config.mode = RGB_MATRIX_STARTUP_MODE; |
108 | rgb_matrix_config.mode = RGB_MATRIX_CYCLE_LEFT_RIGHT; | ||
109 | #else | ||
110 | // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace | ||
111 | rgb_matrix_config.mode = RGB_MATRIX_SOLID_COLOR; | ||
112 | #endif | ||
113 | rgb_matrix_config.hue = 0; | 130 | rgb_matrix_config.hue = 0; |
114 | rgb_matrix_config.sat = UINT8_MAX; | 131 | rgb_matrix_config.sat = UINT8_MAX; |
115 | rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS; | 132 | rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS; |
@@ -435,6 +452,20 @@ static void rgb_task_render(uint8_t effect) { | |||
435 | #endif // DISABLE_RGB_MATRIX_SOLID_MULTISPLASH | 452 | #endif // DISABLE_RGB_MATRIX_SOLID_MULTISPLASH |
436 | #endif // RGB_MATRIX_KEYREACTIVE_ENABLED | 453 | #endif // RGB_MATRIX_KEYREACTIVE_ENABLED |
437 | 454 | ||
455 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) | ||
456 | #define RGB_MATRIX_EFFECT(name, ...) \ | ||
457 | case RGB_MATRIX_CUSTOM_##name: \ | ||
458 | rendering = name(&rgb_effect_params); \ | ||
459 | break; | ||
460 | #ifdef RGB_MATRIX_CUSTOM_KB | ||
461 | #include "rgb_matrix_kb.inc" | ||
462 | #endif | ||
463 | #ifdef RGB_MATRIX_CUSTOM_USER | ||
464 | #include "rgb_matrix_user.inc" | ||
465 | #endif | ||
466 | #undef RGB_MATRIX_EFFECT | ||
467 | #endif | ||
468 | |||
438 | // Factory default magic value | 469 | // Factory default magic value |
439 | case UINT8_MAX: { | 470 | case UINT8_MAX: { |
440 | rgb_matrix_test(); | 471 | rgb_matrix_test(); |
diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 5fdc854f0..775cbeac0 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h | |||
@@ -142,6 +142,18 @@ enum rgb_matrix_effects { | |||
142 | RGB_MATRIX_SOLID_MULTISPLASH, | 142 | RGB_MATRIX_SOLID_MULTISPLASH, |
143 | #endif // DISABLE_RGB_MATRIX_SOLID_MULTISPLASH | 143 | #endif // DISABLE_RGB_MATRIX_SOLID_MULTISPLASH |
144 | #endif // RGB_MATRIX_KEYREACTIVE_ENABLED | 144 | #endif // RGB_MATRIX_KEYREACTIVE_ENABLED |
145 | |||
146 | #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) | ||
147 | #define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_CUSTOM_##name, | ||
148 | #ifdef RGB_MATRIX_CUSTOM_KB | ||
149 | #include "rgb_matrix_kb.inc" | ||
150 | #endif | ||
151 | #ifdef RGB_MATRIX_CUSTOM_USER | ||
152 | #include "rgb_matrix_user.inc" | ||
153 | #endif | ||
154 | #undef RGB_MATRIX_EFFECT | ||
155 | #endif | ||
156 | |||
145 | RGB_MATRIX_EFFECT_MAX | 157 | RGB_MATRIX_EFFECT_MAX |
146 | }; | 158 | }; |
147 | 159 | ||