From 63c60b689e5ec20512797e8e0c5ea97f973cf4be Mon Sep 17 00:00:00 2001 From: coltontcrowe Date: Sun, 29 Aug 2021 09:11:05 +0000 Subject: [PATCH] fix: clean up most rounding errors --- app/src/rgb_underglow.c | 53 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index d3a5f36a..31d7d9f6 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -25,8 +25,8 @@ 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 @@ -58,44 +58,45 @@ static const struct device *ext_power; #endif static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { - uint32_t i = hsb.h / DEG_SEG; - uint32_t f = hsb.h % DEG_SEG; - uint32_t v = hsb.b * RGB_MAX / BRT_MAX; - uint32_t p = v * (SAT_MAX - hsb.s) / SAT_MAX; - uint32_t q = v * (SAT_MAX * DEG_SEG - f * hsb.s) / SAT_MAX / DEG_SEG; - uint32_t t = v * (SAT_MAX * DEG_SEG - (DEG_SEG - f) * hsb.s) / SAT_MAX / DEG_SEG; + 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 = (uint8_t)v; - rgb.g = (uint8_t)t; - rgb.b = (uint8_t)p; + rgb.r = v; + rgb.g = t; + rgb.b = p; break; case 1: - rgb.r = (uint8_t)q; - rgb.g = (uint8_t)v; - rgb.b = (uint8_t)p; + rgb.r = q; + rgb.g = v; + rgb.b = p; break; case 2: - rgb.r = (uint8_t)p; - rgb.g = (uint8_t)v; - rgb.b = (uint8_t)t; + rgb.r = p; + rgb.g = v; + rgb.b = t; break; case 3: - rgb.r = (uint8_t)p; - rgb.g = (uint8_t)q; - rgb.b = (uint8_t)v; + rgb.r = p; + rgb.g = q; + rgb.b = v; break; case 4: - rgb.r = (uint8_t)t; - rgb.g = (uint8_t)p; - rgb.b = (uint8_t)v; + rgb.r = t; + rgb.g = p; + rgb.b = v; break; case 5: - rgb.r = (uint8_t)v; - rgb.g = (uint8_t)p; - rgb.b = (uint8_t)q; + rgb.r = v; + rgb.g = p; + rgb.b = q; break; }