diff options
| author | Daniel Prilik <danielprilik@gmail.com> | 2019-04-29 17:48:41 -0400 |
|---|---|---|
| committer | Drashna Jaelre <drashna@live.com> | 2019-04-29 14:48:41 -0700 |
| commit | 1d784f0f9575b70e35c9c8338b0ff80dc7316d7e (patch) | |
| tree | f1617c0a36ccb3bf6c1b881b6f1b9caad2678e2e | |
| parent | e337bb82a3b418dfd6c60b8c615322c854e5995d (diff) | |
| download | qmk_firmware-1d784f0f9575b70e35c9c8338b0ff80dc7316d7e.tar.gz qmk_firmware-1d784f0f9575b70e35c9c8338b0ff80dc7316d7e.zip | |
RGB Matrix: Custom effects on a kb/user level (#5338)
* Revamped custom effects approach
See docs for example usage
* push-up RGB Matrix default mode
Override default effect using RGB_MATRIX_STARTUP_MODE.
Useful on boards without EEPROM support
(*cough* Massdrop ALT/CTRL *cough*)
* update docs
| -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 | ||
