diff --git a/docs/config_options.md b/docs/config_options.md index f76685702..b96079e60 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 045d97775..7e54bfef3 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 4f227794f..64123774c 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 f93a30c5a..6fc3b6f17 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;