From 07ea98db4a39ece98e306dd324cb461898a62fdb Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 4 Apr 2025 04:44:53 +0200 Subject: [PATCH] fix(radio): prevent dedicated RGB LEDs flickering (#6045) --- radio/src/boards/generic_stm32/rgb_leds.cpp | 2 ++ radio/src/gui/gui_common.cpp | 3 +++ radio/src/lua/api_general.cpp | 2 ++ radio/src/targets/taranis/gx12/bsp_io.cpp | 21 ++++++++++----------- radio/src/targets/taranis/hal.h | 1 + radio/src/targets/taranis/led_driver.cpp | 6 +++--- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/radio/src/boards/generic_stm32/rgb_leds.cpp b/radio/src/boards/generic_stm32/rgb_leds.cpp index 66af78cc6..e93f4c8c0 100644 --- a/radio/src/boards/generic_stm32/rgb_leds.cpp +++ b/radio/src/boards/generic_stm32/rgb_leds.cpp @@ -47,6 +47,8 @@ void rgbSetLedColor(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { #if defined(SIXPOS_SWITCH_INDEX) ws2812_set_color(led + 6, r, g, b); +#elif defined(RGB_LED_OFFSET) + ws2812_set_color(led + RGB_LED_OFFSET, r, g, b); #else ws2812_set_color(led, r, g, b); #endif diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 15a06d239..aa597920a 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -672,6 +672,9 @@ bool isAssignableFunctionAvailable(int function, bool modelFunctions) #if !defined(LED_STRIP_GPIO) case FUNC_RGB_LED: return false; +#elif defined(RGB_LED_OFFSET) + case FUNC_RGB_LED: + return (LED_STRIP_LENGTH > RGB_LED_OFFSET); #endif #if !defined(DEBUG) case FUNC_TEST: diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 313a93ff2..afcb80bc7 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -3197,6 +3197,8 @@ LROT_BEGIN(etxcst, NULL, 0) #if defined(LED_STRIP_GPIO) #if defined(RADIO_V16) LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH - 6) + #elif defined(RGB_LED_OFFSET) + LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH - RGB_LED_OFFSET) #else LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH ) #endif diff --git a/radio/src/targets/taranis/gx12/bsp_io.cpp b/radio/src/targets/taranis/gx12/bsp_io.cpp index d5fa2beee..235f575c1 100644 --- a/radio/src/targets/taranis/gx12/bsp_io.cpp +++ b/radio/src/targets/taranis/gx12/bsp_io.cpp @@ -20,17 +20,17 @@ */ #include "bsp_io.h" -#include "hal/switch_driver.h" -#include "drivers/pca95xx.h" -#include "stm32_i2c_driver.h" -#include "timers_driver.h" -#include "boards/generic_stm32/rgb_leds.h" #include #include -#include "myeeprom.h" #include "bitfield.h" +#include "drivers/pca95xx.h" +#include "hal/switch_driver.h" +#include "myeeprom.h" +#include "stm32_i2c_driver.h" +#include "stm32_ws2812.h" +#include "timers_driver.h" struct bsp_io_expander { pca95xx_t exp; @@ -179,11 +179,10 @@ static SwitchHwPos _get_switch_pos(uint8_t idx) } - if(pos == SWITCH_HW_UP) { - rgbSetLedColor(def->pin_low - RGB_OFFSET, 0x0, 0x0, 0x0); - } - else { - rgbSetLedColor(def->pin_low - RGB_OFFSET, 0xFF, 0xFF, 0xFF); + if (pos == SWITCH_HW_UP) { + ws2812_set_color(def->pin_low - RGB_OFFSET, 0x0, 0x0, 0x0); + } else { + ws2812_set_color(def->pin_low - RGB_OFFSET, 0xFF, 0xFF, 0xFF); } } else if (!def->pin_low) { diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 460ee920a..a21d19c3a 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1965,6 +1965,7 @@ #if defined(RGBLEDS) #if defined(RADIO_GX12) #define LED_STRIP_LENGTH 8 + #define RGB_LED_OFFSET 8 #else #define LED_STRIP_LENGTH 7 #endif diff --git a/radio/src/targets/taranis/led_driver.cpp b/radio/src/targets/taranis/led_driver.cpp index 8cb999826..fa6f9f383 100644 --- a/radio/src/targets/taranis/led_driver.cpp +++ b/radio/src/targets/taranis/led_driver.cpp @@ -25,7 +25,7 @@ #include "boards/generic_stm32/rgb_leds.h" #include "board.h" #if defined(LED_STRIP_GPIO) -#include "boards/generic_stm32/rgb_leds.h" +#include "stm32_ws2812.h" #endif #define GET_RED(color) (((color) & 0xFF0000) >>16) @@ -65,8 +65,8 @@ uint8_t ledMapping[] = {0, 1, 2, 3, 4, 5, 6}; void fsLedRGB(uint8_t index, uint32_t color) { - rgbSetLedColor(ledMapping[index], GET_RED(color), \ - GET_GREEN(color),GET_BLUE(color)); + ws2812_set_color(ledMapping[index], GET_RED(color), GET_GREEN(color), + GET_BLUE(color)); } uint8_t getRGBColorIndex(uint32_t color)