Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert clipping variables in rgblight.c to a structure #7720

Merged
merged 6 commits into from
Apr 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 4 additions & 24 deletions keyboards/ergodox_ez/led_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,40 +22,20 @@
*/
#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;
# if defined(ERGODOX_LED_30)
// 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
Expand All @@ -72,7 +52,7 @@ void rgblight_set(void) {
}
i2c_stop();

ws2812_setleds(led, RGBLED_NUM);
ws2812_setleds(led, led_num);
}


Expand Down
1 change: 0 additions & 1 deletion keyboards/ergodox_ez/rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
73 changes: 37 additions & 36 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

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) {
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 @@ -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) {
Expand All @@ -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;
Expand All @@ -691,17 +692,17 @@ 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
for (uint8_t i = 0; i < num_leds; i++) {
convert_rgb_to_rgbw(&start_led[i]);
}
# endif
ws2812_setleds(start_led, num_leds);
rgblight_call_driver(start_led, num_leds);
}
#endif

Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -991,16 +992,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 +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);
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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;
Expand All @@ -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]);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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);
Expand Down
19 changes: 15 additions & 4 deletions 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 @@ -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"

Expand Down Expand Up @@ -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
Expand Down