diff --git a/src/driver/drv_sm2135.c b/src/driver/drv_sm2135.c index dc894964d..0a724ad5a 100644 --- a/src/driver/drv_sm2135.c +++ b/src/driver/drv_sm2135.c @@ -76,15 +76,49 @@ static void SM2135_Stop(void) { } void SM2135_Write(byte *rgbcw) { - SM2135_Start(SM2135_ADDR_MC); - SM2135_WriteByte(g_current_setting); - SM2135_WriteByte(SM2135_RGB); - SM2135_WriteByte(rgbcw[g_channelOrder[0]]); - SM2135_WriteByte(rgbcw[g_channelOrder[1]]); - SM2135_WriteByte(rgbcw[g_channelOrder[2]]); - SM2135_WriteByte(rgbcw[g_channelOrder[3]]); - SM2135_WriteByte(rgbcw[g_channelOrder[4]]); - SM2135_Stop(); + int i; + int bRGB; + + if(CFG_HasFlag(OBK_FLAG_SM2135_SEPARATE_MODES)) { + bRGB = 0; + for(i = 0; i < 3; i++){ + if(rgbcw[g_channelOrder[i]]!=0) { + bRGB = 1; + break; + } + } + if(bRGB) { + SM2135_Start(SM2135_ADDR_MC); + SM2135_WriteByte(g_current_setting); + SM2135_WriteByte(SM2135_RGB); + SM2135_WriteByte(rgbcw[g_channelOrder[0]]); + SM2135_WriteByte(rgbcw[g_channelOrder[1]]); + SM2135_WriteByte(rgbcw[g_channelOrder[2]]); + SM2135_Stop(); + } else { + SM2135_Start(SM2135_ADDR_MC); + SM2135_WriteByte(g_current_setting); + SM2135_WriteByte(SM2135_CW); + SM2135_Stop(); + rtos_delay_milliseconds(SM2135_DELAY); + + SM2135_Start(SM2135_ADDR_C); + SM2135_WriteByte(rgbcw[g_channelOrder[3]]); + SM2135_WriteByte(rgbcw[g_channelOrder[4]]); + SM2135_Stop(); + + } + } else { + SM2135_Start(SM2135_ADDR_MC); + SM2135_WriteByte(g_current_setting); + SM2135_WriteByte(SM2135_RGB); + SM2135_WriteByte(rgbcw[g_channelOrder[0]]); + SM2135_WriteByte(rgbcw[g_channelOrder[1]]); + SM2135_WriteByte(rgbcw[g_channelOrder[2]]); + SM2135_WriteByte(rgbcw[g_channelOrder[3]]); + SM2135_WriteByte(rgbcw[g_channelOrder[4]]); + SM2135_Stop(); + } } static int SM2135_RGBCW(const void *context, const char *cmd, const char *args, int flags){ diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 2e0cbf7ed..cb1a41d6c 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -1669,7 +1669,7 @@ const char *g_obk_flagNames[] = { "[BTN] Instant touch reaction instead of waiting for release (aka SetOption 13)", "[MQTT] [Debug] Always set Retain flag to all published values", "[LED] Alternate CW light mode (first PWM for warm/cold slider, second for brightness)", - "error", + "[SM2135] Use separate RGB/CW modes instead of writing all 5 values as RGB", "error", }; diff --git a/src/new_pins.h b/src/new_pins.h index af1b276a4..05fa53dd7 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -105,8 +105,9 @@ typedef struct pinsState_s { #define OBK_FLAG_BTN_INSTANTTOUCH 6 #define OBK_FLAG_MQTT_ALWAYSSETRETAIN 7 #define OBK_FLAG_LED_ALTERNATE_CW_MODE 8 +#define OBK_FLAG_SM2135_SEPARATE_MODES 9 -#define OBK_TOTAL_FLAGS 9 +#define OBK_TOTAL_FLAGS 10 // // Main config structure (less than 2KB)