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