From 058473dce9c677d9560e2040409fe73d3807c8d8 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Sep 2024 19:57:58 +0200 Subject: [PATCH] Add LED compatibility for other boards. Signed-off-by: Pol Henarejos --- src/led/led.c | 9 ++++----- src/led/led_cyw43.c | 5 +++-- src/led/led_neopixel.c | 15 +++++++++++++-- src/led/led_pico.c | 5 +++-- src/led/led_pimoroni.c | 5 ++++- src/led/led_ws2812.c | 3 ++- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/led/led.c b/src/led/led.c index f225bab..f9232af 100644 --- a/src/led/led.c +++ b/src/led/led.c @@ -27,7 +27,7 @@ #endif extern void led_driver_init(); -extern void led_driver_color(uint8_t, float); +extern void led_driver_color(uint8_t, uint32_t, float); static uint32_t led_mode = MODE_NOT_MOUNTED; @@ -44,7 +44,7 @@ void led_blinking_task() { #ifdef PICO_DEFAULT_LED_PIN_INVERTED state = !state; #endif - uint32_t led_max_brightness = (led_mode & LED_BTNESS_MASK) >> LED_BTNESS_SHIFT; + uint32_t led_brightness = (led_mode & LED_BTNESS_MASK) >> LED_BTNESS_SHIFT; uint32_t led_color = (led_mode & LED_COLOR_MASK) >> LED_COLOR_SHIFT; uint32_t led_off = (led_mode & LED_OFF_MASK) >> LED_OFF_SHIFT; uint32_t led_on = (led_mode & LED_ON_MASK) >> LED_ON_SHIFT; @@ -64,9 +64,8 @@ void led_blinking_task() { // maybe quick return if progress didn't changed much ? // current one from 0 - 1 - float led_brightness = ((float)led_max_brightness / MAX_BTNESS) * progress; - led_driver_color(led_color, led_brightness); + led_driver_color(led_color, led_brightness, progress); if (board_millis() >= stop_ms){ start_ms = stop_ms; @@ -78,7 +77,7 @@ void led_blinking_task() { void led_off_all() { #ifndef ENABLE_EMULATION - led_driver_color(LED_COLOR_OFF, 0); + led_driver_color(LED_COLOR_OFF, 0, 0); #endif } diff --git a/src/led/led_cyw43.c b/src/led/led_cyw43.c index 6049dc5..939d377 100644 --- a/src/led/led_cyw43.c +++ b/src/led/led_cyw43.c @@ -25,8 +25,9 @@ void led_driver_init() { cyw43_arch_init(); } -void led_driver_color(uint8_t color, float brightness) { - cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, color != LED_COLOR_OFF); +void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { + (void)led_brightness; + cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, progress >= 0.5); } #endif diff --git a/src/led/led_neopixel.c b/src/led/led_neopixel.c index 83322a5..5c55be3 100644 --- a/src/led/led_neopixel.c +++ b/src/led/led_neopixel.c @@ -45,8 +45,19 @@ void led_driver_init() { neopixel = neopixel_Init(1, gpio); } -void led_driver_color(uint8_t color, float brightness) { - neopixel_SetPixel(neopixel, &pixel[color], 1); +void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { + static tNeopixel spx = {.index = 0, .rgb = 0}; + float brightness = ((float)led_brightness / MAX_BTNESS) * progress; + uint32_t pixel_color = pixel[color].rgb; + uint8_t r = (pixel_color >> 16) & 0xFF; + uint8_t g = (pixel_color >> 8) & 0xFF; + uint8_t b = (pixel_color) & 0xFF; + + r = (uint8_t)(r * brightness); + g = (uint8_t)(g * brightness); + b = (uint8_t)(b * brightness); + spx.rgb = NP_RGB(r, g, b); + neopixel_SetPixel(neopixel, &spx, 1); } #endif diff --git a/src/led/led_pico.c b/src/led/led_pico.c index 8d8a308..72fda7b 100644 --- a/src/led/led_pico.c +++ b/src/led/led_pico.c @@ -24,8 +24,9 @@ void led_driver_init() { gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); } -void led_driver_color(uint8_t color, float brightness) { - gpio_put(PICO_DEFAULT_LED_PIN, color != LED_COLOR_OFF); +void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { + (void)led_brightness; + gpio_put(PICO_DEFAULT_LED_PIN, progress >= 0.5); } #endif diff --git a/src/led/led_pimoroni.c b/src/led/led_pimoroni.c index 3938f16..66f8c92 100644 --- a/src/led/led_pimoroni.c +++ b/src/led/led_pimoroni.c @@ -49,7 +49,10 @@ void led_driver_init() { gpio_set_dir(LED_B_PIN, GPIO_OUT); } -void led_driver_color(uint8_t color, float brightness) { +void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { + if (progress < 0.5) { + color = LED_COLOR_OFF; + } gpio_put(LED_R_PIN, pixel[color][0]); gpio_put(LED_G_PIN, pixel[color][1]); gpio_put(LED_B_PIN, pixel[color][2]); diff --git a/src/led/led_ws2812.c b/src/led/led_ws2812.c index b388f55..4a7b324 100644 --- a/src/led/led_ws2812.c +++ b/src/led/led_ws2812.c @@ -79,7 +79,8 @@ uint32_t pixel[] = { 0xffffff00 // 7: white }; -void led_driver_color(uint8_t color, float brightness) { +void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { + float brightness = ((float)led_brightness / MAX_BTNESS) * progress; uint32_t pixel_color = pixel[color]; uint8_t r = (pixel_color >> 16) & 0xFF; uint8_t g = (pixel_color >> 24) & 0xFF;