diff --git a/src/_P004_Dallas.ino b/src/_P004_Dallas.ino index 83cf5345d..518f429fb 100644 --- a/src/_P004_Dallas.ino +++ b/src/_P004_Dallas.ino @@ -28,18 +28,6 @@ # define P004_SENSOR_TYPE_INDEX 2 # define P004_NR_OUTPUT_VALUES getValueCountFromSensorType(static_cast(PCONFIG(P004_SENSOR_TYPE_INDEX))) -String Plugin_004_valuename(uint8_t value_nr, bool displayString) { - String name = F("Temperature"); - - if (value_nr != 0) { - name += String(value_nr + 1); - } - - if (!displayString) { - name.toLowerCase(); - } - return name; -} boolean Plugin_004(uint8_t function, struct EventStruct *event, String& string) { @@ -77,7 +65,7 @@ boolean Plugin_004(uint8_t function, struct EventStruct *event, String& string) if (i < P004_NR_OUTPUT_VALUES) { safe_strncpy( ExtraTaskSettings.TaskDeviceValueNames[i], - Plugin_004_valuename(i, false), + Plugin_valuename(F("Temperature"), i, false), sizeof(ExtraTaskSettings.TaskDeviceValueNames[i])); ExtraTaskSettings.TaskDeviceValueDecimals[i] = 2; } else { diff --git a/src/_P007_PCF8591.ino b/src/_P007_PCF8591.ino index 7c8ce962e..5bc7a3f58 100644 --- a/src/_P007_PCF8591.ino +++ b/src/_P007_PCF8591.ino @@ -26,18 +26,6 @@ # define P007_OUTPUT_MODE PCONFIG_LONG(1) # define P007_OUTPUT_ENABLED (0b01000000) -String Plugin_007_valuename(uint8_t value_nr, bool displayString) { - String name = F(PLUGIN_VALUENAME1_007); - - if (value_nr != 0) { - name += String(value_nr + 1); - } - - if (!displayString) { - name.toLowerCase(); - } - return name; -} boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) { @@ -74,7 +62,7 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) if (i < P007_NR_OUTPUT_VALUES) { safe_strncpy( ExtraTaskSettings.TaskDeviceValueNames[i], - Plugin_007_valuename(i, true), + Plugin_valuename(F(PLUGIN_VALUENAME1_007), i, true), sizeof(ExtraTaskSettings.TaskDeviceValueNames[i])); ExtraTaskSettings.TaskDeviceValueDecimals[i] = 2; } else { diff --git a/src/_P012_LCD.ino b/src/_P012_LCD.ino index 28ee9e463..0cf6df070 100644 --- a/src/_P012_LCD.ino +++ b/src/_P012_LCD.ino @@ -94,7 +94,7 @@ boolean Plugin_012(uint8_t function, struct EventStruct *event, String& string) for (uint8_t varNr = 0; varNr < P12_Nlines; varNr++) { - addFormTextBox(String(F("Line ")) + (varNr + 1), getPluginCustomArgName(varNr), strings[varNr], P12_Nchars); + addFormTextBox(concat(F("Line "), varNr + 1), getPluginCustomArgName(varNr), strings[varNr], P12_Nchars); } } diff --git a/src/_P023_OLED.ino b/src/_P023_OLED.ino index 2f632d1c9..4b755b640 100644 --- a/src/_P023_OLED.ino +++ b/src/_P023_OLED.ino @@ -101,7 +101,7 @@ boolean Plugin_023(uint8_t function, struct EventStruct *event, String& string) for (uint8_t varNr = 0; varNr < 8; varNr++) { - addFormTextBox(String(F("Line ")) + (varNr + 1), getPluginCustomArgName(varNr), strings[varNr], 64); + addFormTextBox(concat(F("Line "), varNr + 1), getPluginCustomArgName(varNr), strings[varNr], 64); } } diff --git a/src/_P043_ClkOutput.ino b/src/_P043_ClkOutput.ino index f3c1b1bcb..5003958b4 100644 --- a/src/_P043_ClkOutput.ino +++ b/src/_P043_ClkOutput.ino @@ -16,17 +16,6 @@ # define P043_SENSOR_TYPE_INDEX 2 # define P043_NR_OUTPUT_VALUES getValueCountFromSensorType(static_cast(PCONFIG(P043_SENSOR_TYPE_INDEX))) -String Plugin_043_valuename(byte value_nr, bool displayString) { - String name = F("Output"); - - if (value_nr != 0) { - name += String(value_nr + 1); - } - if (!displayString) { - name.toLowerCase(); - } - return name; -} boolean Plugin_043(uint8_t function, struct EventStruct *event, String& string) { @@ -62,7 +51,7 @@ boolean Plugin_043(uint8_t function, struct EventStruct *event, String& string) if (i < P043_NR_OUTPUT_VALUES) { safe_strncpy( ExtraTaskSettings.TaskDeviceValueNames[i], - Plugin_043_valuename(i, false), + Plugin_valuename(F("Output"), i, false), sizeof(ExtraTaskSettings.TaskDeviceValueNames[i])); ExtraTaskSettings.TaskDeviceValueDecimals[i] = 2; } else { @@ -102,13 +91,19 @@ boolean Plugin_043(uint8_t function, struct EventStruct *event, String& string) for (uint8_t x = 0; x < PLUGIN_043_MAX_SETTINGS; x++) { - addFormTextBox(String(F("Day,Time ")) + (x + 1), String(F("p043_clock")) + (x), timeLong2String(ExtraTaskSettings.TaskDevicePluginConfigLong[x]), 32); + addFormTextBox( + concat(F("Day,Time "), x + 1), + concat(F("p043_clock"), x), + timeLong2String(ExtraTaskSettings.TaskDevicePluginConfigLong[x]), 32); if (CONFIG_PIN1 >= 0) { addHtml(' '); const uint8_t choice = ExtraTaskSettings.TaskDevicePluginConfig[x]; - addSelector(String(F("p043_state")) + (x), 3, options, nullptr, nullptr, choice); + addSelector(concat(F("p043_state"), x), 3, options, nullptr, nullptr, choice); } - else addFormNumericBox(String(F("Value")) + (x + 1), String(F("p043_state")) + (x), ExtraTaskSettings.TaskDevicePluginConfig[x]); + else addFormNumericBox( + concat(F("Value"), x + 1), + concat(F("p043_state"), x), + ExtraTaskSettings.TaskDevicePluginConfig[x]); } success = true; break; @@ -118,14 +113,9 @@ boolean Plugin_043(uint8_t function, struct EventStruct *event, String& string) { for (uint8_t x = 0; x < PLUGIN_043_MAX_SETTINGS; x++) { - String argc = F("p043_clock"); - argc += x; - String plugin1 = webArg(argc); + const String plugin1 = webArg(concat(F("p043_clock"), x)); ExtraTaskSettings.TaskDevicePluginConfigLong[x] = string2TimeLong(plugin1); - - argc = F("p043_state"); - argc += x; - String plugin2 = webArg(argc); + const String plugin2 = webArg(concat(F("p043_state"), x)); ExtraTaskSettings.TaskDevicePluginConfig[x] = plugin2.toInt(); } success = true; diff --git a/src/_P052_SenseAir.ino b/src/_P052_SenseAir.ino index f4feaf2be..32eb0b83a 100644 --- a/src/_P052_SenseAir.ino +++ b/src/_P052_SenseAir.ino @@ -141,7 +141,7 @@ boolean Plugin_052(uint8_t function, struct EventStruct *event, String& string) if ((nullptr != P052_data) && P052_data->isInitialized()) { P052_data->modbus.writeSingleRegister(0x18, relaystatus); - addLog(LOG_LEVEL_INFO, String(F("Senseair command: relay=")) + param1); + addLog(LOG_LEVEL_INFO, concat(F("Senseair command: relay="), param1)); } } } diff --git a/src/_P074_TSL2591.ino b/src/_P074_TSL2591.ino index 70ea65350..1632259f8 100644 --- a/src/_P074_TSL2591.ino +++ b/src/_P074_TSL2591.ino @@ -187,16 +187,12 @@ boolean Plugin_074(uint8_t function, struct EventStruct *event, String& string) UserVar[event->BaseVarIndex + 3] = ir; if (loglevelActiveFor(LOG_LEVEL_INFO)) { - String log = F("TSL2591: Lux: "); - log += toString(lux); - log += F(" Full: "); - log += String(full); - log += F(" Visible: "); - log += String(visible); - log += F(" IR: "); - log += String(ir); - log += F(" duration: "); - log += P074_data->duration; + String log; + log += concat(F("TSL2591: Lux: "), toString(lux)); + log += concat(F(" Full: "), full); + log += concat(F(" Visible: "), visible); + log += concat(F(" IR: "), ir); + log += concat(F(" duration: "), P074_data->duration); addLogMove(LOG_LEVEL_INFO, log); } diff --git a/src/_P075_Nextion.ino b/src/_P075_Nextion.ino index 5697d12a5..ddb529f4a 100644 --- a/src/_P075_Nextion.ino +++ b/src/_P075_Nextion.ino @@ -120,7 +120,7 @@ boolean Plugin_075(uint8_t function, struct EventStruct *event, String& string) P075_data->loadDisplayLines(event->TaskIndex); for (uint8_t varNr = 0; varNr < P75_Nlines; varNr++) { - addFormTextBox(String(F("Line ")) + (varNr + 1), getPluginCustomArgName(varNr), P075_data->displayLines[varNr], P75_Nchars - 1); + addFormTextBox(concat(F("Line "), varNr + 1), getPluginCustomArgName(varNr), P075_data->displayLines[varNr], P75_Nchars - 1); } } diff --git a/src/_P094_CULReader.ino b/src/_P094_CULReader.ino index bae98f7cb..97a2dd406 100644 --- a/src/_P094_CULReader.ino +++ b/src/_P094_CULReader.ino @@ -329,7 +329,7 @@ String Plugin_094_valuename(uint8_t value_nr, bool displayString) { switch (value_nr) { case P094_QUERY_VALUE: return displayString ? F("Value") : F("v"); } - return ""; + return EMPTY_STRING; } void P094_html_show_matchForms(struct EventStruct *event) { @@ -388,10 +388,7 @@ void P094_html_show_matchForms(struct EventStruct *event) { if (newLine) { // Label + first parameter ++filterSet; - String label; - label = F("Filter "); - label += String(filterSet); - addRowLabel_tr_id(label, id); + addRowLabel_tr_id(concat(F("Filter "), filterSet), id); } else { html_B(F("AND")); html_BR(); diff --git a/src/_P109_ThermOLED.ino b/src/_P109_ThermOLED.ino index cabd5e927..849582e26 100644 --- a/src/_P109_ThermOLED.ino +++ b/src/_P109_ThermOLED.ino @@ -202,12 +202,12 @@ boolean Plugin_109(byte function, struct EventStruct *event, String& string) { if (varNr == 0) { addFormTextBox(String(F("Temperature source ")), - String(F("Plugin_109_template")) + (varNr + 1), + getPluginCustomArgName(F("Plugin_109_template"), varNr), P109_deviceTemplate[varNr], P109_Nchars); } else { - addFormTextBox(String(F("Line ")) + (varNr + 1), - String(F("Plugin_109_template")) + (varNr + 1), + addFormTextBox(getPluginCustomArgName(F("Line "), varNr), + getPluginCustomArgName(F("Plugin_109_template"), varNr), P109_deviceTemplate[varNr], P109_Nchars); } @@ -248,8 +248,7 @@ boolean Plugin_109(byte function, struct EventStruct *event, String& string) for (byte varNr = 0; varNr < P109_Nlines; varNr++) { - argName = F("Plugin_109_template"); - argName += varNr + 1; + const String argName = getPluginCustomArgName(F("Plugin_109_template"), varNr); strncpy(P109_deviceTemplate[varNr], web_server.arg(argName).c_str(), sizeof(P109_deviceTemplate[varNr]) - 1); P109_deviceTemplate[varNr][sizeof(P109_deviceTemplate[varNr]) - 1] = 0; } diff --git a/src/_Plugin_Helper.cpp b/src/_Plugin_Helper.cpp index fdc180ec9..75cf3b8be 100644 --- a/src/_Plugin_Helper.cpp +++ b/src/_Plugin_Helper.cpp @@ -18,9 +18,7 @@ PluginTaskData_base *Plugin_task_data[TASKS_MAX] = { nullptr, }; String PCONFIG_LABEL(int n) { if (n < PLUGIN_CONFIGVAR_MAX) { - String result = F("pconf_"); - result += n; - return result; + return concat(F("pconf_"), n); } return F("error"); } @@ -67,6 +65,11 @@ void initPluginTaskData(taskIndex_t taskIndex, PluginTaskData_base *data) { } } #endif +#if FEATURE_PLUGIN_FILTER +// TODO TD-er: Implement init + +#endif + } else if (data != nullptr) { delete data; } @@ -88,10 +91,11 @@ bool pluginTaskData_initialized(taskIndex_t taskIndex) { } String getPluginCustomArgName(int varNr) { - String argName = F("pc_arg"); + return getPluginCustomArgName(F("pc_arg"), varNr); +} - argName += varNr + 1; - return argName; +String getPluginCustomArgName(const __FlashStringHelper * label, int varNr) { + return concat(label, varNr + 1); } int getFormItemIntCustomArgName(int varNr) { @@ -117,8 +121,8 @@ void pluginWebformShowValue(taskIndex_t taskIndex, } pluginWebformShowValue( - label, String(F("valuename_")) + taskIndex + '_' + varNr, - value, String(F("value_")) + taskIndex + '_' + varNr, + label, concat(F("valuename_"), taskIndex) + '_' + varNr, + value, concat(F("value_"), taskIndex) + '_' + varNr, addTrailingBreak); } diff --git a/src/_Plugin_Helper.h b/src/_Plugin_Helper.h index da3c127f1..90afc2d60 100644 --- a/src/_Plugin_Helper.h +++ b/src/_Plugin_Helper.h @@ -41,6 +41,7 @@ #include "src/Helpers/PortStatus.h" #include "src/Helpers/StringConverter.h" #include "src/Helpers/StringGenerator_GPIO.h" +#include "src/Helpers/StringGenerator_Plugin.h" #include "src/Helpers/StringParser.h" #include "src/Helpers/_Plugin_SensorTypeHelper.h" #include "src/Helpers/_Plugin_Helper_serial.h" @@ -106,6 +107,7 @@ PluginTaskData_base* getPluginTaskData(taskIndex_t taskIndex); bool pluginTaskData_initialized(taskIndex_t taskIndex); String getPluginCustomArgName(int varNr); +String getPluginCustomArgName(const __FlashStringHelper * label, int varNr); int getFormItemIntCustomArgName(int varNr); diff --git a/src/src/DataStructs/ExtraTaskSettingsStruct.cpp b/src/src/DataStructs/ExtraTaskSettingsStruct.cpp index 1c39f0583..14dfc18f3 100644 --- a/src/src/DataStructs/ExtraTaskSettingsStruct.cpp +++ b/src/src/DataStructs/ExtraTaskSettingsStruct.cpp @@ -176,6 +176,10 @@ float ExtraTaskSettingsStruct::checkAllowedRange(taskVarIndex_t taskVarIndex, co return value; } +#if FEATURE_PLUGIN_STATS +// Plugin Stats is now only a single bit, but this may later changed into a combobox with some options. +// Thus leave 8 bits for the plugin stats options. + bool ExtraTaskSettingsStruct::enabledPluginStats(taskVarIndex_t taskVarIndex) const { if (!validTaskVarIndex(taskVarIndex)) { return false; } @@ -196,3 +200,4 @@ bool ExtraTaskSettingsStruct::anyEnabledPluginStats() const } return false; } +#endif diff --git a/src/src/DataStructs/ExtraTaskSettingsStruct.h b/src/src/DataStructs/ExtraTaskSettingsStruct.h index a50e4d7c9..88692959d 100644 --- a/src/src/DataStructs/ExtraTaskSettingsStruct.h +++ b/src/src/DataStructs/ExtraTaskSettingsStruct.h @@ -44,10 +44,11 @@ struct ExtraTaskSettingsStruct bool valueInAllowedRange(taskVarIndex_t taskVarIndex, const float & value) const; - +#if FEATURE_PLUGIN_STATS bool enabledPluginStats(taskVarIndex_t taskVarIndex) const; void enablePluginStats(taskVarIndex_t taskVarIndex, bool enabled); bool anyEnabledPluginStats() const; +#endif taskIndex_t TaskIndex; // Always < TASKS_MAX or INVALID_TASK_INDEX char TaskDeviceName[NAME_FORMULA_LENGTH_MAX + 1]; diff --git a/src/src/Helpers/Dallas1WireHelper.cpp b/src/src/Helpers/Dallas1WireHelper.cpp index 82eace575..531eb5677 100644 --- a/src/src/Helpers/Dallas1WireHelper.cpp +++ b/src/src/Helpers/Dallas1WireHelper.cpp @@ -233,9 +233,8 @@ void Dallas_addr_selector_webform_save(taskIndex_t TaskIndex, int8_t gpio_pin_rx uint8_t addr[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; for (uint8_t var_index = 0; var_index < nrVariables; ++var_index) { - String id = F("dallas_addr"); - id += String(var_index); - int selection = getFormItemInt(id, -1); + const String id = concat(F("dallas_addr"), var_index); + const int selection = getFormItemInt(id, -1); if (selection != -1) { Dallas_scan(getFormItemInt(id), addr, gpio_pin_rx, gpio_pin_tx); diff --git a/src/src/Helpers/ESPEasy_Storage.cpp b/src/src/Helpers/ESPEasy_Storage.cpp index f98c9ad2b..bde4ca827 100644 --- a/src/src/Helpers/ESPEasy_Storage.cpp +++ b/src/src/Helpers/ESPEasy_Storage.cpp @@ -100,7 +100,7 @@ String flashGuard() return log; } flashCount(); - return String(); + return EMPTY_STRING; } // use this in function that can return an error string. it automaticly returns with an error string if there where too many flash writes. @@ -935,10 +935,10 @@ String SaveTaskSettings(taskIndex_t TaskIndex) String LoadTaskSettings(taskIndex_t TaskIndex) { if (ExtraTaskSettings.TaskIndex == TaskIndex) { - return String(); // already loaded + return EMPTY_STRING; // already loaded } if (!validTaskIndex(TaskIndex)) { - return String(); // Un-initialized task index. + return EMPTY_STRING; // Un-initialized task index. } ExtraTaskSettings.clear(); #ifndef BUILD_NO_RAM_TRACKER @@ -1213,7 +1213,7 @@ String InitFile(const String& fname, int datasize) } // OK - return String(); + return EMPTY_STRING; } String InitFile(SettingsType::Enum settingsType) @@ -1345,7 +1345,7 @@ String doSaveToFile(const char *fname, int index, const uint8_t *memAddress, int #endif // OK - return String(); + return EMPTY_STRING; } /********************************************************************************************\ @@ -1396,7 +1396,7 @@ String ClearInFile(const char *fname, int index, int datasize) } // OK - return String(); + return EMPTY_STRING; } /********************************************************************************************\ @@ -1429,7 +1429,7 @@ String LoadFromFile(const char *fname, int offset, uint8_t *memAddress, int data STOP_TIMER(LOADFILE_STATS); delay(0); - return String(); + return EMPTY_STRING; } /********************************************************************************************\ diff --git a/src/src/Helpers/StringConverter.cpp b/src/src/Helpers/StringConverter.cpp index 9c561f98f..6859709e7 100644 --- a/src/src/Helpers/StringConverter.cpp +++ b/src/src/Helpers/StringConverter.cpp @@ -27,6 +27,7 @@ // -V::569 + /********************************************************************************************\ Convert a char string to integer \*********************************************************************************************/ diff --git a/src/src/Helpers/StringConverter.h b/src/src/Helpers/StringConverter.h index 43ae79874..00f6c5528 100644 --- a/src/src/Helpers/StringConverter.h +++ b/src/src/Helpers/StringConverter.h @@ -14,6 +14,25 @@ class IPAddress; // -V::569 +/********************************************************************************************\ + Concatenate using code which results in the smallest compiled code + \*********************************************************************************************/ + +template +String concat(const __FlashStringHelper * str, const T &val) { + String res(str); + res.concat(val); + return res; +} + +template +String concat(const String& str, const T &val) { + String res(str); + res.concat(val); + return res; +} + + /********************************************************************************************\ Convert a char string to integer \*********************************************************************************************/ diff --git a/src/src/Helpers/StringGenerator_Plugin.cpp b/src/src/Helpers/StringGenerator_Plugin.cpp new file mode 100644 index 000000000..2bd04f14b --- /dev/null +++ b/src/src/Helpers/StringGenerator_Plugin.cpp @@ -0,0 +1,16 @@ +#include "../Helpers/StringGenerator_Plugin.h" + + + +String Plugin_valuename(const __FlashStringHelper * name_prefix, uint8_t value_nr, bool displayString) { + String name = name_prefix; + + if (value_nr != 0) { + name += value_nr + 1; + } + + if (!displayString) { + name.toLowerCase(); + } + return name; +} diff --git a/src/src/Helpers/StringGenerator_Plugin.h b/src/src/Helpers/StringGenerator_Plugin.h new file mode 100644 index 000000000..129bac6de --- /dev/null +++ b/src/src/Helpers/StringGenerator_Plugin.h @@ -0,0 +1,15 @@ +#ifndef HELPERS_STRINGGENERATOR_PLUGIN_H +#define HELPERS_STRINGGENERATOR_PLUGIN_H + +#include + + +// Generate string with appending nr (when > 0) +// When NOT used as displaystring, it will be converted to lower case. +String Plugin_valuename( + const __FlashStringHelper * name_prefix, + uint8_t value_nr, + bool displayString); + + +#endif \ No newline at end of file diff --git a/src/src/PluginStructs/P094_data_struct.cpp b/src/src/PluginStructs/P094_data_struct.cpp index b0858ba3f..e92c43cc7 100644 --- a/src/src/PluginStructs/P094_data_struct.cpp +++ b/src/src/PluginStructs/P094_data_struct.cpp @@ -341,7 +341,7 @@ bool P094_data_struct::parsePacket(const String& received) const { if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; if (log.reserve(64)) { - log = F("CUL Reader: "); + log += F("CUL Reader: "); log += P094_FilterValueType_toString(valueType_index[f]); log += F(": in:"); log += inputString; diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index 6956c48fb..c3e809d1e 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -186,9 +186,7 @@ void handle_devices() { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG_DEV)) { - String log = F("DEBUG: String size:"); - log += String(TXBuffer.sentBytes); - addLogMove(LOG_LEVEL_DEBUG_DEV, log); + addLogMove(LOG_LEVEL_DEBUG_DEV, concat(F("DEBUG: String size:"), TXBuffer.sentBytes)); } # endif // ifndef BUILD_NO_DEBUG sendHeadandTail_stdtemplate(_TAIL); @@ -269,9 +267,7 @@ void handle_devices_CopySubmittedSettings(taskIndex_t taskIndex, pluginID_t task uint8_t selectedPorts = 0; for (uint8_t x = 0; x < I2CMultiplexerMaxChannels(); x++) { - String id = F("taskdeviceflag1ch"); - id += String(x); - bitWrite(selectedPorts, x, isFormItemChecked(id)); + bitWrite(selectedPorts, x, isFormItemChecked(concat(F("taskdeviceflag1ch"), x))); } Settings.I2C_Multiplexer_Channel[taskIndex] = selectedPorts; } else { @@ -335,9 +331,9 @@ void handle_devices_CopySubmittedSettings(taskIndex_t taskIndex, pluginID_t task int pin1 = -1; int pin2 = -1; int pin3 = -1; - update_whenset_FormItemInt(F("taskdevicepin1"), pin1); - update_whenset_FormItemInt(F("taskdevicepin2"), pin2); - update_whenset_FormItemInt(F("taskdevicepin3"), pin3); + update_whenset_FormItemInt(concat(F("taskdevicepin"), 1), pin1); + update_whenset_FormItemInt(concat(F("taskdevicepin"), 2), pin2); + update_whenset_FormItemInt(concat(F("taskdevicepin"), 3), pin3); setBasicTaskValues(taskIndex, taskdevicetimer, isFormItemChecked(F("TDE")), webArg(F("TDN")), pin1, pin2, pin3); @@ -347,8 +343,8 @@ void handle_devices_CopySubmittedSettings(taskIndex_t taskIndex, pluginID_t task for (controllerIndex_t controllerNr = 0; controllerNr < CONTROLLER_MAX; controllerNr++) { - Settings.TaskDeviceID[controllerNr][taskIndex] = getFormItemInt(String(F("TDID")) + (controllerNr + 1)); - Settings.TaskDeviceSendData[controllerNr][taskIndex] = isFormItemChecked(String(F("TDSD")) + (controllerNr + 1)); + Settings.TaskDeviceID[controllerNr][taskIndex] = getFormItemInt(getPluginCustomArgName(F("TDID"), controllerNr)); + Settings.TaskDeviceSendData[controllerNr][taskIndex] = isFormItemChecked(getPluginCustomArgName(F("TDSD"), controllerNr)); } if (Device[DeviceIndex].PullUpOption) { @@ -373,10 +369,15 @@ void handle_devices_CopySubmittedSettings(taskIndex_t taskIndex, pluginID_t task for (uint8_t varNr = 0; varNr < valueCount; varNr++) { - strncpy_webserver_arg(ExtraTaskSettings.TaskDeviceFormula[varNr], String(F("TDF")) + (varNr + 1)); - update_whenset_FormItemInt(String(F("TDVD")) + (varNr + 1), ExtraTaskSettings.TaskDeviceValueDecimals[varNr]); - strncpy_webserver_arg(ExtraTaskSettings.TaskDeviceValueNames[varNr], String(F("TDVN")) + (varNr + 1)); - ExtraTaskSettings.enablePluginStats(varNr, isFormItemChecked(String(F("TDS")) + (varNr + 1))); + strncpy_webserver_arg(ExtraTaskSettings.TaskDeviceFormula[varNr], getPluginCustomArgName(F("TDF"), varNr)); + update_whenset_FormItemInt(getPluginCustomArgName(F("TDVD"), varNr), ExtraTaskSettings.TaskDeviceValueDecimals[varNr]); + strncpy_webserver_arg(ExtraTaskSettings.TaskDeviceValueNames[varNr], getPluginCustomArgName(F("TDVN"), varNr)); +#if FEATURE_PLUGIN_FILTER + ExtraTaskSettings.enablePluginFilter(varNr, isFormItemChecked(getPluginCustomArgName(F("TDFIL"), varNr))); +#endif +#if FEATURE_PLUGIN_STATS + ExtraTaskSettings.enablePluginStats(varNr, isFormItemChecked(getPluginCustomArgName(F("TDS"), varNr))); +#endif } ExtraTaskSettings.clearUnusedValueNames(valueCount); @@ -489,23 +490,11 @@ void handle_devicess_ShowAllTasksTable(uint8_t page) html_add_button_prefix(); } { - String html; - html.reserve(30); - - html += F("devices?index="); - html += x + 1; - html += F("&page="); - html += page; - html += F("'>"); - - if (pluginID_set) { - html += F("Edit"); - } else { - html += F("Add"); - } - html += F(""); - html += x + 1; - addHtml(html); + addHtml(concat(F("devices?index="), x + 1)); + addHtml(concat(F("&page="), page)); + addHtml('\'', '>'); + addHtml(pluginID_set ? F("Edit") : F("Add")); + addHtml(concat(F(""), x + 1)); html_TD(); } @@ -593,17 +582,13 @@ void handle_devicess_ShowAllTasksTable(uint8_t page) if (validProtocolIndex(ProtocolIndex)) { if (Protocol[ProtocolIndex].usesID && (Settings.Protocol[controllerNr] != 0)) { - String html; - html.reserve(16); - html += F(" ("); - html += Settings.TaskDeviceID[controllerNr][x]; - html += ')'; + addHtml(concat(F(" ("), Settings.TaskDeviceID[controllerNr][x])); + addHtml(')'); if (Settings.TaskDeviceID[controllerNr][x] == 0) { - html += ' '; - html += F(HTML_SYMBOL_WARNING); + addHtml(' '); + addHtml(F(HTML_SYMBOL_WARNING)); } - addHtml(html); } doBR = true; } @@ -798,8 +783,7 @@ void format_I2C_port_description(taskIndex_t x) } } } else { // Single channel - mux = F("
Multiplexer channel "); - mux += String(Settings.I2C_Multiplexer_Channel[x]); + mux = concat(F("
Multiplexer channel "), Settings.I2C_Multiplexer_Channel[x]); } addHtml(mux); } @@ -885,7 +869,7 @@ void handle_devices_TaskSettingsPage(taskIndex_t taskIndex, uint8_t page) // show selected device name and delete button addHtml(getPluginNameFromDeviceIndex(DeviceIndex)); - addHelpButton(String(F("Plugin")) + Settings.TaskDeviceNumber[taskIndex]); + addHelpButton(concat(F("Plugin"), Settings.TaskDeviceNumber[taskIndex])); addRTDPluginButton(Settings.TaskDeviceNumber[taskIndex]); addFormTextBox(F("Name"), F("TDN"), getTaskDeviceName(taskIndex), NAME_FORMULA_LENGTH_MAX); // ="taskdevicename" @@ -1153,16 +1137,11 @@ void devicePage_show_I2C_config(taskIndex_t taskIndex) html_table_header(F("Enable")); for (uint8_t x = 0; x < I2CMultiplexerMaxChannels(); x++) { - String label = F("Channel "); - label += x; - String id = F("taskdeviceflag1ch"); - id += x; - if (x % 2 == 0) { html_TR(); } // Start a new row for every 2 channels html_TD(); - addHtml(label); + addHtml(concat(F("Channel "), x)); html_TD(); - addCheckBox(id, bitRead(Settings.I2C_Multiplexer_Channel[taskIndex], x), false); + addCheckBox(concat(F("taskdeviceflag1ch"), x), bitRead(Settings.I2C_Multiplexer_Channel[taskIndex], x), false); } html_end_table(); } else { @@ -1176,9 +1155,7 @@ void devicePage_show_I2C_config(taskIndex_t taskIndex) for (int8_t x = 0; x < mux_max; x++) { mux_opt++; - i2c_mux_portoptions[mux_opt] = F("Channel "); - i2c_mux_portoptions[mux_opt] += String(x); - + i2c_mux_portoptions[mux_opt] = concat(F("Channel "), x); i2c_mux_portchoices[mux_opt] = x; } @@ -1258,6 +1235,8 @@ void devicePage_show_task_statistics(taskIndex_t taskIndex, deviceIndex_t Device } #endif // if FEATURE_PLUGIN_STATS + + void devicePage_show_controller_config(taskIndex_t taskIndex, deviceIndex_t DeviceIndex) { if (Device[DeviceIndex].SendDataOption) @@ -1284,14 +1263,13 @@ void devicePage_show_controller_config(taskIndex_t taskIndex, deviceIndex_t Devi addFormSeparator(2); } separatorAdded = true; - String id = F("TDSD"); // ="taskdevicesenddata" - id += controllerNr + 1; - html_TR_TD(); addHtml(F("Send to Controller ")); addHtml(getControllerSymbol(controllerNr)); html_TD(); - addCheckBox(id, Settings.TaskDeviceSendData[controllerNr][taskIndex]); + addCheckBox( + getPluginCustomArgName(F("TDSD"), controllerNr), // ="taskdevicesenddata" + Settings.TaskDeviceSendData[controllerNr][taskIndex]); protocolIndex_t ProtocolIndex = getProtocolIndex_from_ControllerIndex(controllerNr); @@ -1299,9 +1277,9 @@ void devicePage_show_controller_config(taskIndex_t taskIndex, deviceIndex_t Devi if (Protocol[ProtocolIndex].usesID && (Settings.Protocol[controllerNr] != 0)) { addRowLabel(F("IDX")); - id = F("TDID"); // ="taskdeviceid" - id += controllerNr + 1; - addNumericBox(id, Settings.TaskDeviceID[controllerNr][taskIndex], 0, DOMOTICZ_MAX_IDX); + addNumericBox( + getPluginCustomArgName(F("TDID"), controllerNr), // ="taskdeviceid" + Settings.TaskDeviceID[controllerNr][taskIndex], 0, DOMOTICZ_MAX_IDX); } } } @@ -1346,11 +1324,13 @@ void devicePage_show_task_values(taskIndex_t taskIndex, deviceIndex_t DeviceInde ++colCount; } +#if FEATURE_PLUGIN_STATS if (Device[DeviceIndex].PluginStats) { html_table_header(F("Stats"), 30); ++colCount; } +#endif if (Device[DeviceIndex].configurableDecimals()) { @@ -1366,32 +1346,30 @@ void devicePage_show_task_values(taskIndex_t taskIndex, deviceIndex_t DeviceInde addHtmlInt(varNr + 1); html_TD(); { - String id = F("TDVN"); // ="taskdevicevaluename" - id += (varNr + 1); + const String id = getPluginCustomArgName(F("TDVN"), varNr); // ="taskdevicevaluename" addTextBox(id, ExtraTaskSettings.TaskDeviceValueNames[varNr], NAME_FORMULA_LENGTH_MAX); } if (Device[DeviceIndex].FormulaOption) { html_TD(); - String id = F("TDF"); // ="taskdeviceformula" - id += (varNr + 1); + const String id = getPluginCustomArgName(F("TDF"), varNr); // ="taskdeviceformula" addTextBox(id, ExtraTaskSettings.TaskDeviceFormula[varNr], NAME_FORMULA_LENGTH_MAX); } +#if FEATURE_PLUGIN_STATS if (Device[DeviceIndex].PluginStats) { html_TD(); - String id = F("TDS"); // ="taskdevicestats" - id += (varNr + 1); + const String id = getPluginCustomArgName(F("TDS"), varNr); // ="taskdevicestats" addCheckBox(id, ExtraTaskSettings.enabledPluginStats(varNr)); } +#endif if (Device[DeviceIndex].configurableDecimals()) { html_TD(); - String id = F("TDVD"); // ="taskdevicevaluedecimals" - id += (varNr + 1); + const String id = getPluginCustomArgName(F("TDVD"), varNr); // ="taskdevicevaluedecimals" addNumericBox(id, ExtraTaskSettings.TaskDeviceValueDecimals[varNr], 0, 6); } } diff --git a/src/src/WebServer/ESPEasy_WebServer.cpp b/src/src/WebServer/ESPEasy_WebServer.cpp index 9366b4270..323afde7c 100644 --- a/src/src/WebServer/ESPEasy_WebServer.cpp +++ b/src/src/WebServer/ESPEasy_WebServer.cpp @@ -1,5 +1,7 @@ #include "../WebServer/ESPEasy_WebServer.h" +#include "../WebServer/common.h" + #include "../WebServer/404.h" #include "../WebServer/AccessControl.h" #include "../WebServer/AdvancedConfigPage.h"