diff --git a/src/_Plugin_Helper.cpp b/src/_Plugin_Helper.cpp index 7378a7f24..47b54546a 100644 --- a/src/_Plugin_Helper.cpp +++ b/src/_Plugin_Helper.cpp @@ -5,6 +5,7 @@ #include "src/CustomBuild/ESPEasyLimits.h" #include "src/DataStructs/PluginTaskData_base.h" #include "src/DataStructs/SettingsStruct.h" +#include "src/DataStructs/TimingStats.h" #include "src/Globals/Cache.h" #include "src/Globals/Plugins.h" #include "src/Globals/Settings.h" diff --git a/src/src/DataStructs/TimingStats.cpp b/src/src/DataStructs/TimingStats.cpp index de500e71f..7cb625697 100644 --- a/src/src/DataStructs/TimingStats.cpp +++ b/src/src/DataStructs/TimingStats.cpp @@ -76,9 +76,12 @@ const __FlashStringHelper* getPluginFunctionName(int function) { case PLUGIN_FORMAT_USERVAR: return F("FORMAT_USERVAR"); case PLUGIN_GET_DEVICENAME: return F("GET_DEVICENAME"); case PLUGIN_GET_DEVICEVALUENAMES: return F("GET_DEVICEVALUENAMES"); + case PLUGIN_GET_DEVICEVALUECOUNT: return F("GET_DEVICEVALUECOUNT"); + case PLUGIN_GET_DEVICEVTYPE: return F("GET_DEVICEVTYPE"); case PLUGIN_WRITE: return F("WRITE"); case PLUGIN_EVENT_OUT: return F("EVENT_OUT"); case PLUGIN_WEBFORM_SHOW_CONFIG: return F("WEBFORM_SHOW_CONFIG"); + case PLUGIN_WEBFORM_LOAD_SHOW_STATS: return F("WEBFORM_LOAD_SHOW_STATS"); case PLUGIN_SERIAL_IN: return F("SERIAL_IN"); case PLUGIN_UDP_IN: return F("UDP_IN"); case PLUGIN_CLOCK_IN: return F("CLOCK_IN"); @@ -110,9 +113,11 @@ bool mustLogFunction(int function) { case PLUGIN_WEBFORM_SAVE: return false; case PLUGIN_WEBFORM_LOAD: return false; case PLUGIN_WEBFORM_SHOW_VALUES: return false; - case PLUGIN_FORMAT_USERVAR: return false; - case PLUGIN_GET_DEVICENAME: return false; - case PLUGIN_GET_DEVICEVALUENAMES: return false; + case PLUGIN_FORMAT_USERVAR: return true; + case PLUGIN_GET_DEVICENAME: return true; + case PLUGIN_GET_DEVICEVALUENAMES: return true; + case PLUGIN_GET_DEVICEVALUECOUNT: return true; + case PLUGIN_GET_DEVICEVTYPE: return true; case PLUGIN_WRITE: return true; case PLUGIN_EVENT_OUT: return true; case PLUGIN_WEBFORM_SHOW_CONFIG: return false; @@ -242,6 +247,9 @@ const __FlashStringHelper* getMiscStatsName_F(TimingStatsElements stat) { case TimingStatsElements::SAVE_TO_RTC: return F("saveToRTC()"); case TimingStatsElements::BACKGROUND_TASKS: return F("backgroundtasks()"); case TimingStatsElements::PROCESS_SYSTEM_EVENT_QUEUE: return F("process_system_event_queue()"); + case TimingStatsElements::FORMAT_USER_VAR: return F("doFormatUserVar()"); + case TimingStatsElements::IS_NUMERICAL: return F("isNumerical()"); + case TimingStatsElements::GET_TASKVALUE_AS_STRING: return F("TaskValueGetAsString()"); case TimingStatsElements::HANDLE_SCHEDULER_IDLE: return F("handle_schedule() idle"); case TimingStatsElements::HANDLE_SCHEDULER_TASK: return F("handle_schedule() task"); case TimingStatsElements::PARSE_TEMPLATE_PADDED: return F("parseTemplate_padded()"); diff --git a/src/src/DataStructs/TimingStats.h b/src/src/DataStructs/TimingStats.h index eabe36fa0..9aad136cf 100644 --- a/src/src/DataStructs/TimingStats.h +++ b/src/src/DataStructs/TimingStats.h @@ -67,6 +67,9 @@ enum class TimingStatsElements { PARSE_SYSVAR, PARSE_SYSVAR_NOCHANGE, PARSE_TEMPLATE_PADDED, + IS_NUMERICAL, + GET_TASKVALUE_AS_STRING, + FORMAT_USER_VAR, PROCESS_SYSTEM_EVENT_QUEUE, RULES_MATCH, RULES_PROCESSING, diff --git a/src/src/DataTypes/TaskValues_Data.cpp b/src/src/DataTypes/TaskValues_Data.cpp index bf1e33afa..9fa84188e 100644 --- a/src/src/DataTypes/TaskValues_Data.cpp +++ b/src/src/DataTypes/TaskValues_Data.cpp @@ -1,5 +1,6 @@ #include "../DataTypes/TaskValues_Data.h" +#include "../DataStructs/TimingStats.h" #include "../Helpers/Numerical.h" #include "../Helpers/StringConverter_Numerical.h" @@ -223,6 +224,7 @@ bool TaskValues_Data_t::isValid(uint8_t varNr, Sensor_VType sensorType) const String TaskValues_Data_t::getAsString(uint8_t varNr, Sensor_VType sensorType, uint8_t nrDecimals) const { String result; + START_TIMER; if (isFloatOutputDataType(sensorType)) { result = toString(getFloat(varNr), nrDecimals); @@ -246,5 +248,6 @@ String TaskValues_Data_t::getAsString(uint8_t varNr, Sensor_VType sensorType, u #endif } result.trim(); + STOP_TIMER(GET_TASKVALUE_AS_STRING); return result; } diff --git a/src/src/Globals/Plugins.cpp b/src/src/Globals/Plugins.cpp index bc872c14c..a8f0f1d7d 100644 --- a/src/src/Globals/Plugins.cpp +++ b/src/src/Globals/Plugins.cpp @@ -660,19 +660,11 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) } } event->BaseVarIndex = event->TaskIndex * VARS_PER_TASK; - { - #ifndef BUILD_NO_RAM_TRACKER - String descr; - descr.reserve(20); - descr = F("PluginCall_task_"); - descr += (event->TaskIndex + 1); - #if FEATURE_TIMING_STATS - checkRAM(descr, getPluginFunctionName(Function)); - #else // if FEATURE_TIMING_STATS - checkRAM(descr, String(Function)); - #endif // if FEATURE_TIMING_STATS - #endif - } + + #ifndef BUILD_NO_RAM_TRACKER + checkRAM_PluginCall_task(event->TaskIndex, Function); + #endif + if (!prepare_I2C_by_taskIndex(event->TaskIndex, DeviceIndex)) { return false; } @@ -795,8 +787,6 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) // Call to specific task not interacting with hardware case PLUGIN_GET_CONFIG_VALUE: case PLUGIN_GET_DEVICEVALUENAMES: - case PLUGIN_GET_DEVICEVALUECOUNT: - case PLUGIN_GET_DEVICEVTYPE: case PLUGIN_GET_DEVICEGPIONAMES: case PLUGIN_WEBFORM_SAVE: case PLUGIN_WEBFORM_SHOW_VALUES: @@ -807,7 +797,6 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) #if FEATURE_PLUGIN_STATS case PLUGIN_WEBFORM_LOAD_SHOW_STATS: #endif // if FEATURE_PLUGIN_STATS - case PLUGIN_FORMAT_USERVAR: case PLUGIN_SET_CONFIG: case PLUGIN_SET_DEFAULTS: case PLUGIN_I2C_HAS_ADDRESS: @@ -818,6 +807,7 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) //case PLUGIN_MQTT_CONNECTION_STATE: //case PLUGIN_MQTT_IMPORT: { + START_TIMER; const deviceIndex_t DeviceIndex = getDeviceIndex_from_TaskIndex(event->TaskIndex); if (validDeviceIndex(DeviceIndex)) { @@ -831,33 +821,17 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) LoadTaskSettings(event->TaskIndex); } event->BaseVarIndex = event->TaskIndex * VARS_PER_TASK; - { - #ifndef BUILD_NO_RAM_TRACKER - String descr; - descr.reserve(20); - descr = F("PluginCall_task_"); - descr += (event->TaskIndex + 1); - #if FEATURE_TIMING_STATS - checkRAM(descr, getPluginFunctionName(Function)); - #else // if FEATURE_TIMING_STATS - checkRAM(descr, String(Function)); - #endif // if FEATURE_TIMING_STATS - #endif - } + #ifndef BUILD_NO_RAM_TRACKER + checkRAM_PluginCall_task(event->TaskIndex, Function); + #endif + if (Function == PLUGIN_SET_DEFAULTS) { for (int i = 0; i < VARS_PER_TASK; ++i) { UserVar[event->BaseVarIndex + i] = 0.0f; } } - if (Function == PLUGIN_GET_DEVICEVALUECOUNT) { - event->Par1 = Device[DeviceIndex].ValueCount; - } - if (Function == PLUGIN_GET_DEVICEVTYPE) { - event->sensorType = Device[DeviceIndex].VType; - } - START_TIMER; bool retval = PluginCall(DeviceIndex, Function, event, str); // Calls may have updated ExtraTaskSettings, so validate them. @@ -886,6 +860,36 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) } } + + STOP_TIMER_TASK(DeviceIndex, Function); + delay(0); // SMY: call delay(0) unconditionally + return retval; + } + return false; + } + + // Frequently made call to specific task not interacting with hardware + case PLUGIN_GET_DEVICEVALUECOUNT: + case PLUGIN_GET_DEVICEVTYPE: + case PLUGIN_FORMAT_USERVAR: + { + START_TIMER; + const deviceIndex_t DeviceIndex = getDeviceIndex_from_TaskIndex(event->TaskIndex); + + if (validDeviceIndex(DeviceIndex)) { + event->BaseVarIndex = event->TaskIndex * VARS_PER_TASK; + + #ifndef BUILD_NO_RAM_TRACKER +// checkRAM_PluginCall_task(event->TaskIndex, Function); + #endif + + if (Function == PLUGIN_GET_DEVICEVALUECOUNT) { + event->Par1 = Device[DeviceIndex].ValueCount; + } + if (Function == PLUGIN_GET_DEVICEVTYPE) { + event->sensorType = Device[DeviceIndex].VType; + } + bool retval = PluginCall(DeviceIndex, Function, event, str); if (Function == PLUGIN_GET_DEVICEVALUECOUNT) { // Check if we have a valid value count. if (Output_Data_type_t::Simple == Device[DeviceIndex].OutputDataType) { @@ -896,7 +900,6 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) } } } - STOP_TIMER_TASK(DeviceIndex, Function); delay(0); // SMY: call delay(0) unconditionally return retval; @@ -904,6 +907,7 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) return false; } + } // case return false; } diff --git a/src/src/Globals/RamTracker.cpp b/src/src/Globals/RamTracker.cpp index 2e7264f31..3cf3fbbfa 100644 --- a/src/src/Globals/RamTracker.cpp +++ b/src/src/Globals/RamTracker.cpp @@ -2,6 +2,9 @@ #ifndef BUILD_NO_RAM_TRACKER +#if FEATURE_TIMING_STATS +#include "../DataStructs/TimingStats.h" +#endif #include "../ESPEasyCore/ESPEasy_Log.h" @@ -10,6 +13,7 @@ #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" +#include "../Helpers/StringConverter.h" RamTracker myRamTracker; @@ -49,6 +53,16 @@ void checkRAM(const __FlashStringHelper * descr ) { checkRAM(String(descr)); } +void checkRAM_PluginCall_task(uint8_t taskIndex, uint8_t Function) { + if (!checkRAM_continue()) return; + const String descr = concat(F("PluginCall_task_"), taskIndex + 1); + #if FEATURE_TIMING_STATS + checkRAM(descr, getPluginFunctionName(Function)); + #else // if FEATURE_TIMING_STATS + checkRAM(descr, String(Function)); + #endif // if FEATURE_TIMING_STATS +} + void checkRAM(const String& descr ) { if (Settings.EnableRAMTracking()) myRamTracker.registerRamState(descr); @@ -71,6 +85,22 @@ void checkRAM(const String& descr ) { } } +bool checkRAM_continue() +{ +#ifdef ESP32 + const uint32_t freeRAM = ESP.getMinFreeHeap(); +#else + const uint32_t freeRAM = FreeMem(); +#endif + if (freeRAM <= lowestRAM) + return true; + + if (getFreeStackWatermark() <= lowestFreeStack) { + return true; + } + return Settings.EnableRAMTracking(); +} + /********************************************************************************************\ RamTracker class diff --git a/src/src/Globals/RamTracker.h b/src/src/Globals/RamTracker.h index 1b8223fe2..1878e8e83 100644 --- a/src/src/Globals/RamTracker.h +++ b/src/src/Globals/RamTracker.h @@ -56,10 +56,11 @@ void checkRAM(const __FlashStringHelper * flashString, const __FlashStringHelper * a); void checkRAM(const String& flashString, const String& a); - +void checkRAM_PluginCall_task(uint8_t taskIndex, uint8_t Function); void checkRAM(const __FlashStringHelper * descr); void checkRAM(const String& descr); +bool checkRAM_continue(); #endif diff --git a/src/src/Helpers/Numerical.cpp b/src/src/Helpers/Numerical.cpp index 75360c1b4..b1994ef28 100644 --- a/src/src/Helpers/Numerical.cpp +++ b/src/src/Helpers/Numerical.cpp @@ -1,5 +1,7 @@ #include "../Helpers/Numerical.h" +#include "../DataStructs/TimingStats.h" + #include "../Globals/Settings.h" #include "../Helpers/StringConverter.h" @@ -316,6 +318,7 @@ String getNumerical(const String& tBuf, NumericalType requestedType, NumericalTy } bool isNumerical(const String& tBuf, NumericalType& detectedType) { + START_TIMER; NumericalType requestedType = NumericalType::FloatingPoint; const String result = getNumerical(tBuf, requestedType, detectedType); @@ -329,9 +332,9 @@ bool isNumerical(const String& tBuf, NumericalType& detectedType) { // Resulting size should be the same size as the given string. // Not sure if it is possible to have a longer result, but better be sure to also allow for larger resulting strings. // For example ".123" -> "0.123" + STOP_TIMER(IS_NUMERICAL); return result.length() >= tmp.length(); } - return result.length() > 0; } diff --git a/src/src/Helpers/StringConverter.cpp b/src/src/Helpers/StringConverter.cpp index a9ac3b6f1..aadfecb3e 100644 --- a/src/src/Helpers/StringConverter.cpp +++ b/src/src/Helpers/StringConverter.cpp @@ -4,6 +4,7 @@ #include "../../_Plugin_Helper.h" #include "../DataStructs/ESPEasy_EventStruct.h" +#include "../DataStructs/TimingStats.h" #include "../ESPEasyCore/ESPEasy_Log.h" @@ -295,6 +296,7 @@ void replaceUnicodeByChar(String& line, char replChar) { \*********************************************************************************************/ String doFormatUserVar(struct EventStruct *event, uint8_t rel_index, bool mustCheck, bool& isvalid) { if (event == nullptr) return EMPTY_STRING; + START_TIMER; isvalid = true; const deviceIndex_t DeviceIndex = getDeviceIndex_from_TaskIndex(event->TaskIndex); @@ -363,7 +365,9 @@ String doFormatUserVar(struct EventStruct *event, uint8_t rel_index, bool mustCh return toString(f, nrDecimals); } } - return UserVar.getAsString(event->TaskIndex, rel_index, sensorType, nrDecimals); + String res = UserVar.getAsString(event->TaskIndex, rel_index, sensorType, nrDecimals); + STOP_TIMER(FORMAT_USER_VAR); + return res; } String formatUserVarNoCheck(taskIndex_t TaskIndex, uint8_t rel_index) { @@ -537,34 +541,25 @@ String to_json_value(const String& value, bool wrapInQuotes) { // First we check for not allowed special characters. const size_t val_length = value.length(); for (size_t i = 0; i < val_length; ++i) { - switch (value[i]) { - case '\n': - case '\r': - case '\t': - case '\\': - case '\b': - case '\f': - case '"': - { - // Special characters not allowed in JSON: - // \b Backspace (ascii code 08) - // \f Form feed (ascii code 0C) - // \n New line - // \r Carriage return - // \t Tab - // \" Double quote - // \\ Backslash character - // Must replace characters, so make a deepcopy - String tmpValue(value); - tmpValue.replace('\n', '^'); - tmpValue.replace('\r', '^'); - tmpValue.replace('\t', ' '); - tmpValue.replace('\\', '^'); - tmpValue.replace('\b', '^'); - tmpValue.replace('\f', '^'); - tmpValue.replace('"', '\''); - return wrap_String(tmpValue, '"'); - } + const char c = value[i]; + // Special characters not allowed in JSON: + if (c == '\n'|| // \n New line + c == '\r'|| // \r Carriage return + c == '\t'|| // \t Tab + c == '\\'|| // \\ Backslash character + c == '\b'|| // \b Backspace (ascii code 08) + c == '\f'|| // \f Form feed (ascii code 0C) + c == '"') { // \" Double quote + // Must replace characters, so make a deepcopy + String tmpValue(value); + tmpValue.replace('\n', '^'); + tmpValue.replace('\r', '^'); + tmpValue.replace('\t', ' '); + tmpValue.replace('\\', '^'); + tmpValue.replace('\b', '^'); + tmpValue.replace('\f', '^'); + tmpValue.replace('"', '\''); + return wrap_String(tmpValue, '"'); } } return wrap_String(value, '"'); diff --git a/src/src/Helpers/StringConverter_Numerical.cpp b/src/src/Helpers/StringConverter_Numerical.cpp index ed5567a05..9669f0aa9 100644 --- a/src/src/Helpers/StringConverter_Numerical.cpp +++ b/src/src/Helpers/StringConverter_Numerical.cpp @@ -21,9 +21,14 @@ unsigned long str2int(const char *string) \*********************************************************************************************/ String toString(const float& value, unsigned int decimalPlaces) { + /* #ifndef LIMIT_BUILD_SIZE if (decimalPlaces == 0) { + if ((value > -2e9f) && (value < 2e9f)) { + const int32_t l_value = static_cast(roundf(value)); + return String(l_value); + } if ((value > -1e18f) && (value < 1e18f)) { // Work-around to perform a faster conversion const int64_t ll_value = static_cast(roundf(value)); @@ -31,17 +36,14 @@ String toString(const float& value, unsigned int decimalPlaces) } } #endif // ifndef LIMIT_BUILD_SIZE + */ #if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE // This has been fixed in ESP32 code, not (yet) in ESP8266 code // https://github.com/espressif/arduino-esp32/pull/6138/files // #ifdef ESP8266 - char *buf = (char *)malloc(decimalPlaces + 42); - - if (nullptr == buf) { - return F("nan"); - } + char buf[decimalPlaces + 42]; + ZERO_FILL(buf); String sValue(dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf)); - free(buf); #else String sValue = String(value, decimalPlaces); diff --git a/src/src/WebServer/JSON.cpp b/src/src/WebServer/JSON.cpp index 997908733..96c70bfed 100644 --- a/src/src/WebServer/JSON.cpp +++ b/src/src/WebServer/JSON.cpp @@ -413,7 +413,7 @@ void handle_json() nrDecimals = 255; } stream_next_json_object_value(F("ValueNumber"), x + 1); - stream_next_json_object_value(F("Name"), getTaskValueName(TaskIndex, x)); + stream_next_json_object_value(F("Name"), Cache.getTaskDeviceValueName(TaskIndex, x)); stream_next_json_object_value(F("NrDecimals"), nrDecimals); stream_last_json_object_value(F("Value"), value); diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index c64ed2fb6..02d0f13ea 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -213,9 +213,10 @@ void handle_root() { { addRowLabel(LabelType::M_DNS); addHtml(F("")); - addHtml(getValue(LabelType::M_DNS)); + addHtml(url); addHtml(F("")); } # endif // if FEATURE_MDNS diff --git a/src/src/WebServer/WebTemplateParser.cpp b/src/src/WebServer/WebTemplateParser.cpp index 42674c316..d76ceee57 100644 --- a/src/src/WebServer/WebTemplateParser.cpp +++ b/src/src/WebServer/WebTemplateParser.cpp @@ -213,17 +213,7 @@ void WebTemplateParser::processVarName() if (!varName.length()) { return; } varName.toLowerCase(); - if (equals(varName, F("error"))) { - getErrorNotifications(); - } - else if (equals(varName, F("meta"))) { - if (Rebooting) { - addHtml(F("")); - } - } - else { - getWebPageTemplateVar(varName); - } + getWebPageTemplateVar(varName); } void WebTemplateParser::getErrorNotifications() { @@ -250,129 +240,175 @@ void WebTemplateParser::getErrorNotifications() { void WebTemplateParser::getWebPageTemplateVar(const String& varName) { + if (varName.length() == 0) { return; } + + // serialPrint(varName); serialPrint(" : free: "); serialPrint(ESP.getFreeHeap()); serialPrint("var len before: "); serialPrint // (varValue.length()) ;serialPrint("after: "); // varValue = ""; - if (equals(varName, F("name"))) - { - addHtml(Settings.getHostname()); - } + switch (varName[0]) { + case 'b': - else if (equals(varName, F("unit"))) - { - addHtmlInt(Settings.Unit); - } - - else if (equals(varName, F("build"))) - { + if (equals(varName, F("build"))) + { #if BUILD_IN_WEBFOOTER - // In the footer, show full build binary name, will be 'firmware.bin' when compiled using Arduino IDE. - addHtml(get_binary_filename()); - #endif - } - else if (equals(varName, F("date"))) - { - #if BUILD_IN_WEBFOOTER - // Add the compile-date - addHtml(get_build_date()); - #endif - } - - else if (equals(varName, F("menu"))) - { - addHtml(F("")); - } - - else if (equals(varName, F("logo"))) - { - if (fileExists(F("esp.png"))) - { - addHtml(F("")); - } - } - - else if (equals(varName, F("css"))) - { - serve_favicon(); - // if (MENU_INDEX_SETUP == navMenuIndex) { - // // Serve embedded CSS - // serve_CSS_inline(); - // } else { - serve_CSS(CSSfiles_e::ESPEasy_default); - // } + // } #if FEATURE_RULES_EASY_COLOR_CODE - if (MENU_INDEX_RULES == navMenuIndex || - MENU_INDEX_CUSTOM_PAGE == navMenuIndex) { - serve_CSS(CSSfiles_e::EasyColorCode_codemirror); - } - #endif - } + if ((MENU_INDEX_RULES == navMenuIndex) || + (MENU_INDEX_CUSTOM_PAGE == navMenuIndex)) { + serve_CSS(CSSfiles_e::EasyColorCode_codemirror); + } + #endif // if FEATURE_RULES_EASY_COLOR_CODE + return; + } + break; + case 'd': - else if (equals(varName, F("js"))) - { - html_add_JQuery_script(); + if (equals(varName, F("date"))) + { + #if BUILD_IN_WEBFOOTER + + // Add the compile-date + addHtml(get_build_date()); + #endif // if BUILD_IN_WEBFOOTER + return; + } + else if (equals(varName, F("debug"))) + { + // print debug messages - not implemented yet + return; + } + + break; + case 'e': + + if (equals(varName, F("error"))) + { + getErrorNotifications(); + return; + } + break; + case 'j': + + if (equals(varName, F("js"))) + { + html_add_JQuery_script(); #if FEATURE_CHART_JS - html_add_ChartJS_script(); + html_add_ChartJS_script(); #endif // if FEATURE_CHART_JS #if FEATURE_RULES_EASY_COLOR_CODE - if (MENU_INDEX_RULES == navMenuIndex || - MENU_INDEX_CUSTOM_PAGE == navMenuIndex) { - html_add_Easy_color_code_script(); - } - #endif - if (MENU_INDEX_RULES == navMenuIndex) { - serve_JS(JSfiles_e::SaveRulesFile); - } - - html_add_autosubmit_form(); - serve_JS(JSfiles_e::Toasting); - } - else if (equals(varName, F("error"))) - { - // print last error - not implemented yet - } + if ((MENU_INDEX_RULES == navMenuIndex) || + (MENU_INDEX_CUSTOM_PAGE == navMenuIndex)) { + html_add_Easy_color_code_script(); + } + #endif // if FEATURE_RULES_EASY_COLOR_CODE - else if (equals(varName, F("debug"))) - { - // print debug messages - not implemented yet - } + if (MENU_INDEX_RULES == navMenuIndex) { + serve_JS(JSfiles_e::SaveRulesFile); + } - else + html_add_autosubmit_form(); + serve_JS(JSfiles_e::Toasting); + return; + } + break; + case 'l': + + if (equals(varName, F("logo"))) + { + if (fileExists(F("esp.png"))) + { + addHtml(F("")); + } + return; + } + break; + case 'm': + + if (equals(varName, F("menu"))) + { + addHtml(F("")); + return; + } + else if (equals(varName, F("meta"))) { + if (Rebooting) { + addHtml(F("")); + } + return; + } + + break; + case 'n': + + if (equals(varName, F("name"))) + { + addHtml(Settings.getHostname()); + return; + } + break; + case 'u': + + if (equals(varName, F("unit"))) + { + addHtmlInt(Settings.Unit); + return; + } + + break; + } { #ifndef BUILD_NO_DEBUG @@ -385,4 +421,4 @@ void WebTemplateParser::getWebPageTemplateVar(const String& varName) // no return string - eat var name } -} \ No newline at end of file +}