From a76a79a413030ddbc78f7e8eb4722b850c110edf Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Mon, 25 Nov 2019 15:20:44 +0100
Subject: [PATCH] Refactor sliders
---
tasmota/xdrv_01_webserver.ino | 97 ++++++++++++++++++++++-------------
tasmota/xdrv_04_light.ino | 18 ++++---
2 files changed, 72 insertions(+), 43 deletions(-)
diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino
index 193f8fcf3..141543b5c 100644
--- a/tasmota/xdrv_01_webserver.ino
+++ b/tasmota/xdrv_01_webserver.ino
@@ -152,21 +152,13 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM =
"}"
#endif // USE_SCRIPT_WEB_DISPLAY
-#ifdef USE_JAVASCRIPT_ES6
- "lb=(v,p)=>la(`&${v}=${p}`);"
- "lc=(v,i,p)=>la(`&${v}${i}=${p}`);"
-#else
- "function lb(v,p){"
- "la('&'+v+'='+p);"
- "}"
"function lc(v,i,p){"
+ "if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too
+ "var sl=eb('sl4').value;"
+ "eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';"
+ "}"
"la('&'+v+i+'='+p);"
"}"
-#endif // USE_JAVASCRIPT_ES6
- "function ld(v,p){"
- "eb('s').style.background='linear-gradient(to right,#fff,hsl('+p+',100%%,50%%))';"
- "la('&'+v+'='+p);"
- "}"
"wl(la);";
@@ -379,12 +371,9 @@ const char HTTP_HEAD_STYLE3[] PROGMEM =
"
%s
";
const char HTTP_MSG_SLIDER_GRADIENT[] PROGMEM =
- "";
-const char HTTP_MSG_SLIDER_HUE[] PROGMEM =
- ""
- "
";
-const char HTTP_MSG_SLIDER_CHANNEL[] PROGMEM =
- "";
+ ""
+ ""
+ "
";
const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM =
"" D_CLOSE "" D_OPEN "
"
"";
@@ -962,8 +951,6 @@ void HandleWifiLogin(void)
WSContentStop();
}
-
-
void HandleRoot(void)
{
if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page.
@@ -1012,26 +999,64 @@ void HandleRoot(void)
uint8_t light_subtype = light_type &7;
if (!Settings.flag3.pwm_multi_channels) { // SetOption68 0 - Enable multi-channels PWM instead of Color PWM
if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) {
- // Cold - Warm &t related to lb("t", value) and WebGetArg("t", tmp, sizeof(tmp));
- WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, "a", "#fff", "#ff0", 153, 500, LightGetColorTemp(), 't'); // White to Yellow
+
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Cold Warm
+ "a", // a - Unique HTML id
+ "#fff", "#ff0", // White to Yellow
+ 1, // sl1
+ 153, 500, // Range color temperature
+ LightGetColorTemp(),
+ 't', 0); // t0 - Value id releated to lc("t0", value) and WebGetArg("t0", tmp, sizeof(tmp));
}
if (light_subtype > 2) {
uint16_t hue;
uint8_t sat;
- uint8_t bri;
- LightGetHSB(&hue, &sat, &bri);
- WSContentSend_P(HTTP_MSG_SLIDER_HUE, hue); // Hue
- snprintf_P(stemp, sizeof(stemp), PSTR("#%02X%02X%02X"), Settings.light_color[0], Settings.light_color[1], Settings.light_color[2]);
- // Saturation "s" related to eb('s').style.background='linear-gradient(to right,#fff,hsl('+p+',100%%,50%%))';
- WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, "s", "#fff", stemp, 1, 100, changeUIntScale(sat, 0, 255, 0, 100), 'n');
+ LightGetHSB(&hue, &sat, nullptr);
+
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Hue
+ "b", // b - Unique HTML id
+ "#800", "#f00 5%,#ff0 20%,#0f0 35%,#0ff 50%,#00f 65%,#f0f 80%,#f00 95%,#800", // Hue colors
+ 2, // sl2 - Unique range HTML id - Used as source for Saturation end color
+ 1, 359, // Range valid Hue
+ hue,
+ 'h', 0); // h0 - Value id
+
+ uint8_t dcolor = changeUIntScale(Settings.light_dimmer, 0, 100, 0, 255);
+ char scolor[8];
+ snprintf_P(scolor, sizeof(scolor), PSTR("#%02X%02X%02X"), dcolor, dcolor, dcolor); // Saturation start color from Black to White
+ uint8_t red, green, blue;
+ LightHsToRgb(hue, 255, &red, &green, &blue);
+ snprintf_P(stemp, sizeof(stemp), PSTR("#%02X%02X%02X"), red, green, blue); // Saturation end color
+
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Saturation
+ "s", // s - Unique HTML id related to eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';
+ scolor, stemp, // Brightness to max current color
+ 3, // sl3 - Unique range HTML id - Not used
+ 1, 100, // Range 1 to 100%
+ changeUIntScale(sat, 0, 255, 0, 100),
+ 'n', 0); // n0 - Value id
}
- // Dark - Bright &d related to lb("d", value) and WebGetArg("d", tmp, sizeof(tmp));
- WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, "b", "#000", "#fff", 1, 100, Settings.light_dimmer, 'd'); // Black to White
+
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Brightness - Black to White
+ "c", // c - Unique HTML id
+ "#000", "#fff", // Black to White
+ 4, // sl4 - Unique range HTML id - Used as source for Saturation begin color
+ 1, 100, // Range 1 to 100%
+ Settings.light_dimmer,
+ 'd', 0); // d0 - Value id is related to lc("d0", value) and WebGetArg("d0", tmp, sizeof(tmp));
} else { // Settings.flag3.pwm_multi_channels - SetOption68 1 - Enable multi-channels PWM instead of Color PWM
uint32_t pwm_channels = light_subtype > LST_MAX ? LST_MAX : light_subtype;
+ stemp[0] = 'd'; stemp[1] = '0'; stemp[2] = '\0'; // d0
for (uint32_t i = 0; i < pwm_channels; i++) {
- uint8_t index = (pwm_channels < 3) ? i +3 : i;
- WSContentSend_P(HTTP_MSG_SLIDER_CHANNEL, "#fff", changeUIntScale(Settings.light_color[i], 0, 255, 0, 100), i+1); // Dark to Light
+ stemp[1]++; // d1 to d5 - Make unique ids
+
+ WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Channel brightness - Black to White
+ stemp, // d1 to d5 - Unique HTML id
+ "#000", "#fff", // Black to White
+ i+1, // sl1 to sl5 - Unique range HTML id - Not used
+ 1, 100, // Range 1 to 100%
+ changeUIntScale(Settings.light_color[i], 0, 255, 0, 100),
+ 'd', i+1); // d1 to d5 - Value id
}
} // Settings.flag3.pwm_multi_channels
}
@@ -1136,7 +1161,7 @@ bool HandleRootStatusRefresh(void)
}
#endif // USE_SONOFF_IFAN
}
- WebGetArg("d", tmp, sizeof(tmp)); // 0 - 100 Dimmer value
+ WebGetArg("d0", tmp, sizeof(tmp)); // 0 - 100 Dimmer value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_DIMMER " %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
@@ -1150,17 +1175,17 @@ bool HandleRootStatusRefresh(void)
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
}
- WebGetArg("t", tmp, sizeof(tmp)); // 153 - 500 Color temperature
+ WebGetArg("t0", tmp, sizeof(tmp)); // 153 - 500 Color temperature
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_COLORTEMPERATURE " %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
- WebGetArg("u", tmp, sizeof(tmp)); // 0 - 359 Hue value
+ WebGetArg("h0", tmp, sizeof(tmp)); // 0 - 359 Hue value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_HSBCOLOR "1 %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
}
- WebGetArg("n", tmp, sizeof(tmp)); // 0 - 99 Saturation value
+ WebGetArg("n0", tmp, sizeof(tmp)); // 0 - 99 Saturation value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_HSBCOLOR "2 %s"), tmp);
ExecuteWebCommand(svalue, SRC_WEBGUI);
diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino
index fcdf578c6..3e06446ec 100644
--- a/tasmota/xdrv_04_light.ino
+++ b/tasmota/xdrv_04_light.ino
@@ -1257,6 +1257,10 @@ uint32_t LightGetHSB(uint16_t *hue,uint8_t *sat, uint8_t *bri) {
light_state.getHSB(hue, sat, bri);
}
+void LightHsToRgb(uint16_t hue, uint8_t sat, uint8_t *r_r, uint8_t *r_g, uint8_t *r_b) {
+ light_state.HsToRgb(hue, sat, r_r, r_g, r_b);
+}
+
// If SetOption68 is set, get the brightness for a specific device
uint8_t LightGetBri(uint8_t device) {
uint8_t bri = 254; // default value if relay
@@ -1607,10 +1611,10 @@ void LightAnimate(void)
if (!Light.fade_running) {
sleep = Settings.sleep;
}
- } else {
- if (Settings.sleep > PWM_MAX_SLEEP) {
- sleep = PWM_MAX_SLEEP; // set a maxumum value of 50 milliseconds to ensure that animations are smooth
- } else {
+ } else {
+ if (Settings.sleep > PWM_MAX_SLEEP) {
+ sleep = PWM_MAX_SLEEP; // set a maxumum value of 50 milliseconds to ensure that animations are smooth
+ } else {
sleep = Settings.sleep; // or keep the current sleep if it's lower than 50
}
switch (Settings.light_scheme) {
@@ -1664,8 +1668,8 @@ void LightAnimate(void)
LightApplyPower(Light.new_color, Light.power);
// AddLog_P2(LOG_LEVEL_INFO, PSTR("last_color (%02X%02X%02X%02X%02X) new_color (%02X%02X%02X%02X%02X) power %d"),
- // Light.last_color[0], Light.last_color[1], Light.last_color[2], Light.last_color[3], Light.last_color[4],
- // Light.new_color[0], Light.new_color[1], Light.new_color[2], Light.new_color[3], Light.new_color[4],
+ // Light.last_color[0], Light.last_color[1], Light.last_color[2], Light.last_color[3], Light.last_color[4],
+ // Light.new_color[0], Light.new_color[1], Light.new_color[2], Light.new_color[3], Light.new_color[4],
// Light.power
// );
@@ -1997,7 +2001,7 @@ bool LightColorEntry(char *buffer, uint32_t buffer_length)
memset(&Light.entry_color, 0x00, sizeof(Light.entry_color));
// erase all channels except if the last character is '=', #6799
while ((buffer_length > 0) && ('=' == buffer[buffer_length - 1])) {
- buffer_length--; // remove all trailing '='
+ buffer_length--; // remove all trailing '='
memcpy(&Light.entry_color, &Light.current_color, sizeof(Light.entry_color));
}
if (strstr(buffer, ",") != nullptr) { // Decimal entry