2019-12-11 08:03:32 +00:00
|
|
|
#include "time.h"
|
2020-12-28 15:41:01 +00:00
|
|
|
#include <TaskScheduler.h>
|
2021-06-28 19:07:58 +00:00
|
|
|
#define _TASK_SLEEP_ON_IDLE_RUN //ToDo check benefit
|
2020-12-28 15:41:01 +00:00
|
|
|
|
2022-11-10 19:03:13 +00:00
|
|
|
//#include <MacroLogger.h>
|
2020-09-27 06:29:14 +00:00
|
|
|
#include <NeoPixelBrightnessBus.h>
|
2020-05-03 12:53:41 +00:00
|
|
|
#include <IotWebConf.h>
|
2021-06-15 13:05:53 +00:00
|
|
|
#include <IotWebConfTParameter.h>
|
2021-01-01 15:44:50 +00:00
|
|
|
// UpdateServer includes
|
2022-11-10 19:03:13 +00:00
|
|
|
|
2021-01-01 15:44:50 +00:00
|
|
|
#ifdef ESP8266
|
2021-01-28 18:00:15 +00:00
|
|
|
#include <ESP8266WiFi.h>
|
2021-01-01 15:44:50 +00:00
|
|
|
# include <ESP8266HTTPUpdateServer.h>
|
2021-01-28 18:00:15 +00:00
|
|
|
#include <TZ.h>
|
|
|
|
#define MYTZ TZ_Europe_Berlin
|
|
|
|
#include <coredecls.h> // settimeofday_cb()
|
|
|
|
#include <sys/time.h> // struct timeval
|
|
|
|
#include <sntp.h> // sntp_servermode_dhcp()
|
2022-11-10 19:03:13 +00:00
|
|
|
|
2021-01-01 15:44:50 +00:00
|
|
|
#elif defined(ESP32)
|
2021-01-28 18:00:15 +00:00
|
|
|
#include <WiFi.h>
|
2021-01-01 15:44:50 +00:00
|
|
|
// For ESP32 IotWebConf provides a drop-in replacement for UpdateServer.
|
|
|
|
# include <IotWebConfESP32HTTPUpdateServer.h>
|
2021-10-14 11:51:43 +00:00
|
|
|
#include <esp_task_wdt.h>
|
2021-01-01 15:44:50 +00:00
|
|
|
#endif
|
|
|
|
|
2019-12-11 08:03:32 +00:00
|
|
|
|
2019-12-12 18:06:56 +00:00
|
|
|
#define MOD(a,b) ((((a)%(b))+(b))%(b))
|
2021-11-26 11:10:53 +00:00
|
|
|
|
2021-01-28 18:00:15 +00:00
|
|
|
#ifdef ESP8266
|
2021-05-06 19:13:50 +00:00
|
|
|
#define LDR_PIN A0
|
2021-01-28 18:00:15 +00:00
|
|
|
#define IOTWEBCONF_DEBUG_DISABLED
|
2021-05-06 19:13:50 +00:00
|
|
|
#define DATA_PIN D7 //DMA RDX0/GPIO3 | Uart1 TXD1/GPIO2 | UART0 GPIO1
|
2021-01-28 18:00:15 +00:00
|
|
|
#elif defined(ESP32)
|
2020-09-27 06:29:14 +00:00
|
|
|
#define LDR_PIN A6
|
|
|
|
#define DATA_PIN 17
|
2021-01-28 18:00:15 +00:00
|
|
|
#endif
|
2021-05-06 20:41:54 +00:00
|
|
|
/* useful preselection
|
2021-05-07 14:17:23 +00:00
|
|
|
NO following hour
|
|
|
|
NO three block hour marking
|
|
|
|
quarter hour marking
|
2021-05-06 20:41:54 +00:00
|
|
|
*/
|
|
|
|
#define NUM_LEDS 60 //24
|
2020-12-26 15:00:29 +00:00
|
|
|
#define SERIAL_BAUD 115200
|
|
|
|
|
2021-05-06 19:13:50 +00:00
|
|
|
#define RGBW
|
2021-05-06 20:41:54 +00:00
|
|
|
const bool clockwiseRing = false;
|
|
|
|
volatile bool singleSecond = false; //show seconds
|
2021-01-08 20:10:16 +00:00
|
|
|
volatile bool allDotsOn = true; //lighten up all leds
|
2021-05-06 20:41:54 +00:00
|
|
|
#if NUM_LEDS == 60
|
2021-01-08 20:10:16 +00:00
|
|
|
volatile bool followingHour = true; //move hour like an analog one
|
2021-05-07 14:17:23 +00:00
|
|
|
#else
|
|
|
|
volatile bool followingHour = false; //disabled due limited resolution
|
2021-05-06 20:41:54 +00:00
|
|
|
#endif
|
2021-01-08 20:10:16 +00:00
|
|
|
volatile int hourOffset = 0;
|
2020-12-26 15:00:29 +00:00
|
|
|
|
2020-12-28 15:41:01 +00:00
|
|
|
void bootAnimCallback();
|
|
|
|
void clockTickCallback();
|
|
|
|
void ledRefreshCallback();
|
|
|
|
void brightnessAdjustmentCallback();
|
2021-11-26 11:10:53 +00:00
|
|
|
void brightnessFadingCallback();
|
2021-06-28 19:07:58 +00:00
|
|
|
void iotWebConfLoopCallback();
|
2020-12-28 15:41:01 +00:00
|
|
|
|
2022-11-10 19:03:13 +00:00
|
|
|
//https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
|
|
|
|
#define MYTZ TZ_Europe_Berlin
|
|
|
|
String currentNTP;
|
|
|
|
struct tm timeinfo;
|
|
|
|
time_t now;
|
|
|
|
//https://github.com/arduino/esp8266/blob/master/cores/esp8266/sntp-lwip2.c
|
2022-01-30 14:44:36 +00:00
|
|
|
|
|
|
|
|
2022-11-10 19:03:13 +00:00
|
|
|
//mapping for analog time representation
|
2022-08-19 19:29:43 +00:00
|
|
|
volatile int currentSec = 30;
|
|
|
|
volatile int currentMin = 50;
|
|
|
|
volatile int currentHour = 50;
|
2022-01-30 14:44:36 +00:00
|
|
|
volatile bool NTPreachable = false;
|
|
|
|
volatile int MAX_BRIGHTNESS = 200;
|
|
|
|
#ifdef LDR_PIN
|
|
|
|
// variable for storing the potentiometer value
|
|
|
|
volatile unsigned int ldrValue = 0;
|
|
|
|
volatile unsigned int targetBrightness = MAX_BRIGHTNESS;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// WebPortal
|
|
|
|
const char thingName[] = "NTP-Clock-RGBLED";
|
|
|
|
const char wifiInitialApPassword[] = "12345678";
|
|
|
|
#define STRING_LEN 63
|
|
|
|
#define NUMBER_LEN 4
|
|
|
|
// -- Maximal length the input-range attributes can have.
|
|
|
|
//#define COLOR_ATTR_LENGTH 60
|
|
|
|
// -- Configuration specific key. The value should be modified if config structure was changed.
|
2022-11-10 19:03:13 +00:00
|
|
|
#define CONFIG_VERSION "V1.1.10"
|
2022-01-30 14:44:36 +00:00
|
|
|
|
|
|
|
|
2020-12-26 15:00:29 +00:00
|
|
|
#ifdef RGBW
|
|
|
|
#define MINIMAL_BRIGHTNESS 5
|
2021-11-26 11:10:53 +00:00
|
|
|
#define LDR_SCALE 4
|
2020-12-26 15:00:29 +00:00
|
|
|
#define colorSaturation 255
|
2021-01-28 18:00:15 +00:00
|
|
|
#ifdef ESP8266
|
2021-05-06 19:13:50 +00:00
|
|
|
//NeoPixelBrightnessBus<NeoGrbwFeature, Neo800KbpsMethod> strip(NUM_LEDS);//RDX0 GPIO3
|
2021-01-28 18:00:15 +00:00
|
|
|
//NeoPixelBrightnessBus<NeoGrbwFeature, NeoEsp8266AsyncUart0Sk6812Method> strip(NUM_LEDS);
|
|
|
|
//NeoPixelBrightnessBus<NeoGrbwFeature, NeoEsp8266Uart0Sk6812Method> strip(NUM_LEDS);
|
2021-05-06 19:13:50 +00:00
|
|
|
NeoPixelBrightnessBus<NeoGrbwFeature, NeoEsp8266BitBang800KbpsMethod> strip(NUM_LEDS, DATA_PIN);
|
2021-01-28 18:00:15 +00:00
|
|
|
#elif defined(ESP32)
|
|
|
|
NeoPixelBrightnessBus<NeoGrbwFeature, NeoEsp32I2s1800KbpsMethod> strip(NUM_LEDS, DATA_PIN); //ESP32
|
|
|
|
#endif
|
2020-09-27 06:29:14 +00:00
|
|
|
RgbwColor red(colorSaturation, 0, 0, 0);
|
|
|
|
RgbwColor green(0, colorSaturation, 0, 0);
|
|
|
|
RgbwColor blue(0, 0, colorSaturation, 0);
|
2020-12-28 15:41:01 +00:00
|
|
|
RgbwColor realWhite(colorSaturation);
|
2021-01-08 20:10:16 +00:00
|
|
|
RgbwColor white(0, 0, 0, 40); //darkish dirt
|
2020-12-28 15:41:01 +00:00
|
|
|
RgbwColor whiter(0, 0, 0, 120); //darkish dirt
|
2021-01-01 15:44:50 +00:00
|
|
|
RgbwColor white12(0, 0, 0, 192); //darkish dirt
|
2020-09-27 06:29:14 +00:00
|
|
|
RgbwColor black(0);
|
|
|
|
RgbwColor gold(HtmlColor( 0xFFD700 ) );
|
|
|
|
RgbwColor orangered(HtmlColor( 0xFF4500 ) );
|
|
|
|
RgbwColor orange(HtmlColor( 0xFFA500 ) );
|
2021-01-27 16:27:23 +00:00
|
|
|
RgbwColor darkred(HtmlColor( 0x800000) );
|
|
|
|
RgbwColor darkgreen(HtmlColor( 0x006400) );
|
|
|
|
RgbwColor lightgreen(HtmlColor( 0x30ee30) );
|
2020-12-26 15:00:29 +00:00
|
|
|
RgbwColor temp;
|
2021-01-30 13:04:23 +00:00
|
|
|
RgbwColor secondsColor = black;
|
2021-01-26 20:44:46 +00:00
|
|
|
RgbwColor minuteColor = darkred;
|
|
|
|
RgbwColor hourColor = gold;
|
|
|
|
RgbwColor highnoonColor = white12;
|
|
|
|
RgbwColor backlightColor = white;
|
|
|
|
RgbwColor hourMarkingColor = whiter;
|
2021-01-27 16:27:23 +00:00
|
|
|
|
|
|
|
void transformtoHtmlColor (char* sOutput, RgbwColor* inputColor) {
|
|
|
|
//Serial.printf("InputColor: R:%i G:%i B:%i W:%i\n", inputColor.R, inputColor.G, inputColor.B, inputColor.W);
|
|
|
|
|
|
|
|
if (inputColor->IsMonotone())
|
|
|
|
{
|
|
|
|
//Serial.print("White: "); Serial.println(inputColor->W);
|
2021-01-30 13:04:23 +00:00
|
|
|
HtmlColor(RgbColor(inputColor->W, inputColor->W, inputColor->W)).ToNumericalString(sOutput, 12);
|
2021-01-27 16:27:23 +00:00
|
|
|
//Serial.println((char*)sOutput);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
//Serial.print("Color: "); Serial.print(inputColor->R); Serial.print(inputColor->G); Serial.println(inputColor->B);
|
2021-01-30 13:04:23 +00:00
|
|
|
HtmlColor(RgbColor(inputColor->R, inputColor->G, inputColor->B)).ToNumericalString(sOutput, 12);
|
2021-01-27 16:27:23 +00:00
|
|
|
//Serial.println((char*)sOutput);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void transformHtmltoStrip(RgbwColor* outputColor, char* sInput) {
|
|
|
|
HtmlColor htmlTemp;
|
|
|
|
//Serial.print("HtmltoStrip ");
|
|
|
|
//Serial.println((char*)sInput);
|
|
|
|
htmlTemp.Parse<HtmlColorNames>( sInput );
|
|
|
|
RgbwColor stripColor( htmlTemp );
|
|
|
|
//Serial.printf("StripColor: R:%i G:%i B:%i W:%i\n", stripColor.R, stripColor.G, stripColor.B, stripColor.W);
|
|
|
|
memcpy(outputColor, &stripColor, sizeof(stripColor));
|
|
|
|
}
|
2022-01-30 14:44:36 +00:00
|
|
|
#endif
|
2021-01-27 16:27:23 +00:00
|
|
|
|
2022-01-30 14:44:36 +00:00
|
|
|
#ifndef RGBW
|
2020-12-26 15:00:29 +00:00
|
|
|
#define MINIMAL_BRIGHTNESS 20
|
|
|
|
#define LDR_SCALE 16
|
|
|
|
#define colorSaturation 192
|
2021-05-06 19:13:50 +00:00
|
|
|
#ifdef ESP8266
|
|
|
|
//NeoPixelBrightnessBus<NeoGrbFeature, Neo800KbpsMethod> strip(NUM_LEDS);//RDX0 GPIO3 Broken due IoTWebConf
|
|
|
|
NeoPixelBrightnessBus<NeoGrbFeature, NeoEsp8266Uart1800KbpsMethod> strip(NUM_LEDS);
|
|
|
|
//NeoPixelBrightnessBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod> strip(NUM_LEDS, DATA_PIN);
|
|
|
|
#elif defined(ESP32)
|
|
|
|
NeoPixelBrightnessBus<NeoGrbFeature, NeoEsp32I2s1800KbpsMethod> strip(NUM_LEDS, DATA_PIN); //ESP32
|
|
|
|
#endif
|
2020-12-26 15:00:29 +00:00
|
|
|
RgbColor red(colorSaturation, 0, 0);
|
|
|
|
RgbColor green(0, colorSaturation, 0);
|
|
|
|
RgbColor blue(0, 0, colorSaturation);
|
|
|
|
RgbColor realWhite(colorSaturation);
|
|
|
|
RgbColor black(0);
|
|
|
|
RgbColor white(30, 40, 35); //darkish dirt
|
|
|
|
RgbColor whiter(120, 120, 120); //darkish dirt
|
|
|
|
RgbColor white12(255, 255, 255); //darkish dirt
|
2021-01-27 16:27:23 +00:00
|
|
|
RgbColor gold(HtmlColor( 0xFFD700 ));
|
|
|
|
RgbColor orangered(HtmlColor( 0xFF4500 ));
|
|
|
|
RgbColor orange(HtmlColor( 0xFFA500 ));
|
|
|
|
RgbColor darkred(HtmlColor( 0x800000 ));
|
|
|
|
RgbColor darkgreen(HtmlColor( 0x006400 ));
|
|
|
|
RgbColor lightgreen(HtmlColor( 0x90ee90 ));
|
2020-12-26 15:00:29 +00:00
|
|
|
RgbColor temp;
|
2021-01-30 13:04:23 +00:00
|
|
|
RgbColor secondsColor = black;
|
2021-01-26 20:44:46 +00:00
|
|
|
RgbColor minuteColor = darkred;
|
|
|
|
RgbColor hourColor = gold;
|
|
|
|
RgbColor highnoonColor = white12;
|
|
|
|
RgbColor backlightColor = white;
|
|
|
|
RgbColor hourMarkingColor = whiter;
|
2021-01-27 16:27:23 +00:00
|
|
|
|
2021-01-30 13:04:23 +00:00
|
|
|
void transformtoHtmlColor (char* sOutput, RgbColor* inputColor) {
|
|
|
|
HtmlColor(RgbColor(inputColor->R, inputColor->G, inputColor->B)).ToNumericalString(sOutput, 12);
|
2021-01-27 16:27:23 +00:00
|
|
|
}
|
|
|
|
|
2021-01-30 13:04:23 +00:00
|
|
|
void transformHtmltoStrip(RgbColor* outputColor, char* sInput) {
|
2021-01-27 16:27:23 +00:00
|
|
|
HtmlColor htmlTemp;
|
|
|
|
//Serial.print("HtmltoStrip ");
|
|
|
|
//Serial.println((char*)sInput);
|
2021-01-30 13:04:23 +00:00
|
|
|
htmlTemp.Parse<HtmlColorNames>( sInput );
|
2021-01-27 16:27:23 +00:00
|
|
|
RgbColor stripColor( htmlTemp );
|
2021-01-30 13:04:23 +00:00
|
|
|
//Serial.printf("StripColor: R:%i G:%i B:%i W:%i\n", stripColor.R, stripColor.G, stripColor.B, stripColor.W);
|
2021-01-27 16:27:23 +00:00
|
|
|
memcpy(outputColor, &stripColor, sizeof(stripColor));
|
|
|
|
}
|
|
|
|
|
2020-12-26 15:00:29 +00:00
|
|
|
#endif
|
2020-05-03 12:53:41 +00:00
|
|
|
DNSServer dnsServer;
|
|
|
|
WebServer server(80);
|
2021-01-01 15:44:50 +00:00
|
|
|
#ifdef ESP8266
|
|
|
|
ESP8266HTTPUpdateServer httpUpdater;
|
|
|
|
#elif defined(ESP32)
|
|
|
|
HTTPUpdateServer httpUpdater;
|
|
|
|
#endif
|
2020-05-03 12:53:41 +00:00
|
|
|
|
2022-11-10 19:03:13 +00:00
|
|
|
|
2020-05-03 12:53:41 +00:00
|
|
|
IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION);
|
2021-06-15 13:05:53 +00:00
|
|
|
iotwebconf::ParameterGroup timeGroup = iotwebconf::ParameterGroup("Time", "Time settings");
|
2022-11-10 19:03:13 +00:00
|
|
|
iotwebconf::TextTParameter<STRING_LEN> timezoneParam =
|
|
|
|
iotwebconf::Builder<iotwebconf::TextTParameter<STRING_LEN>>("timezone").
|
|
|
|
label("TimeZone").
|
|
|
|
defaultValue("TZ_Europe_Berlin").
|
|
|
|
build();
|
|
|
|
/*
|
2021-06-15 13:05:53 +00:00
|
|
|
iotwebconf::TextTParameter<STRING_LEN> ntpServerParam =
|
|
|
|
iotwebconf::Builder<iotwebconf::TextTParameter<STRING_LEN>>("ntpServer").
|
|
|
|
label("NTP Server").
|
|
|
|
defaultValue("pool.ntp.org").
|
2022-11-10 19:03:13 +00:00
|
|
|
build();*/
|
2021-06-15 13:05:53 +00:00
|
|
|
iotwebconf::ParameterGroup ledGroup = iotwebconf::ParameterGroup("LED", "LED settings");
|
|
|
|
iotwebconf::IntTParameter<int16_t> maxBrightnessParam =
|
|
|
|
iotwebconf::Builder<iotwebconf::IntTParameter<int16_t>>("Max Brightness").
|
|
|
|
label("Max brightness").
|
|
|
|
defaultValue(200).
|
|
|
|
min(MINIMAL_BRIGHTNESS).
|
|
|
|
max(MAX_BRIGHTNESS).
|
|
|
|
step(1).
|
|
|
|
build();
|
|
|
|
|
|
|
|
iotwebconf::CheckboxTParameter singleSecondParam =
|
|
|
|
iotwebconf::Builder<iotwebconf::CheckboxTParameter>("singleSecond").
|
|
|
|
label("single Second visible").
|
2021-05-06 20:41:54 +00:00
|
|
|
#if NUM_LEDS == 60
|
2021-06-15 13:05:53 +00:00
|
|
|
defaultValue(true).
|
|
|
|
build();
|
2021-05-07 14:17:23 +00:00
|
|
|
#else
|
2021-06-15 13:05:53 +00:00
|
|
|
defaultValue(false).
|
|
|
|
build();
|
2021-05-06 20:41:54 +00:00
|
|
|
#endif
|
2021-06-15 13:05:53 +00:00
|
|
|
|
|
|
|
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").
|
2021-05-06 20:41:54 +00:00
|
|
|
#if NUM_LEDS == 60
|
2021-06-15 13:05:53 +00:00
|
|
|
defaultValue(true).
|
|
|
|
build();
|
2021-05-07 14:17:23 +00:00
|
|
|
#else
|
2021-06-15 13:05:53 +00:00
|
|
|
defaultValue(false).
|
|
|
|
build();
|
2021-05-06 20:41:54 +00:00
|
|
|
#endif
|
2021-06-15 13:05:53 +00:00
|
|
|
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();
|
2022-01-30 14:44:36 +00:00
|
|
|
const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\
|
|
|
|
function colorCh(id)\n\
|
|
|
|
{\n\
|
|
|
|
var x=document.getElementById(id);\n\
|
|
|
|
var s=document.getElementById(id + 'Val');\n\
|
|
|
|
s.innerHTML = x.value;\n\
|
|
|
|
}\n\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 = '80%'; 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";
|
|
|
|
|
|
|
|
// -- We need to create our custom HtmlFormatProvider to add some javasripts.
|
|
|
|
class CustomHtmlFormatProvider : public iotwebconf::HtmlFormatProvider
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
String getScriptInner() override
|
|
|
|
{
|
|
|
|
return
|
|
|
|
HtmlFormatProvider::getScriptInner() +
|
|
|
|
String(FPSTR(CUSTOMHTML_SCRIPT_INNER));
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
// -- 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_BODY_INNER[] PROGMEM = " <link rel='icon' src='data:image/png;base64,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'/>";
|
2021-01-01 15:44:50 +00:00
|
|
|
|
|
|
|
// -- An instance must be created from the class defined above.
|
|
|
|
CustomHtmlFormatProvider customHtmlFormatProvider;
|
2019-12-11 08:03:32 +00:00
|
|
|
|
2020-12-28 15:41:01 +00:00
|
|
|
Task bootAnim(200, TASK_FOREVER, &bootAnimCallback);
|
|
|
|
Task clockTick(1000, TASK_FOREVER, &clockTickCallback);
|
2022-11-10 19:03:13 +00:00
|
|
|
Task ntpReachableCheck(1800000, TASK_FOREVER, &ntpReachableCheckCallback);
|
2020-12-28 15:41:01 +00:00
|
|
|
Task ledRefresh(200, TASK_FOREVER, &ledRefreshCallback);
|
2021-01-28 18:00:15 +00:00
|
|
|
#ifdef LDR_PIN
|
2021-11-26 11:10:53 +00:00
|
|
|
Task brightnessAdjustment(10000, TASK_FOREVER, &brightnessAdjustmentCallback);
|
|
|
|
Task brightnessFading(333, TASK_FOREVER, &brightnessFadingCallback);
|
2021-01-28 18:00:15 +00:00
|
|
|
#endif
|
2021-06-28 19:07:58 +00:00
|
|
|
Task iotwebconfLoop(1000, TASK_FOREVER, &iotWebConfLoopCallback);
|
2020-12-28 15:41:01 +00:00
|
|
|
Scheduler runner;
|