Skip to content

Commit

Permalink
Use structure for rgb clipping settings
Browse files Browse the repository at this point in the history
per the suggestion of mtei
  • Loading branch information
drashna committed Apr 13, 2020
1 parent b1a2cc7 commit 4fa3012
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 36 deletions.
66 changes: 31 additions & 35 deletions quantum/rgblight.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,23 +107,19 @@ LED_TYPE led[RGBLED_NUM];
rgblight_segment_t const *const *rgblight_layers = NULL;
#endif

uint8_t clipping_start_pos = 0;
uint8_t clipping_num_leds = RGBLED_NUM;
uint8_t effect_start_pos = 0;
uint8_t effect_end_pos = RGBLED_NUM;
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) {
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -667,7 +663,7 @@ static void rgblight_layers_write(void) {
#ifndef RGBLIGHT_CUSTOM_DRIVER
void rgblight_set(void) {
LED_TYPE *start_led;
uint16_t num_leds = clipping_num_leds;
uint16_t num_leds = rgblight_ranges.clipping_num_leds;

# ifdef RGBLIGHT_LAYERS
if (rgblight_layers != NULL) {
Expand All @@ -676,7 +672,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;
Expand All @@ -691,9 +687,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
Expand Down Expand Up @@ -961,9 +957,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();

Expand Down Expand Up @@ -991,16 +987,16 @@ 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;
}
anim->pos = 1;
}
# 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;
Expand All @@ -1013,7 +1009,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);
Expand All @@ -1023,7 +1019,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
Expand All @@ -1034,7 +1030,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
Expand All @@ -1060,7 +1056,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;
Expand All @@ -1070,7 +1066,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]);
Expand Down Expand Up @@ -1107,9 +1103,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();
}
Expand Down Expand Up @@ -1148,11 +1144,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);
Expand Down
17 changes: 16 additions & 1 deletion quantum/rgblight.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -230,6 +230,21 @@ 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;

# ifdef RGBLIGHT_CUSTOM_DRIVER
extern rgblight_ranges_t rgblight_ranges;
# endif

/* === 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
Expand Down

0 comments on commit 4fa3012

Please sign in to comment.