|
|
@ -107,23 +107,19 @@ LED_TYPE led[RGBLED_NUM]; |
|
|
|
rgblight_segment_t const *const *rgblight_layers = NULL; |
|
|
|
rgblight_segment_t const *const *rgblight_layers = NULL; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
static uint8_t clipping_start_pos = 0; |
|
|
|
rgblight_ranges_t rgblight_ranges = { 0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM }; |
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { |
|
|
|
void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { |
|
|
|
clipping_start_pos = start_pos; |
|
|
|
rgblight_ranges.clipping_start_pos = start_pos; |
|
|
|
clipping_num_leds = num_leds; |
|
|
|
rgblight_ranges.clipping_num_leds = num_leds; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) { |
|
|
|
void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) { |
|
|
|
if (start_pos >= RGBLED_NUM) return; |
|
|
|
if (start_pos >= RGBLED_NUM) return; |
|
|
|
if (start_pos + num_leds > RGBLED_NUM) return; |
|
|
|
if (start_pos + num_leds > RGBLED_NUM) return; |
|
|
|
effect_start_pos = start_pos; |
|
|
|
rgblight_ranges.effect_start_pos = start_pos; |
|
|
|
effect_end_pos = start_pos + num_leds; |
|
|
|
rgblight_ranges.effect_end_pos = start_pos + num_leds; |
|
|
|
effect_num_leds = num_leds; |
|
|
|
rgblight_ranges.effect_num_leds = num_leds; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void sethsv_raw(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) { |
|
|
@ -468,15 +464,15 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w |
|
|
|
# else |
|
|
|
# else |
|
|
|
uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2]; |
|
|
|
uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2]; |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
for (uint8_t i = 0; i < effect_num_leds; i++) { |
|
|
|
for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) { |
|
|
|
uint8_t _hue = ((uint16_t)i * (uint16_t)range) / effect_num_leds; |
|
|
|
uint8_t _hue = ((uint16_t)i * (uint16_t)range) / rgblight_ranges.effect_num_leds; |
|
|
|
if (direction) { |
|
|
|
if (direction) { |
|
|
|
_hue = hue + _hue; |
|
|
|
_hue = hue + _hue; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
_hue = hue - _hue; |
|
|
|
_hue = hue - _hue; |
|
|
|
} |
|
|
|
} |
|
|
|
dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range); |
|
|
|
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(); |
|
|
|
rgblight_set(); |
|
|
|
} |
|
|
|
} |
|
|
@ -530,7 +526,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { |
|
|
|
return; |
|
|
|
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].r = r; |
|
|
|
led[i].g = g; |
|
|
|
led[i].g = g; |
|
|
|
led[i].b = b; |
|
|
|
led[i].b = b; |
|
|
@ -664,10 +660,15 @@ static void rgblight_layers_write(void) { |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#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 |
|
|
|
#ifndef RGBLIGHT_CUSTOM_DRIVER |
|
|
|
void rgblight_set(void) { |
|
|
|
void rgblight_set(void) { |
|
|
|
LED_TYPE *start_led; |
|
|
|
LED_TYPE *start_led; |
|
|
|
uint16_t num_leds = clipping_num_leds; |
|
|
|
uint8_t num_leds = rgblight_ranges.clipping_num_leds; |
|
|
|
|
|
|
|
|
|
|
|
# ifdef RGBLIGHT_LAYERS |
|
|
|
# ifdef RGBLIGHT_LAYERS |
|
|
|
if (rgblight_layers != NULL) { |
|
|
|
if (rgblight_layers != NULL) { |
|
|
@ -676,7 +677,7 @@ void rgblight_set(void) { |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
|
|
if (!rgblight_config.enable) { |
|
|
|
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].r = 0; |
|
|
|
led[i].g = 0; |
|
|
|
led[i].g = 0; |
|
|
|
led[i].b = 0; |
|
|
|
led[i].b = 0; |
|
|
@ -691,9 +692,9 @@ void rgblight_set(void) { |
|
|
|
for (uint8_t i = 0; i < RGBLED_NUM; i++) { |
|
|
|
for (uint8_t i = 0; i < RGBLED_NUM; i++) { |
|
|
|
led0[i] = led[pgm_read_byte(&led_map[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 |
|
|
|
# else |
|
|
|
start_led = led + clipping_start_pos; |
|
|
|
start_led = led + rgblight_ranges.clipping_start_pos; |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
|
|
# ifdef RGBW |
|
|
|
# ifdef RGBW |
|
|
@ -701,7 +702,7 @@ void rgblight_set(void) { |
|
|
|
convert_rgb_to_rgbw(&start_led[i]); |
|
|
|
convert_rgb_to_rgbw(&start_led[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
ws2812_setleds(start_led, num_leds); |
|
|
|
rgblight_call_driver(start_led, num_leds); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
@ -961,9 +962,9 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) { |
|
|
|
uint8_t hue; |
|
|
|
uint8_t hue; |
|
|
|
uint8_t i; |
|
|
|
uint8_t i; |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < effect_num_leds; i++) { |
|
|
|
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { |
|
|
|
hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / effect_num_leds * i + anim->current_hue); |
|
|
|
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 + effect_start_pos]); |
|
|
|
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); |
|
|
|
} |
|
|
|
} |
|
|
|
rgblight_set(); |
|
|
|
rgblight_set(); |
|
|
|
|
|
|
|
|
|
|
@ -991,7 +992,7 @@ void rgblight_effect_snake(animation_status_t *anim) { |
|
|
|
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) |
|
|
|
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) |
|
|
|
if (anim->pos == 0) { // restart signal
|
|
|
|
if (anim->pos == 0) { // restart signal
|
|
|
|
if (increment == 1) { |
|
|
|
if (increment == 1) { |
|
|
|
pos = effect_num_leds - 1; |
|
|
|
pos = rgblight_ranges.effect_num_leds - 1; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
pos = 0; |
|
|
|
pos = 0; |
|
|
|
} |
|
|
|
} |
|
|
@ -999,8 +1000,8 @@ void rgblight_effect_snake(animation_status_t *anim) { |
|
|
|
} |
|
|
|
} |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < effect_num_leds; i++) { |
|
|
|
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { |
|
|
|
LED_TYPE *ledp = led + i + effect_start_pos; |
|
|
|
LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; |
|
|
|
ledp->r = 0; |
|
|
|
ledp->r = 0; |
|
|
|
ledp->g = 0; |
|
|
|
ledp->g = 0; |
|
|
|
ledp->b = 0; |
|
|
|
ledp->b = 0; |
|
|
@ -1013,7 +1014,7 @@ void rgblight_effect_snake(animation_status_t *anim) { |
|
|
|
k = k % RGBLED_NUM; |
|
|
|
k = k % RGBLED_NUM; |
|
|
|
} |
|
|
|
} |
|
|
|
if (k < 0) { |
|
|
|
if (k < 0) { |
|
|
|
k = k + effect_num_leds; |
|
|
|
k = k + rgblight_ranges.effect_num_leds; |
|
|
|
} |
|
|
|
} |
|
|
|
if (i == k) { |
|
|
|
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); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp); |
|
|
@ -1023,7 +1024,7 @@ void rgblight_effect_snake(animation_status_t *anim) { |
|
|
|
rgblight_set(); |
|
|
|
rgblight_set(); |
|
|
|
if (increment == 1) { |
|
|
|
if (increment == 1) { |
|
|
|
if (pos - 1 < 0) { |
|
|
|
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) |
|
|
|
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) |
|
|
|
anim->pos = 0; |
|
|
|
anim->pos = 0; |
|
|
|
# endif |
|
|
|
# endif |
|
|
@ -1034,7 +1035,7 @@ void rgblight_effect_snake(animation_status_t *anim) { |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} 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) |
|
|
|
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) |
|
|
|
anim->pos = pos; |
|
|
|
anim->pos = pos; |
|
|
|
# endif |
|
|
|
# endif |
|
|
@ -1060,7 +1061,7 @@ void rgblight_effect_knight(animation_status_t *anim) { |
|
|
|
} |
|
|
|
} |
|
|
|
# endif |
|
|
|
# endif |
|
|
|
// Set all the LEDs to 0
|
|
|
|
// 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].r = 0; |
|
|
|
led[i].g = 0; |
|
|
|
led[i].g = 0; |
|
|
|
led[i].b = 0; |
|
|
|
led[i].b = 0; |
|
|
@ -1070,7 +1071,7 @@ void rgblight_effect_knight(animation_status_t *anim) { |
|
|
|
} |
|
|
|
} |
|
|
|
// Determine which LEDs should be lit up
|
|
|
|
// Determine which LEDs should be lit up
|
|
|
|
for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { |
|
|
|
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) { |
|
|
|
if (i >= low_bound && i <= high_bound) { |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); |
|
|
@ -1107,9 +1108,9 @@ void rgblight_effect_christmas(animation_status_t *anim) { |
|
|
|
uint8_t i; |
|
|
|
uint8_t i; |
|
|
|
|
|
|
|
|
|
|
|
anim->current_offset = (anim->current_offset + 1) % 2; |
|
|
|
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; |
|
|
|
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(); |
|
|
|
rgblight_set(); |
|
|
|
} |
|
|
|
} |
|
|
@ -1148,11 +1149,11 @@ void rgblight_effect_rgbtest(animation_status_t *anim) { |
|
|
|
|
|
|
|
|
|
|
|
#ifdef RGBLIGHT_EFFECT_ALTERNATING |
|
|
|
#ifdef RGBLIGHT_EFFECT_ALTERNATING |
|
|
|
void rgblight_effect_alternating(animation_status_t *anim) { |
|
|
|
void rgblight_effect_alternating(animation_status_t *anim) { |
|
|
|
for (int i = 0; i < effect_num_leds; i++) { |
|
|
|
for (int i = 0; i < rgblight_ranges.effect_num_leds; i++) { |
|
|
|
LED_TYPE *ledp = led + i + effect_start_pos; |
|
|
|
LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; |
|
|
|
if (i < effect_num_leds / 2 && anim->pos) { |
|
|
|
if (i < rgblight_ranges.effect_num_leds / 2 && anim->pos) { |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); |
|
|
|
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); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp); |
|
|
|