From 9650d0f1eff85814aa5736f826f65fa38e0039a7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 13 Dec 2024 00:17:25 +0100 Subject: [PATCH] Fix GUI display power button regression from v14.3.0.5 (#15788) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + .../xdrv_01_9_webserver.ino | 46 +++++++++---------- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 10 ++-- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9d00dc85015..db2e325f0324 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. ### Fixed - ESP32 rules operation priority regression from v13.3.0.4 (#22636) +- GUI display power button regression from v14.3.0.5 (#15788) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7433735df036..e1c6a731e4f5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -123,6 +123,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed ### Fixed +- GUI display power button regression from v14.3.0.5 [#15788](https://github.com/arendst/Tasmota/issues/15788) - ESP32 rules operation priority regression from v13.3.0.4 [#22636](https://github.com/arendst/Tasmota/issues/22636) ### Removed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index e0b92a731379..10d9fb4e8b25 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -1257,19 +1257,24 @@ int32_t IsShutterWebButton(uint32_t idx) { /*-------------------------------------------------------------------------------------------*/ -void WebGetDeviceCounts(uint32_t &buttons_non_light, uint32_t &buttons_non_light_non_shutter, uint32_t &shutter_button_mask) { +void WebGetDeviceCounts(uint32_t &buttons_non_light, uint32_t &buttons_non_light_non_shutter, uint32_t &light_shutter_button_mask) { + light_shutter_button_mask = 0; // Bitmask for each light and/or shutter button buttons_non_light = TasmotaGlobal.devices_present; #ifdef USE_LIGHT // Chk for reduced toggle buttons used by lights if (TasmotaGlobal.light_type) { // Find and skip light buttons (Lights are controlled by the last TasmotaGlobal.devices_present (or 2)) - buttons_non_light = LightDevice() -1; + uint32_t light_device = LightDevice(); + uint32_t light_devices = LightDevices(); + buttons_non_light -= light_devices; + for (uint32_t button_idx = light_device; button_idx < (light_device + light_devices); button_idx++) { + light_shutter_button_mask |= (1 << (button_idx -1)); // Set button bit in bitmask + } } #endif // USE_LIGHT buttons_non_light_non_shutter = buttons_non_light; - shutter_button_mask = 0; // Bitmask for each button #ifdef USE_SHUTTER // Chk for reduced toggle buttons used by shutters // Find and skip dedicated shutter buttons @@ -1277,13 +1282,14 @@ void WebGetDeviceCounts(uint32_t &buttons_non_light, uint32_t &buttons_non_light for (uint32_t button_idx = 1; button_idx <= buttons_non_light; button_idx++) { if (IsShutterWebButton(button_idx) != 0) { buttons_non_light_non_shutter--; - shutter_button_mask |= (1 << (button_idx -1)); // Set button bit in bitmask + light_shutter_button_mask |= (1 << (button_idx -1)); // Set button bit in bitmask } } } #endif // USE_SHUTTER -// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("HTP: DP %d, BNL %d, BNLNS %d, SB %08X"), TasmotaGlobal.devices_present, buttons_non_light, buttons_non_light_non_shutter, shutter_button); +// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("HTP: DP %d, BNL %d, BNLNS %d, SB %08X"), +// TasmotaGlobal.devices_present, buttons_non_light, buttons_non_light_non_shutter, light_shutter_button_mask); } #ifdef USE_LIGHT @@ -1368,8 +1374,8 @@ void HandleRoot(void) { if (TasmotaGlobal.devices_present) { uint32_t buttons_non_light; uint32_t buttons_non_light_non_shutter; - uint32_t shutter_button_mask; - WebGetDeviceCounts(buttons_non_light, buttons_non_light_non_shutter, shutter_button_mask); + uint32_t light_shutter_button_mask; + WebGetDeviceCounts(buttons_non_light, buttons_non_light_non_shutter, light_shutter_button_mask); uint32_t button_idx = 1; if (buttons_non_light_non_shutter) { // Any non light AND non shutter button - Show toggle buttons @@ -1397,12 +1403,8 @@ void HandleRoot(void) { if (buttons_non_light_non_shutter % rows) { cols++; } uint32_t button_ptr = 0; - for (button_idx = 1; button_idx <= buttons_non_light; button_idx++) { - -#ifdef USE_SHUTTER - if (bitRead(shutter_button_mask, button_idx -1)) { continue; } // Skip non-sequential shutter button -#endif // USE_SHUTTER - + for (button_idx = 1; button_idx <= TasmotaGlobal.devices_present; button_idx++) { + if (bitRead(light_shutter_button_mask, button_idx -1)) { continue; } // Skip non-sequential light and/or shutter button bool set_button = ((button_idx <= MAX_BUTTON_TEXT) && strlen(GetWebButton(button_idx -1))); snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), button_idx); WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / cols, button_idx, button_idx, @@ -1451,15 +1453,13 @@ void HandleRoot(void) { WSContentSend_P(PSTR("")); } WSContentSend_P(PSTR("")); - - if (1 == button_idx) { // No power/display button - button_idx = shutter_button_idx +2; - } } #endif // USE_SHUTTER #ifdef USE_LIGHT if (TasmotaGlobal.light_type) { // Any light - Show light button and slider(s) + button_idx = LightDevice(); + WSContentSend_P(HTTP_TABLE100); // "" uint8_t light_subtype = TasmotaGlobal.light_type &7; @@ -1904,19 +1904,15 @@ bool HandleRootStatusRefresh(void) { uint32_t buttons_non_light; uint32_t buttons_non_light_non_shutter; - uint32_t shutter_button_mask; - WebGetDeviceCounts(buttons_non_light, buttons_non_light_non_shutter, shutter_button_mask); + uint32_t light_shutter_button_mask; + WebGetDeviceCounts(buttons_non_light, buttons_non_light_non_shutter, light_shutter_button_mask); if (buttons_non_light_non_shutter <= 8) { // Any non light AND non shutter button WSContentSend_P(PSTR("{t}")); uint32_t cols = buttons_non_light_non_shutter; uint32_t fontsize = (cols < 5) ? 70 - (cols * 8) : 32; - for (uint32_t idx = 1; idx <= buttons_non_light; idx++) { - -#ifdef USE_SHUTTER - if (bitRead(shutter_button_mask, idx -1)) { continue; } // Skip non-sequential shutter button -#endif // USE_SHUTTER - + for (uint32_t idx = 1; idx <= TasmotaGlobal.devices_present; idx++) { + if (bitRead(light_shutter_button_mask, idx -1)) { continue; } // Skip non-sequential shutter button snprintf_P(svalue, sizeof(svalue), PSTR("%d"), bitRead(TasmotaGlobal.power, idx -1)); WSContentSend_P(HTTP_DEVICE_STATE, 100 / cols, (bitRead(TasmotaGlobal.power, idx -1)) ? PSTR("bold") : PSTR("normal"), fontsize, (cols < 5) ? GetStateText(bitRead(TasmotaGlobal.power, idx -1)) : svalue); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index cb8e081b498c..3fc5ade14f63 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -236,6 +236,7 @@ struct LIGHT { uint8_t random = 0; uint8_t subtype = 0; // LST_ subtype uint8_t device = 0; + uint8_t devices = 0; uint8_t old_power = 1; uint8_t wakeup_active = 0; // 0=inctive, 1=on-going, 2=about to start, 3=will be triggered next cycle uint8_t fixed_color_index = 1; @@ -294,10 +295,7 @@ uint8_t LightDevice(void) } uint32_t LightDevices(void) { - if (0 == Light.device) { - return 0; - } - return TasmotaGlobal.devices_present - Light.device +1; // Make external + return Light.devices; // Make external } static uint32_t min3(uint32_t a, uint32_t b, uint32_t c) { @@ -1182,6 +1180,8 @@ void LightSetScheme(uint32_t scheme) { void LightInit(void) { + uint32_t devices_present = TasmotaGlobal.devices_present; + // move white blend mode from deprecated `RGBWWTable` to `SetOption105` if (0 == Settings->rgbwwTable[4]) { Settings->flag4.white_blend_mode = true; @@ -1256,6 +1256,8 @@ void LightInit(void) Light.fade_initialized = true; // consider fade intialized starting from black } + Light.devices = TasmotaGlobal.devices_present - Light.device +1; // Last time that devices_present is not increments by display + LightUpdateColorMapping(); }