Convert clipping variables in rgblight.c to a structure (#7720)
This commit is contained in:
parent
5f5c2a219c
commit
86c4c4e91d
4 changed files with 56 additions and 65 deletions
|
@ -22,31 +22,11 @@
|
|||
*/
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
|
||||
# include "ws2812.c"
|
||||
# include "ergodox_ez.h"
|
||||
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
#ifdef RGBW
|
||||
led[i].w = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef RGBW
|
||||
else {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
convert_rgb_to_rgbw(&led[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t led_num = RGBLED_NUM;
|
||||
void rgblight_call_driver(LED_TYPE *led, uint8_t led_num) {
|
||||
i2c_init();
|
||||
i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT);
|
||||
int i = 0;
|
||||
|
@ -54,8 +34,8 @@ void rgblight_set(void) {
|
|||
// prevent right-half code from trying to bitbang all 30
|
||||
// so with 30 LEDs, we count from 29 to 15 here, and the
|
||||
// other half does 0 to 14.
|
||||
led_num = RGBLED_NUM / 2;
|
||||
for (i = led_num + led_num - 1; i >= led_num; --i)
|
||||
uint8_t half_led_num = RGBLED_NUM / 2;
|
||||
for (i = half_led_num + half_led_num - 1; i >= half_led_num; --i)
|
||||
# elif defined(ERGODOX_LED_15_MIRROR)
|
||||
for (i = 0; i < led_num; ++i)
|
||||
# else // ERGDOX_LED_15 non-mirrored
|
||||
|
@ -72,7 +52,7 @@ void rgblight_set(void) {
|
|||
}
|
||||
i2c_stop();
|
||||
|
||||
ws2812_setleds(led, RGBLED_NUM);
|
||||
ws2812_setleds(led, led_num);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
|
|||
SLEEP_LED_ENABLE = no
|
||||
API_SYSEX_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
|
||||
RGB_MATRIX_ENABLE = no # enable later
|
||||
DEBOUNCE_TYPE = eager_pr
|
||||
|
|
|
@ -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,15 @@ 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 +677,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;
|
||||
|
@ -691,9 +692,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
|
||||
|
@ -701,7 +702,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
|
||||
|
||||
|
@ -961,9 +962,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();
|
||||
|
||||
|
@ -991,7 +992,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;
|
||||
}
|
||||
|
@ -999,8 +1000,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;
|
||||
|
@ -1013,7 +1014,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);
|
||||
|
@ -1023,7 +1024,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
|
||||
|
@ -1034,7 +1035,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
|
||||
|
@ -1060,7 +1061,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;
|
||||
|
@ -1070,7 +1071,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]);
|
||||
|
@ -1107,9 +1108,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();
|
||||
}
|
||||
|
@ -1148,11 +1149,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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue