diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 5f38aba7..983dcc40 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -25,8 +25,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define STRIP_NUM_PIXELS DT_PROP(DT_CHOSEN(zmk_underglow), chain_length) #define HUE_MAX 360 -#define SAT_MAX 100 -#define BRT_MAX 100 +#define SAT_MAX 101 +#define BRT_MAX 101 +#define RGB_MAX 255 +#define NUM_SEG 6 // Number of segments on color wheel +#define DEG_SEG (HUE_MAX / NUM_SEG) // degrees per color wheel segment enum rgb_underglow_effect { UNDERGLOW_EFFECT_SOLID, @@ -54,6 +57,7 @@ static struct rgb_underglow_state state; static const struct device *ext_power; #endif +#if IS_ENABLED(CONFIG_FPU) static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { double r, g, b; @@ -102,6 +106,53 @@ static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { return rgb; } +#else +static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { + uint8_t i = hsb.h / DEG_SEG; + uint8_t f = hsb.h % DEG_SEG; + uint8_t v = hsb.b * RGB_MAX / BRT_MAX; + uint8_t p = hsb.b * RGB_MAX * (SAT_MAX - hsb.s) / SAT_MAX / BRT_MAX; + uint8_t q = hsb.b * RGB_MAX * (SAT_MAX * DEG_SEG - f * hsb.s) / SAT_MAX / DEG_SEG / BRT_MAX; + uint8_t t = + hsb.b * RGB_MAX * (SAT_MAX * DEG_SEG - (DEG_SEG - f) * hsb.s) / SAT_MAX / DEG_SEG / BRT_MAX; + struct led_rgb rgb; + + switch (i) { + case 0: + rgb.r = v; + rgb.g = t; + rgb.b = p; + break; + case 1: + rgb.r = q; + rgb.g = v; + rgb.b = p; + break; + case 2: + rgb.r = p; + rgb.g = v; + rgb.b = t; + break; + case 3: + rgb.r = p; + rgb.g = q; + rgb.b = v; + break; + case 4: + rgb.r = t; + rgb.g = p; + rgb.b = v; + break; + case 5: + rgb.r = v; + rgb.g = p; + rgb.b = q; + break; + } + + return rgb; +} +#endif static void zmk_rgb_underglow_effect_solid() { for (int i = 0; i < STRIP_NUM_PIXELS; i++) {