From a8a8bf0ff3d6e1c9637079b925b30cf7eb8913fd Mon Sep 17 00:00:00 2001 From: Joshua Diamond Date: Wed, 13 May 2020 16:39:05 -0400 Subject: Allow expanding from 8 to 32 RGB Lighting Layers (#8941) * Allow 16 lighting layers * Require #define RGBLIGHT_LAYERS_16 to enable 16 layers * Override RGBLIGHT_MAX_LAYERS to set maximum number of lighting layers * Enforce lower bound on RGBLIGHT_MAX_LAYERS Co-Authored-By: Takeshi ISHII <2170248+mtei@users.noreply.github.com> * Fix an error in the check for valid RGBLIGHT_MAX_LAYERS * Don't use bitfield / PACKED, as it causes bloat * Update documentation re: up to 32 lighting layers * Run cformat * Add note about increasing FW size in docs/config_options.md Co-authored-by: Drashna Jaelre * Remove no-longer-valid comment * Add doc note that split sync will be slower Co-authored-by: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Co-authored-by: Drashna Jaelre --- docs/config_options.md | 3 +++ docs/feature_rgblight.md | 2 ++ quantum/rgblight.c | 4 ++-- quantum/rgblight.h | 17 +++++++++++++++-- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index f766857025..b96079e605 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -192,6 +192,9 @@ If you define these options you will enable the associated feature, which may in * run RGB animations * `#define RGBLIGHT_LAYERS` * Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state. +* `#define RGBLIGHT_MAX_LAYERS` + * Defaults to 8. Can be expanded up to 32 if more [lighting layers](feature_rgblight.md?id=lighting-layers) are needed. + * Note: Increasing the maximum will increase the firmware size and slow sync on split keyboards. * `#define RGBLIGHT_LAYER_BLINK` * Adds ability to [blink](feature_rgblight.md?id=lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action). * `#define RGBLED_NUM 12` diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 045d97775d..7e54bfef3c 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -186,6 +186,8 @@ it easy to use your underglow LEDs as status indicators to show which keyboard l ### Defining Lighting Layers :id=defining-lighting-layers +By default, 8 layers are possible. This can be expanded to as many as 32 by overriding the definition of `RGBLIGHT_MAX_LAYERS` in `config.h` (e.g. `#define RGBLIGHT_MAX_LAYERS 32`). Please note, if you use a split keyboard, you will need to flash both sides of the split after changing this. Also, increasing the maximum will increase the firmware size, and will slow sync on split keyboards. + To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently: ```c diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 4f227794fe..64123774c7 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -613,7 +613,7 @@ void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_set #ifdef RGBLIGHT_LAYERS void rgblight_set_layer_state(uint8_t layer, bool enabled) { - uint8_t mask = 1 << layer; + rgblight_layer_mask_t mask = 1 << layer; if (enabled) { rgblight_status.enabled_layer_mask |= mask; } else { @@ -627,7 +627,7 @@ void rgblight_set_layer_state(uint8_t layer, bool enabled) { } bool rgblight_get_layer_state(uint8_t layer) { - uint8_t mask = 1 << layer; + rgblight_layer_mask_t mask = 1 << layer; return (rgblight_status.enabled_layer_mask & mask) != 0; } diff --git a/quantum/rgblight.h b/quantum/rgblight.h index f93a30c5a5..6fc3b6f177 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -196,7 +196,20 @@ typedef struct { # define RGBLIGHT_END_SEGMENT_INDEX (255) # define RGBLIGHT_END_SEGMENTS \ { RGBLIGHT_END_SEGMENT_INDEX, 0, 0, 0 } -# define RGBLIGHT_MAX_LAYERS 8 +# ifndef RGBLIGHT_MAX_LAYERS +# define RGBLIGHT_MAX_LAYERS 8 +# endif +# if RGBLIGHT_MAX_LAYERS <= 0 +# error invalid RGBLIGHT_MAX_LAYERS value (must be >= 1) +# elif RGBLIGHT_MAX_LAYERS <= 8 +typedef uint8_t rgblight_layer_mask_t; +# elif RGBLIGHT_MAX_LAYERS <= 16 +typedef uint16_t rgblight_layer_mask_t; +# elif RGBLIGHT_MAX_LAYERS <= 32 +typedef uint32_t rgblight_layer_mask_t; +# else +# error invalid RGBLIGHT_MAX_LAYERS value (must be <= 32) +# endif # define RGBLIGHT_LAYER_SEGMENTS(...) \ { __VA_ARGS__, RGBLIGHT_END_SEGMENTS } # define RGBLIGHT_LAYERS_LIST(...) \ @@ -247,7 +260,7 @@ typedef struct _rgblight_status_t { uint8_t change_flags; # endif # ifdef RGBLIGHT_LAYERS - uint8_t enabled_layer_mask; + rgblight_layer_mask_t enabled_layer_mask; # endif } rgblight_status_t; -- cgit v1.2.3