Add effect range to rgblight.c (#5856)
* add rgblight_set_effect_range() * implement effect range * Arrange the order of function list in rgblight.h . * update docs/feature_rgblight.md * fix RGBLIGHT_RAINBOW_SWIRL_RANGE default value * add example code about Utility Functions * add example code about direct operation functions * When RGBLIGHT_SPLIT is defined, the following function has no meaning and is invalidated. * rgblight_setrgb_master(r, g, b) * rgblight_setrgb_slave(r, g, b) * rgblight_sethsv_master(h, s, v) * rgblight_sethsv_slave(h, s, v) * add temporary test code for rgblight_set_effect_range * fix rgblight_effect_knight() bug * Test End. Revert "add temporary test code for rgblight_set_effect_range" This reverts commit 5680cddd012d68b2db75a532862a7fef250f8973.
This commit is contained in:
parent
acd3e79add
commit
670a9b7f83
3 changed files with 261 additions and 167 deletions
|
@ -101,19 +101,35 @@ LED_TYPE led[RGBLED_NUM];
|
|||
|
||||
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;
|
||||
|
||||
void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) {
|
||||
clipping_start_pos = start_pos;
|
||||
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;
|
||||
}
|
||||
|
||||
void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
|
||||
HSV hsv = { hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val };
|
||||
void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
|
||||
HSV hsv = { hue, sat, val };
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
setrgb(rgb.r, rgb.g, rgb.b, led1);
|
||||
}
|
||||
|
||||
void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
|
||||
sethsv_raw( hue, sat,
|
||||
val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val,
|
||||
led1);
|
||||
}
|
||||
|
||||
void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) {
|
||||
(*led1).r = r;
|
||||
(*led1).g = g;
|
||||
|
@ -501,15 +517,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 < RGBLED_NUM; i++) {
|
||||
uint8_t _hue = ((uint16_t)i * (uint16_t)range) / RGBLED_NUM;
|
||||
for (uint8_t i = 0; i < effect_num_leds; i++) {
|
||||
uint8_t _hue = ((uint16_t)i * (uint16_t)range) / 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]);
|
||||
sethsv(_hue, sat, val, (LED_TYPE *)&led[i + effect_start_pos]);
|
||||
}
|
||||
rgblight_set();
|
||||
}
|
||||
|
@ -557,7 +573,7 @@ uint8_t rgblight_get_val(void) {
|
|||
void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
|
||||
if (!rgblight_config.enable) { return; }
|
||||
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
|
||||
led[i].r = r;
|
||||
led[i].g = g;
|
||||
led[i].b = b;
|
||||
|
@ -615,6 +631,7 @@ void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start,
|
|||
rgblight_setrgb_range(tmp_led.r, tmp_led.g, tmp_led.b, start, end);
|
||||
}
|
||||
|
||||
#ifndef RGBLIGHT_SPLIT
|
||||
void rgblight_setrgb_master(uint8_t r, uint8_t g, uint8_t b) {
|
||||
rgblight_setrgb_range(r, g, b, 0 , (uint8_t) RGBLED_NUM/2);
|
||||
}
|
||||
|
@ -630,36 +647,34 @@ void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val) {
|
|||
void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) {
|
||||
rgblight_sethsv_range(hue, sat, val, (uint8_t) RGBLED_NUM/2, (uint8_t) RGBLED_NUM);
|
||||
}
|
||||
#endif // ifndef RGBLIGHT_SPLIT
|
||||
|
||||
#ifndef RGBLIGHT_CUSTOM_DRIVER
|
||||
void rgblight_set(void) {
|
||||
LED_TYPE *start_led = led + clipping_start_pos;
|
||||
LED_TYPE *start_led;
|
||||
uint16_t num_leds = clipping_num_leds;
|
||||
if (rgblight_config.enable) {
|
||||
#ifdef RGBLIGHT_LED_MAP
|
||||
LED_TYPE led0[RGBLED_NUM];
|
||||
for(uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led0[i] = led[pgm_read_byte(&led_map[i])];
|
||||
}
|
||||
start_led = led0 + clipping_start_pos;
|
||||
#endif
|
||||
#ifdef RGBW
|
||||
ws2812_setleds_rgbw(start_led, num_leds);
|
||||
#else
|
||||
ws2812_setleds(start_led, num_leds);
|
||||
#endif
|
||||
} else {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
#ifdef RGBW
|
||||
ws2812_setleds_rgbw(start_led, num_leds);
|
||||
#else
|
||||
ws2812_setleds(start_led, num_leds);
|
||||
#endif
|
||||
}
|
||||
#ifdef RGBLIGHT_LED_MAP
|
||||
LED_TYPE led0[RGBLED_NUM];
|
||||
for(uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led0[i] = led[pgm_read_byte(&led_map[i])];
|
||||
}
|
||||
start_led = led0 + clipping_start_pos;
|
||||
#else
|
||||
start_led = led + clipping_start_pos;
|
||||
#endif
|
||||
#ifdef RGBW
|
||||
ws2812_setleds_rgbw(start_led, num_leds);
|
||||
#else
|
||||
ws2812_setleds(start_led, num_leds);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -926,9 +941,9 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) {
|
|||
uint8_t hue;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < RGBLED_NUM; i++) {
|
||||
hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / RGBLED_NUM * i + anim->current_hue);
|
||||
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[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]);
|
||||
}
|
||||
rgblight_set();
|
||||
|
||||
|
@ -957,7 +972,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 = RGBLED_NUM - 1;
|
||||
pos = effect_num_leds - 1;
|
||||
} else {
|
||||
pos = 0;
|
||||
}
|
||||
|
@ -965,26 +980,27 @@ void rgblight_effect_snake(animation_status_t *anim) {
|
|||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
for (i = 0; i < effect_num_leds; i++) {
|
||||
LED_TYPE *ledp = led + i + effect_start_pos;
|
||||
ledp->r = 0;
|
||||
ledp->g = 0;
|
||||
ledp->b = 0;
|
||||
for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) {
|
||||
k = pos + j * increment;
|
||||
if (k < 0) {
|
||||
k = k + RGBLED_NUM;
|
||||
k = k + 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),
|
||||
(LED_TYPE *)&led[i]);
|
||||
ledp);
|
||||
}
|
||||
}
|
||||
}
|
||||
rgblight_set();
|
||||
if (increment == 1) {
|
||||
if (pos - 1 < 0) {
|
||||
pos = RGBLED_NUM - 1;
|
||||
pos = effect_num_leds - 1;
|
||||
#if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC)
|
||||
anim->pos = 0;
|
||||
#endif
|
||||
|
@ -995,7 +1011,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
|
|||
#endif
|
||||
}
|
||||
} else {
|
||||
pos = (pos + 1) % RGBLED_NUM;
|
||||
pos = (pos + 1) % effect_num_leds;
|
||||
#if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC)
|
||||
anim->pos = pos;
|
||||
#endif
|
||||
|
@ -1023,14 +1039,14 @@ void rgblight_effect_knight(animation_status_t *anim) {
|
|||
}
|
||||
#endif
|
||||
// Set all the LEDs to 0
|
||||
for (i = 0; i < RGBLED_NUM; i++) {
|
||||
for (i = effect_start_pos; i < effect_end_pos; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
// Determine which LEDs should be lit up
|
||||
for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) {
|
||||
cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % RGBLED_NUM;
|
||||
cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % effect_num_leds + effect_start_pos;
|
||||
|
||||
if (i >= low_bound && i <= high_bound) {
|
||||
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]);
|
||||
|
@ -1064,9 +1080,9 @@ void rgblight_effect_christmas(animation_status_t *anim) {
|
|||
uint8_t i;
|
||||
|
||||
anim->current_offset = (anim->current_offset + 1) % 2;
|
||||
for (i = 0; i < RGBLED_NUM; i++) {
|
||||
for (i = 0; i < 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]);
|
||||
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]);
|
||||
}
|
||||
rgblight_set();
|
||||
}
|
||||
|
@ -1099,13 +1115,14 @@ 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<RGBLED_NUM; i++){
|
||||
if(i<RGBLED_NUM/2 && anim->pos){
|
||||
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
|
||||
}else if (i>=RGBLED_NUM/2 && !anim->pos){
|
||||
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
|
||||
}else{
|
||||
sethsv(rgblight_config.hue, rgblight_config.sat, 0, (LED_TYPE *)&led[i]);
|
||||
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) {
|
||||
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp);
|
||||
} else if (i>=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);
|
||||
}
|
||||
}
|
||||
rgblight_set();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue