diff --git a/src/_C002.cpp b/src/_C002.cpp index 8dc05eaf5..4c58f890e 100644 --- a/src/_C002.cpp +++ b/src/_C002.cpp @@ -173,7 +173,7 @@ bool CPlugin_002(CPlugin::Function function, struct EventStruct *event, String& if (mustSendEvent) { // trigger rulesprocessing if (Settings.UseRules) { - struct EventStruct TempEvent(x); + EventStruct TempEvent(x); parseCommandString(&TempEvent, action); createRuleEvents(&TempEvent); } @@ -197,9 +197,7 @@ bool CPlugin_002(CPlugin::Function function, struct EventStruct *event, String& # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { - String log = F("MQTT : "); - log += json; - addLogMove(LOG_LEVEL_DEBUG, log); + addLogMove(LOG_LEVEL_DEBUG, concat(F("MQTT : "), json)); } # endif // ifndef BUILD_NO_DEBUG diff --git a/src/_P001_Switch.ino b/src/_P001_Switch.ino index 19c602e04..92d84d763 100644 --- a/src/_P001_Switch.ino +++ b/src/_P001_Switch.ino @@ -61,20 +61,13 @@ // TD-er: Needed to fix a mistake in earlier fixes. uint8_t P001_getSwitchType(struct EventStruct *event) { - uint8_t choice = PCONFIG(0); - - switch (choice) { - case 2: // Old implementation for Dimmer - case PLUGIN_001_TYPE_DIMMER: - choice = PLUGIN_001_TYPE_DIMMER; - break; - case 1: // Old implementation for switch - case PLUGIN_001_TYPE_SWITCH: - default: - choice = PLUGIN_001_TYPE_SWITCH; - break; + const uint8_t choice = PCONFIG(0); + if (choice == 2 || // Old implementation for Dimmer + choice == PLUGIN_001_TYPE_DIMMER) + { + return PLUGIN_001_TYPE_DIMMER; } - return choice; + return PLUGIN_001_TYPE_SWITCH; } boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) diff --git a/src/_P026_Sysinfo.ino b/src/_P026_Sysinfo.ino index 9e40d771b..af761ae81 100644 --- a/src/_P026_Sysinfo.ino +++ b/src/_P026_Sysinfo.ino @@ -25,23 +25,26 @@ # define P026_NR_OUTPUT_OPTIONS 14 const __FlashStringHelper* Plugin_026_valuename(uint8_t value_nr, bool displayString) { - switch (value_nr) { - case 0: return displayString ? F("Uptime") : F("uptime"); - case 1: return displayString ? F("Free RAM") : F("freeheap"); - case 2: return displayString ? F("Wifi RSSI") : F("rssi"); - case 3: return displayString ? F("Input VCC") : F("vcc"); - case 4: return displayString ? F("System load") : F("load"); - case 5: return displayString ? F("IP 1.Octet") : F("ip1"); - case 6: return displayString ? F("IP 2.Octet") : F("ip2"); - case 7: return displayString ? F("IP 3.Octet") : F("ip3"); - case 8: return displayString ? F("IP 4.Octet") : F("ip4"); - case 9: return displayString ? F("Web activity") : F("web"); - case 10: return displayString ? F("Free Stack") : F("freestack"); - case 11: return displayString ? F("None") : F(""); - case 12: return displayString ? F("WiFi TX pwr") : F("txpwr"); - case 13: return displayString ? F("Free 2nd Heap") : F("free2ndheap"); - default: - break; + const __FlashStringHelper* strings[] { + F("Uptime") , F("uptime"), + F("Free RAM") , F("freeheap"), + F("Wifi RSSI") , F("rssi"), + F("Input VCC") , F("vcc"), + F("System load") , F("load"), + F("IP 1.Octet") , F("ip1"), + F("IP 2.Octet") , F("ip2"), + F("IP 3.Octet") , F("ip3"), + F("IP 4.Octet") , F("ip4"), + F("Web activity") , F("web"), + F("Free Stack") , F("freestack"), + F("None") , F(""), + F("WiFi TX pwr") , F("txpwr"), + F("Free 2nd Heap"), F("free2ndheap") + }; + const size_t index = 2* value_nr + displayString ? 0 : 1; + constexpr size_t nrStrings = sizeof(strings) / sizeof(strings[0]); + if (index < nrStrings) { + return strings[index]; } return F(""); } @@ -76,10 +79,9 @@ boolean Plugin_026(uint8_t function, struct EventStruct *event, String& string) for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { if (i < P026_NR_OUTPUT_VALUES) { const uint8_t pconfigIndex = i + P026_QUERY1_CONFIG_POS; - uint8_t choice = PCONFIG(pconfigIndex); safe_strncpy( ExtraTaskSettings.TaskDeviceValueNames[i], - Plugin_026_valuename(choice, false), + Plugin_026_valuename(PCONFIG(pconfigIndex), false), sizeof(ExtraTaskSettings.TaskDeviceValueNames[i])); } else { ZERO_FILL(ExtraTaskSettings.TaskDeviceValueNames[i]); @@ -198,7 +200,7 @@ boolean Plugin_026(uint8_t function, struct EventStruct *event, String& string) // return decode(bytes, // [header, uint24, uint24, int8, vcc, pct_8, uint8, uint8, uint8, uint8, uint24, uint16], // ['header', 'uptime', 'freeheap', 'rssi', 'vcc', 'load', 'ip1', 'ip2', 'ip3', 'ip4', 'web', 'freestack']); - int index = 0; + uint8_t index = 0; string += LoRa_addInt(P026_get_value(index++), PackedData_uint24); // uptime string += LoRa_addInt(P026_get_value(index++), PackedData_uint24); // freeheap string += LoRa_addFloat(P026_get_value(index++), PackedData_int8); // rssi @@ -219,7 +221,7 @@ boolean Plugin_026(uint8_t function, struct EventStruct *event, String& string) return success; } -float P026_get_value(int type) +float P026_get_value(uint8_t type) { switch (type) { diff --git a/src/_P029_Output.ino b/src/_P029_Output.ino index 02d875c4d..9f737f33b 100644 --- a/src/_P029_Output.ino +++ b/src/_P029_Output.ino @@ -54,9 +54,11 @@ boolean Plugin_029(uint8_t function, struct EventStruct *event, String& string) } addRowLabel(F("IDX")); - String id = F("TDID"); //="taskdeviceid" - id += controllerNr + 1; - addNumericBox(id, Settings.TaskDeviceID[controllerNr][event->TaskIndex], 0, DOMOTICZ_MAX_IDX); + addNumericBox( + concat(F("TDID"), controllerNr + 1), //="taskdeviceid" + Settings.TaskDeviceID[controllerNr][event->TaskIndex], + 0, + DOMOTICZ_MAX_IDX); success = true; break; } diff --git a/src/_P033_Dummy.ino b/src/_P033_Dummy.ino index 9250c193a..994374b6e 100644 --- a/src/_P033_Dummy.ino +++ b/src/_P033_Dummy.ino @@ -87,6 +87,7 @@ boolean Plugin_033(uint8_t function, struct EventStruct *event, String& string) break; } +/* case PLUGIN_WRITE: { String command = parseString(string, 1); @@ -131,6 +132,7 @@ boolean Plugin_033(uint8_t function, struct EventStruct *event, String& string) } break; } +*/ } return success; } diff --git a/src/_Plugin_Helper.cpp b/src/_Plugin_Helper.cpp index 578dc5afa..2ef96cdac 100644 --- a/src/_Plugin_Helper.cpp +++ b/src/_Plugin_Helper.cpp @@ -129,10 +129,13 @@ void pluginWebformShowValue(taskIndex_t taskIndex, if (varNr > 0) { addHtmlDiv(F("div_br")); } + String postfix(taskIndex); + postfix += '_'; + postfix += varNr; pluginWebformShowValue( - label, concat(F("valuename_"), static_cast(taskIndex)) + '_' + varNr, - value, concat(F("value_"), static_cast(taskIndex)) + '_' + varNr, + label, concat(F("valuename_"), postfix), + value, concat(F("value_"), postfix), addTrailingBreak); } diff --git a/src/src/Commands/GPIO.cpp b/src/src/Commands/GPIO.cpp index 744537473..c42ffabab 100644 --- a/src/src/Commands/GPIO.cpp +++ b/src/src/Commands/GPIO.cpp @@ -1181,12 +1181,14 @@ bool getGPIOPinStateValues(String& str) { // parseString(string, 2) = command (pinstate,pinrange) // parseString(string, 3) = gpio 1st number or a range separated by '-' bool success = false; - String logPrefix = F(""); const String device = parseString(str, 1); const String command = parseString(str, 2); const String gpio_descr = parseString(str, 3); if ((command.length() >= 8) && command.equalsIgnoreCase(F("pinstate")) && (device.length() > 0)) { + #ifndef BUILD_NO_DEBUG + String logPrefix; + #endif // returns pin value using syntax: [plugin#xxxxxxx#pinstate#x] int par1; const bool validArgument = validIntFromString(gpio_descr, par1); @@ -1202,7 +1204,9 @@ bool getGPIOPinStateValues(String& str) { pluginID = PLUGIN_GPIO; #endif // if FEATURE_PINSTATE_EXTENDED str = digitalRead(par1); + #ifndef BUILD_NO_DEBUG logPrefix = F("GPIO"); + #endif success = true; break; } @@ -1213,7 +1217,9 @@ bool getGPIOPinStateValues(String& str) { pluginID = PLUGIN_MCP; #endif // if FEATURE_PINSTATE_EXTENDED str = GPIO_MCP_Read(par1); + #ifndef BUILD_NO_DEBUG logPrefix = F("MCP"); + #endif success = true; break; #endif @@ -1224,7 +1230,9 @@ bool getGPIOPinStateValues(String& str) { pluginID = PLUGIN_PCF; #endif // if FEATURE_PINSTATE_EXTENDED str = GPIO_PCF_Read(par1); + #ifndef BUILD_NO_DEBUG logPrefix = F("PCF"); + #endif success = true; break; #endif @@ -1234,10 +1242,12 @@ bool getGPIOPinStateValues(String& str) { unsigned int plugin = INVALID_PLUGIN_ID; if (validUIntFromString(device, plugin) && (plugin != INVALID_PLUGIN_ID)) { // Valid plugin ID? pluginID = plugin; + #ifndef BUILD_NO_DEBUG logPrefix = F("P"); if (pluginID < 100) { logPrefix += '0'; } if (pluginID < 10) { logPrefix += '0'; } logPrefix += pluginID; + #endif } else #endif // if FEATURE_PINSTATE_EXTENDED { @@ -1281,6 +1291,7 @@ bool getGPIOPinStateValues(String& str) { } if (successPar) { + const __FlashStringHelper * logPrefix = F(""); switch (device[0]) { #ifdef USES_P009 diff --git a/src/src/DataStructs/Caches.cpp b/src/src/DataStructs/Caches.cpp index c6d5a7538..f9f8b95f0 100644 --- a/src/src/DataStructs/Caches.cpp +++ b/src/src/DataStructs/Caches.cpp @@ -64,23 +64,21 @@ void Caches::updateActiveTaskUseSerial0() { // Check to see if a task is enabled and using the pins we also use for receiving commands. // We're now receiving only from Serial0, so check if an enabled task is also using it. - for (taskIndex_t task = 0; validTaskIndex(task); ++task) + for (taskIndex_t task = 0; task < TASKS_MAX; ++task) { const deviceIndex_t DeviceIndex = getDeviceIndex_from_TaskIndex(task); if (Settings.TaskDeviceEnabled[task] && validDeviceIndex(DeviceIndex)) { if ((Device[DeviceIndex].Type == DEVICE_TYPE_SERIAL) || (Device[DeviceIndex].Type == DEVICE_TYPE_SERIAL_PLUS1)) { - switch (ESPeasySerialType::getSerialType( + const ESPEasySerialPort port = ESPeasySerialType::getSerialType( ESPEasySerialPort::not_set, Settings.TaskDevicePin1[task], - Settings.TaskDevicePin2[task])) + Settings.TaskDevicePin2[task]); + if (port == ESPEasySerialPort::serial0_swap || + port == ESPEasySerialPort::serial0) { - case ESPEasySerialPort::serial0_swap: - case ESPEasySerialPort::serial0: - activeTaskUseSerial0 = true; - default: - break; + activeTaskUseSerial0 = true; } } } diff --git a/src/src/DataStructs/Caches.h b/src/src/DataStructs/Caches.h index 1e57c2d72..dca04e79f 100644 --- a/src/src/DataStructs/Caches.h +++ b/src/src/DataStructs/Caches.h @@ -48,7 +48,7 @@ struct ExtraTaskSettings_cache_t { typedef std::map TaskIndexNameMap; typedef std::map TaskIndexValueNameMap; -typedef std::map FilePresenceMap; +typedef std::map FilePresenceMap; typedef std::map ExtraTaskSettingsMap; #ifdef ESP32 diff --git a/src/src/DataStructs/DeviceStruct.cpp b/src/src/DataStructs/DeviceStruct.cpp index dc4a9278a..9654b4f45 100644 --- a/src/src/DataStructs/DeviceStruct.cpp +++ b/src/src/DataStructs/DeviceStruct.cpp @@ -1,5 +1,7 @@ #include "../DataStructs/DeviceStruct.h" + + DeviceStruct::DeviceStruct() : Number(0), Type(0), VType(Sensor_VType::SENSOR_TYPE_NONE), Ports(0), ValueCount(0), OutputDataType(Output_Data_type_t::Default), @@ -31,20 +33,18 @@ bool DeviceStruct::connectedToGPIOpins() const { } bool DeviceStruct::usesTaskDevicePin(int pin) const { - switch (pin) { - case 1: + if (pin == 1) return connectedToGPIOpins(); - case 2: + if (pin == 2) return connectedToGPIOpins() && !(Type == DEVICE_TYPE_SINGLE || Type == DEVICE_TYPE_SPI || Type == DEVICE_TYPE_CUSTOM1); - case 3: + if (pin == 3) return Type == DEVICE_TYPE_TRIPLE || Type == DEVICE_TYPE_SERIAL_PLUS1 || Type == DEVICE_TYPE_SPI3 || Type == DEVICE_TYPE_CUSTOM3; - } return false; } diff --git a/src/src/DataStructs/DeviceStruct.h b/src/src/DataStructs/DeviceStruct.h index ef20662b0..8cbbe3de9 100644 --- a/src/src/DataStructs/DeviceStruct.h +++ b/src/src/DataStructs/DeviceStruct.h @@ -48,7 +48,7 @@ enum class Sensor_VType : uint8_t { SENSOR_TYPE_WIND = 21, SENSOR_TYPE_STRING = 22, - SENSOR_TYPE_NOT_SET = 255 + SENSOR_TYPE_NOT_SET = 255 }; enum class Output_Data_type_t : uint8_t { @@ -57,6 +57,8 @@ enum class Output_Data_type_t : uint8_t { All }; + + /*********************************************************************************************\ * DeviceStruct * Description of a plugin diff --git a/src/src/DataStructs/PortStatusStruct.cpp b/src/src/DataStructs/PortStatusStruct.cpp index 9e2ce1e68..c36ec205c 100644 --- a/src/src/DataStructs/PortStatusStruct.cpp +++ b/src/src/DataStructs/PortStatusStruct.cpp @@ -15,12 +15,7 @@ uint16_t portStatusStruct::getDutyCycle() const int16_t portStatusStruct::getValue() const { - switch (mode) { - case PIN_MODE_PWM: - case PIN_MODE_SERVO: - return dutyCycle; - default: - break; - } + if (mode == PIN_MODE_PWM || mode == PIN_MODE_SERVO) + return dutyCycle; return state; } \ No newline at end of file diff --git a/src/src/DataStructs/SecurityStruct.cpp b/src/src/DataStructs/SecurityStruct.cpp index bdad72975..ab5d5ba79 100644 --- a/src/src/DataStructs/SecurityStruct.cpp +++ b/src/src/DataStructs/SecurityStruct.cpp @@ -63,15 +63,12 @@ void SecurityStruct::clearWiFiCredentials() { } void SecurityStruct::clearWiFiCredentials(SecurityStruct::WiFiCredentialsSlot slot) { - switch (slot) { - case SecurityStruct::WiFiCredentialsSlot::first: - ZERO_FILL(WifiSSID); - ZERO_FILL(WifiKey); - break; - case SecurityStruct::WiFiCredentialsSlot::second: - ZERO_FILL(WifiSSID2); - ZERO_FILL(WifiKey2); - break; + if (slot == SecurityStruct::WiFiCredentialsSlot::first) { + ZERO_FILL(WifiSSID); + ZERO_FILL(WifiKey); + } else if (slot == SecurityStruct::WiFiCredentialsSlot::second) { + ZERO_FILL(WifiSSID2); + ZERO_FILL(WifiKey2); } } @@ -81,12 +78,11 @@ bool SecurityStruct::hasWiFiCredentials() const { } bool SecurityStruct::hasWiFiCredentials(SecurityStruct::WiFiCredentialsSlot slot) const { - switch (slot) { - case SecurityStruct::WiFiCredentialsSlot::first: + if (slot == SecurityStruct::WiFiCredentialsSlot::first) return (WifiSSID[0] != 0 && !String(WifiSSID).equalsIgnoreCase(F("ssid"))); - case SecurityStruct::WiFiCredentialsSlot::second: + if (slot == SecurityStruct::WiFiCredentialsSlot::second) return (WifiSSID2[0] != 0 && !String(WifiSSID2).equalsIgnoreCase(F("ssid"))); - } + return false; } diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index 9e5dc95b9..cf5fc3a00 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -55,7 +55,7 @@ class SettingsStruct_tmpl { public: - SettingsStruct_tmpl(); //-V730 +// SettingsStruct_tmpl() = default; // VariousBits1 defaults to 0, keep in mind when adding bit lookups. bool appendUnitToHostname() const; @@ -251,9 +251,9 @@ class SettingsStruct_tmpl char NTPHost[64] = {0}; // FIXME TD-er: Issue #2690 unsigned long Delay = 0; // Sleep time in seconds - int8_t Pin_i2c_sda = -1; - int8_t Pin_i2c_scl = -1; - int8_t Pin_status_led = -1; + int8_t Pin_i2c_sda = DEFAULT_PIN_I2C_SDA; + int8_t Pin_i2c_scl = DEFAULT_PIN_I2C_SCL; + int8_t Pin_status_led = DEFAULT_PIN_STATUS_LED; int8_t Pin_sd_cs = -1; int8_t PinBootStates[17] = {0}; // Only use getPinBootState and setPinBootState as multiple pins are packed for ESP32 uint8_t Syslog_IP[4] = {0}; @@ -291,15 +291,15 @@ class SettingsStruct_tmpl int8_t TaskDevicePin3[N_TASKS]; uint8_t TaskDevicePort[N_TASKS]; }; - int8_t TaskDevicePin[4][N_TASKS]; + int8_t TaskDevicePin[4][N_TASKS]{}; }; boolean TaskDevicePin1PullUp[N_TASKS] = {0}; - int16_t TaskDevicePluginConfig[N_TASKS][PLUGIN_CONFIGVAR_MAX]; + int16_t TaskDevicePluginConfig[N_TASKS][PLUGIN_CONFIGVAR_MAX]{}; boolean TaskDevicePin1Inversed[N_TASKS] = {0}; - float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]; + float TaskDevicePluginConfigFloat[N_TASKS][PLUGIN_CONFIGFLOATVAR_MAX]{}; union { int32_t TaskDevicePluginConfigLong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; - uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]; + uint32_t TaskDevicePluginConfigULong[N_TASKS][PLUGIN_CONFIGLONGVAR_MAX]{}; }; uint8_t TaskDeviceSendDataFlags[N_TASKS] = {0}; uint8_t OLD_TaskDeviceGlobalSync[N_TASKS] = {0}; @@ -364,7 +364,7 @@ class SettingsStruct_tmpl // Do not rename or move this checksum. // Checksum calculation will work "around" this - uint8_t md5[16]; // Store checksum of the settings. + uint8_t md5[16]{}; // Store checksum of the settings. // uint8_t ProgmemMd5[16]; // crc of the binary that last saved the struct to file. diff --git a/src/src/DataStructs/WiFiEventData.h b/src/src/DataStructs/WiFiEventData.h index 00cf89c2a..8bbd3ea55 100644 --- a/src/src/DataStructs/WiFiEventData.h +++ b/src/src/DataStructs/WiFiEventData.h @@ -122,7 +122,7 @@ struct WiFiEventData_t { unsigned long connectionFailures = 0; - std::map connectDurations; + std::map connectDurations; #ifdef ESP32 WiFiEventId_t wm_event_id = 0; diff --git a/src/src/DataStructs_templ/SettingsStruct.cpp b/src/src/DataStructs_templ/SettingsStruct.cpp index a9b6a8cc8..9fbcc6b90 100644 --- a/src/src/DataStructs_templ/SettingsStruct.cpp +++ b/src/src/DataStructs_templ/SettingsStruct.cpp @@ -12,18 +12,6 @@ #ifndef DATASTRUCTS_SETTINGSSTRUCT_CPP #define DATASTRUCTS_SETTINGSSTRUCT_CPP -template -SettingsStruct_tmpl::SettingsStruct_tmpl() : ResetFactoryDefaultPreference(0) { //-V730 - clearMisc(); - clearTimeSettings(); - clearNotifications(); - clearControllers(); - clearTasks(); - clearLogSettings(); - clearUnitNameSettings(); - clearNetworkSettings(); -} - // VariousBits1 defaults to 0, keep in mind when adding bit lookups. template @@ -547,15 +535,15 @@ void SettingsStruct_tmpl::clearTask(taskIndex_t task) { if (task >= N_TASKS) { return; } for (controllerIndex_t i = 0; i < CONTROLLER_MAX; ++i) { - TaskDeviceID[i][task] = 0; + TaskDeviceID[i][task] = 0u; TaskDeviceSendData[i][task] = false; } - TaskDeviceNumber[task] = 0; - OLD_TaskDeviceID[task] = 0; // UNUSED: this can be removed + TaskDeviceNumber[task] = 0u; + OLD_TaskDeviceID[task] = 0u; // UNUSED: this can be removed TaskDevicePin1[task] = -1; TaskDevicePin2[task] = -1; TaskDevicePin3[task] = -1; - TaskDevicePort[task] = 0; + TaskDevicePort[task] = 0u; TaskDevicePin1PullUp[task] = false; for (uint8_t cv = 0; cv < PLUGIN_CONFIGVAR_MAX; ++cv) { @@ -570,10 +558,10 @@ void SettingsStruct_tmpl::clearTask(taskIndex_t task) { for (uint8_t cv = 0; cv < PLUGIN_CONFIGLONGVAR_MAX; ++cv) { TaskDevicePluginConfigLong[task][cv] = 0; } - TaskDeviceSendDataFlags[task] = 0; - OLD_TaskDeviceGlobalSync[task]= 0; - TaskDeviceDataFeed[task] = 0; - TaskDeviceTimer[task] = 0; + TaskDeviceSendDataFlags[task] = 0u; + OLD_TaskDeviceGlobalSync[task]= 0u; + TaskDeviceDataFeed[task] = 0u; + TaskDeviceTimer[task] = 0u; TaskDeviceEnabled[task] = false; I2C_Multiplexer_Channel[task] = -1; } @@ -686,14 +674,15 @@ bool SettingsStruct_tmpl::isSPI_pin(int8_t pin) const { template bool SettingsStruct_tmpl::isSPI_valid() const { - return !((InitSPI == static_cast(SPI_Options_e::None)) || - ((InitSPI == static_cast(SPI_Options_e::UserDefined)) && - ((SPI_SCLK_pin == -1) || + if (InitSPI == static_cast(SPI_Options_e::None)) return false; + if (InitSPI == static_cast(SPI_Options_e::UserDefined)) + return !((SPI_SCLK_pin == -1) || (SPI_MISO_pin == -1) || (SPI_MOSI_pin == -1) || (SPI_SCLK_pin == SPI_MISO_pin) || (SPI_MISO_pin == SPI_MOSI_pin) || - (SPI_MOSI_pin == SPI_SCLK_pin)))); // Checks + (SPI_MOSI_pin == SPI_SCLK_pin)); + return true; } template diff --git a/src/src/ESPEasyCore/ESPEasyGPIO.cpp b/src/src/ESPEasyCore/ESPEasyGPIO.cpp index 4d192d8d3..0ecf19683 100644 --- a/src/src/ESPEasyCore/ESPEasyGPIO.cpp +++ b/src/src/ESPEasyCore/ESPEasyGPIO.cpp @@ -21,14 +21,11 @@ void GPIO_Internal_Write(int pin, uint8_t value) const uint32_t key = createKey(PLUGIN_GPIO, pin); auto it = globalMapPortStatus.find(key); if (it != globalMapPortStatus.end()) { - switch (it->second.mode) { - case PIN_MODE_PWM: - set_Gpio_PWM(pin, value); - break; - default: - pinMode(pin, OUTPUT); - digitalWrite(pin, value); - break; + if (it->second.mode == PIN_MODE_PWM) { + set_Gpio_PWM(pin, value); + } else { + pinMode(pin, OUTPUT); + digitalWrite(pin, value); } } } @@ -68,12 +65,14 @@ bool GPIO_Read_Switch_State(int pin, uint8_t pinMode) { case PIN_MODE_OUTPUT: canRead = true; break; +/* case PIN_MODE_PWM: break; case PIN_MODE_SERVO: break; case PIN_MODE_OFFLINE: break; +*/ default: break; } diff --git a/src/src/ESPEasyCore/ESPEasyRules.cpp b/src/src/ESPEasyCore/ESPEasyRules.cpp index 9b006263b..8e3fbefbe 100644 --- a/src/src/ESPEasyCore/ESPEasyRules.cpp +++ b/src/src/ESPEasyCore/ESPEasyRules.cpp @@ -714,9 +714,7 @@ void substitute_eventvalue(String& line, const String& event) { } else { // Just remove the invalid eventvalue variable if (loglevelActiveFor(LOG_LEVEL_ERROR)) { - String log = F("Rules : Syntax error, invalid variable: "); - log += eventvalue; - addLog(LOG_LEVEL_ERROR, log); + addLog(LOG_LEVEL_ERROR, concat(F("Rules : Syntax error, invalid variable: "), eventvalue)); } line.replace(eventvalue, EMPTY_STRING); } @@ -1178,13 +1176,10 @@ int balanceParentheses(String& string) { int left = 0; int right = 0; for (unsigned int i = 0; i < string.length(); i++) { - switch (string[i]) { - case '(': - left++; - break; - case ')': - right++; - break; + if (string[i] == '(') { + left++; + } else if (string[i] == ')') { + right++; } } if (left != right) { @@ -1196,7 +1191,7 @@ int balanceParentheses(String& string) { } } else if (right > left) { for (int i = 0; i < right - left; i++) { - string = String(F("(")) + string; // This is quite 'expensive' + string = String('(') + string; // This is quite 'expensive' } } return left - right; diff --git a/src/src/ESPEasyCore/ESPEasyWifi_ProcessEvent.cpp b/src/src/ESPEasyCore/ESPEasyWifi_ProcessEvent.cpp index dff34da4f..de3bcdda2 100644 --- a/src/src/ESPEasyCore/ESPEasyWifi_ProcessEvent.cpp +++ b/src/src/ESPEasyCore/ESPEasyWifi_ProcessEvent.cpp @@ -536,8 +536,8 @@ void processScanDone() { // FIXME TD-er: Set timeout... if (WiFiEventData.lastGetScanMoment.timeoutReached(5000)) { # ifndef BUILD_NO_DEBUG - addLog(LOG_LEVEL_ERROR, F("WiFi : Scan Running Timeout")); - #endif + addLog(LOG_LEVEL_ERROR, F("WiFi : Scan Running Timeout")); + #endif WiFiEventData.processedScanDone = true; } return; @@ -551,9 +551,7 @@ void processScanDone() { WiFiEventData.processedScanDone = true; # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { - String log = F("WiFi : Scan finished, found: "); - log += scanCompleteStatus; - addLogMove(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_INFO, concat(F("WiFi : Scan finished, found: "), scanCompleteStatus)); } #endif diff --git a/src/src/Helpers/Convert.cpp b/src/src/Helpers/Convert.cpp index fc6700f74..acd414595 100644 --- a/src/src/Helpers/Convert.cpp +++ b/src/src/Helpers/Convert.cpp @@ -14,23 +14,27 @@ const __FlashStringHelper * getBearing(int degrees) int bearing_idx = int((degrees + (stepsize / 2.0f)) / stepsize) % nr_directions; if (bearing_idx >= 0) { - switch (bearing_idx) { - case 0: return F("N"); - case 1: return F("NNE"); - case 2: return F("NE"); - case 3: return F("ENE"); - case 4: return F("E"); - case 5: return F("ESE"); - case 6: return F("SE"); - case 7: return F("SSE"); - case 8: return F("S"); - case 9: return F("SSW"); - case 10: return F("SW"); - case 11: return F("WSW"); - case 12: return F("W"); - case 13: return F("WNW"); - case 14: return F("NW"); - case 15: return F("NNW"); + const __FlashStringHelper* strings[] { + F("N"), + F("NNE"), + F("NE"), + F("ENE"), + F("E"), + F("ESE"), + F("SE"), + F("SSE"), + F("S"), + F("SSW"), + F("SW"), + F("WSW"), + F("W"), + F("WNW"), + F("NW"), + F("NNW") + }; + constexpr size_t nrStrings = sizeof(strings) / sizeof(strings[0]); + if (bearing_idx < nrStrings) { + return strings[bearing_idx]; } } return F(""); @@ -145,7 +149,7 @@ String format_msec_duration(int64_t duration) { String result; if (duration < 0) { - result = "-"; + result = '-'; duration = -1ll * duration; } diff --git a/src/src/Helpers/Dallas1WireHelper.cpp b/src/src/Helpers/Dallas1WireHelper.cpp index 1e73aa5a7..9d8babc6b 100644 --- a/src/src/Helpers/Dallas1WireHelper.cpp +++ b/src/src/Helpers/Dallas1WireHelper.cpp @@ -237,13 +237,7 @@ void Dallas_addr_selector_webform_save(taskIndex_t TaskIndex, int8_t gpio_pin_rx bool Dallas_plugin(pluginID_t pluginID) { - switch (pluginID) { - case 4: - case 80: - case 100: - return true; - } - return false; + return (pluginID == 4) || (pluginID == 80) || (pluginID == 100); } void Dallas_plugin_get_addr(uint8_t addr[], taskIndex_t TaskIndex, uint8_t var_index) diff --git a/src/src/Helpers/_CPlugin_DomoticzHelper.cpp b/src/src/Helpers/_CPlugin_DomoticzHelper.cpp index 17f3d9361..42de167c0 100644 --- a/src/src/Helpers/_CPlugin_DomoticzHelper.cpp +++ b/src/src/Helpers/_CPlugin_DomoticzHelper.cpp @@ -81,101 +81,93 @@ String formatUserVarDomoticz(int value) { String formatDomoticzSensorType(struct EventStruct *event) { String values; - switch (event->getSensorType()) - { - case Sensor_VType::SENSOR_TYPE_SINGLE: // single value sensor, used for Dallas, BH1750, etc - values = formatUserVarDomoticz(event, 0); - break; - case Sensor_VType::SENSOR_TYPE_LONG: // single LONG value, stored in two floats (rfid tags) - values = UserVar.getSensorTypeLong(event->TaskIndex); - break; - case Sensor_VType::SENSOR_TYPE_DUAL: // any sensor that uses two simple values - values = formatUserVarDomoticz(event, 0); - values += formatUserVarDomoticz(event, 1); - break; - case Sensor_VType::SENSOR_TYPE_TEMP_HUM: + const Sensor_VType sensorType = event->getSensorType(); - // temp + hum + hum_stat, used for DHT11 - // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fhumidity - values = formatUserVarDomoticz(event, 0); // TEMP = Temperature - values += formatUserVarDomoticz(event, 1); // HUM = Humidity - values += humStatDomoticz(event, 1); // HUM_STAT = Humidity status - break; - case Sensor_VType::SENSOR_TYPE_TEMP_HUM_BARO: + if (isSimpleOutputDataType(sensorType)) { + const uint8_t valueCount = getValueCountFromSensorType(sensorType); - // temp + hum + hum_stat + bar + bar_fore, used for BME280 - // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fhumidity.2Fbarometer - values = formatUserVarDomoticz(event, 0); // TEMP = Temperature - values += formatUserVarDomoticz(event, 1); // HUM = Humidity - values += humStatDomoticz(event, 1); // HUM_STAT = Humidity status - values += formatUserVarDomoticz(event, 2); // BAR = Barometric pressure - values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast - break; - case Sensor_VType::SENSOR_TYPE_TEMP_BARO: - - // temp + hum + hum_stat + bar + bar_fore, used for BMP085 - // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fbarometer - values = formatUserVarDomoticz(event, 0); // TEMP = Temperature - values += formatUserVarDomoticz(event, 1); // BAR = Barometric pressure - values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast - values += formatUserVarDomoticz(0); // ALTITUDE= Not used at the moment, can be 0 - break; - case Sensor_VType::SENSOR_TYPE_TEMP_EMPTY_BARO: - - // temp + bar + bar_fore, used for BMP280 - // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fbarometer - values = formatUserVarDomoticz(event, 0); // TEMP = Temperature - values += formatUserVarDomoticz(event, 2); // BAR = Barometric pressure - values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast - values += formatUserVarDomoticz(0); // ALTITUDE= Not used at the moment, can be 0 - break; - case Sensor_VType::SENSOR_TYPE_TRIPLE: - values = formatUserVarDomoticz(event, 0); - values += formatUserVarDomoticz(event, 1); - values += formatUserVarDomoticz(event, 2); - break; - case Sensor_VType::SENSOR_TYPE_QUAD: - values = formatUserVarDomoticz(event, 0); - values += formatUserVarDomoticz(event, 1); - values += formatUserVarDomoticz(event, 2); - values += formatUserVarDomoticz(event, 3); - break; - case Sensor_VType::SENSOR_TYPE_WIND: - - // WindDir in degrees; WindDir as text; Wind speed average ; Wind speed gust; 0 - // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Wind - values = formatUserVarDomoticz(event, 0); // WB = Wind bearing (0-359) - values += getBearing(UserVar[event->BaseVarIndex]); // WD = Wind direction (S, SW, NNW, etc.) - values += ';'; // Needed after getBearing - // Domoticz expects the wind speed in (m/s * 10) - values += toString((UserVar[event->BaseVarIndex + 1] * 10), Cache.getTaskDeviceValueDecimals(event->TaskIndex, 1)); - values += ';'; // WS = 10 * Wind speed [m/s] - values += toString((UserVar[event->BaseVarIndex + 2] * 10), Cache.getTaskDeviceValueDecimals(event->TaskIndex, 2)); - values += ';'; // WG = 10 * Gust [m/s] - values += formatUserVarDomoticz(0); // Temperature - values += formatUserVarDomoticz(0); // Temperature Windchill - break; - case Sensor_VType::SENSOR_TYPE_SWITCH: - case Sensor_VType::SENSOR_TYPE_DIMMER: - - // Too specific for HTTP/MQTT - break; - case Sensor_VType::SENSOR_TYPE_STRING: - values = event->String2; - break; - default: + for (uint8_t i = 0; i < valueCount; ++i) { + values += formatUserVarDomoticz(event, i); + } + } else { + switch (sensorType) { - # ifndef BUILD_NO_DEBUG + case Sensor_VType::SENSOR_TYPE_LONG: // single LONG value, stored in two floats (rfid tags) + values = UserVar.getSensorTypeLong(event->TaskIndex); + break; + case Sensor_VType::SENSOR_TYPE_TEMP_HUM: - if (loglevelActiveFor(LOG_LEVEL_ERROR)) { - String log = F("Domoticz Controller: Not yet implemented sensor type: "); - log += static_cast(event->sensorType); - log += F(" idx: "); - log += event->idx; - addLogMove(LOG_LEVEL_ERROR, log); + // temp + hum + hum_stat, used for DHT11 + // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fhumidity + values = formatUserVarDomoticz(event, 0); // TEMP = Temperature + values += formatUserVarDomoticz(event, 1); // HUM = Humidity + values += humStatDomoticz(event, 1); // HUM_STAT = Humidity status + break; + case Sensor_VType::SENSOR_TYPE_TEMP_HUM_BARO: + + // temp + hum + hum_stat + bar + bar_fore, used for BME280 + // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fhumidity.2Fbarometer + values = formatUserVarDomoticz(event, 0); // TEMP = Temperature + values += formatUserVarDomoticz(event, 1); // HUM = Humidity + values += humStatDomoticz(event, 1); // HUM_STAT = Humidity status + values += formatUserVarDomoticz(event, 2); // BAR = Barometric pressure + values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast + break; + case Sensor_VType::SENSOR_TYPE_TEMP_BARO: + + // temp + hum + hum_stat + bar + bar_fore, used for BMP085 + // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fbarometer + values = formatUserVarDomoticz(event, 0); // TEMP = Temperature + values += formatUserVarDomoticz(event, 1); // BAR = Barometric pressure + values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast + values += formatUserVarDomoticz(0); // ALTITUDE= Not used at the moment, can be 0 + break; + case Sensor_VType::SENSOR_TYPE_TEMP_EMPTY_BARO: + + // temp + bar + bar_fore, used for BMP280 + // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature.2Fbarometer + values = formatUserVarDomoticz(event, 0); // TEMP = Temperature + values += formatUserVarDomoticz(event, 2); // BAR = Barometric pressure + values += formatUserVarDomoticz(0); // BAR_FOR = Barometer forecast + values += formatUserVarDomoticz(0); // ALTITUDE= Not used at the moment, can be 0 + break; + case Sensor_VType::SENSOR_TYPE_WIND: + + // WindDir in degrees; WindDir as text; Wind speed average ; Wind speed gust; 0 + // http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Wind + values = formatUserVarDomoticz(event, 0); // WB = Wind bearing (0-359) + values += getBearing(UserVar[event->BaseVarIndex]); // WD = Wind direction (S, SW, NNW, etc.) + values += ';'; // Needed after getBearing + // Domoticz expects the wind speed in (m/s * 10) + values += toString((UserVar[event->BaseVarIndex + 1] * 10), Cache.getTaskDeviceValueDecimals(event->TaskIndex, 1)); + values += ';'; // WS = 10 * Wind speed [m/s] + values += toString((UserVar[event->BaseVarIndex + 2] * 10), Cache.getTaskDeviceValueDecimals(event->TaskIndex, 2)); + values += ';'; // WG = 10 * Gust [m/s] + values += formatUserVarDomoticz(0); // Temperature + values += formatUserVarDomoticz(0); // Temperature Windchill + break; + case Sensor_VType::SENSOR_TYPE_SWITCH: + case Sensor_VType::SENSOR_TYPE_DIMMER: + + // Too specific for HTTP/MQTT + break; + case Sensor_VType::SENSOR_TYPE_STRING: + values = event->String2; + break; + default: + { + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_ERROR)) { + String log = F("Domoticz Controller: Not yet implemented sensor type: "); + log += static_cast(event->sensorType); + log += F(" idx: "); + log += event->idx; + addLogMove(LOG_LEVEL_ERROR, log); + } + # endif // ifndef BUILD_NO_DEBUG + break; } - # endif // ifndef BUILD_NO_DEBUG - break; } } @@ -218,8 +210,10 @@ bool deserializeDomoticzJson(const String& json, if (root.isNull()) { return false; } + // Use long here as intermediate object type to prevent ArduinoJSON from adding a new template variant to the code. const long idx_long = root[F("idx")]; + idx = idx_long; nvalue = root[F("nvalue")]; nvaluealt = root[F("nvalue")]; @@ -265,52 +259,36 @@ String serializeDomoticzJson(struct EventStruct *event) const Sensor_VType sensorType = event->getSensorType(); - switch (sensorType) + if (sensorType == Sensor_VType::SENSOR_TYPE_SWITCH) { - case Sensor_VType::SENSOR_TYPE_SWITCH: - json += ','; - json += to_json_object_value(F("command"), F("switchlight")); + json += ','; + json += to_json_object_value(F("command"), F("switchlight")); - if (essentiallyZero(UserVar[event->BaseVarIndex])) { - json += ','; - json += to_json_object_value(F("switchcmd"), F("Off")); - } - else { - json += ','; - json += to_json_object_value(F("switchcmd"), F("On")); - } - break; - case Sensor_VType::SENSOR_TYPE_DIMMER: + if (essentiallyZero(UserVar[event->BaseVarIndex])) { json += ','; - json += to_json_object_value(F("command"), F("switchlight")); + json += to_json_object_value(F("switchcmd"), F("Off")); + } + else { + json += ','; + json += to_json_object_value(F("switchcmd"), F("On")); + } + } else if (sensorType == Sensor_VType::SENSOR_TYPE_DIMMER) { + json += ','; + json += to_json_object_value(F("command"), F("switchlight")); - if (essentiallyZero(UserVar[event->BaseVarIndex])) { - json += ','; - json += to_json_object_value(F("switchcmd"), F("Off")); - } - else { - json += ','; - json += to_json_object_value(F("Set%20Level"), toString(UserVar[event->BaseVarIndex], 2)); - } - break; - - case Sensor_VType::SENSOR_TYPE_SINGLE: - case Sensor_VType::SENSOR_TYPE_LONG: - case Sensor_VType::SENSOR_TYPE_DUAL: - case Sensor_VType::SENSOR_TYPE_TRIPLE: - case Sensor_VType::SENSOR_TYPE_QUAD: - case Sensor_VType::SENSOR_TYPE_TEMP_HUM: - case Sensor_VType::SENSOR_TYPE_TEMP_BARO: - case Sensor_VType::SENSOR_TYPE_TEMP_EMPTY_BARO: - case Sensor_VType::SENSOR_TYPE_TEMP_HUM_BARO: - case Sensor_VType::SENSOR_TYPE_WIND: - case Sensor_VType::SENSOR_TYPE_STRING: - default: + if (essentiallyZero(UserVar[event->BaseVarIndex])) { json += ','; - json += to_json_object_value(F("nvalue"), F("0")); + json += to_json_object_value(F("switchcmd"), F("Off")); + } + else { json += ','; - json += to_json_object_value(F("svalue"), formatDomoticzSensorType(event), true); - break; + json += to_json_object_value(F("Set%20Level"), toString(UserVar[event->BaseVarIndex], 2)); + } + } else { + json += ','; + json += to_json_object_value(F("nvalue"), F("0")); + json += ','; + json += to_json_object_value(F("svalue"), formatDomoticzSensorType(event), true); } json += '}'; } diff --git a/src/src/Helpers/_Plugin_SensorTypeHelper.cpp b/src/src/Helpers/_Plugin_SensorTypeHelper.cpp index 2b5da9a5c..70178efff 100644 --- a/src/src/Helpers/_Plugin_SensorTypeHelper.cpp +++ b/src/src/Helpers/_Plugin_SensorTypeHelper.cpp @@ -41,10 +41,21 @@ uint8_t getValueCountFromSensorType(Sensor_VType sensorType) return 1; case Sensor_VType::SENSOR_TYPE_NOT_SET: break; } + #ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_ERROR, F("getValueCountFromSensorType: Unknown sensortype")); + #endif return 0; } +bool isSimpleOutputDataType(Sensor_VType sensorType) +{ + return sensorType == Sensor_VType::SENSOR_TYPE_SINGLE || + sensorType == Sensor_VType::SENSOR_TYPE_DUAL || + sensorType == Sensor_VType::SENSOR_TYPE_TRIPLE || + sensorType == Sensor_VType::SENSOR_TYPE_QUAD; +} + + const __FlashStringHelper * getSensorTypeLabel(Sensor_VType sensorType) { switch (sensorType) { case Sensor_VType::SENSOR_TYPE_SINGLE: return F("Single"); @@ -68,31 +79,34 @@ const __FlashStringHelper * getSensorTypeLabel(Sensor_VType sensorType) { void sensorTypeHelper_webformLoad_allTypes(struct EventStruct *event, uint8_t pconfigIndex) { - uint8_t optionValues[12]; - - optionValues[0] = static_cast(Sensor_VType::SENSOR_TYPE_SINGLE); - optionValues[1] = static_cast(Sensor_VType::SENSOR_TYPE_TEMP_HUM); - optionValues[2] = static_cast(Sensor_VType::SENSOR_TYPE_TEMP_BARO); - optionValues[3] = static_cast(Sensor_VType::SENSOR_TYPE_TEMP_HUM_BARO); - optionValues[4] = static_cast(Sensor_VType::SENSOR_TYPE_DUAL); - optionValues[5] = static_cast(Sensor_VType::SENSOR_TYPE_TRIPLE); - optionValues[6] = static_cast(Sensor_VType::SENSOR_TYPE_QUAD); - optionValues[7] = static_cast(Sensor_VType::SENSOR_TYPE_SWITCH); - optionValues[8] = static_cast(Sensor_VType::SENSOR_TYPE_DIMMER); - optionValues[9] = static_cast(Sensor_VType::SENSOR_TYPE_LONG); - optionValues[10] = static_cast(Sensor_VType::SENSOR_TYPE_WIND); - optionValues[11] = static_cast(Sensor_VType::SENSOR_TYPE_STRING); - sensorTypeHelper_webformLoad(event, pconfigIndex, 11, optionValues); + const uint8_t optionValues[] { + static_cast(Sensor_VType::SENSOR_TYPE_SINGLE), + static_cast(Sensor_VType::SENSOR_TYPE_TEMP_HUM), + static_cast(Sensor_VType::SENSOR_TYPE_TEMP_BARO), + static_cast(Sensor_VType::SENSOR_TYPE_TEMP_HUM_BARO), + static_cast(Sensor_VType::SENSOR_TYPE_DUAL), + static_cast(Sensor_VType::SENSOR_TYPE_TRIPLE), + static_cast(Sensor_VType::SENSOR_TYPE_QUAD), + static_cast(Sensor_VType::SENSOR_TYPE_SWITCH), + static_cast(Sensor_VType::SENSOR_TYPE_DIMMER), + static_cast(Sensor_VType::SENSOR_TYPE_LONG), + static_cast(Sensor_VType::SENSOR_TYPE_WIND), + static_cast(Sensor_VType::SENSOR_TYPE_STRING) + }; + constexpr int optionCount = sizeof(optionValues) / sizeof(optionValues[0]); + sensorTypeHelper_webformLoad(event, pconfigIndex, optionCount, optionValues); } void sensorTypeHelper_webformLoad_simple(struct EventStruct *event, uint8_t pconfigIndex) { - uint8_t optionValues[4]; - optionValues[0] = static_cast(Sensor_VType::SENSOR_TYPE_SINGLE); - optionValues[1] = static_cast(Sensor_VType::SENSOR_TYPE_DUAL); - optionValues[2] = static_cast(Sensor_VType::SENSOR_TYPE_TRIPLE); - optionValues[3] = static_cast(Sensor_VType::SENSOR_TYPE_QUAD); - sensorTypeHelper_webformLoad(event, pconfigIndex, 4, optionValues); + const uint8_t optionValues[] { + static_cast(Sensor_VType::SENSOR_TYPE_SINGLE), + static_cast(Sensor_VType::SENSOR_TYPE_DUAL), + static_cast(Sensor_VType::SENSOR_TYPE_TRIPLE), + static_cast(Sensor_VType::SENSOR_TYPE_QUAD) + }; + constexpr int optionCount = sizeof(optionValues) / sizeof(optionValues[0]); + sensorTypeHelper_webformLoad(event, pconfigIndex, optionCount, optionValues); } void sensorTypeHelper_webformLoad(struct EventStruct *event, uint8_t pconfigIndex, int optionCount, const uint8_t options[]) @@ -112,21 +126,12 @@ void sensorTypeHelper_webformLoad(struct EventStruct *event, uint8_t pconfigInde choice = event->sensorType; PCONFIG(pconfigIndex) = static_cast(choice); } - String outputTypeLabel = F("Output Data Type"); + const __FlashStringHelper * outputTypeLabel = F("Output Data Type"); if (Device[DeviceIndex].OutputDataType == Output_Data_type_t::Simple) { - switch(event->sensorType) { - case Sensor_VType::SENSOR_TYPE_SINGLE: - case Sensor_VType::SENSOR_TYPE_DUAL: - case Sensor_VType::SENSOR_TYPE_TRIPLE: - case Sensor_VType::SENSOR_TYPE_QUAD: - // These are valid - break; - default: - { - choice = Device[DeviceIndex].VType; - PCONFIG(pconfigIndex) = static_cast(choice); - break; - } + if (!isSimpleOutputDataType(event->sensorType)) + { + choice = Device[DeviceIndex].VType; + PCONFIG(pconfigIndex) = static_cast(choice); } outputTypeLabel = F("Number Output Values"); } @@ -169,11 +174,13 @@ void sensorTypeHelper_loadOutputSelector( struct EventStruct *event, uint8_t pconfigIndex, uint8_t valuenr, int optionCount, const __FlashStringHelper * options[], const int indices[]) { - uint8_t choice = PCONFIG(pconfigIndex); - String label = F("Value "); - - label += (valuenr + 1); - addFormSelector(label, PCONFIG_LABEL(pconfigIndex), optionCount, options, indices, choice); + addFormSelector( + concat(F("Value "), valuenr + 1), + PCONFIG_LABEL(pconfigIndex), + optionCount, + options, + indices, + PCONFIG(pconfigIndex)); } @@ -181,9 +188,11 @@ void sensorTypeHelper_loadOutputSelector( struct EventStruct *event, uint8_t pconfigIndex, uint8_t valuenr, int optionCount, const String options[], const int indices[]) { - uint8_t choice = PCONFIG(pconfigIndex); - String label = F("Value "); - - label += (valuenr + 1); - addFormSelector(label, PCONFIG_LABEL(pconfigIndex), optionCount, options, indices, choice); + addFormSelector( + concat(F("Value "), valuenr + 1), + PCONFIG_LABEL(pconfigIndex), + optionCount, + options, + indices, + PCONFIG(pconfigIndex)); } diff --git a/src/src/Helpers/_Plugin_SensorTypeHelper.h b/src/src/Helpers/_Plugin_SensorTypeHelper.h index 9373e536e..32d371511 100644 --- a/src/src/Helpers/_Plugin_SensorTypeHelper.h +++ b/src/src/Helpers/_Plugin_SensorTypeHelper.h @@ -13,6 +13,8 @@ \*********************************************************************************************/ uint8_t getValueCountFromSensorType(Sensor_VType sensorType); +bool isSimpleOutputDataType(Sensor_VType sensorType); + const __FlashStringHelper * getSensorTypeLabel(Sensor_VType sensorType); void sensorTypeHelper_webformLoad_allTypes(struct EventStruct *event, uint8_t pconfigIndex); diff --git a/src/src/PluginStructs/P052_data_struct.cpp b/src/src/PluginStructs/P052_data_struct.cpp index 5d78bcebb..9b837135d 100644 --- a/src/src/PluginStructs/P052_data_struct.cpp +++ b/src/src/PluginStructs/P052_data_struct.cpp @@ -19,17 +19,20 @@ bool P052_data_struct::isInitialized() const { } const __FlashStringHelper * P052_data_struct::Plugin_052_valuename(uint8_t value_nr, bool displayString) { - switch (value_nr) { - case 0: return displayString ? F("Empty") : F(""); - case 1: return displayString ? F("Carbon Dioxide") : F("co2"); - case 2: return displayString ? F("Temperature") : F("T"); - case 3: return displayString ? F("Humidity") : F("H"); - case 4: return displayString ? F("Relay Status") : F("rel"); - case 5: return displayString ? F("Temperature Adjustment") : F("Tadj"); - case 6: return displayString ? F("ABC period") : F("abc_per"); - case 7: return displayString ? F("Error Status") : F("err"); - default: - break; + const __FlashStringHelper* strings[] { + F("Empty"), F(""), + F("Carbon Dioxide"), F("co2"), + F("Temperature"), F("T"), + F("Humidity"), F("H"), + F("Relay Status"), F("rel"), + F("Temperature Adjustment"), F("Tadj"), + F("ABC period"), F("abc_per"), + F("Error Status"), F("err") + }; + const size_t index = 2* value_nr + displayString ? 0 : 1; + constexpr size_t nrStrings = sizeof(strings) / sizeof(strings[0]); + if (index < nrStrings) { + return strings[index]; } return F(""); } diff --git a/src/src/PluginStructs/P145_data_struct.cpp b/src/src/PluginStructs/P145_data_struct.cpp index 2f3ebce68..f5fba2321 100644 --- a/src/src/PluginStructs/P145_data_struct.cpp +++ b/src/src/PluginStructs/P145_data_struct.cpp @@ -447,7 +447,7 @@ float P145_data_struct::getAnalogValue() @param[in] ref Reference level for calibration @note These parameters must be set before the plugin can calculate the level They are determined by the plugin configuration -/*****************************************************************************/ + *****************************************************************************/ void P145_data_struct::setSensorData(int stype, bool comp, bool cal, bool vcclow, float load, float zero, float ref) { /* Each MQ-xxx sensor comes with its own set of constants */ @@ -475,7 +475,7 @@ void P145_data_struct::setSensorData(int stype, bool comp, bool cal, bool vcclow @param[in] hPin Ootput pin for heater control @note These values must be set before the plugin can measure the level They are determined by the plugin configuration -/*****************************************************************************/ + *****************************************************************************/ void P145_data_struct::setSensorPins(int aPin, int hPin) { analogPin = aPin; diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index 405ea88d9..eda5173c5 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -430,6 +430,14 @@ void handle_devices_CopySubmittedSettings(taskIndex_t taskIndex, pluginID_t task } +void html_add_setPage(uint8_t page, bool isLinkToPrev) { + addHtml(F("devices?setpage=")); + addHtmlInt(page); + addHtml(F("'>&")); + addHtml(isLinkToPrev ? 'l' : 'g'); + addHtml(F("t;")); +} + // ******************************************************************************** // Show table with all selected Tasks/Devices // ******************************************************************************** @@ -444,37 +452,9 @@ void handle_devicess_ShowAllTasksTable(uint8_t page) { html_add_button_prefix(); - { - String html; - html.reserve(30); - - html += F("devices?setpage="); - - if (page > 1) { - html += page - 1; - } - else { - html += page; - } - html += F("'><"); - addHtml(html); - } + html_add_setPage((page > 1) ? page - 1 : page, true); html_add_button_prefix(); - { - String html; - html.reserve(30); - - html += F("devices?setpage="); - - if (page < (TASKS_MAX / TASKS_PER_PAGE)) { - html += page + 1; - } - else { - html += page; - } - html += F("'>>"); - addHtml(html); - } + html_add_setPage((page < (TASKS_MAX / TASKS_PER_PAGE)) ? page + 1 : page, false); } html_table_header(F("Task"), 50);