aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common_features.mk8
-rw-r--r--docs/feature_rgb_matrix.md57
-rw-r--r--quantum/rgb_matrix.c43
-rw-r--r--quantum/rgb_matrix.h12
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
179endif 179endif
180 180
181ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
182 OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB
183endif
184
185ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes)
186 OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER
187endif
188
181ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) 189ifeq ($(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
207You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`: 207You 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
241By 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
243To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks something like this:
240 244
241Custom 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
244void 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!)
254RGB_MATRIX_EFFECT(my_cool_effect)
255RGB_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
262static 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
272static uint8_t some_global_state;
273static void my_cool_effect2_complex_init(effect_params_t* params) {
274 some_global_state = 1;
246} 275}
276static 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}
284static 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
249A similar function works in the keymap as `rgb_matrix_indicators_user`. 292For 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
84bool g_suspend_state = false; 106bool g_suspend_state = false;
85 107
86rgb_config_t rgb_matrix_config; 108rgb_config_t rgb_matrix_config;
@@ -104,12 +126,7 @@ void eeconfig_update_rgb_matrix(uint32_t val) {
104void eeconfig_update_rgb_matrix_default(void) { 126void 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