summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2019-12-31 08:33:49 -0800
committerJoel Challis <git@zvecr.com>2019-12-31 16:33:49 +0000
commit7ba6456c0b2e041bb9f97dbed265c5b8b4b12192 (patch)
tree4e01ff717ab7d4c1d6d979f5d01ad8d4d841962e
parenta52e55ec09c587ca58a156a6c174d51e0ad228b4 (diff)
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>
-rw-r--r--keyboards/ergodox_ez/led_i2c.c8
-rw-r--r--quantum/color.c14
-rw-r--r--quantum/color.h4
-rw-r--r--quantum/rgb_matrix_drivers.c2
-rw-r--r--quantum/rgblight.c9
5 files changed, 33 insertions, 4 deletions
diff --git a/keyboards/ergodox_ez/led_i2c.c b/keyboards/ergodox_ez/led_i2c.c
index 3e75a8cd08..4a7a02f468 100644
--- a/keyboards/ergodox_ez/led_i2c.c
+++ b/keyboards/ergodox_ez/led_i2c.c
@@ -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();
diff --git a/quantum/color.c b/quantum/color.c
index 1f398e2403..8bd52444fa 100644
--- a/quantum/color.c
+++ b/quantum/color.c
@@ -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
diff --git a/quantum/color.h b/quantum/color.h
index 6781646628..58d4f0407f 100644
--- a/quantum/color.h
+++ b/quantum/color.h
@@ -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
diff --git a/quantum/rgb_matrix_drivers.c b/quantum/rgb_matrix_drivers.c
index 9729a3064e..ea41b0d396 100644
--- a/quantum/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix_drivers.c
@@ -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
}
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 7949bb688e..141dc2e7bc 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -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