~ruther/qmk_firmware

86c4c4e91de20b3f928300cfab617963c31699f9 — Drashna Jaelre 5 years ago 5f5c2a2
Convert clipping variables in rgblight.c to a structure (#7720)

4 files changed, 56 insertions(+), 65 deletions(-)

M keyboards/ergodox_ez/led_i2c.c
M keyboards/ergodox_ez/rules.mk
M quantum/rgblight.c
M quantum/rgblight.h
M keyboards/ergodox_ez/led_i2c.c => keyboards/ergodox_ez/led_i2c.c +4 -24
@@ 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);
}



M keyboards/ergodox_ez/rules.mk => keyboards/ergodox_ez/rules.mk +0 -1
@@ 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

M quantum/rgblight.c => quantum/rgblight.c +37 -36
@@ 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);

M quantum/rgblight.h => quantum/rgblight.h +15 -4
@@ 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