diff --git a/keyboard/staryu/backlight.c b/keyboard/staryu/backlight.c index 8509e713..11c55d63 100644 --- a/keyboard/staryu/backlight.c +++ b/keyboard/staryu/backlight.c @@ -21,6 +21,7 @@ along with this program. If not, see . #include "backlight.h" #include "softpwm_led.h" #include "action.h" +#include "rgb.h" #ifdef BACKLIGHT_ENABLE @@ -29,6 +30,7 @@ static const uint8_t backlight_table[] PROGMEM = { }; extern backlight_config_t backlight_config; +uint8_t backlight_brightness; void backlight_set(uint8_t level) { @@ -39,7 +41,9 @@ void backlight_set(uint8_t level) case 3: fading_led_disable_all(); breathing_led_disable_all(); - softpwm_led_set_all(pgm_read_byte(&backlight_table[level])); + backlight_brightness = pgm_read_byte(&backlight_table[level]); + softpwm_led_set_all(backlight_brightness); + rgb_set_brightness(backlight_brightness); break; case 4: case 5: @@ -64,6 +68,8 @@ void backlight_set(uint8_t level) default: fading_led_disable_all(); breathing_led_disable_all(); + backlight_brightness = 0; + softpwm_led_set_all(backlight_brightness); break; } } @@ -136,4 +142,16 @@ void action_keyevent(keyevent_t event) } } +#ifdef CUSTOM_LED_ENABLE +void fading_led_custom(uint8_t *value) +{ + rgb_set_brightness(*value); +} + +void breathing_led_custom(uint8_t *value) +{ + rgb_set_brightness(*value); +} +#endif + #endif diff --git a/keyboard/staryu/rgb.c b/keyboard/staryu/rgb.c index f2e051c2..0ce7e7e9 100644 --- a/keyboard/staryu/rgb.c +++ b/keyboard/staryu/rgb.c @@ -17,26 +17,25 @@ along with this program. If not, see . #include #include +#include "softpwm_led.h" +#include "backlight.h" #include "rgb.h" #include "light_ws2812.h" -static const uint8_t rgb_table[RGB_LEVELS][3] PROGMEM = { - { 0, 0, 0 }, - { 255, 0, 0 }, - { 255, 127, 0 }, - { 255, 255, 0 }, - { 0, 255, 0 }, - { 0, 255, 255 }, - { 0, 0, 255 }, - { 143, 0, 255 }, - { 255, 255, 255 } -}; - +volatile static uint8_t rgb_fading_enable = 0; static rgb_config_t rgb_config; +static uint16_t rgb_hue = 0; +static uint8_t rgb_saturation = 255; +static uint8_t rgb_brightness = 16; -void rgb_write_config(void); -void rgb_read_config(void); -void rgb_set(uint8_t level); +extern backlight_config_t backlight_config; +extern uint8_t backlight_brightness; + +static void rgb_write_config(void); +static void rgb_read_config(void); +static void rgb_set_level(uint8_t level); +static void hue_to_rgb(uint16_t hue, struct cRGB *rgb); +static void hsb_to_rgb(uint16_t hue, uint8_t saturation, uint8_t brightness, struct cRGB *rgb); void rgb_init(void) { @@ -47,7 +46,7 @@ void rgb_init(void) rgb_write_config(); } if (rgb_config.enable) { - rgb_set(rgb_config.level); + rgb_set_level(rgb_config.level); } } @@ -74,14 +73,14 @@ void rgb_toggle(void) void rgb_on(void) { rgb_config.enable = 1; - rgb_set(rgb_config.level); + rgb_set_level(rgb_config.level); rgb_write_config(); } void rgb_off(void) { rgb_config.enable = 0; - rgb_set(RGB_OFF); + rgb_set_level(RGB_OFF); rgb_write_config(); } @@ -92,35 +91,121 @@ void rgb_decrease(void) rgb_config.enable = (rgb_config.level != 0); rgb_write_config(); } - rgb_set(rgb_config.level); + rgb_set_level(rgb_config.level); } void rgb_increase(void) { - if(rgb_config.level < RGB_LEVELS - 1) { + if(rgb_config.level < RGB_LEVELS) { rgb_config.level++; rgb_config.enable = 1; rgb_write_config(); } - rgb_set(rgb_config.level); + rgb_set_level(rgb_config.level); } void rgb_step(void) { rgb_config.level++; - if(rgb_config.level >= RGB_LEVELS) + if(rgb_config.level > RGB_LEVELS) { rgb_config.level = 0; } rgb_config.enable = (rgb_config.level != 0); - rgb_set(rgb_config.level); + rgb_set_level(rgb_config.level); } -void rgb_set(uint8_t level) +void rgb_set_level(uint8_t level) { - struct cRGB rgb[1]; - rgb[0].r = pgm_read_byte(&rgb_table[level][0]); - rgb[0].g = pgm_read_byte(&rgb_table[level][1]); - rgb[0].b = pgm_read_byte(&rgb_table[level][2]); - ws2812_setleds(rgb, 1); + if (level <= RGB_WHITE) { + rgb_fading_enable = 0; + if (level == RGB_OFF) { + rgb_brightness = 0; + } + else { + if (level == RGB_WHITE) { + rgb_saturation = 0; + } + else { + rgb_hue = (level - 1) * 128; + rgb_saturation = 255; + } + if (backlight_config.enable) { + if (backlight_config.level >= 1 && backlight_config.level <= 3) { + rgb_brightness = backlight_brightness; + } + } + else { + rgb_brightness = 16; + } + } + rgb_refresh(); + } + else { + rgb_saturation = 255; + rgb_fading_enable = 3 - (level - RGB_FADE_SLOW); + } } + +void rgb_set_brightness(uint8_t brightness) +{ + rgb_brightness = brightness; + rgb_refresh(); +} + +void rgb_refresh(void) +{ + struct cRGB rgb_color[1]; + hsb_to_rgb(rgb_hue, rgb_saturation, rgb_brightness, rgb_color); + ws2812_setleds(rgb_color, 1); +} + +void hue_to_rgb(uint16_t hue, struct cRGB *rgb) +{ + uint8_t hi = hue / 60; + uint16_t f = (hue % 60) * 425 / 100; + uint8_t q = 255 - f; + switch (hi) { + case 0: rgb->r = 255; rgb->g = f; rgb->b = 0; break; + case 1: rgb->r = q; rgb->g = 255; rgb->b = 0; break; + case 2: rgb->r = 0; rgb->g = 255; rgb->b = f; break; + case 3: rgb->r = 0; rgb->g = q; rgb->b = 255; break; + case 4: rgb->r = f; rgb->g = 0; rgb->b = 255; break; + case 5: rgb->r = 255; rgb->g = 0; rgb->b = q; break; + } +} + +/* + * original code: https://blog.adafruit.com/2012/03/14/constant-brightness-hsb-to-rgb-algorithm/ + */ +void hsb_to_rgb(uint16_t hue, uint8_t saturation, uint8_t brightness, struct cRGB *rgb) +{ + uint8_t temp[5]; + uint8_t n = (hue >> 8) % 3; + uint8_t x = ((((hue & 255) * saturation) >> 8) * brightness) >> 8; + uint8_t s = ((256 - saturation) * brightness) >> 8; + temp[0] = temp[3] = s; + temp[1] = temp[4] = x + s; + temp[2] = brightness - x; + rgb->r = temp[n + 2]; + rgb->g = temp[n + 1]; + rgb->b = temp[n]; +} + +#ifdef CUSTOM_LED_ENABLE +void softpwm_led_custom(void) +{ + static uint8_t step = 0; + static uint16_t hue = 0; + if (rgb_fading_enable) { + if (++step > rgb_fading_enable) { + step = 0; + rgb_hue = hue; + rgb_refresh(); + if (++hue >= 768) { + hue = 0; + } + } + } +} +#endif diff --git a/keyboard/staryu/rgb.h b/keyboard/staryu/rgb.h index 61073dde..5e001b3e 100644 --- a/keyboard/staryu/rgb.h +++ b/keyboard/staryu/rgb.h @@ -32,14 +32,16 @@ typedef union { enum { RGB_OFF = 0, RGB_RED, - RGB_ORANGE, RGB_YELLOW, RGB_GREEN, RGB_CYAN, RGB_BLUE, - RGB_VIOLET, + RGB_MAGENTA, RGB_WHITE, - RGB_LEVELS + RGB_FADE_SLOW, + RGB_FADE_MID, + RGB_FADE_FAST, + RGB_LEVELS = RGB_FADE_FAST }; #define EECONFIG_RGB (uint8_t *)7 @@ -52,5 +54,6 @@ void rgb_off(void); void rgb_decrease(void); void rgb_increase(void); void rgb_step(void); +void rgb_set_brightness(uint8_t brightness); #endif