adopt the new types for color. Fix the NTP refresh bug every minute. raise wtd to 2 min

This commit is contained in:
coelner 2021-06-15 15:05:53 +02:00
parent 96641edfe4
commit 2468643acf

View File

@ -4,7 +4,7 @@
#include <NeoPixelBrightnessBus.h> #include <NeoPixelBrightnessBus.h>
#include <IotWebConf.h> #include <IotWebConf.h>
#include <IotWebConfUsing.h> #include <IotWebConfTParameter.h>
// UpdateServer includes // UpdateServer includes
#ifdef ESP8266 #ifdef ESP8266
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
@ -33,6 +33,11 @@
ESP8266 24LED ESP8266 24LED
5V--10k-+-LDR--GND -ADC 5V--10k-+-LDR--GND -ADC
- 150k--220k-+-100k--GND - 150k--220k-+-100k--GND
-----------------
ESP8266 60LED
5V--??k-+-LDR--??k-GND
- 39k--220k-+-100k--GND
-ADC
*/ */
#ifdef ESP8266 #ifdef ESP8266
#define LDR_PIN A0 #define LDR_PIN A0
@ -57,8 +62,6 @@ volatile bool allDotsOn = true; //lighten up all leds
#if NUM_LEDS == 60 #if NUM_LEDS == 60
volatile bool followingHour = true; //move hour like an analog one volatile bool followingHour = true; //move hour like an analog one
#else #else
//#endif
//#if NUM_LEDS == 24
volatile bool followingHour = false; //disabled due limited resolution volatile bool followingHour = false; //disabled due limited resolution
#endif #endif
volatile int hourOffset = 0; volatile int hourOffset = 0;
@ -200,9 +203,9 @@ const char wifiInitialApPassword[] = "12345678";
#define STRING_LEN 63 #define STRING_LEN 63
#define NUMBER_LEN 4 #define NUMBER_LEN 4
// -- Maximal length the input-range attributes can have. // -- Maximal length the input-range attributes can have.
#define COLOR_ATTR_LENGTH 60 //#define COLOR_ATTR_LENGTH 60
// -- Configuration specific key. The value should be modified if config structure was changed. // -- Configuration specific key. The value should be modified if config structure was changed.
#define CONFIG_VERSION "V1.1.5" #define CONFIG_VERSION "V1.1.7"
const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\ const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\
function colorCh(id)\n\ function colorCh(id)\n\
@ -218,43 +221,6 @@ const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\
btn.onclick = function() { if (p.type === 'password') { p.type = 'text'; btn.value = '🔒'; } else { p.type = 'password'; btn.value = '🔓'; } }\n\ btn.onclick = function() { if (p.type === 'password') { p.type = 'text'; btn.value = '🔒'; } else { p.type = 'password'; btn.value = '🔓'; } }\n\
};\n\ };\n\
});\n"; });\n";
const char IOTWEBCONF_HTML_FORM_COLOR_PARAM[] PROGMEM =
"<div class='{s}' '><label for='{i}'>{b}</label> (<span id='{i}Val'>{v}</span>)"
"<input type='{t}' id='{i}' "
"name='{i}' style=\"padding: unset\" maxlength={l} placeholder='{p}' value='{v}' {c}/>"
"<div class='em'>{e}</div></div>\n";
// -- Our custom class declaration. You should move it to a .h fine in your project.
class ColorWithValueParameter : public iotwebconf::NumberParameter
{
public:
ColorWithValueParameter(
const char* label, const char* id, char* valueBuffer, int length,
const char* defaultValue
) : iotwebconf::NumberParameter(
label, id, valueBuffer, length, defaultValue)
{
snprintf(
this->_colorAttr, COLOR_ATTR_LENGTH,
"oninput='colorCh(this.id)'");
this->customHtml = this->_colorAttr;
};
protected:
// Overrides
virtual String renderHtml(
bool dataArrived, bool hasValueFromPost, String valueFromPost) override
{
return TextParameter::renderHtml("color", hasValueFromPost, valueFromPost);
};
virtual String getHtmlTemplate()
{
return FPSTR(IOTWEBCONF_HTML_FORM_COLOR_PARAM);
};
private:
char _colorAttr[COLOR_ATTR_LENGTH];
};
// -- We need to create our custom HtmlFormatProvider to add some javasripts. // -- We need to create our custom HtmlFormatProvider to add some javasripts.
class CustomHtmlFormatProvider : public iotwebconf::HtmlFormatProvider class CustomHtmlFormatProvider : public iotwebconf::HtmlFormatProvider
@ -266,26 +232,10 @@ class CustomHtmlFormatProvider : public iotwebconf::HtmlFormatProvider
HtmlFormatProvider::getScriptInner() + HtmlFormatProvider::getScriptInner() +
String(FPSTR(CUSTOMHTML_SCRIPT_INNER)); String(FPSTR(CUSTOMHTML_SCRIPT_INNER));
} }
/*
String getBodyInner() override
{
return
String(FPSTR(CUSTOMHTML_BODY_INNER)) +
HtmlFormatProvider::getBodyInner();
}
*/
}; };
// -- Javascript block will be added to the header. // -- Javascript block will be added to the header.
/* //const char CUSTOMHTML_BODY_INNER[] PROGMEM = " <link rel='icon' href='data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎯</text></svg>'>";
const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\
document.addEventListener('DOMContentLoaded', function(event) {\n\
let elements = document.querySelectorAll('input[type=\"password\"]');\n\
for (let p of elements) {\n\
let btn = document.createElement('INPUT'); btn.type = 'button'; btn.value = '🔓'; btn.style.width = 'auto'; p.style.width = '83%'; p.parentNode.insertBefore(btn,p.nextSibling);\n\
btn.onclick = function() { if (p.type === 'password') { p.type = 'text'; btn.value = '🔒'; } else { p.type = 'password'; btn.value = '🔓'; } }\n\
};\n\
});\n";
*/
//const char CUSTOMHTML_BODY_INNER[] PROGMEM = " <link rel='icon' src='data:image/png;base64,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'/>"; //const char CUSTOMHTML_BODY_INNER[] PROGMEM = " <link rel='icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABHNCSVQICAgIfAhkiAAACPxJREFUeJztmm1sU+cVx3++vo7dGKdOQpp48ZQKJ3hCEFJYtBZSurUiDaWqSpKBWnUKe2Mkm8o+VWoEm8KglQpq12pSkSpIIdXUjQJS0pUkrTZtISoiiW0F1s1UfaFKyCBuAiN2HBz77MO1p7YJ1NfYGdL8k+4X+z73/M+5z31eznMgS5YsWbJkyfL/ijENz8iNXwJE0/C8ZMgBFqHpjyyQzTncA7wKeAE/0GcwGNrKyspKMmWwrKysxGAw7Ab64ja9cQ33ZMrmfKjAL4Fpo9EoDodDXK4lkp+fLwaDQVRVHalctuzBm7Q3AXagFLg7fpXGfzPdqFFlZeWDqqqOGAwGyc/PF5driTgcDjEajQJMxzWpqTijl83Ac8XFxZYdTz/Nfffdi8ViYWJigrff/hMdb7xR+nhDw8E33nzz3srKykvxNiXA94C1wArAAdi+YH8WuAaMAeeAfuDPwL8AhoeHi986evTgxx9/XPqDp57i0Uc3UlBQQDgc5v33T/PyK69YLl269BxwGfi9HmcMOp23An+3Wq1l7YcOsXRpxZwbpqamsFqtTExOvF5bW9cZjUZ/AjwAWE0mEwUFBSxevJiioiJyc3MBCIVCjI+PEwgEmJiYIBKJAASBvxmNxtd6e7sfK8gv2BoMBlm0aNEcm+fPn+eHP/oxwWDwArAMCGUqAA8Af9m0aZPh17/aNe8N0WiUvlOnePXVA7N+v1+MRqNp+fLlNDQ0sGbNGpYuXYrdbsdisaAoCgCxWIxwOMyVK1f48MMP6e/v5/jx45w9e5ZoNBpxu92G5ubt6v01NRiN84/bbbt/w4kTJwStp/1Vp19Jsx2Q3W1t4vN6vnR5PUPS1dkp69atE0VRJC8vT5544gk5c+aMRCIR0UskEpEzZ87Ik08+KXl5eaIoiqxbd790dXaK1zM0x/7utjZBm4m263FI0RmA6wAz12fm/NHf38/25mb6+vqoqamhp6eHI0eOUF1djarOP9TMzs4muvscVFWlurqaw4cP09PTQ01NDX19p9je3Myp/v45939B03WdPumiCphdu3aNeIYGxef1yNDggOzatVNMJpPYbDZ58cUXZXp6+mvf8MzMjHy/sVE2btyY1P3hcFheeuklsdlsYjKZZNfOnTI0OCA+r0c8Q4Oyds0aQRtMqzIZAFVRlNMmk0nee7dXfF6PtLY+KxaLRYqLi6Wzs1Oi0WhSXfzatWuyfPlyqaiokMnJyaTaxGJR6ezslJKSErFYLNLa+qz4vB55791eMZlMoijKaVKb2ZKntrZ29d69ez71DA3K/n37RFVVcTgcMjAwkJQTXw1AeXl50gFIMDAwIA6HQ1RVlf379olnaFD27t3zaW1t7eqMOp/A6/VWdRx53XNXUZHY7Xbp7u7W5cCtBkBEpLu7W+x2u9xVVCRHjhz2+ny+BV0NWoBTiqLIoUOHJBaLLXgAYrGYHDx4UBRFEeBUXNOC8TMgVl9fn9IUl44AiGhTZX19vQCxuKYFoRT4yOFwiN/vT0l4ugIgIuL3+8XhcAjwEfANvc7oXQeAthe4e+vWrZSXl6fQPL2Ul5fT1NQE2qZqS6bt5QB+m80mo6OjKb+1dPYAEZHR0VGx2WyCtkXO0eOQ3h5QDZQ/8sgjOBwOnU0zh8PhYMOGDQDlwLf1tNUbgMcVRVE2b96MwaB3H5U5DAYDW7ZsQdF2V4/raasnADnAdwoLC1m1apUugQvBqlWrKCwsBLgXHZ+BngAUAi6Xy0VJScayXilTUlKCy+UCcKFpTQo9AbgLuNPlcmE2m3XKyzxms5klS5YA3ImmNSn0BsDsdDpvq+8/gcFgwOl0ApjJUAAWAYrdbtcpbX6uX7/O9PQ0ACKSlmfGtSloWpNCTwBUwHCjlJReOjo6+OSTT1i2bNl/c4O3SjzxYkDHllhPAMKAhEJJ5xtvyPj4OC+88AImk4m2tra0jSlxbYKmNSn0BGACmL18+bJOWV8mGo2yZ88eLl68SHNzM1VV6UvgxLVF0LQmhZ4AXAaCn332GdFo6idgPp+Pjo4OysrK2LFjR8rP+SrRaJQLFy6AlhK/9DW3p8SdwD8qKipkYmIipTV7JBKRhx9+WAA5cODALa3/v8rnn38uFRUVAnwQ15p2FOBobm6uDA4OpiSyq6tLFEWRqqoqCQaDaQ3A4OCg5ObmCnAUHecdej6BGNATCoXo7e3VGTsIBALs3LkTs9nM888/n7aRP0FPT09iEOxGGwgzghMIrly5UncmaP/+/aIoijQ2Nko4HE7r249EIrJy5UpBO04rzZTzCf4IyMmTJ5MWePHiRSkoKBCbzSbnz59Pq/MiIu+8807iVOgPmXYe4CEgVFtbK6FQKCmBw8PDYrVapbW1NaUE6s0IhUKyfv16QRv9H1qIAJiAY6qqSnt7e9JCA+PjKSdQb0Z7e7uoqirAW9ykviDdrACmnE6njIyMpN2pZBkZGRGn0ynAVFzTgvIMEKmrq7vlnF4qTE5OSl1dnaCt/J5ZaOdB23GdUBRFtm3blpHufSMikYhs27YtcShyAh27v3STD5wGYi0tLXL16tWMO3/16lVpaWlJHIacjmv4n+ICBhRFkfr6egkEAhlzPhAISH19feLND8Rt3xYsRluDi9vtlq6urrR+EpFIRLq6usTtdifm+w/iNm8bvgkE0EbjGYvFIk1NTXL27NlbmvdjsZicO3dOmpqa5I477hBgJm5jPG7ztsAEdKCNxj8HvotWyDibk5MjDQ0NcuzYMRkbG0uqV8zOzsrY2JgcP35cGhsbxWw2Jyo/+uLPbonb6iAN8346spu1aCOxD9gA/BttVG4EfgHcYzQaldLSUlasWMHq1atxu904nU6sVisAwWCQkZER/H4/Ho+H4eFhRkdHiUajMbRq0N+hLXSmgDzgJFopzCZA/84sjZjRHA8DNfP8bwTuB34LDANX0OqJ5QZXNH7PMPAysI7565lr4jZ9cQ0pc6s9oAD4J9AJ/JSbb0NtaLtJN1CGVj2amL+n0KpCL6AdcI6gVY7eCAPwGvAY8C10pMAywU1rfDNIouY4S5YsWbJkyZIlSyr8B2nXiKOP5kQtAAAAAElFTkSuQmCC'/>";
DNSServer dnsServer; DNSServer dnsServer;
WebServer server(80); WebServer server(80);
@ -295,41 +245,80 @@ ESP8266HTTPUpdateServer httpUpdater;
HTTPUpdateServer httpUpdater; HTTPUpdateServer httpUpdater;
#endif #endif
char ntpServerParamValue[STRING_LEN];
char maxBrightnessParamValue[NUMBER_LEN];
char singleSecondParamValue[STRING_LEN];
char allDotsOnParamValue[STRING_LEN];
char followingHourParamValue[STRING_LEN];
char hourColorParamValue[COLOR_ATTR_LENGTH];
char minuteColorParamValue[COLOR_ATTR_LENGTH];
char secondsColorParamValue[COLOR_ATTR_LENGTH];
char highnoonColorParamValue[COLOR_ATTR_LENGTH];
char backlightColorParamValue[COLOR_ATTR_LENGTH];
char hourMarkingColorParamValue[COLOR_ATTR_LENGTH];
IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION); IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION);
IotWebConfParameterGroup timeGroup = IotWebConfParameterGroup("Time", "Time settings"); iotwebconf::ParameterGroup timeGroup = iotwebconf::ParameterGroup("Time", "Time settings");
IotWebConfTextParameter ntpServerParam = IotWebConfTextParameter("NTP Server", "ntpServer", ntpServerParamValue, STRING_LEN, "pool.ntp.org"); iotwebconf::TextTParameter<STRING_LEN> ntpServerParam =
IotWebConfParameterGroup ledGroup = IotWebConfParameterGroup("LED", "LED settings"); iotwebconf::Builder<iotwebconf::TextTParameter<STRING_LEN>>("ntpServer").
IotWebConfNumberParameter maxBrightnessParam = IotWebConfNumberParameter("Max BRIGHTNESS", "max brightness", maxBrightnessParamValue, NUMBER_LEN, "200", "20..254", "min='20' max='254' step='1'"); label("NTP Server").
#if NUM_LEDS == 60 defaultValue("pool.ntp.org").
IotWebConfCheckboxParameter singleSecondParam = IotWebConfCheckboxParameter("Show Seconds", "singleSecond", singleSecondParamValue, STRING_LEN, true); build();
#else iotwebconf::ParameterGroup ledGroup = iotwebconf::ParameterGroup("LED", "LED settings");
IotWebConfCheckboxParameter singleSecondParam = IotWebConfCheckboxParameter("Show Seconds", "singleSecond", singleSecondParamValue, STRING_LEN, false); iotwebconf::IntTParameter<int16_t> maxBrightnessParam =
#endif iotwebconf::Builder<iotwebconf::IntTParameter<int16_t>>("Max Brightness").
IotWebConfCheckboxParameter allDotsOnParam = IotWebConfCheckboxParameter("all Dots lighten on", "allDotsOn", allDotsOnParamValue, STRING_LEN, true); label("Max brightness").
#if NUM_LEDS == 60 defaultValue(200).
IotWebConfCheckboxParameter followingHourParam = IotWebConfCheckboxParameter("following Hour", "followingHour", followingHourParamValue, STRING_LEN, true); min(MINIMAL_BRIGHTNESS).
#else max(MAX_BRIGHTNESS).
IotWebConfCheckboxParameter followingHourParam = IotWebConfCheckboxParameter("following Hour", "followingHour", followingHourParamValue, STRING_LEN, false); step(1).
#endif build();
ColorWithValueParameter hourColorParam = ColorWithValueParameter("Stundenfarbe", "hourColorParam", hourColorParamValue, COLOR_ATTR_LENGTH, "#FFD700");
ColorWithValueParameter minuteColorParam = ColorWithValueParameter("Minutenfarbe", "minuteColorParam", minuteColorParamValue, COLOR_ATTR_LENGTH, "#800000");
ColorWithValueParameter secondsColorParam = ColorWithValueParameter("Sekundenfarbe", "secondsColorParam", secondsColorParamValue, COLOR_ATTR_LENGTH, "#000000");
ColorWithValueParameter highnoonColorParam = ColorWithValueParameter("12Uhr Farbe", "highnoonColorParam", highnoonColorParamValue, COLOR_ATTR_LENGTH, "#C0C0C0");
ColorWithValueParameter backlightColorParam = ColorWithValueParameter("Hintergrundfarbe", "backlightColorParam", backlightColorParamValue, COLOR_ATTR_LENGTH, "#1E2823");
ColorWithValueParameter hourMarkingColorParam = ColorWithValueParameter("Stundenmarkierung", "hourMarkingColorParam", hourMarkingColorParamValue, COLOR_ATTR_LENGTH, "#787878");
iotwebconf::CheckboxTParameter singleSecondParam =
iotwebconf::Builder<iotwebconf::CheckboxTParameter>("singleSecond").
label("single Second visible").
#if NUM_LEDS == 60
defaultValue(true).
build();
#else
defaultValue(false).
build();
#endif
iotwebconf::CheckboxTParameter allDotsOnParam =
iotwebconf::Builder<iotwebconf::CheckboxTParameter>("allDotsOn").
label("all Dots lighten on").
defaultValue(true).
build();
iotwebconf::CheckboxTParameter followingHourParam =
iotwebconf::Builder<iotwebconf::CheckboxTParameter>("followingHour").
label("following Hour").
#if NUM_LEDS == 60
defaultValue(true).
build();
#else
defaultValue(false).
build();
#endif
iotwebconf::ColorTParameter hourColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("Stundenfarbe").
label("Stundenfarbe").
defaultValue("#FFD700").
build();
iotwebconf::ColorTParameter minuteColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("Minutenfarbe").
label("Minutenfarbe").
defaultValue("#800000").
build();
iotwebconf::ColorTParameter secondsColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("Sekundenfarbe").
label("Sekundenfarbe").
defaultValue("#000000").
build();
iotwebconf::ColorTParameter highnoonColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("12 Uhr Farbe").
label("12 Uhr Farbe").
defaultValue("#C0C0C0").
build();
iotwebconf::ColorTParameter backlightColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("Hintergrundfarbe").
label("Hintergrundfarbe").
defaultValue("#1E2823").
build();
iotwebconf::ColorTParameter hourMarkingColorParam =
iotwebconf::Builder<iotwebconf::ColorTParameter>("Stundenmarkierung").
label("Stundenmarkierung").
defaultValue("#787878").
build();
// -- An instance must be created from the class defined above. // -- An instance must be created from the class defined above.
CustomHtmlFormatProvider customHtmlFormatProvider; CustomHtmlFormatProvider customHtmlFormatProvider;
@ -364,7 +353,7 @@ String printLocalTime() {
if (!getLocalTime(&timeinfo, 200)) { if (!getLocalTime(&timeinfo, 200)) {
Serial.println("Failed to obtain time"); Serial.println("Failed to obtain time");
NTPreachable = false; NTPreachable = false;
return ""; return "N/A";
} }
//Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); //Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
@ -386,7 +375,7 @@ void iotWebConfHandleRoot() {
// -- Captive portal request were already served. // -- Captive portal request were already served.
return; return;
} }
char sTemp[12]; //char sTemp[12];
String s = "<!DOCTYPE html><html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/>"; String s = "<!DOCTYPE html><html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/>";
s += "<meta http-equiv=\"refresh\" content=\"30\">"; s += "<meta http-equiv=\"refresh\" content=\"30\">";
//s += CUSTOMHTML_BODY_INNER; //s += CUSTOMHTML_BODY_INNER;
@ -398,45 +387,39 @@ void iotWebConfHandleRoot() {
s += printLocalTime(); s += printLocalTime();
s += "</td></tr></table><table>"; s += "</td></tr></table><table>";
s += "<tr></tr><tr><td>NTP Server:</td><td>"; s += "<tr></tr><tr><td>NTP Server:</td><td>";
s += ntpServerParamValue; s += ntpServerParam.value();
s += "</td><tr><tr><td>Current Brightness value: </td><td>"; s += "</td><tr><tr><td>Current Brightness value: </td><td>";
s += String(strip.GetBrightness()); s += String(strip.GetBrightness());
s += "</td><tr><tr><td>Max Brightness value: </td><td>"; s += "</td><tr><tr><td>Max Brightness value: </td><td>";
s += atoi(maxBrightnessParamValue); s += maxBrightnessParam.value();
s += "</td></tr><tr><td>Show Seconds: </td><td>"; s += "</td></tr><tr><td>Show Seconds: </td><td>";
s += (singleSecond ? "Yes" : "No"); s += (singleSecondParam.isChecked() ? "Yes" : "No");
s += "</td></tr><tr><td>All Dots On: </td><td>"; s += "</td></tr><tr><td>All Dots On: </td><td>";
s += (allDotsOn ? "Yes" : "No"); s += (allDotsOnParam.isChecked() ? "Yes" : "No");
s += "</td></tr><tr><td>Following Hour: </td><td>"; s += "</td></tr><tr><td>Following Hour: </td><td>";
s += (followingHour ? "Yes" : "No"); s += (followingHourParam.isChecked() ? "Yes" : "No");
s += "</td></tr><tr><td>"; s += "</td></tr><tr><td>";
s += "<tr><td>High noon: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>High noon: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &highnoonColor); s += highnoonColorParam.value();
s += sTemp;
s += ";\"><td></tr>"; s += ";\"><td></tr>";
s += "<tr><td>Hour color: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>Hour color: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &hourColor); s += hourColorParam.value();
s += sTemp;
s += ";\"><td></tr>"; s += ";\"><td></tr>";
s += "<tr><td>Minute color: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>Minute color: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &minuteColor); s += minuteColorParam.value();
s += sTemp;
s += ";\"><td></tr>"; s += ";\"><td></tr>";
if (singleSecond) { if (singleSecond) {
s += "<tr><td>Seconds color: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>Seconds color: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &secondsColor); s += secondsColorParam.value();
s += sTemp;
s += ";\"><td></tr>"; s += ";\"><td></tr>";
} }
if (allDotsOn) { if (allDotsOn) {
s += "<tr><td>Backlight: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>Backlight: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &backlightColor); s += backlightColorParam.value();
s += sTemp;
s += ";\"><td></tr>"; s += ";\"><td></tr>";
} }
s += "<tr><td>Hour Marking: </td><td style=\"border: 1px solid #000000; background-color:"; s += "<tr><td>Hour Marking: </td><td style=\"border: 1px solid #000000; background-color:";
transformtoHtmlColor ((char*)&sTemp, &hourMarkingColor); s += hourMarkingColorParam.value();
s += sTemp;
s += ";\"><td></tr></table>"; s += ";\"><td></tr></table>";
s += "<p>"; s += "<p>";
s += "Go to <a href='config'>configure page</a> to change values."; s += "Go to <a href='config'>configure page</a> to change values.";
@ -448,7 +431,7 @@ void iotWebConfHandleRoot() {
void iotWebConfConfigSaved() void iotWebConfConfigSaved()
{ {
//ToDo ntpServerParamValue; //ToDo ntpServerParamValue;
MAX_BRIGHTNESS = atoi(maxBrightnessParamValue); MAX_BRIGHTNESS = maxBrightnessParam.value();
singleSecond = singleSecondParam.isChecked() ? true : false; singleSecond = singleSecondParam.isChecked() ? true : false;
//Serial.println(singleSecondParam.isChecked() ? "true" : "false"); //Serial.println(singleSecondParam.isChecked() ? "true" : "false");
allDotsOn = allDotsOnParam.isChecked() ? true : false; allDotsOn = allDotsOnParam.isChecked() ? true : false;
@ -458,12 +441,12 @@ void iotWebConfConfigSaved()
#endif #endif
//Serial.println(followingHourParam.isChecked() ? "true" : "false"); //Serial.println(followingHourParam.isChecked() ? "true" : "false");
transformHtmltoStrip(&highnoonColor, (char*)&highnoonColorParamValue); transformHtmltoStrip(&highnoonColor, (char*)&highnoonColorParam.value());
transformHtmltoStrip(&hourColor, (char*)&hourColorParamValue); transformHtmltoStrip(&hourColor, (char*)&hourColorParam.value());
transformHtmltoStrip(&minuteColor, (char*)&minuteColorParamValue); transformHtmltoStrip(&minuteColor, (char*)&minuteColorParam.value());
transformHtmltoStrip(&secondsColor, (char*)&secondsColorParamValue); transformHtmltoStrip(&secondsColor, (char*)&secondsColorParam.value());
transformHtmltoStrip(&backlightColor, (char*)&backlightColorParamValue); transformHtmltoStrip(&backlightColor, (char*)&backlightColorParam.value());
transformHtmltoStrip(&hourMarkingColor, (char*)&hourMarkingColorParamValue); transformHtmltoStrip(&hourMarkingColor, (char*)&hourMarkingColorParam.value());
Serial.println("Configuration was updated."); Serial.println("Configuration was updated.");
} }
@ -519,7 +502,7 @@ void syncNTP() {
//init and get the time //init and get the time
#ifdef ESP8266 #ifdef ESP8266
//sntp_servermode_dhcp(0); //sntp_servermode_dhcp(0);
configTime(MYTZ, ntpServerParamValue); configTime(MYTZ, ntpServerParam.value());
#endif #endif
#ifdef ESP32 #ifdef ESP32
configTime(0, 0, ntpServer); configTime(0, 0, ntpServer);
@ -545,11 +528,12 @@ void syncNTP() {
Serial.println("NTP mapped: " + String(int(currentHour * NUM_LEDS / 12)) + ":" + String(int(currentMin * NUM_LEDS / 60)) + ":" + String(int(currentSec * NUM_LEDS / 60))); Serial.println("NTP mapped: " + String(int(currentHour * NUM_LEDS / 12)) + ":" + String(int(currentMin * NUM_LEDS / 60)) + ":" + String(int(currentSec * NUM_LEDS / 60)));
bootAnim.disable(); bootAnim.disable();
ledRefresh.enable(); ledRefresh.enable();
clockTick.enable(); //clockTick.enable();
#ifdef LDR_PIN #ifdef LDR_PIN
brightness.enable(); brightness.enable();
#endif #endif
} }
clockTick.enable(); //enable to check for ntp every 60 seconds
} }
} }
@ -587,6 +571,8 @@ void setup() {
iotWebConf_Setup(); iotWebConf_Setup();
//Serial.end(); //Serial.end();
ESP.wdtDisable();
ESP.wdtEnable(2000);
} }
void loop() void loop()