diff options
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/rgblight.c | 70 | ||||
-rw-r--r-- | quantum/rgblight.h | 19 |
2 files changed, 49 insertions, 40 deletions
diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 6ae185fea8..e90d79e5ed 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -107,23 +107,19 @@ LED_TYPE led[RGBLED_NUM]; rgblight_segment_t const *const *rgblight_layers = NULL; #endif -static uint8_t clipping_start_pos = 0; -static uint8_t clipping_num_leds = RGBLED_NUM; -static uint8_t effect_start_pos = 0; -static uint8_t effect_end_pos = RGBLED_NUM; -static uint8_t effect_num_leds = RGBLED_NUM; +rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM}; void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { - clipping_start_pos = start_pos; - clipping_num_leds = num_leds; + rgblight_ranges.clipping_start_pos = start_pos; + rgblight_ranges.clipping_num_leds = num_leds; } void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) { if (start_pos >= RGBLED_NUM) return; if (start_pos + num_leds > RGBLED_NUM) return; - effect_start_pos = start_pos; - effect_end_pos = start_pos + num_leds; - effect_num_leds = num_leds; + rgblight_ranges.effect_start_pos = start_pos; + rgblight_ranges.effect_end_pos = start_pos + num_leds; + rgblight_ranges.effect_num_leds = num_leds; } void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { @@ -468,15 +464,15 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w # else uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2]; # endif - for (uint8_t i = 0; i < effect_num_leds; i++) { - uint8_t _hue = ((uint16_t)i * (uint16_t)range) / effect_num_leds; + for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) { + uint8_t _hue = ((uint16_t)i * (uint16_t)range) / rgblight_ranges.effect_num_leds; if (direction) { _hue = hue + _hue; } else { _hue = hue - _hue; } dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range); - sethsv(_hue, sat, val, (LED_TYPE *)&led[i + effect_start_pos]); + sethsv(_hue, sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); } rgblight_set(); } @@ -530,7 +526,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { return; } - for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { + for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { led[i].r = r; led[i].g = g; led[i].b = b; @@ -664,10 +660,12 @@ static void rgblight_layers_write(void) { } #endif +__attribute__((weak)) void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); } + #ifndef RGBLIGHT_CUSTOM_DRIVER void rgblight_set(void) { LED_TYPE *start_led; - uint16_t num_leds = clipping_num_leds; + uint8_t num_leds = rgblight_ranges.clipping_num_leds; # ifdef RGBLIGHT_LAYERS if (rgblight_layers != NULL) { @@ -676,7 +674,7 @@ void rgblight_set(void) { # endif if (!rgblight_config.enable) { - for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { + for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { led[i].r = 0; led[i].g = 0; led[i].b = 0; @@ -690,9 +688,9 @@ void rgblight_set(void) { for (uint8_t i = 0; i < RGBLED_NUM; i++) { led0[i] = led[pgm_read_byte(&led_map[i])]; } - start_led = led0 + clipping_start_pos; + start_led = led0 + rgblight_ranges.clipping_start_pos; # else - start_led = led + clipping_start_pos; + start_led = led + rgblight_ranges.clipping_start_pos; # endif # ifdef RGBW @@ -700,7 +698,7 @@ void rgblight_set(void) { convert_rgb_to_rgbw(&start_led[i]); } # endif - ws2812_setleds(start_led, num_leds); + rgblight_call_driver(start_led, num_leds); } #endif @@ -960,9 +958,9 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) { uint8_t hue; uint8_t i; - for (i = 0; i < effect_num_leds; i++) { - hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / effect_num_leds * i + anim->current_hue); - sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]); + for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { + hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue); + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); } rgblight_set(); @@ -990,7 +988,7 @@ void rgblight_effect_snake(animation_status_t *anim) { # if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) if (anim->pos == 0) { // restart signal if (increment == 1) { - pos = effect_num_leds - 1; + pos = rgblight_ranges.effect_num_leds - 1; } else { pos = 0; } @@ -998,8 +996,8 @@ void rgblight_effect_snake(animation_status_t *anim) { } # endif - for (i = 0; i < effect_num_leds; i++) { - LED_TYPE *ledp = led + i + effect_start_pos; + for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { + LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; ledp->r = 0; ledp->g = 0; ledp->b = 0; @@ -1012,7 +1010,7 @@ void rgblight_effect_snake(animation_status_t *anim) { k = k % RGBLED_NUM; } if (k < 0) { - k = k + effect_num_leds; + k = k + rgblight_ranges.effect_num_leds; } if (i == k) { sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp); @@ -1022,7 +1020,7 @@ void rgblight_effect_snake(animation_status_t *anim) { rgblight_set(); if (increment == 1) { if (pos - 1 < 0) { - pos = effect_num_leds - 1; + pos = rgblight_ranges.effect_num_leds - 1; # if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) anim->pos = 0; # endif @@ -1033,7 +1031,7 @@ void rgblight_effect_snake(animation_status_t *anim) { # endif } } else { - pos = (pos + 1) % effect_num_leds; + pos = (pos + 1) % rgblight_ranges.effect_num_leds; # if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) anim->pos = pos; # endif @@ -1059,7 +1057,7 @@ void rgblight_effect_knight(animation_status_t *anim) { } # endif // Set all the LEDs to 0 - for (i = effect_start_pos; i < effect_end_pos; i++) { + for (i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { led[i].r = 0; led[i].g = 0; led[i].b = 0; @@ -1069,7 +1067,7 @@ void rgblight_effect_knight(animation_status_t *anim) { } // Determine which LEDs should be lit up for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { - cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % effect_num_leds + effect_start_pos; + cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % rgblight_ranges.effect_num_leds + rgblight_ranges.effect_start_pos; if (i >= low_bound && i <= high_bound) { sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); @@ -1106,9 +1104,9 @@ void rgblight_effect_christmas(animation_status_t *anim) { uint8_t i; anim->current_offset = (anim->current_offset + 1) % 2; - for (i = 0; i < effect_num_leds; i++) { + for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85; - sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]); + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); } rgblight_set(); } @@ -1147,11 +1145,11 @@ void rgblight_effect_rgbtest(animation_status_t *anim) { #ifdef RGBLIGHT_EFFECT_ALTERNATING void rgblight_effect_alternating(animation_status_t *anim) { - for (int i = 0; i < effect_num_leds; i++) { - LED_TYPE *ledp = led + i + effect_start_pos; - if (i < effect_num_leds / 2 && anim->pos) { + for (int i = 0; i < rgblight_ranges.effect_num_leds; i++) { + LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; + if (i < rgblight_ranges.effect_num_leds / 2 && anim->pos) { sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); - } else if (i >= effect_num_leds / 2 && !anim->pos) { + } else if (i >= rgblight_ranges.effect_num_leds / 2 && !anim->pos) { sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); } else { sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp); diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 97882c5b29..b1585b158b 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -130,7 +130,7 @@ enum RGBLIGHT_EFFECT_MODE { # endif # ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM -# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (effect_num_leds) +# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (rgblight_ranges.effect_num_leds) # endif # ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL @@ -160,9 +160,7 @@ enum RGBLIGHT_EFFECT_MODE { # include <stdint.h> # include <stdbool.h> # include "eeconfig.h" -# ifndef RGBLIGHT_CUSTOM_DRIVER -# include "ws2812.h" -# endif +# include "ws2812.h" # include "color.h" # include "rgblight_list.h" @@ -230,6 +228,19 @@ typedef struct _rgblight_status_t { # endif } rgblight_status_t; +/* + * Structure for RGB Light clipping ranges + */ +typedef struct _rgblight_ranges_t { + uint8_t clipping_start_pos; + uint8_t clipping_num_leds; + uint8_t effect_start_pos; + uint8_t effect_end_pos; + uint8_t effect_num_leds; +} rgblight_ranges_t; + +extern rgblight_ranges_t rgblight_ranges; + /* === Utility Functions ===*/ void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); // without RGBLIGHT_LIMIT_VAL check |