From 4bdbb9ba6122e7c9bd69aa4ef05d43af278e4a08 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 14 Jul 2026 12:10:22 +0300 Subject: [PATCH 1/4] Add 4-PWM RGBW LED mode (flag 52) --- docs/README.md | 2 +- docs/flags.md | 1 + docs/json/flags.json | 7 + src/cmnds/cmd_newLEDDriver.c | 69 +++++++++- src/cmnds/cmd_public.h | 6 + src/httpserver/hass.c | 18 +++ src/httpserver/hass.h | 3 + src/httpserver/http_fns.c | 86 ++++++++++-- src/mqtt/new_mqtt.c | 4 + src/mqtt/new_mqtt_deduper.h | 1 + src/new_pins.h | 3 +- src/selftest/selftest_led.c | 124 ++++++++++++++++++ src/selftest/selftest_mqtt.c | 94 +++++++++++++ .../selftest_tuyaMCU_batteryPowered.c | 7 +- 14 files changed, 402 insertions(+), 23 deletions(-) diff --git a/docs/README.md b/docs/README.md index aedaa3a1e5..a1aec12cfa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ Do not add anything here, as it will overwritten with next rebuild. | Section | Comment | |:------------- |------:| | [IO/Pin Roles](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/ioRoles.md) (100 total) | You can set pin roles in 'Configure Module' section or use one of predefined templates in Web App. For each pin, you also set corresponding channel value. This is needed for modules with multiple relays. If you have 3 relays and 3 buttons, you need to use channel values like 1, 2, and 3. Just enter '1' in the text field, etc. | -| [Flags](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/flags.md) (52 total) | Flags are global and allows you to alter behaviour of the device. | +| [Flags](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/flags.md) (53 total) | Flags are global and allows you to alter behaviour of the device. | | [Drivers](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/drivers.md) (95 total) | Drivers allows you to control certain peripherals or enable certain features that are off by default. | | [Script constants](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/constants.md) (43 total) | Every console command that takes an integer argument supports certain constant expansion. | | [Channel Types](https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/channelTypes.md) (69 total) | Channel types are often not required and don't have to be configured, but in some cases they are required for better device control from OpenBeken web panel. Channel types describes the kind of value stored in channel, for example, if you have a Tuya Fan Controller with 3 speeds control, you can set the channel type to LowMidHigh and it will display the correct UI radiobutton on OpenBeken panel.
Some channels have '_div10' or '_div100' suffixes. This is for TuyaMCU. This is needed because TuyaMCU sends values as integers, so it sends, for example, 215 for 21.5C temperature, and we store it internally as 215 and only convert to float for display. | diff --git a/docs/flags.md b/docs/flags.md index abd57cc728..a2aaa129e3 100644 --- a/docs/flags.md +++ b/docs/flags.md @@ -57,3 +57,4 @@ Do not add anything here, as it will overwritten with next rebuild. | 49 | [HTTP] Hide ON/OFF for relays (only red/green buttons) | | 50 | [MQTT] Never add GET suffix | | 51 | [WiFi] (RTL/BK/BL602) Enhanced fast connect by saving AP data to flash (preferable with Flag 37 & static ip). Quick reset 3 times to connect normally | +| 52 | [LED] Enables independent management of RGB vs White only modes for 4 PWMs | diff --git a/docs/json/flags.json b/docs/json/flags.json index 3972b0b521..3f71fbc7a5 100644 --- a/docs/json/flags.json +++ b/docs/json/flags.json @@ -362,5 +362,12 @@ "title": "todo", "file": "new_pins.h", "descr": "[WiFi] (RTL/BK/BL602) Enhanced fast connect by saving AP data to flash (preferable with Flag 37 & static ip). Quick reset 3 times to connect normally" + }, + { + "index": "52", + "enum": "OBK_FLAG_LED_4PWM_RGBW_MODE", + "title": "todo", + "file": "new_pins.h", + "descr": "[LED] Enables independent management of RGB vs White only modes for 4 PWMs" } ] \ No newline at end of file diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index ee8a1218fa..7bb2868b73 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -78,6 +78,10 @@ short led_timeUntilNextSavePossible = 0; byte g_ledStateSavePending = 0; byte g_numBaseColors = 5; byte g_lightMode = Light_RGB; +// 0=rgb, 1=white — selects active channels in OBK_FLAG_LED_4PWM_RGBW_MODE. +// In RGB mode ch0-2 output, ch4 (white) is zeroed. +// In White mode ch4 outputs, ch0-2 (RGB) are zeroed. +byte g_colorMode = LIGHT_COLOR_MODE_RGB; // NOTE: in this system, enabling/disabling whole led light bulb // is not changing the stored channel and brightness values. @@ -95,6 +99,7 @@ void LED_ResetGlobalVariablesToDefaults() { int i; g_lightMode = Light_RGB; + g_colorMode = LIGHT_COLOR_MODE_RGB; for (i = 0; i < 5; i++) { led_baseColors[i] = 255; finalColors[i] = 0; @@ -508,6 +513,9 @@ OBK_Publish_Result LED_SendCurrentLightModeParam_TempOrColor() { return sendTemperatureChange(); } else if (g_lightMode == Light_RGB) { + if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + sendColorMode(); + } return sendColorChange(); } return OBK_PUBLISH_WAS_NOT_REQUIRED; @@ -614,11 +622,17 @@ void apply_smart_light() { } } else if (g_lightMode == Light_RGB) { - // skip channels 3, 4 - if (i >= 3) - { - baseRGBCW[i] = 0; - final = 0; + if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + // RGB+W mode with channel topology [0]=R, [1]=G, [2]=B, [3]=unused, [4]=W + if (g_colorMode == LIGHT_COLOR_MODE_RGB) { + // RGB mode: zero channels 3+ (white + unused gap) + if (i >= 3) { baseRGBCW[i] = 0; final = 0; } + } else { + // White mode: zero channels 0-3 (RGB + unused gap) + if (i <= 3) { baseRGBCW[i] = 0; final = 0; } + } + } else { + if (i >= 3) { baseRGBCW[i] = 0; final = 0; } } } else if(g_lightMode == Light_Anim) { // skip all? @@ -1263,6 +1277,37 @@ static commandResult_t dimmer(const void *context, const char *cmd, const char * return CMD_RES_OK; } +#if ENABLE_MQTT +// Publish current color mode ("rgb" or "white") for HA to switch UI +OBK_Publish_Result sendColorMode() { + const char *mode = (g_colorMode == LIGHT_COLOR_MODE_RGB) ? "rgb" : "white"; + return MQTT_PublishMain_StringString_DeDuped(DEDUP_LED_COLOR_MODE, DEDUP_EXPIRE_TIME, "led_colorMode", mode, 0); +} +#endif +// Switch to white mode in OBK_FLAG_LED_4PWM_RGBW_MODE. +// White channel is always at max — brightness is controlled by led_dimmer. +// RGB channels are zeroed in apply_smart_light(). +static commandResult_t led_enableWhite(const void *context, const char *cmd, const char *args, int cmdFlags) { + if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE) == false) { + return CMD_RES_ERROR; + } + + g_colorMode = LIGHT_COLOR_MODE_WHITE; + + led_baseColors[4] = 255.0f; + + if (CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_ANY_ACTION)) { + LED_SetEnableAll(true); + } + apply_smart_light(); +#if ENABLE_MQTT + sendColorMode(); + if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDPARAMSTOGETHER)) { + LED_SendDimmerChange(); + } +#endif + return CMD_RES_OK; +} void LED_SetFinalRGBCW(byte *rgbcw) { if(rgbcw[0] == 0 && rgbcw[1] == 0 && rgbcw[2] == 0 && rgbcw[3] == 0 && rgbcw[4] == 0) { @@ -1464,6 +1509,7 @@ commandResult_t LED_SetBaseColor(const void *context, const char *cmd, const cha SET_LightMode(Light_All); } else { SET_LightMode(Light_RGB); + g_colorMode = LIGHT_COLOR_MODE_RGB; } g_numBaseColors = 0; @@ -1517,6 +1563,9 @@ commandResult_t LED_SetBaseColor(const void *context, const char *cmd, const cha apply_smart_light(); #if ENABLE_MQTT sendColorChange(); + if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + sendColorMode(); + } if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDPARAMSTOGETHER)) { LED_SendDimmerChange(); } @@ -1536,7 +1585,6 @@ static commandResult_t basecolor_rgb(const void *context, const char *cmd, const static commandResult_t basecolor_rgbcw(const void *context, const char *cmd, const char *args, int cmdFlags){ return LED_SetBaseColor(context,cmd,args,1); } - // CONFIG-ONLY command! static commandResult_t colorMult(const void *context, const char *cmd, const char *args, int cmdFlags){ ADDLOG_DEBUG(LOG_FEATURE_CMD, " g_cfg_colorScaleToChannel (%s) received with args %s",cmd,args); @@ -1752,12 +1800,21 @@ void NewLED_InitCommands(){ // if single color or RGB, force RGB g_lightMode = Light_RGB; } + // 4 PWM with flag 52: treat as RGB+W (channels [0,1,2,4]) + else if (pwmCount == 4 && CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + g_lightMode = Light_RGB; + } //cmddetail:{"name":"led_dimmer","args":"[Value]", //cmddetail:"descr":"set output dimmer 0..100", //cmddetail:"fn":"dimmer","file":"cmnds/cmd_newLEDDriver.c","requires":"", //cmddetail:"examples":""} CMD_RegisterCommand("led_dimmer", dimmer, NULL); + //cmddetail:{"name":"led_enableWhite","args":"[ignored]", + //cmddetail:"descr":"Switch to white mode for 4PWM RGBW (requires flag 52). White channel always at max; brightness via led_dimmer.", + //cmddetail:"fn":"led_enableWhite","file":"cmnds/cmd_newLEDDriver.c","requires":"", + //cmddetail:"examples":""} + CMD_RegisterCommand("led_enableWhite", led_enableWhite, NULL); //cmddetail:{"name":"Dimmer","args":"[Value]", //cmddetail:"descr":"Alias for led_dimmer, added for Tasmota.", //cmddetail:"fn":"dimmer","file":"cmnds/cmd_newLEDDriver.c","requires":"", diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index b08935a62f..06d19f494f 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -295,10 +295,16 @@ float LED_GetBlue255(); extern float led_baseColors[5]; extern byte g_lightEnableAll; extern byte g_lightMode; +enum LightColorMode { + LIGHT_COLOR_MODE_RGB = 0, + LIGHT_COLOR_MODE_WHITE = 1, +}; +extern byte g_colorMode; void LED_RunQuickColorLerp(int deltaMS); void LED_RunOnEverySecond(); OBK_Publish_Result sendFinalColor(); OBK_Publish_Result sendColorChange(); +OBK_Publish_Result sendColorMode(); OBK_Publish_Result LED_SendEnableAllState(); OBK_Publish_Result LED_SendDimmerChange(); OBK_Publish_Result sendTemperatureChange(); diff --git a/src/httpserver/hass.c b/src/httpserver/hass.c index 17e50f0bbe..c46e578de3 100644 --- a/src/httpserver/hass.c +++ b/src/httpserver/hass.c @@ -48,6 +48,7 @@ void hass_populate_unique_id(ENTITY_TYPE type, int index, char* uniq_id, int ase case LIGHT_PWMCW: case LIGHT_RGB: case LIGHT_RGBCW: + case LIGHT_RGBW: sprintf(uniq_id, "%s_%s", longDeviceName, "light"); break; @@ -178,6 +179,7 @@ void hass_populate_device_config_channel(ENTITY_TYPE type, char* uniq_id, HassDe case LIGHT_PWMCW: case LIGHT_RGB: case LIGHT_RGBCW: + case LIGHT_RGBW: sprintf(info->channel, "light/%s/config", uniq_id); break; case RELAY: @@ -563,6 +565,7 @@ HassDeviceInfo* hass_init_device_info(ENTITY_TYPE type, int index, const char* p case LIGHT_PWMCW: case LIGHT_RGB: case LIGHT_RGBCW: + case LIGHT_RGBW: //There can only be one RGB so we can skip including index in the name. Do the same //for 2 PWM case. sprintf(g_hassBuffer, "Light"); @@ -790,6 +793,21 @@ HassDeviceInfo* hass_init_light_device_info(ENTITY_TYPE type) { cJSON_AddStringToObject(info->root, "rgb_cmd_t", g_hassBuffer); //rgb_command_topic break; + case LIGHT_RGBW: + cJSON_AddStringToObject(info->root, "rgb_cmd_tpl", "{{'#%02x%02x%02x0000'|format(red,green,blue)}}"); + cJSON_AddStringToObject(info->root, "rgb_val_tpl", "{{ value[0:2]|int(base=16) }},{{ value[2:4]|int(base=16) }},{{ value[4:6]|int(base=16) }}"); + cJSON_AddStringToObject(info->root, "rgb_stat_t", "~/led_basecolor_rgb/get"); + sprintf(g_hassBuffer, "cmnd/%s/led_basecolor_rgb", clientId); + cJSON_AddStringToObject(info->root, "rgb_cmd_t", g_hassBuffer); + + sprintf(g_hassBuffer, "cmnd/%s/led_enableWhite", clientId); + cJSON_AddStringToObject(info->root, "whit_cmd_t", g_hassBuffer); + cJSON_AddNumberToObject(info->root, "whit_scl", 100); + + sprintf(g_hassBuffer, "%s", "~/led_colorMode/get"); + cJSON_AddStringToObject(info->root, "clrm_stat_t", g_hassBuffer); + break; + case LIGHT_ON_OFF: case LIGHT_PWM: brightness_scale = 100; diff --git a/src/httpserver/hass.h b/src/httpserver/hass.h index a3a51d2720..b2feabd043 100644 --- a/src/httpserver/hass.h +++ b/src/httpserver/hass.h @@ -28,6 +28,9 @@ typedef enum { /// @brief RGB + temperature (5 PWM or LED driver) LIGHT_RGBCW, + /// @brief RGB + independent White (4 PWM, flag 52) + LIGHT_RGBW, + /// @brief Power sensors (voltage, current, power) ENERGY_METER_SENSOR, diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index ef1d44b8f1..47abafe858 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -369,6 +369,21 @@ int http_fn_index(http_request_t* request) { } #endif } +#if ENABLE_LED_BASIC + if (http_getArg(request->url, "colormode", tmpA, sizeof(tmpA))) { + hprintf255(request, "

Switch to %s mode!

", tmpA); + if (strcmp(tmpA, "white") == 0) { + CMD_ExecuteCommandArgs("led_enableWhite", "100", COMMAND_FLAG_SOURCE_HTTP); + } else if (strcmp(tmpA, "rgb") == 0) { + char colorValue[16]; + LED_GetBaseColorString(colorValue); + CMD_ExecuteCommandArgs("led_basecolor_rgb", colorValue, COMMAND_FLAG_SOURCE_HTTP); + } + if (CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { + LED_SetEnableAll(true); + } + } +#endif if (http_getArg(request->url, "set", tmpA, sizeof(tmpA))) { int newSetValue = atoi(tmpA); http_getArg(request->url, "setIndex", tmpA, sizeof(tmpA)); @@ -812,16 +827,38 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "", SPECIAL_CHANNEL_BRIGHTNESS); poststr(request, ""); } + bool bRGBW = CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE); + bool bShowCWForPixelAnim = false; +#if ENABLE_DRIVER_PIXELANIM + if (DRV_IsRunning("PixelAnim")) { + if (c_realPwms == 2) + bShowCWForPixelAnim = true; + PixelAnim_CreatePanel(request); + } +#endif + if (bRGBW && c_pwms >= 4) { + poststr(request, ""); + poststr(request, "
"); + const char* rgbChecked = (g_colorMode == LIGHT_COLOR_MODE_RGB) ? "checked" : ""; + const char* whiteChecked = (g_colorMode == LIGHT_COLOR_MODE_WHITE) ? "checked" : ""; + poststr(request, "
Mode: "); + hprintf255(request, "RGB", rgbChecked); + hprintf255(request, "White", whiteChecked); + poststr(request, "
"); + poststr(request, "
"); + poststr(request, ""); + } if (c_pwms >= 3) { char colorValue[16]; inputName = "rgb"; const char* activeStr = ""; - if (lm == Light_RGB) { + if (!bRGBW && lm == Light_RGB) { activeStr = "[ACTIVE]"; } LED_GetBaseColorString(colorValue); - poststr(request, ""); + const char* rgbRowDisplay = (bRGBW && g_colorMode == LIGHT_COLOR_MODE_WHITE) ? " style=\"display:none\"" : ""; + hprintf255(request, "", rgbRowDisplay); hprintf255(request, "
LED RGB Color %s
", activeStr); hprintf255(request, "
", SPECIAL_CHANNEL_BASECOLOR); // onchange would fire only if colour was changed @@ -831,15 +868,7 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "
"); poststr(request, ""); } - bool bShowCWForPixelAnim = false; -#if ENABLE_DRIVER_PIXELANIM - if (DRV_IsRunning("PixelAnim")) { - if (c_realPwms == 2) - bShowCWForPixelAnim = true; - PixelAnim_CreatePanel(request); - } -#endif - if (c_pwms == 2 || c_pwms >= 4 || bShowCWForPixelAnim) { + if ((!bRGBW || c_pwms < 4) && (c_pwms == 2 || c_pwms >= 4 || bShowCWForPixelAnim)) { // TODO: temperature slider int pwmValue; const char* activeStr = ""; @@ -2164,7 +2193,10 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) { discoveryQueued = true; } else if (pwmCount > 0) { - if (pwmCount == 4) { + if (pwmCount == 4 && CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + dev_info = hass_init_light_device_info(LIGHT_RGBW); + } + else if (pwmCount == 4) { addLogAdv(LOG_ERROR, LOG_FEATURE_HTTP, "4 PWM device not yet handled"); } else if (pwmCount == 3) { @@ -2670,6 +2702,17 @@ void http_generate_cw_cfg(http_request_t* request, const char* clientId) { hprintf255(request, " color_temp_state_topic: \"%s/led_temperature/get\"\n", clientId); http_generate_singleColor_cfg(request, clientId); } +void http_generate_rgbw_cfg(http_request_t* request, const char* clientId) { + hprintf255(request, " rgb_command_template: \"{{ '#%%02x%%02x%%02x0000' | format(red, green, blue)}}\"\n"); + hprintf255(request, " rgb_value_template: \"{{ value[0:2]|int(base=16) }},{{ value[2:4]|int(base=16) }},{{ value[4:6]|int(base=16) }}\"\n"); + hprintf255(request, " rgb_state_topic: \"%s/led_basecolor_rgb/get\"\n", clientId); + hprintf255(request, " rgb_command_topic: \"cmnd/%s/led_basecolor_rgb\"\n", clientId); + hprintf255(request, " white_command_topic: \"cmnd/%s/led_enableWhite\"\n", clientId); + hprintf255(request, " white_scale: 100\n"); + hprintf255(request, " color_mode_state_topic: \"%s/led_colorMode/get\"\n", clientId); + + http_generate_singleColor_cfg(request, clientId); +} void hprintf_qos_payload(http_request_t* request, const char* clientId) { poststr(request, " qos: 1\n"); @@ -2771,7 +2814,22 @@ int http_fn_ha_cfg(http_request_t* request) { //hprintf255(request, " #color_temp_value_template: \"{{ value }}\"\n"); } else - if (pwmCount == 3) { + if (pwmCount == 4 && CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + // Enable + RGBW control + if (mqttAdded == 0) { + poststr(request, "mqtt:\n"); + mqttAdded = 1; + } + if (switchAdded == 0) { + poststr(request, " light:\n"); + switchAdded = 1; + } + + hass_print_unique_id(request, " - unique_id: \"%s\"\n", LIGHT_RGBW, i, 0); + hprintf255(request, " name: Light\n"); + http_generate_rgbw_cfg(request, clientId); + } + else if (pwmCount == 3) { // Enable + RGB control if (mqttAdded == 0) { poststr(request, "mqtt:\n"); @@ -3238,7 +3296,7 @@ const char* g_obk_flagNames[] = { "[HTTP] Hide ON/OFF for relays (only red/green buttons)", "[MQTT] Never add GET suffix", "[WiFi] (RTL/BK/BL602) Enhanced fast connect by saving AP data to flash (preferable with Flag 37 & static ip). Quick reset 3 times to connect normally", - "error", + "[LED] 4 PWM RGBW mode - 3 PWMs for RGB, 4th PWM for independent White channel", "error", "error", "error", diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index e1bb7c127f..124acedcb6 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -617,6 +617,10 @@ int channelGet(obk_mqtt_request_t* request) { sendColorChange(); return 1; } + if (stribegins(p, "led_colorMode")) { + sendColorMode(); + return 1; + } #endif // atoi won't parse any non-decimal chars, so it should skip over the rest of the topic. diff --git a/src/mqtt/new_mqtt_deduper.h b/src/mqtt/new_mqtt_deduper.h index 65edcfaddb..521a18e30e 100644 --- a/src/mqtt/new_mqtt_deduper.h +++ b/src/mqtt/new_mqtt_deduper.h @@ -16,6 +16,7 @@ typedef enum MQTT_Dedup_Slot_e { DEDUP_LED_ENABLEALL, // not enabled by default, but a user requested ability also to broadcast full RGBCW format DEDUP_LED_FINALCOLOR_RGBCW, + DEDUP_LED_COLOR_MODE, DEDUP_CURRENT_ANIM, DEDUP_MAX, } MQTT_Dedup_Slot_t; diff --git a/src/new_pins.h b/src/new_pins.h index bbe7a92cb3..1fb3e4ca00 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -1422,8 +1422,9 @@ typedef struct pinsState_s { #define OBK_FLAG_HTTP_NO_ONOFF_WORDS 49 #define OBK_FLAG_MQTT_NEVERAPPENDGET 50 #define OBK_FLAG_WIFI_ENHANCED_FAST_CONNECT 51 +#define OBK_FLAG_LED_4PWM_RGBW_MODE 52 -#define OBK_TOTAL_FLAGS 52 +#define OBK_TOTAL_FLAGS 53 #define LOGGER_FLAG_MQTT_DEDUPER 1 #define LOGGER_FLAG_POWER_SAVE 2 diff --git a/src/selftest/selftest_led.c b/src/selftest/selftest_led.c index 8522f86e49..f1474e239b 100644 --- a/src/selftest/selftest_led.c +++ b/src/selftest/selftest_led.c @@ -382,6 +382,129 @@ void Simulator_StoreBP5758DColor(unsigned short *data) { #define SELFTEST_ASSERT_SM_CHANNELS(a, b, c, d, e) SELFTEST_ASSERT(sim_smChannels[0] == a && sim_smChannels[1] == b && sim_smChannels[2] == c && sim_smChannels[3] == d && sim_smChannels[4] == e); +void Test_LEDDriver_4PWM_RGBW() { + // reset + SIM_ClearOBK(0); + + // Configure 4 PWMs on channels 0, 1, 2, 4 (skip 3 as per RGBW topology docs) + // P3 → ch0 (R), P4 → ch1 (G), P21 → ch2 (B), P20 → ch4 (W) + PIN_SetPinRoleForPinIndex(3, IOR_PWM); + PIN_SetPinChannelForPinIndex(3, 0); + PIN_SetPinRoleForPinIndex(4, IOR_PWM); + PIN_SetPinChannelForPinIndex(4, 1); + PIN_SetPinRoleForPinIndex(21, IOR_PWM); + PIN_SetPinChannelForPinIndex(21, 2); + PIN_SetPinRoleForPinIndex(20, IOR_PWM); + PIN_SetPinChannelForPinIndex(20, 4); + + // Enable Flag 52 (OBK_FLAG_LED_4PWM_RGBW_MODE) + CFG_SetFlag(OBK_FLAG_LED_4PWM_RGBW_MODE, true); + + // Enable light, full brightness + CMD_ExecuteCommand("led_enableAll 1", 0); + CMD_ExecuteCommand("led_dimmer 100", 0); + + // === RGB mode === + // Set red + CMD_ExecuteCommand("led_basecolor_rgb FF0000", 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT_CHANNEL(0, 100); // R + SELFTEST_ASSERT_CHANNEL(1, 0); // G + SELFTEST_ASSERT_CHANNEL(2, 0); // B + SELFTEST_ASSERT_CHANNEL(3, 0); // unused + SELFTEST_ASSERT_CHANNEL(4, 0); // W zeroed in RGB mode + + // Set green + CMD_ExecuteCommand("led_basecolor_rgb 00FF00", 0); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 100); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Set blue with # + CMD_ExecuteCommand("led_basecolor_rgb #0000FF", 0); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 100); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Dimmer in RGB mode (values match existing Test_LEDDriver_RGB assertions) + CMD_ExecuteCommand("led_dimmer 50", 0); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 21); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + SELFTEST_ASSERT_EXPRESSION("$led_dimmer", 50.0f); + + CMD_ExecuteCommand("led_dimmer 100", 0); + + // === White mode === + CMD_ExecuteCommand("led_enableWhite", 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT_CHANNEL(0, 0); // R zeroed in white mode + SELFTEST_ASSERT_CHANNEL(1, 0); // G zeroed in white mode + SELFTEST_ASSERT_CHANNEL(2, 0); // B zeroed in white mode + SELFTEST_ASSERT_CHANNEL(3, 0); // unused + SELFTEST_ASSERT_CHANNEL(4, 100); // W full + + // Dimmer in white mode (same gamma curve as RGB) + CMD_ExecuteCommand("led_dimmer 50", 0); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 21); + + CMD_ExecuteCommand("led_dimmer 100", 0); + + // Switch back to RGB mode via led_basecolor_rgb + CMD_ExecuteCommand("led_basecolor_rgb FF0000", 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT_CHANNEL(0, 100); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Back to white + CMD_ExecuteCommand("led_enableWhite", 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT_CHANNEL(4, 100); + SELFTEST_ASSERT_CHANNEL(0, 0); + + // === Test enable/disable === + CMD_ExecuteCommand("led_enableAll 0", 0); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Re-enable should retain white mode and value + CMD_ExecuteCommand("led_enableAll 1", 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT_CHANNEL(4, 100); + SELFTEST_ASSERT_CHANNEL(0, 0); + + // === Test Web UI === + // White mode: White radio checked, RGB picker hidden, temperature suppressed + Test_FakeHTTPClientPacket_GET("index"); + SELFTEST_ASSERT_HTML_REPLY_CONTAINS("rgbPickerRow\" style=\"display:none\""); + SELFTEST_ASSERT_HTML_REPLY_CONTAINS("LED RGB Color"); + SELFTEST_ASSERT_HTML_REPLY_CONTAINS("checked>White"); + SELFTEST_ASSERT_HTML_REPLY_NOT_CONTAINS("checked>RGB"); + SELFTEST_ASSERT_HTML_REPLY_NOT_CONTAINS("LED Temperature Slider"); + + // Switch to RGB mode: RGB radio checked, RGB picker shown + CMD_ExecuteCommand("led_basecolor_rgb 00FF00", 0); + Test_FakeHTTPClientPacket_GET("index"); + SELFTEST_ASSERT_HTML_REPLY_CONTAINS("checked>RGB"); + SELFTEST_ASSERT_HTML_REPLY_NOT_CONTAINS("checked>White"); + SELFTEST_ASSERT_HTML_REPLY_CONTAINS("rgbPickerRow\">"); + SELFTEST_ASSERT_HTML_REPLY_NOT_CONTAINS("rgbPickerRow\" style=\"display:none\""); + SELFTEST_ASSERT_HTML_REPLY_NOT_CONTAINS("LED Temperature Slider"); +} void Test_LEDDriver_RGBCW() { // reset whole device SIM_ClearOBK(0); @@ -1031,6 +1154,7 @@ void Test_LEDDriver() { Test_LEDDriver_Palette(); Test_LEDDriver_BP5758_RGBCW(); Test_LEDDriver_SM2235_RGBCW(); + Test_LEDDriver_4PWM_RGBW(); } #endif diff --git a/src/selftest/selftest_mqtt.c b/src/selftest/selftest_mqtt.c index aea5b1ef46..74723f9186 100644 --- a/src/selftest/selftest_mqtt.c +++ b/src/selftest/selftest_mqtt.c @@ -511,6 +511,99 @@ void Test_MQTT_LED_RGBCW() { // if assert has passed, we can clear SIM MQTT history, it's no longer needed SIM_ClearMQTTHistory(); } +void Test_MQTT_LED_4PWM_RGBW() { + SIM_ClearOBK(0); + SIM_ClearAndPrepareForMQTTTesting("fakeRGBW4PWM", "bekens"); + + // Configure 4 PWMs on channels 0, 1, 2, 4 (skip 3) + PIN_SetPinRoleForPinIndex(3, IOR_PWM); + PIN_SetPinChannelForPinIndex(3, 0); + PIN_SetPinRoleForPinIndex(4, IOR_PWM); + PIN_SetPinChannelForPinIndex(4, 1); + PIN_SetPinRoleForPinIndex(21, IOR_PWM); + PIN_SetPinChannelForPinIndex(21, 2); + PIN_SetPinRoleForPinIndex(20, IOR_PWM); + PIN_SetPinChannelForPinIndex(20, 4); + + CFG_SetFlag(OBK_FLAG_LED_4PWM_RGBW_MODE, true); + CFG_SetFlag(OBK_FLAG_MQTT_BROADCASTLEDFINALCOLOR, true); + + // Enable and set RGB via MQTT + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_enableAll", "1"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_enableAll/get", "1", false); + SIM_ClearMQTTHistory(); + + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_basecolor_rgb", "FF0000"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_basecolor_rgb/get", "FF0000", false); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_finalcolor_rgb/get", "FF0000", false); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_colorMode/get", "rgb", false); + SIM_ClearMQTTHistory(); + + // RGB mode: ch0=R active, ch4=W zeroed + SELFTEST_ASSERT_CHANNEL(0, 100); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + + // Switch to white mode via MQTT + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_enableWhite", ""); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_colorMode/get", "white", false); + SIM_ClearMQTTHistory(); + + // White mode: ch4=W active, ch0-2=RGB zeroed + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(3, 0); + SELFTEST_ASSERT_CHANNEL(4, 100); + + // Dimmer via MQTT in white mode + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_dimmer", "50"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_dimmer/get", "50", false); + SIM_ClearMQTTHistory(); + + SELFTEST_ASSERT_CHANNEL(4, 21); + + // Back to full + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_dimmer", "100"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_dimmer/get", "100", false); + SIM_ClearMQTTHistory(); + + // Switch back to RGB mode via MQTT + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_basecolor_rgb", "00FF00"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_basecolor_rgb/get", "00FF00", false); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_colorMode/get", "rgb", false); + SIM_ClearMQTTHistory(); + + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 100); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Disable via MQTT + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_enableAll", "0"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_enableAll/get", "0", false); + SIM_ClearMQTTHistory(); + + SELFTEST_ASSERT_CHANNEL(0, 0); + SELFTEST_ASSERT_CHANNEL(1, 0); + SELFTEST_ASSERT_CHANNEL(2, 0); + SELFTEST_ASSERT_CHANNEL(4, 0); + + // Re-enable + SIM_SendFakeMQTTAndRunSimFrame_CMND("led_enableAll", "1"); + SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_enableAll/get", "1", false); + SIM_ClearMQTTHistory(); + CFG_SetFlag(OBK_FLAG_LED_4PWM_RGBW_MODE, false); + + SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT_CHANNEL(1, 100); + SELFTEST_ASSERT_CHANNEL(4, 0); +} void Test_MQTT_Misc() { SIM_ClearOBK(0); SIM_ClearAndPrepareForMQTTTesting("miscDevice", "bekens"); @@ -836,6 +929,7 @@ void Test_MQTT(){ Test_MQTT_LED_CW(); Test_MQTT_LED_RGB(); Test_MQTT_LED_RGBCW(); + Test_MQTT_LED_4PWM_RGBW(); #endif Test_MQTT_Topic_With_Slash(); Test_MQTT_Topic_With_Slashes(); diff --git a/src/selftest/selftest_tuyaMCU_batteryPowered.c b/src/selftest/selftest_tuyaMCU_batteryPowered.c index e73c36a114..348a467dac 100644 --- a/src/selftest/selftest_tuyaMCU_batteryPowered.c +++ b/src/selftest/selftest_tuyaMCU_batteryPowered.c @@ -350,12 +350,17 @@ void Test_TuyaMCU_BatteryPowered_QuerySignalStrength() { SELFTEST_ASSERT_HAS_SENT_UART_STRING("55 AA 00 01 00 00 00"); // nothing is sent by OBK at that point SELFTEST_ASSERT_HAS_UART_EMPTY(); + // Respond to QueryInfo so state machine leaves TM0_STATE_AWAITING_INFO + CMD_ExecuteCommand("uartFakeHex 55 AA 00 01 00 01 58 59", 0); + Sim_RunFrames(1, false); + SELFTEST_ASSERT_HAS_UART_EMPTY(); CMD_ExecuteCommand("uartFakeHex 55 AA 00 0B 00 00 0A", 0); Sim_RunSeconds(0.1f, false); SELFTEST_ASSERT_HAS_SENT_UART_STRING("55 AA 00 0B 00 02 01 50 5D"); - // nothing is sent by OBK at that point + // Consume periodic WiFi state packet if Main_OnEverySecond fired during the window + SIM_UART_ExpectAndConsumeHexStr("55 AA 00 02 00 01 03 05"); SELFTEST_ASSERT_HAS_UART_EMPTY(); } void Test_TuyaMCU_BatteryPowered() { From 15fbf976cfe080670c53fb7bc37f89e40a7beae3 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 19 Jul 2026 13:24:25 +0300 Subject: [PATCH 2/4] Flag 12: save/restore white channel and colorMode for RGBW (flag 52) - Store colorMode (RGB/White) in mode slot high byte - Reuse temperature slot for white channel when flag 52 is active - Add HAL_LED_PackModeAndColorMode / UnpackModeAndColorMode helpers - Update all 14 HAL implementations, flags docs - Struct stays at 64 bytes, zero format change --- docs/flags.md | 2 +- docs/json/flags.json | 2 +- src/cmnds/cmd_newLEDDriver.c | 15 +++++++++++---- src/hal/bk7231/hal_flashVars_bk7231.c | 13 +++++++------ src/hal/bl602/hal_flashVars_bl602.c | 13 +++++++------ src/hal/ecr6600/hal_flashVars_ecr6600.c | 13 +++++++------ src/hal/espidf/hal_flashVars_espidf.c | 12 ++++++++---- src/hal/gd32vw553/hal_flashVars_gd32vw553.c | 13 +++++++------ src/hal/generic/hal_flashVars_generic.c | 4 ++-- src/hal/hal_flashVars.h | 12 ++++++++++-- src/hal/ln882h/hal_flashVars_ln882h.c | 14 ++++++++------ src/hal/rda5981/hal_flashVars_rda5981.c | 13 +++++++------ src/hal/realtek/hal_flashVars_realtek.c | 13 +++++++------ src/hal/tr6260/hal_flashVars_tr6260.c | 13 +++++++------ src/hal/txw81x/hal_flashVars_txw81x.c | 13 +++++++------ src/hal/w800/hal_flashVars_w800.c | 13 +++++++------ src/hal/win32/hal_flashVars_win32.c | 4 ++-- src/hal/xradio/hal_flashVars_xradio.c | 13 +++++++------ src/httpserver/http_fns.c | 2 +- 19 files changed, 114 insertions(+), 83 deletions(-) diff --git a/docs/flags.md b/docs/flags.md index a2aaa129e3..ad2c872356 100644 --- a/docs/flags.md +++ b/docs/flags.md @@ -17,7 +17,7 @@ Do not add anything here, as it will overwritten with next rebuild. | 9 | [SM2135] Use separate RGB/CW modes instead of writing all 5 values as RGB | | 10 | [MQTT] Broadcast self state on MQTT connect | | 11 | [PWM] BK7231 use 600hz instead of 1khz default | -| 12 | [LED] Remember LED driver state (RGBCW, enable, brightness, temperature) after reboot | +| 12 | [LED] Remember LED driver state (RGBCW/RGBW, enable, brightness, temperature) after reboot | | 13 | [HTTP] Show actual PIN logic level for unconfigured pins | | 14 | [IR] Do MQTT publish (RAW STRING) for incoming IR data | | 15 | [IR] Allow 'unknown' protocol | diff --git a/docs/json/flags.json b/docs/json/flags.json index 3f71fbc7a5..4c9457e3d8 100644 --- a/docs/json/flags.json +++ b/docs/json/flags.json @@ -88,7 +88,7 @@ "enum": "OBK_FLAG_LED_REMEMBERLASTSTATE", "title": "todo", "file": "new_pins.h", - "descr": "[LED] Remember LED driver state (RGBCW, enable, brightness, temperature) after reboot" + "descr": "[LED] Remember LED driver state (RGBCW/RGBW, enable, brightness, temperature) after reboot" }, { "index": "13", diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index 7bb2868b73..972bf9f40c 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -549,7 +549,8 @@ OBK_Publish_Result sendTemperatureChange() { #endif void LED_SaveStateToFlashVarsNow() { - HAL_FlashVars_SaveLED(g_lightMode, g_brightness0to100, led_temperature_current, led_baseColors[0], led_baseColors[1], led_baseColors[2], g_lightEnableAll); + short tempOrWhite = CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE) ? led_baseColors[4] : led_temperature_current; + HAL_FlashVars_SaveLED(g_lightMode, g_brightness0to100, tempOrWhite, led_baseColors[0], led_baseColors[1], led_baseColors[2], g_lightEnableAll, g_colorMode); } void apply_smart_light() { int i; @@ -1955,17 +1956,23 @@ void NewLED_InitCommands(){ void NewLED_RestoreSavedStateIfNeeded() { if(CFG_HasFlag(OBK_FLAG_LED_REMEMBERLASTSTATE)) { short brig; - short tmp; + short tmpOrWhite; byte rgb[3]; byte mod; byte bEnableAll; + byte colorMode; - HAL_FlashVars_ReadLED(&mod, &brig, &tmp, rgb, &bEnableAll); + HAL_FlashVars_ReadLED(&mod, &brig, &tmpOrWhite, rgb, &bEnableAll, &colorMode); g_lightEnableAll = bEnableAll; SET_LightMode(mod); g_brightness0to100 = brig; - LED_SetTemperature(tmp,0); + g_colorMode = colorMode; + if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { + led_baseColors[4] = (byte)tmpOrWhite; + } else { + LED_SetTemperature(tmpOrWhite, 0); + } led_baseColors[0] = rgb[0]; led_baseColors[1] = rgb[1]; led_baseColors[2] = rgb[2]; diff --git a/src/hal/bk7231/hal_flashVars_bk7231.c b/src/hal/bk7231/hal_flashVars_bk7231.c index 18eb204c85..158b8e83d8 100644 --- a/src/hal/bk7231/hal_flashVars_bk7231.c +++ b/src/hal/bk7231/hal_flashVars_bk7231.c @@ -83,22 +83,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -107,9 +107,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/bl602/hal_flashVars_bl602.c b/src/hal/bl602/hal_flashVars_bl602.c index c4c01a9585..516fd15019 100644 --- a/src/hal/bl602/hal_flashVars_bl602.c +++ b/src/hal/bl602/hal_flashVars_bl602.c @@ -83,22 +83,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -107,9 +107,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/ecr6600/hal_flashVars_ecr6600.c b/src/hal/ecr6600/hal_flashVars_ecr6600.c index 9e4830a106..79cd37a0a2 100644 --- a/src/hal/ecr6600/hal_flashVars_ecr6600.c +++ b/src/hal/ecr6600/hal_flashVars_ecr6600.c @@ -68,22 +68,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -92,9 +92,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/espidf/hal_flashVars_espidf.c b/src/hal/espidf/hal_flashVars_espidf.c index e741ad5945..d5a011b28b 100644 --- a/src/hal/espidf/hal_flashVars_espidf.c +++ b/src/hal/espidf/hal_flashVars_espidf.c @@ -46,34 +46,38 @@ void HAL_FlashVars_SaveChannel(int index, int value) nvs_close(handle); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { InitFlashIfNeeded(); nvs_handle_t handle = 0; nvs_open("config", NVS_READONLY, &handle); nvs_get_u8(handle, "mode", mode); nvs_get_i16(handle, "brs", brightness); - nvs_get_i16(handle, "temp", temperature); + nvs_get_i16(handle, "temp", temperatureOrWhite); nvs_get_u8(handle, "r", &rgb[0]); nvs_get_u8(handle, "g", &rgb[1]); nvs_get_u8(handle, "b", &rgb[2]); nvs_get_u8(handle, "ena", bEnableAll); + if (nvs_get_u8(handle, "clr", colorMode) != ESP_OK) { + *colorMode = 0; + } nvs_close(handle); } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { InitFlashIfNeeded(); nvs_handle_t handle = 0; nvs_open("config", NVS_READWRITE, &handle); nvs_set_u8(handle, "mode", mode); nvs_set_i16(handle, "brs", brightness); - nvs_set_i16(handle, "temp", temperature); + nvs_set_i16(handle, "temp", temperatureOrWhite); nvs_set_u8(handle, "r", r); nvs_set_u8(handle, "g", g); nvs_set_u8(handle, "b", b); nvs_set_u8(handle, "ena", bEnableAll); + nvs_set_u8(handle, "clr", colorMode); nvs_commit(handle); nvs_close(handle); } diff --git a/src/hal/gd32vw553/hal_flashVars_gd32vw553.c b/src/hal/gd32vw553/hal_flashVars_gd32vw553.c index 74184bc562..9d12dc5b72 100644 --- a/src/hal/gd32vw553/hal_flashVars_gd32vw553.c +++ b/src/hal/gd32vw553/hal_flashVars_gd32vw553.c @@ -69,22 +69,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -93,9 +93,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/generic/hal_flashVars_generic.c b/src/hal/generic/hal_flashVars_generic.c index 19f2ff049e..345409cc89 100644 --- a/src/hal/generic/hal_flashVars_generic.c +++ b/src/hal/generic/hal_flashVars_generic.c @@ -13,12 +13,12 @@ void __attribute__((weak)) HAL_FlashVars_SaveChannel(int index, int value) } -void __attribute__((weak)) HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void __attribute__((weak)) HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { } -void __attribute__((weak)) HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void __attribute__((weak)) HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { } diff --git a/src/hal/hal_flashVars.h b/src/hal/hal_flashVars.h index 70e6a01ca3..ba6250c4c1 100644 --- a/src/hal/hal_flashVars.h +++ b/src/hal/hal_flashVars.h @@ -52,6 +52,14 @@ typedef struct flash_vars_structure #define MAGIC_FLASHVARS_SIZE 64 +static inline short HAL_LED_PackModeAndColorMode(byte mode, byte colorMode) { + return mode | ((short)colorMode << 8); +} +static inline void HAL_LED_UnpackModeAndColorMode(short packed, byte* mode, byte* colorMode) { + *mode = packed & 0xFF; + *colorMode = (packed >> 8) & 0xFF; +} + // call at startup void HAL_FlashVars_IncreaseBootCount(); // call once started (>30s?) @@ -60,8 +68,8 @@ void HAL_FlashVars_SaveBootComplete(); int HAL_FlashVars_GetBootFailures(); int HAL_FlashVars_GetBootCount(); void HAL_FlashVars_SaveChannel(int index, int value); -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll); -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll); +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode); +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode); int HAL_FlashVars_GetChannelValue(int ch); int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA* data); int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA* data); diff --git a/src/hal/ln882h/hal_flashVars_ln882h.c b/src/hal/ln882h/hal_flashVars_ln882h.c index 40639d3980..d609adf0c7 100644 --- a/src/hal/ln882h/hal_flashVars_ln882h.c +++ b/src/hal/ln882h/hal_flashVars_ln882h.c @@ -81,12 +81,12 @@ void HAL_FlashVars_SaveChannel(int index, int value) { #endif } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) { +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { #ifndef DISABLE_FLASH_VARS_VARS if (flash_vars_init()) { *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; @@ -102,19 +102,21 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, by counter++; \ } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { #ifndef DISABLE_FLASH_VARS_VARS int iChangesCount = 0; if (flash_vars_init()) { + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[2], b, iChangesCount); + flash_vars.len = MAGIC_FLASHVARS_SIZE; if (iChangesCount > 0) { flash_vars_store(); } diff --git a/src/hal/rda5981/hal_flashVars_rda5981.c b/src/hal/rda5981/hal_flashVars_rda5981.c index 3e9a5941bb..a4b967466c 100644 --- a/src/hal/rda5981/hal_flashVars_rda5981.c +++ b/src/hal/rda5981/hal_flashVars_rda5981.c @@ -70,22 +70,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -94,9 +94,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/realtek/hal_flashVars_realtek.c b/src/hal/realtek/hal_flashVars_realtek.c index 672a1f7957..6d759cac54 100644 --- a/src/hal/realtek/hal_flashVars_realtek.c +++ b/src/hal/realtek/hal_flashVars_realtek.c @@ -70,22 +70,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -94,9 +94,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/tr6260/hal_flashVars_tr6260.c b/src/hal/tr6260/hal_flashVars_tr6260.c index 6899ef8d32..285cc66629 100644 --- a/src/hal/tr6260/hal_flashVars_tr6260.c +++ b/src/hal/tr6260/hal_flashVars_tr6260.c @@ -66,22 +66,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -90,9 +90,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/txw81x/hal_flashVars_txw81x.c b/src/hal/txw81x/hal_flashVars_txw81x.c index 1d1c2cea95..ee903c4b9e 100644 --- a/src/hal/txw81x/hal_flashVars_txw81x.c +++ b/src/hal/txw81x/hal_flashVars_txw81x.c @@ -70,22 +70,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -94,9 +94,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/w800/hal_flashVars_w800.c b/src/hal/w800/hal_flashVars_w800.c index 2ae9862752..3bb6352d54 100644 --- a/src/hal/w800/hal_flashVars_w800.c +++ b/src/hal/w800/hal_flashVars_w800.c @@ -86,14 +86,15 @@ int HAL_FlashVars_GetChannelValue(int ch) { } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { #ifndef DISABLE_FLASH_VARS_VARS int iChangesCount = 0; ef_get_env_blob(KV_KEY_FLASH_VARS, &flash_vars, FLASH_VARS_STRUCTURE_SIZE, NULL); + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); @@ -105,11 +106,11 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte } #endif } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) { +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { #ifndef DISABLE_FLASH_VARS_VARS * bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; diff --git a/src/hal/win32/hal_flashVars_win32.c b/src/hal/win32/hal_flashVars_win32.c index 191e9f0f5a..bc689fa36f 100644 --- a/src/hal/win32/hal_flashVars_win32.c +++ b/src/hal/win32/hal_flashVars_win32.c @@ -23,10 +23,10 @@ void HAL_FlashVars_SaveChannel(int index, int value) { int HAL_FlashVars_GetChannelValue(int ch) { return 0; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { } -void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperature, byte *rgb, byte *bEnableAll) { +void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperatureOrWhite, byte *rgb, byte *bEnableAll, byte *colorMode) { } diff --git a/src/hal/xradio/hal_flashVars_xradio.c b/src/hal/xradio/hal_flashVars_xradio.c index 9ffe9e4d4c..925a9f161c 100644 --- a/src/hal/xradio/hal_flashVars_xradio.c +++ b/src/hal/xradio/hal_flashVars_xradio.c @@ -70,22 +70,22 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; - *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; rgb[1] = flash_vars.rgb[1]; rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { int iChangesCount = 0; @@ -94,9 +94,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte ReadFlashVars(&flash_vars, sizeof(flash_vars)); } + short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 47abafe858..d1bda8ae5a 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -3254,7 +3254,7 @@ const char* g_obk_flagNames[] = { "[SM2135] Use separate RGB/CW modes instead of writing all 5 values as RGB", "[MQTT] Broadcast self state on MQTT connect", "[PWM] BK7231 use 600hz instead of 1khz default", - "[LED] Remember LED driver state (RGBCW, enable, brightness, temperature) after reboot", + "[LED] Remember LED driver state (RGBCW/RGBW, enable, brightness, temperature) after reboot", "[HTTP] Show actual PIN logic level for unconfigured pins", "[IR] Do MQTT publish (RAW STRING) for incoming IR data", "[IR] Allow 'unknown' protocol", From 25738399e813975bd151b3a287990c301cad2aef Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 19 Jul 2026 23:11:36 +0300 Subject: [PATCH 3/4] Replace g_colorMode with Light_White for 4PWM RGBW mode --- src/cmnds/cmd_newLEDDriver.c | 37 ++++++++------------- src/cmnds/cmd_public.h | 7 ++-- src/hal/bk7231/hal_flashVars_bk7231.c | 9 +++-- src/hal/bl602/hal_flashVars_bl602.c | 9 +++-- src/hal/ecr6600/hal_flashVars_ecr6600.c | 9 +++-- src/hal/espidf/hal_flashVars_espidf.c | 8 ++--- src/hal/gd32vw553/hal_flashVars_gd32vw553.c | 9 +++-- src/hal/generic/hal_flashVars_generic.c | 4 +-- src/hal/hal_flashVars.h | 12 ++----- src/hal/ln882h/hal_flashVars_ln882h.c | 9 +++-- src/hal/rda5981/hal_flashVars_rda5981.c | 9 +++-- src/hal/realtek/hal_flashVars_realtek.c | 9 +++-- src/hal/tr6260/hal_flashVars_tr6260.c | 9 +++-- src/hal/txw81x/hal_flashVars_txw81x.c | 9 +++-- src/hal/w800/hal_flashVars_w800.c | 9 +++-- src/hal/win32/hal_flashVars_win32.c | 4 +-- src/hal/xradio/hal_flashVars_xradio.c | 9 +++-- src/httpserver/http_fns.c | 6 ++-- src/selftest/selftest_led.c | 10 +++--- src/selftest/selftest_mqtt.c | 8 ++--- 20 files changed, 79 insertions(+), 116 deletions(-) diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index 972bf9f40c..8ca6e19800 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -78,10 +78,6 @@ short led_timeUntilNextSavePossible = 0; byte g_ledStateSavePending = 0; byte g_numBaseColors = 5; byte g_lightMode = Light_RGB; -// 0=rgb, 1=white — selects active channels in OBK_FLAG_LED_4PWM_RGBW_MODE. -// In RGB mode ch0-2 output, ch4 (white) is zeroed. -// In White mode ch4 outputs, ch0-2 (RGB) are zeroed. -byte g_colorMode = LIGHT_COLOR_MODE_RGB; // NOTE: in this system, enabling/disabling whole led light bulb // is not changing the stored channel and brightness values. @@ -99,7 +95,6 @@ void LED_ResetGlobalVariablesToDefaults() { int i; g_lightMode = Light_RGB; - g_colorMode = LIGHT_COLOR_MODE_RGB; for (i = 0; i < 5; i++) { led_baseColors[i] = 255; finalColors[i] = 0; @@ -518,6 +513,9 @@ OBK_Publish_Result LED_SendCurrentLightModeParam_TempOrColor() { } return sendColorChange(); } + else if (g_lightMode == Light_White) { + sendColorMode(); + } return OBK_PUBLISH_WAS_NOT_REQUIRED; } OBK_Publish_Result sendFinalColor() { @@ -550,7 +548,7 @@ OBK_Publish_Result sendTemperatureChange() { void LED_SaveStateToFlashVarsNow() { short tempOrWhite = CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE) ? led_baseColors[4] : led_temperature_current; - HAL_FlashVars_SaveLED(g_lightMode, g_brightness0to100, tempOrWhite, led_baseColors[0], led_baseColors[1], led_baseColors[2], g_lightEnableAll, g_colorMode); + HAL_FlashVars_SaveLED(g_lightMode, g_brightness0to100, tempOrWhite, led_baseColors[0], led_baseColors[1], led_baseColors[2], g_lightEnableAll); } void apply_smart_light() { int i; @@ -623,18 +621,10 @@ void apply_smart_light() { } } else if (g_lightMode == Light_RGB) { - if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { - // RGB+W mode with channel topology [0]=R, [1]=G, [2]=B, [3]=unused, [4]=W - if (g_colorMode == LIGHT_COLOR_MODE_RGB) { - // RGB mode: zero channels 3+ (white + unused gap) - if (i >= 3) { baseRGBCW[i] = 0; final = 0; } - } else { - // White mode: zero channels 0-3 (RGB + unused gap) - if (i <= 3) { baseRGBCW[i] = 0; final = 0; } - } - } else { - if (i >= 3) { baseRGBCW[i] = 0; final = 0; } - } + if (i >= 3) { baseRGBCW[i] = 0; final = 0; } + } else if (g_lightMode == Light_White) { + // White sub-mode for 4PWM RGBW: only channel 4 active, zero 0-3 + if (i <= 3) { baseRGBCW[i] = 0; final = 0; } } else if(g_lightMode == Light_Anim) { // skip all? baseRGBCW[i] = 0; @@ -837,6 +827,8 @@ const char *GetLightModeStr(int mode) { return "cw"; if(mode == Light_RGB) return "rgb"; + if(mode == Light_White) + return "white"; return "er"; } void SET_LightMode(int newMode) { @@ -1281,7 +1273,7 @@ static commandResult_t dimmer(const void *context, const char *cmd, const char * #if ENABLE_MQTT // Publish current color mode ("rgb" or "white") for HA to switch UI OBK_Publish_Result sendColorMode() { - const char *mode = (g_colorMode == LIGHT_COLOR_MODE_RGB) ? "rgb" : "white"; + const char *mode = (g_lightMode == Light_White) ? "white" : "rgb"; return MQTT_PublishMain_StringString_DeDuped(DEDUP_LED_COLOR_MODE, DEDUP_EXPIRE_TIME, "led_colorMode", mode, 0); } #endif @@ -1293,7 +1285,7 @@ static commandResult_t led_enableWhite(const void *context, const char *cmd, con return CMD_RES_ERROR; } - g_colorMode = LIGHT_COLOR_MODE_WHITE; + g_lightMode = Light_White; led_baseColors[4] = 255.0f; @@ -1510,7 +1502,6 @@ commandResult_t LED_SetBaseColor(const void *context, const char *cmd, const cha SET_LightMode(Light_All); } else { SET_LightMode(Light_RGB); - g_colorMode = LIGHT_COLOR_MODE_RGB; } g_numBaseColors = 0; @@ -1960,14 +1951,12 @@ void NewLED_RestoreSavedStateIfNeeded() { byte rgb[3]; byte mod; byte bEnableAll; - byte colorMode; - HAL_FlashVars_ReadLED(&mod, &brig, &tmpOrWhite, rgb, &bEnableAll, &colorMode); + HAL_FlashVars_ReadLED(&mod, &brig, &tmpOrWhite, rgb, &bEnableAll); g_lightEnableAll = bEnableAll; SET_LightMode(mod); g_brightness0to100 = brig; - g_colorMode = colorMode; if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE)) { led_baseColors[4] = (byte)tmpOrWhite; } else { diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index 06d19f494f..d9021eca02 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -202,6 +202,7 @@ enum LightMode { Light_RGB, Light_All, Light_Anim, + Light_White, }; #define TOKENIZER_ALLOW_QUOTES 1 @@ -295,11 +296,7 @@ float LED_GetBlue255(); extern float led_baseColors[5]; extern byte g_lightEnableAll; extern byte g_lightMode; -enum LightColorMode { - LIGHT_COLOR_MODE_RGB = 0, - LIGHT_COLOR_MODE_WHITE = 1, -}; -extern byte g_colorMode; + void LED_RunQuickColorLerp(int deltaMS); void LED_RunOnEverySecond(); OBK_Publish_Result sendFinalColor(); diff --git a/src/hal/bk7231/hal_flashVars_bk7231.c b/src/hal/bk7231/hal_flashVars_bk7231.c index 158b8e83d8..c673fb404f 100644 --- a/src/hal/bk7231/hal_flashVars_bk7231.c +++ b/src/hal/bk7231/hal_flashVars_bk7231.c @@ -83,14 +83,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -98,7 +98,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -107,10 +107,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/bl602/hal_flashVars_bl602.c b/src/hal/bl602/hal_flashVars_bl602.c index 516fd15019..1df8bfe651 100644 --- a/src/hal/bl602/hal_flashVars_bl602.c +++ b/src/hal/bl602/hal_flashVars_bl602.c @@ -83,14 +83,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -98,7 +98,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -107,10 +107,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/ecr6600/hal_flashVars_ecr6600.c b/src/hal/ecr6600/hal_flashVars_ecr6600.c index 79cd37a0a2..b445708970 100644 --- a/src/hal/ecr6600/hal_flashVars_ecr6600.c +++ b/src/hal/ecr6600/hal_flashVars_ecr6600.c @@ -68,14 +68,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -83,7 +83,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -92,10 +92,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/espidf/hal_flashVars_espidf.c b/src/hal/espidf/hal_flashVars_espidf.c index d5a011b28b..20729d8ae4 100644 --- a/src/hal/espidf/hal_flashVars_espidf.c +++ b/src/hal/espidf/hal_flashVars_espidf.c @@ -46,7 +46,7 @@ void HAL_FlashVars_SaveChannel(int index, int value) nvs_close(handle); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { InitFlashIfNeeded(); nvs_handle_t handle = 0; @@ -58,14 +58,11 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh nvs_get_u8(handle, "g", &rgb[1]); nvs_get_u8(handle, "b", &rgb[2]); nvs_get_u8(handle, "ena", bEnableAll); - if (nvs_get_u8(handle, "clr", colorMode) != ESP_OK) { - *colorMode = 0; - } nvs_close(handle); } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { InitFlashIfNeeded(); nvs_handle_t handle = 0; @@ -77,7 +74,6 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite nvs_set_u8(handle, "g", g); nvs_set_u8(handle, "b", b); nvs_set_u8(handle, "ena", bEnableAll); - nvs_set_u8(handle, "clr", colorMode); nvs_commit(handle); nvs_close(handle); } diff --git a/src/hal/gd32vw553/hal_flashVars_gd32vw553.c b/src/hal/gd32vw553/hal_flashVars_gd32vw553.c index 9d12dc5b72..5b53e6ce2e 100644 --- a/src/hal/gd32vw553/hal_flashVars_gd32vw553.c +++ b/src/hal/gd32vw553/hal_flashVars_gd32vw553.c @@ -69,14 +69,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -84,7 +84,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -93,10 +93,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/generic/hal_flashVars_generic.c b/src/hal/generic/hal_flashVars_generic.c index 345409cc89..81a070d076 100644 --- a/src/hal/generic/hal_flashVars_generic.c +++ b/src/hal/generic/hal_flashVars_generic.c @@ -13,12 +13,12 @@ void __attribute__((weak)) HAL_FlashVars_SaveChannel(int index, int value) } -void __attribute__((weak)) HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void __attribute__((weak)) HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { } -void __attribute__((weak)) HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void __attribute__((weak)) HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { } diff --git a/src/hal/hal_flashVars.h b/src/hal/hal_flashVars.h index ba6250c4c1..65d790392e 100644 --- a/src/hal/hal_flashVars.h +++ b/src/hal/hal_flashVars.h @@ -52,14 +52,6 @@ typedef struct flash_vars_structure #define MAGIC_FLASHVARS_SIZE 64 -static inline short HAL_LED_PackModeAndColorMode(byte mode, byte colorMode) { - return mode | ((short)colorMode << 8); -} -static inline void HAL_LED_UnpackModeAndColorMode(short packed, byte* mode, byte* colorMode) { - *mode = packed & 0xFF; - *colorMode = (packed >> 8) & 0xFF; -} - // call at startup void HAL_FlashVars_IncreaseBootCount(); // call once started (>30s?) @@ -68,8 +60,8 @@ void HAL_FlashVars_SaveBootComplete(); int HAL_FlashVars_GetBootFailures(); int HAL_FlashVars_GetBootCount(); void HAL_FlashVars_SaveChannel(int index, int value); -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode); -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode); +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll); +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll); int HAL_FlashVars_GetChannelValue(int ch); int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA* data); int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA* data); diff --git a/src/hal/ln882h/hal_flashVars_ln882h.c b/src/hal/ln882h/hal_flashVars_ln882h.c index d609adf0c7..40351dcfe6 100644 --- a/src/hal/ln882h/hal_flashVars_ln882h.c +++ b/src/hal/ln882h/hal_flashVars_ln882h.c @@ -81,11 +81,11 @@ void HAL_FlashVars_SaveChannel(int index, int value) { #endif } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { #ifndef DISABLE_FLASH_VARS_VARS if (flash_vars_init()) { *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -102,16 +102,15 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh counter++; \ } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { #ifndef DISABLE_FLASH_VARS_VARS int iChangesCount = 0; if (flash_vars_init()) { - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/rda5981/hal_flashVars_rda5981.c b/src/hal/rda5981/hal_flashVars_rda5981.c index a4b967466c..f5656e1ead 100644 --- a/src/hal/rda5981/hal_flashVars_rda5981.c +++ b/src/hal/rda5981/hal_flashVars_rda5981.c @@ -70,14 +70,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -85,7 +85,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -94,10 +94,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/realtek/hal_flashVars_realtek.c b/src/hal/realtek/hal_flashVars_realtek.c index 6d759cac54..f2710d95f4 100644 --- a/src/hal/realtek/hal_flashVars_realtek.c +++ b/src/hal/realtek/hal_flashVars_realtek.c @@ -70,14 +70,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -85,7 +85,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -94,10 +94,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/tr6260/hal_flashVars_tr6260.c b/src/hal/tr6260/hal_flashVars_tr6260.c index 285cc66629..162998ba01 100644 --- a/src/hal/tr6260/hal_flashVars_tr6260.c +++ b/src/hal/tr6260/hal_flashVars_tr6260.c @@ -66,14 +66,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -81,7 +81,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -90,10 +90,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/txw81x/hal_flashVars_txw81x.c b/src/hal/txw81x/hal_flashVars_txw81x.c index ee903c4b9e..daa64d45d1 100644 --- a/src/hal/txw81x/hal_flashVars_txw81x.c +++ b/src/hal/txw81x/hal_flashVars_txw81x.c @@ -70,14 +70,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -85,7 +85,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -94,10 +94,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/hal/w800/hal_flashVars_w800.c b/src/hal/w800/hal_flashVars_w800.c index 3bb6352d54..9636431792 100644 --- a/src/hal/w800/hal_flashVars_w800.c +++ b/src/hal/w800/hal_flashVars_w800.c @@ -86,15 +86,14 @@ int HAL_FlashVars_GetChannelValue(int ch) { } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { #ifndef DISABLE_FLASH_VARS_VARS int iChangesCount = 0; ef_get_env_blob(KV_KEY_FLASH_VARS, &flash_vars, FLASH_VARS_STRUCTURE_SIZE, NULL); - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); @@ -106,10 +105,10 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite } #endif } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) { +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { #ifndef DISABLE_FLASH_VARS_VARS * bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; diff --git a/src/hal/win32/hal_flashVars_win32.c b/src/hal/win32/hal_flashVars_win32.c index bc689fa36f..05221f7f14 100644 --- a/src/hal/win32/hal_flashVars_win32.c +++ b/src/hal/win32/hal_flashVars_win32.c @@ -23,10 +23,10 @@ void HAL_FlashVars_SaveChannel(int index, int value) { int HAL_FlashVars_GetChannelValue(int ch) { return 0; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) { +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { } -void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperatureOrWhite, byte *rgb, byte *bEnableAll, byte *colorMode) { +void HAL_FlashVars_ReadLED(byte *mode, short *brightness, short *temperatureOrWhite, byte *rgb, byte *bEnableAll) { } diff --git a/src/hal/xradio/hal_flashVars_xradio.c b/src/hal/xradio/hal_flashVars_xradio.c index 925a9f161c..4f1fae8cc4 100644 --- a/src/hal/xradio/hal_flashVars_xradio.c +++ b/src/hal/xradio/hal_flashVars_xradio.c @@ -70,14 +70,14 @@ void HAL_FlashVars_SaveChannel(int index, int value) SaveFlashVars(&flash_vars, sizeof(flash_vars)); } -void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll, byte* colorMode) +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWhite, byte* rgb, byte* bEnableAll) { if(g_loaded == 0) { ReadFlashVars(&flash_vars, sizeof(flash_vars)); } *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; - HAL_LED_UnpackModeAndColorMode(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, colorMode); + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; *temperatureOrWhite = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; rgb[0] = flash_vars.rgb[0]; @@ -85,7 +85,7 @@ void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperatureOrWh rgb[2] = flash_vars.rgb[2]; } -void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll, byte colorMode) +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite, byte r, byte g, byte b, byte bEnableAll) { int iChangesCount = 0; @@ -94,10 +94,9 @@ void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperatureOrWhite ReadFlashVars(&flash_vars, sizeof(flash_vars)); } - short modeAndColorMode = HAL_LED_PackModeAndColorMode(mode, colorMode); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperatureOrWhite, iChangesCount); - SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], modeAndColorMode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index d1bda8ae5a..68e6101eaf 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -839,8 +839,8 @@ int http_fn_index(http_request_t* request) { if (bRGBW && c_pwms >= 4) { poststr(request, ""); poststr(request, "
"); - const char* rgbChecked = (g_colorMode == LIGHT_COLOR_MODE_RGB) ? "checked" : ""; - const char* whiteChecked = (g_colorMode == LIGHT_COLOR_MODE_WHITE) ? "checked" : ""; + const char* rgbChecked = (g_lightMode == Light_RGB) ? "checked" : ""; + const char* whiteChecked = (g_lightMode == Light_White) ? "checked" : ""; poststr(request, "
Mode: "); hprintf255(request, "RGB", rgbChecked); hprintf255(request, "White", whiteChecked); @@ -857,7 +857,7 @@ int http_fn_index(http_request_t* request) { } LED_GetBaseColorString(colorValue); - const char* rgbRowDisplay = (bRGBW && g_colorMode == LIGHT_COLOR_MODE_WHITE) ? " style=\"display:none\"" : ""; + const char* rgbRowDisplay = (bRGBW && g_lightMode == Light_White) ? " style=\"display:none\"" : ""; hprintf255(request, "", rgbRowDisplay); hprintf255(request, "
LED RGB Color %s
", activeStr); hprintf255(request, "", SPECIAL_CHANNEL_BASECOLOR); diff --git a/src/selftest/selftest_led.c b/src/selftest/selftest_led.c index f1474e239b..c8b3e6f6e0 100644 --- a/src/selftest/selftest_led.c +++ b/src/selftest/selftest_led.c @@ -407,7 +407,7 @@ void Test_LEDDriver_4PWM_RGBW() { // === RGB mode === // Set red CMD_ExecuteCommand("led_basecolor_rgb FF0000", 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT(g_lightMode == Light_RGB); SELFTEST_ASSERT_CHANNEL(0, 100); // R SELFTEST_ASSERT_CHANNEL(1, 0); // G SELFTEST_ASSERT_CHANNEL(2, 0); // B @@ -443,7 +443,7 @@ void Test_LEDDriver_4PWM_RGBW() { // === White mode === CMD_ExecuteCommand("led_enableWhite", 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT(g_lightMode == Light_White); SELFTEST_ASSERT_CHANNEL(0, 0); // R zeroed in white mode SELFTEST_ASSERT_CHANNEL(1, 0); // G zeroed in white mode SELFTEST_ASSERT_CHANNEL(2, 0); // B zeroed in white mode @@ -462,7 +462,7 @@ void Test_LEDDriver_4PWM_RGBW() { // Switch back to RGB mode via led_basecolor_rgb CMD_ExecuteCommand("led_basecolor_rgb FF0000", 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT(g_lightMode == Light_RGB); SELFTEST_ASSERT_CHANNEL(0, 100); SELFTEST_ASSERT_CHANNEL(1, 0); SELFTEST_ASSERT_CHANNEL(2, 0); @@ -470,7 +470,7 @@ void Test_LEDDriver_4PWM_RGBW() { // Back to white CMD_ExecuteCommand("led_enableWhite", 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT(g_lightMode == Light_White); SELFTEST_ASSERT_CHANNEL(4, 100); SELFTEST_ASSERT_CHANNEL(0, 0); @@ -483,7 +483,7 @@ void Test_LEDDriver_4PWM_RGBW() { // Re-enable should retain white mode and value CMD_ExecuteCommand("led_enableAll 1", 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT(g_lightMode == Light_White); SELFTEST_ASSERT_CHANNEL(4, 100); SELFTEST_ASSERT_CHANNEL(0, 0); diff --git a/src/selftest/selftest_mqtt.c b/src/selftest/selftest_mqtt.c index 74723f9186..9695e794fa 100644 --- a/src/selftest/selftest_mqtt.c +++ b/src/selftest/selftest_mqtt.c @@ -545,7 +545,7 @@ void Test_MQTT_LED_4PWM_RGBW() { SELFTEST_ASSERT_CHANNEL(2, 0); SELFTEST_ASSERT_CHANNEL(3, 0); SELFTEST_ASSERT_CHANNEL(4, 0); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT(g_lightMode == Light_RGB); // Switch to white mode via MQTT SIM_SendFakeMQTTAndRunSimFrame_CMND("led_enableWhite", ""); @@ -553,7 +553,7 @@ void Test_MQTT_LED_4PWM_RGBW() { SIM_ClearMQTTHistory(); // White mode: ch4=W active, ch0-2=RGB zeroed - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_WHITE); + SELFTEST_ASSERT(g_lightMode == Light_White); SELFTEST_ASSERT_CHANNEL(0, 0); SELFTEST_ASSERT_CHANNEL(1, 0); SELFTEST_ASSERT_CHANNEL(2, 0); @@ -578,7 +578,7 @@ void Test_MQTT_LED_4PWM_RGBW() { SELFTEST_ASSERT_HAD_MQTT_PUBLISH_STR("fakeRGBW4PWM/led_colorMode/get", "rgb", false); SIM_ClearMQTTHistory(); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT(g_lightMode == Light_RGB); SELFTEST_ASSERT_CHANNEL(0, 0); SELFTEST_ASSERT_CHANNEL(1, 100); SELFTEST_ASSERT_CHANNEL(2, 0); @@ -600,7 +600,7 @@ void Test_MQTT_LED_4PWM_RGBW() { SIM_ClearMQTTHistory(); CFG_SetFlag(OBK_FLAG_LED_4PWM_RGBW_MODE, false); - SELFTEST_ASSERT(g_colorMode == LIGHT_COLOR_MODE_RGB); + SELFTEST_ASSERT(g_lightMode == Light_RGB); SELFTEST_ASSERT_CHANNEL(1, 100); SELFTEST_ASSERT_CHANNEL(4, 0); } From ddfa3b3da46afe0bad11203fdca898a56d1b19fa Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 25 Jul 2026 16:53:45 +0300 Subject: [PATCH 4/4] Use SET_LightMode in led_enableWhite; expand comment explaining HA signal-only behavior --- src/cmnds/cmd_newLEDDriver.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index 8ca6e19800..a8462ddc0e 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -1278,14 +1278,16 @@ OBK_Publish_Result sendColorMode() { } #endif // Switch to white mode in OBK_FLAG_LED_4PWM_RGBW_MODE. -// White channel is always at max — brightness is controlled by led_dimmer. -// RGB channels are zeroed in apply_smart_light(). +// Home Assistant sends this command with a value only once, as a signal to +// enter white mode. The value itself is deliberately ignored — the white +// channel stays at max, and all brightness changes in white mode continue to +// go through led_dimmer. RGB channels are zeroed in apply_smart_light(). static commandResult_t led_enableWhite(const void *context, const char *cmd, const char *args, int cmdFlags) { if (CFG_HasFlag(OBK_FLAG_LED_4PWM_RGBW_MODE) == false) { return CMD_RES_ERROR; } - g_lightMode = Light_White; + SET_LightMode(Light_White); led_baseColors[4] = 255.0f;