~ruther/qmk_firmware

7ba6456c0b2e041bb9f97dbed265c5b8b4b12192 — Drashna Jaelre 5 years ago a52e55e
Use White channel on RGBW LEDs (#7678)

* Use White channel on RGBW LEDs

Co-authored-by: kwerdenker <sebastian.spindler@gmail.com>

* Manually apply white channel to array

* Move where convert_rgb_to_rgbw is called

* Fix type for rgbw led struct

* Add changes to Ergodox EZ

can revert if deemed necessary

* Revert "Add changes to Ergodox EZ"

This reverts commit aa44db198d40d758ca10470eb94615513592d1dd.

* Revert "Fix type for rgbw led struct"

This reverts commit c5c744cba040201cc0d124400773cf13f8a2cf22.

* Revert "Move where convert_rgb_to_rgbw is called"

This reverts commit cd7f17caf6dd30731c54b3be54490fe4519444f9.

* Revert changes and fix up functions

* Enable white channel for Ergodox EZ as well

* Only run conversion of rgblight is enabled

Co-authored-by: kwerdenker <sebastian.spindler@gmail.com>
M keyboards/ergodox_ez/led_i2c.c => keyboards/ergodox_ez/led_i2c.c +7 -1
@@ 51,7 51,13 @@ void rgblight_set(void) {
#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;
    i2c_init();

M quantum/color.c => quantum/color.c +14 -0
@@ 85,3 85,17 @@ RGB hsv_to_rgb(HSV hsv) {

    return rgb;
}

#ifdef RGBW
#ifndef MIN
#    define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
void convert_rgb_to_rgbw(LED_TYPE *led) {
    // Determine lowest value in all three colors, put that into
    // the white channel and then shift all colors by that amount
    led->w = MIN(led->r, MIN(led->g, led->b));
    led->r -= led->w;
    led->g -= led->w;
    led->b -= led->w;
}
#endif

M quantum/color.h => quantum/color.h +3 -1
@@ 64,5 64,7 @@ typedef struct PACKED {
#endif

RGB hsv_to_rgb(HSV hsv);

#ifdef RGBW
void convert_rgb_to_rgbw(LED_TYPE *led);
#endif
#endif  // COLOR_H

M quantum/rgb_matrix_drivers.c => quantum/rgb_matrix_drivers.c +1 -1
@@ 113,7 113,7 @@ static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
    led[i].g = g;
    led[i].b = b;
#    ifdef RGBW
    led[i].w = 0;
    convert_rgb_to_rgbw(led[i]);
#    endif
}


M quantum/rgblight.c => quantum/rgblight.c +8 -1
@@ 611,6 611,7 @@ void rgblight_set(void) {
#    endif
        }
    }

#    ifdef RGBLIGHT_LED_MAP
    LED_TYPE led0[RGBLED_NUM];
    for (uint8_t i = 0; i < RGBLED_NUM; i++) {


@@ 620,7 621,13 @@ void rgblight_set(void) {
#    else
    start_led = led + clipping_start_pos;
#    endif
    ws2812_setleds(start_led, num_leds);

#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);
}
#endif