From 963a335ced84fb30cf86591ee69ba80df07c912c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Fri, 1 Apr 2022 20:21:05 +0000 Subject: [PATCH 01/25] [P2P] set default port to 8266, plus warn about port, partly fix for #3982 --- src/Custom-sample.h | 2 +- src/src/CustomBuild/ESPEasyDefaults.h | 2 +- src/src/WebServer/AdvancedConfigPage.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Custom-sample.h b/src/Custom-sample.h index 6022ef704..75f6e5b11 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -141,7 +141,7 @@ #define DEFAULT_SERIAL_BAUD 115200 // Serial Port Baud Rate #define DEFAULT_SYSLOG_FACILITY 0 // kern -#define DEFAULT_SYNC_UDP_PORT 0 // Used for ESPEasy p2p. (IANA registered port: 8266) +#define DEFAULT_SYNC_UDP_PORT 8266 // Used for ESPEasy p2p. (IANA registered port: 8266) #define BUILD_NO_DEBUG diff --git a/src/src/CustomBuild/ESPEasyDefaults.h b/src/src/CustomBuild/ESPEasyDefaults.h index 3e57caf12..6581cafb3 100644 --- a/src/src/CustomBuild/ESPEasyDefaults.h +++ b/src/src/CustomBuild/ESPEasyDefaults.h @@ -309,7 +309,7 @@ #endif #ifndef DEFAULT_SYNC_UDP_PORT -#define DEFAULT_SYNC_UDP_PORT 0 // Used for ESPEasy p2p. (IANA registered port: 8266) +#define DEFAULT_SYNC_UDP_PORT 8266 // Used for ESPEasy p2p. (IANA registered port: 8266) #endif #ifndef BUILD_IN_WEBHEADER diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index 260ea09ab..3e80b50d1 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -191,7 +191,7 @@ void handle_advanced() { addFormSubHeader(F("Inter-ESPEasy Network")); - + if (Settings.UDPPort != 8266 ) addFormNote(F("Default port is 8266")); addFormNumericBox(F("UDP port"), F("udpport"), Settings.UDPPort, 0, 65535); // TODO sort settings in groups or move to other pages/groups From e3802e8a4f7ca8e2bf055ddcf373a788a735ae89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Fri, 1 Apr 2022 20:27:36 +0000 Subject: [PATCH 02/25] [p2p] more defaults --- src/_C013.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_C013.cpp b/src/_C013.cpp index 1f99ee7c0..65de43863 100644 --- a/src/_C013.cpp +++ b/src/_C013.cpp @@ -37,7 +37,7 @@ bool CPlugin_013(CPlugin::Function function, struct EventStruct *event, String& Protocol[protocolCount].usesTemplate = false; Protocol[protocolCount].usesAccount = false; Protocol[protocolCount].usesPassword = false; - Protocol[protocolCount].defaultPort = 65501; + Protocol[protocolCount].defaultPort = 8266; Protocol[protocolCount].usesID = false; Protocol[protocolCount].Custom = true; break; From 3feecf115765295d30867346b09ae0394cc60c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Fri, 1 Apr 2022 21:43:45 +0000 Subject: [PATCH 03/25] [p2p] warn about int number equals 0 --- src/src/WebServer/RootPage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index 014e65289..f44723791 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -255,6 +255,7 @@ void handle_root() { html_end_table(); html_BR(); + if (Settings.Unit == 0) addFormNote(F("Warning: Unit number is 0, please change it if you want to send it to other units.")); html_BR(); html_table_class_multirow_noborder(); html_TR(); From 46620f379297761c3733163c16c008cc0f7f3d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Sat, 2 Apr 2022 09:56:41 +0000 Subject: [PATCH 04/25] [p2p] update text plus check for port on rootpage --- src/src/WebServer/AdvancedConfigPage.cpp | 2 +- src/src/WebServer/RootPage.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index 3e80b50d1..b84b7eeed 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -191,7 +191,7 @@ void handle_advanced() { addFormSubHeader(F("Inter-ESPEasy Network")); - if (Settings.UDPPort != 8266 ) addFormNote(F("Default port is 8266")); + if (Settings.UDPPort != 8266 ) addFormNote(F("Preffered P2P port is 8266")); addFormNumericBox(F("UDP port"), F("udpport"), Settings.UDPPort, 0, 65535); // TODO sort settings in groups or move to other pages/groups diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index f44723791..6cd8fd861 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -255,7 +255,7 @@ void handle_root() { html_end_table(); html_BR(); - if (Settings.Unit == 0) addFormNote(F("Warning: Unit number is 0, please change it if you want to send it to other units.")); + if (Settings.Unit == 0 && Settings.UDPPort != 0) addFormNote(F("Warning: Unit number is 0, please change it if you want to send it to other units.")); html_BR(); html_table_class_multirow_noborder(); html_TR(); From edcc690c770eb9407eeb03d91cde59f1b80df921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Sat, 2 Apr 2022 10:03:08 +0000 Subject: [PATCH 05/25] [p2p] update text info --- src/src/WebServer/RootPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index 6cd8fd861..263a27133 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -255,7 +255,7 @@ void handle_root() { html_end_table(); html_BR(); - if (Settings.Unit == 0 && Settings.UDPPort != 0) addFormNote(F("Warning: Unit number is 0, please change it if you want to send it to other units.")); + if (Settings.Unit == 0 && Settings.UDPPort != 0) addFormNote(F("Warning: Unit number is 0, please change it if you want to send data to other units.")); html_BR(); html_table_class_multirow_noborder(); html_TR(); From b6eb27d95ec5c8251d82eb27cee75d452655439c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Sat, 2 Apr 2022 15:24:25 +0000 Subject: [PATCH 06/25] [p2p] typo --- src/src/WebServer/AdvancedConfigPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index b84b7eeed..b8726fbf4 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -191,7 +191,7 @@ void handle_advanced() { addFormSubHeader(F("Inter-ESPEasy Network")); - if (Settings.UDPPort != 8266 ) addFormNote(F("Preffered P2P port is 8266")); + if (Settings.UDPPort != 8266 ) addFormNote(F("Preferred P2P port is 8266")); addFormNumericBox(F("UDP port"), F("udpport"), Settings.UDPPort, 0, 65535); // TODO sort settings in groups or move to other pages/groups From 1d09c6284f7a2c74bdd4a8045f1817f74e1b1f5b Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Thu, 21 Apr 2022 21:44:31 +0200 Subject: [PATCH 07/25] [P132] New plugin INA3221 3 channel DC Voltage/Current --- src/Custom-sample.h | 1 + src/_P132_INA3221.ino | 254 +++++++++++++++++++++ src/src/CustomBuild/define_plugin_sets.h | 5 +- src/src/PluginStructs/P132_data_struct.cpp | 145 ++++++++++++ src/src/PluginStructs/P132_data_struct.h | 48 ++++ 5 files changed, 452 insertions(+), 1 deletion(-) create mode 100644 src/_P132_INA3221.ino create mode 100644 src/src/PluginStructs/P132_data_struct.cpp create mode 100644 src/src/PluginStructs/P132_data_struct.h diff --git a/src/Custom-sample.h b/src/Custom-sample.h index 2d8577c31..b847b0d09 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -392,6 +392,7 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = { // #define USES_P125 // ADXL345 SPI Acceleration / Gravity // #define USES_P126 // 74HC595 Shift register // #define USES_P127 // CDM7160 +// #define USES_P132 // INA3221 // Special plugins needing IR library diff --git a/src/_P132_INA3221.ino b/src/_P132_INA3221.ino new file mode 100644 index 000000000..dd64a57a5 --- /dev/null +++ b/src/_P132_INA3221.ino @@ -0,0 +1,254 @@ +#ifdef USES_P132 + +// ####################################################################################################### +// ######################### Plugin 132: INA3221 DC Voltage/Current sensor ############################### +// ####################################################################################################### + +/** + * Changelog: + * 2022-04-21, tonhuisman: Move source into PluginStructs + * 2022-04-20, tonhuisman: Add averaging of samples and conversion rate settings + * 2022-04-19, tonhuisman: Adapt to general ESPEasy coding standards + **/ + +// Initial development: ## 25 jan 2021 Fred van Duin #### + +#include "_Plugin_Helper.h" + +#define PLUGIN_132 +#define PLUGIN_ID_132 132 +#define PLUGIN_NAME_132 "Energy (DC) - INA3221 [TESTING]" +#define PLUGIN_VALUENAME1_132 "Value1" +#define PLUGIN_VALUENAME2_132 "Value2" +#define PLUGIN_VALUENAME3_132 "Value3" +#define PLUGIN_VALUENAME4_132 "Value4" + +#include "./src/PluginStructs/P132_data_struct.h" + +boolean Plugin_132(uint8_t function, struct EventStruct *event, String& string) +{ + boolean success = false; + + switch (function) + { + case PLUGIN_DEVICE_ADD: + { + Device[++deviceCount].Number = PLUGIN_ID_132; + Device[deviceCount].Type = DEVICE_TYPE_I2C; + Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_QUAD; + Device[deviceCount].Ports = 0; + Device[deviceCount].PullUpOption = false; + Device[deviceCount].InverseLogicOption = false; + Device[deviceCount].FormulaOption = true; + Device[deviceCount].ValueCount = 4; + Device[deviceCount].SendDataOption = true; + Device[deviceCount].TimerOption = true; + Device[deviceCount].GlobalSyncOption = true; + break; + } + + case PLUGIN_GET_DEVICENAME: + { + string = F(PLUGIN_NAME_132); + break; + } + + case PLUGIN_GET_DEVICEVALUENAMES: + { + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_132)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_132)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[2], PSTR(PLUGIN_VALUENAME3_132)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[3], PSTR(PLUGIN_VALUENAME4_132)); + break; + } + + case PLUGIN_I2C_HAS_ADDRESS: + case PLUGIN_WEBFORM_SHOW_I2C_PARAMS: + { + const uint8_t i2cAddressValues[] = { 0x40, 0x41, 0x42, 0x43 }; + + if (function == PLUGIN_WEBFORM_SHOW_I2C_PARAMS) { + addFormSelectorI2C(F("i2c_addr"), 4, i2cAddressValues, P132_I2C_ADDR); + addFormNote(F("A0 connected to: GND= 0x40, VCC= 0x41, SDA= 0x42, SCL= 0x43")); + } else { + success = intArrayContains(4, i2cAddressValues, event->Par1); + } + break; + } + + case PLUGIN_SET_DEFAULTS: + { + P132_VALUE_1 = 0; // Configure randomly + P132_VALUE_2 = 1; + P132_VALUE_3 = 2; + P132_VALUE_4 = 3; + uint32_t lSettings = 0; + set3BitToUL(lSettings, P132_FLAG_AVERAGE, 0x00); + set3BitToUL(lSettings, P132_FLAG_CONVERSION, 0x04); + P132_CONFIG_FLAGS = lSettings; + break; + } + + case PLUGIN_WEBFORM_LOAD: + { + #define INA3221_var_OPTION 6 + { + const __FlashStringHelper *varOptions[] = { + F("Current channel 1"), + F("Voltage channel 1"), + F("Current channel 2"), + F("Voltage channel 2"), + F("Current channel 3"), + F("Voltage channel 3") + }; + + for (uint8_t r = 0; r < VARS_PER_TASK; r++) { + String label = F("Power value "); + label += (r + 1); + addFormSelector(label, getPluginCustomArgName(r), INA3221_var_OPTION, varOptions, NULL, PCONFIG(P132_CONFIG_BASE + r)); + } + } + + + addFormSubHeader(F("Hardware")); + + #define INA3221_shunt_OPTION 3 + { + const __FlashStringHelper *varshuntptions[] = { + F("0.1 ohm"), + F("0.01 ohm"), + F("0.005 ohm"), + }; + int shuntvalue[] = { 1, 10, 20 }; + addFormSelector(F("Shunt resistor"), F("p132_shunt"), INA3221_shunt_OPTION, varshuntptions, shuntvalue, P132_SHUNT); + addFormNote(F("Select as is installed on the board.")); + } + + addFormSubHeader(F("Measurement")); + + #define INA3221_average_OPTION 8 + { + const __FlashStringHelper *averagingSamples[] = { + F("1 (default)"), + F("4"), + F("16"), + F("64"), + F("128"), + F("256"), + F("512"), + F("1024"), + }; + int averageValue[] = { 0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111 }; + addFormSelector(F("Averaging samples"), + F("p132_average"), + INA3221_average_OPTION, + averagingSamples, + averageValue, + P132_GET_AVERAGE); + addFormNote(F("Samples > 16 then min. Interval: 64= 4, 128= 7, 256= 14, 512= 26, 1024= 52 seconds!")); + } + + #define INA3221_conversion_OPTION 8 + { + const __FlashStringHelper *conversionRates[] = { + F("140 µsec"), + F("204 µsec"), + F("332 µsec"), + F("588 µsec"), + F("1.1 msec (default)"), + F("2.116 msec"), + F("4.156 msec"), + F("8.244 msec"), + }; + + // 140us 204us 332us 588us 1.1ms 2.1ms 4.1ms 8.2ms + int conversionValues[] = { 0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111 }; + addFormSelector(F("Conversion rate"), + F("p132_conversion"), + INA3221_conversion_OPTION, + conversionRates, + conversionValues, + P132_GET_CONVERSION); + } + + success = true; + break; + } + + case PLUGIN_WEBFORM_SAVE: + { + P132_I2C_ADDR = getFormItemInt(F("i2c_addr")); + + for (uint8_t r = 0; r < VARS_PER_TASK; r++) { + PCONFIG(P132_CONFIG_BASE + r) = getFormItemInt(getPluginCustomArgName(r)); + } + P132_SHUNT = getFormItemInt(F("p132_shunt")); + + uint32_t lSettings = 0; + set3BitToUL(lSettings, P132_FLAG_AVERAGE, getFormItemInt(F("p132_average"))); + set3BitToUL(lSettings, P132_FLAG_CONVERSION, getFormItemInt(F("p132_conversion"))); + P132_CONFIG_FLAGS = lSettings; + + success = true; + break; + } + + case PLUGIN_INIT: + { + initPluginTaskData(event->TaskIndex, new (std::nothrow) P132_data_struct(event)); + P132_data_struct *P132_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr == P132_data) { + return success; + } + + success = true; + break; + } + + case PLUGIN_READ: + { + P132_data_struct *P132_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr == P132_data) { + return success; + } + + uint8_t reg; + + for (uint8_t r = 0; r < VARS_PER_TASK; r++) { + // VALUES 1..4 + reg = static_cast(PCONFIG(P132_CONFIG_BASE + r) + 1); + + if ((reg == 2) || (reg == 4) || (reg == 6)) { + UserVar[event->BaseVarIndex + r] = P132_data->getBusVoltage_V(reg) + + (P132_data->getShuntVoltage_mV(reg - 1) / 1000.0f); + } else { + UserVar[event->BaseVarIndex + r] = (P132_data->getShuntVoltage_mV(reg) / 100.0f) * P132_SHUNT; + } + } + + #ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("INA3221: Values: "); + log += UserVar[event->BaseVarIndex]; + log += F(", "); + log += UserVar[event->BaseVarIndex + 1]; + log += F(", "); + log += UserVar[event->BaseVarIndex + 2]; + log += F(", "); + log += UserVar[event->BaseVarIndex + 3]; + addLog(LOG_LEVEL_INFO, log); + } + #endif // ifndef BUILD_NO_DEBUG + + success = true; + break; + } + } + + return success; +} + +#endif // USES_P132 diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index d53ebe693..b77792217 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1228,6 +1228,9 @@ To create/register a plugin, you have to : #ifndef USES_P115 #define USES_P115 // Fuel Gauge MAX1704x #endif + #ifndef USES_P132 + #define USES_P132 // INA3221 + #endif #endif // Collection of all display plugins. (also NeoPixel) @@ -1525,7 +1528,7 @@ To create/register a plugin, you have to : // #define USES_P131 // #endif #ifndef USES_P132 -// #define USES_P132 // + #define USES_P132 // INA3221 #endif #ifndef USES_P133 // #define USES_P133 // diff --git a/src/src/PluginStructs/P132_data_struct.cpp b/src/src/PluginStructs/P132_data_struct.cpp new file mode 100644 index 000000000..2511d0b68 --- /dev/null +++ b/src/src/PluginStructs/P132_data_struct.cpp @@ -0,0 +1,145 @@ +#include "../PluginStructs/P132_data_struct.h" + +#ifdef USES_P132 + +// **************************************************************************/ +// Constructor +// **************************************************************************/ +P132_data_struct::P132_data_struct(struct EventStruct *event) { + _i2c_address = P132_I2C_ADDR; + setCalibration_INA3221(event); +} + +// **************************************************************************/ +// Destructor +// **************************************************************************/ +P132_data_struct::~P132_data_struct() {} + +// **************************************************************************/ +// Gets the raw bus voltage (7FF8 / 32760) LSB 8mV +// **************************************************************************/ +int16_t P132_data_struct::getBusVoltage_raw(byte reg) { + uint16_t value = I2C_read16_reg(_i2c_address, reg); + + // Shift to the right 3 to drop CNVR and OVF and multiply by LSB 8 mV + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = F("INA3221: get raw bus "); + log += value; + log += F(" reg - "); + log += reg; + addLog(LOG_LEVEL_DEBUG, log); + } + # endif // ifndef BUILD_NO_DEBUG + return (int16_t)((value >> 3) * 8); +} + +// **************************************************************************/ +// Gets the raw shunt voltage (integer, so +-32760) LSB 40 uV +// **************************************************************************/ +int16_t P132_data_struct::getShuntVoltage_raw(byte reg) { + uint16_t value = I2C_read16_reg(_i2c_address, reg); + + # ifndef BUILD_NO_DEBUG + String log = F("INA3221: get raw shunt voltage "); + log += value; + log += F(" value2 - "); + # endif // ifndef BUILD_NO_DEBUG + + // Shift to the right 3 to drop CNVR and OVF and multiply by LSB + if (value > 32767) { // check value is negative + // value = 0; // no negative measure + value = ((value >> 3) | 57344); // correct int16_t value + # ifndef BUILD_NO_DEBUG + log += F(" value_neg - "); + log += value; + # endif // ifndef BUILD_NO_DEBUG + } else { + value = (value >> 3); + # ifndef BUILD_NO_DEBUG + log += F(" value_pos - "); + log += value; + # endif // ifndef BUILD_NO_DEBUG + } + # ifndef BUILD_NO_DEBUG + log += F(" reg - "); + log += reg; + addLog(LOG_LEVEL_DEBUG, log); + # endif // ifndef BUILD_NO_DEBUG + return value; +} + +// **************************************************************************/ +// Gets the shunt voltage in mV (32760 so +-163.8 mV) 7ff8 LSB 40uV +// **************************************************************************/ +float P132_data_struct::getShuntVoltage_mV(byte reg) { + int16_t value = getShuntVoltage_raw(reg); + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = F("INA3221: shunt voltage in mV * 0.04 "); + log += value; + log += F(" reg - "); + log += reg; + addLog(LOG_LEVEL_DEBUG, log); + } + # endif // ifndef BUILD_NO_DEBUG + return value * 0.04f; +} + +// **************************************************************************/ +// Gets the Bus voltage in volts +// **************************************************************************/ +float P132_data_struct::getBusVoltage_V(byte reg) { + int16_t value = getBusVoltage_raw(reg); + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { + String log = F("INA3221: get bus voltage "); + log += value; + log += F(" reg - "); + log += reg; + addLog(LOG_LEVEL_DEBUG, log); + } + # endif // ifndef BUILD_NO_DEBUG + return value * 0.001f; +} + +// **************************************************************************/ +// Configures to INA3221 +// **************************************************************************/ +void P132_data_struct::setCalibration_INA3221(struct EventStruct *event) { + // Set Config register + uint32_t config = I2C_read16_reg(_i2c_address, 0x00); // read, chip default: 0x7127 + uint16_t mfgid = I2C_read16_reg(_i2c_address, 0xFE); // read manufacturer ID, should be 0x5449 + + set3BitToUL(config, INA3221_AVERAGE_BIT, P132_GET_AVERAGE); + set3BitToUL(config, INA3221_CONVERSION_BUS_BIT, P132_GET_CONVERSION); + set3BitToUL(config, INA3221_CONVERSION_SHUNT_BIT, P132_GET_CONVERSION); + + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("INA3221: init I2C: 0x"); + log += String(_i2c_address, HEX); + log += F(" mfg: 0x"); + log += String(mfgid, HEX); + log += F(", config: 0x"); + log += String(config, HEX); + log += F(", 0b"); + log += String(config, BIN); + addLog(LOG_LEVEL_INFO, log); + } + # endif // ifndef BUILD_NO_DEBUG + + if (mfgid != 0x5449) { + addLogMove(LOG_LEVEL_ERROR, F("INA3221: Invalid Manufacturer ID! (0x5449)")); + } + + I2C_write16_reg(_i2c_address, 0x00, static_cast(config)); +} + +#endif // ifdef USES_P132 diff --git a/src/src/PluginStructs/P132_data_struct.h b/src/src/PluginStructs/P132_data_struct.h new file mode 100644 index 000000000..15bd87b5c --- /dev/null +++ b/src/src/PluginStructs/P132_data_struct.h @@ -0,0 +1,48 @@ +#ifndef PLUGINSTRUCTS_P132_DATA_STRUCT_H +#define PLUGINSTRUCTS_P132_DATA_STRUCT_H + +#include "../../_Plugin_Helper.h" +#ifdef USES_P132 + +// # define P132_DEBUG_LOG // Enable for some (extra) logging + +# define P132_CONFIG_BASE 2 // Better not change this... +# define P132_I2C_ADDR PCONFIG(1) +# define P132_VALUE_1 PCONFIG(P132_CONFIG_BASE) +# define P132_VALUE_2 PCONFIG(P132_CONFIG_BASE + 1) +# define P132_VALUE_3 PCONFIG(P132_CONFIG_BASE + 2) +# define P132_VALUE_4 PCONFIG(P132_CONFIG_BASE + 3) +# define P132_SHUNT PCONFIG(6) + +# define P132_CONFIG_FLAGS PCONFIG_LONG(0) +# define P132_FLAG_AVERAGE 0 +# define P132_FLAG_CONVERSION 3 + +# define P132_GET_AVERAGE get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_AVERAGE) +# define P132_GET_CONVERSION get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_CONVERSION) + +# define INA3221_AVERAGE_BIT 9 +# define INA3221_CONVERSION_BUS_BIT 6 +# define INA3221_CONVERSION_SHUNT_BIT 3 + +struct P132_data_struct : public PluginTaskData_base { +public: + + P132_data_struct(struct EventStruct *event); + + P132_data_struct() = delete; + ~P132_data_struct(); + + float getShuntVoltage_mV(byte reg); + float getBusVoltage_V(byte reg); + +private: + + void setCalibration_INA3221(struct EventStruct *event); + int16_t getBusVoltage_raw(byte reg); + int16_t getShuntVoltage_raw(byte reg); + + int8_t _i2c_address; +}; +#endif // ifdef USES_P132 +#endif // ifndef PLUGINSTRUCTS_P132_DATA_STRUCT_H From a7cdb239b5b9a0e4801f2b090d413869e700d5ac Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 23 Apr 2022 13:17:27 +0200 Subject: [PATCH 08/25] [P132] Add separate Conversion rate setting for Voltage and Current --- src/_P132_INA3221.ino | 24 ++++++++++++++------ src/src/PluginStructs/P132_data_struct.cpp | 4 ++-- src/src/PluginStructs/P132_data_struct.h | 26 ++++++++++++---------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/_P132_INA3221.ino b/src/_P132_INA3221.ino index dd64a57a5..47a8b7aa0 100644 --- a/src/_P132_INA3221.ino +++ b/src/_P132_INA3221.ino @@ -6,6 +6,7 @@ /** * Changelog: + * 2022-04-23, tonhuisman: Add separate settings for Conversion rate Voltage and Current * 2022-04-21, tonhuisman: Move source into PluginStructs * 2022-04-20, tonhuisman: Add averaging of samples and conversion rate settings * 2022-04-19, tonhuisman: Adapt to general ESPEasy coding standards @@ -83,8 +84,9 @@ boolean Plugin_132(uint8_t function, struct EventStruct *event, String& string) P132_VALUE_3 = 2; P132_VALUE_4 = 3; uint32_t lSettings = 0; - set3BitToUL(lSettings, P132_FLAG_AVERAGE, 0x00); - set3BitToUL(lSettings, P132_FLAG_CONVERSION, 0x04); + set3BitToUL(lSettings, P132_FLAG_AVERAGE, 0x00); + set3BitToUL(lSettings, P132_FLAG_CONVERSION_B, 0x04); // Voltage + set3BitToUL(lSettings, P132_FLAG_CONVERSION_S, 0x04); // Current P132_CONFIG_FLAGS = lSettings; break; } @@ -163,12 +165,19 @@ boolean Plugin_132(uint8_t function, struct EventStruct *event, String& string) // 140us 204us 332us 588us 1.1ms 2.1ms 4.1ms 8.2ms int conversionValues[] = { 0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111 }; - addFormSelector(F("Conversion rate"), - F("p132_conversion"), + addFormSelector(F("Conversion rate Voltage"), + F("p132_conversion_v"), INA3221_conversion_OPTION, conversionRates, conversionValues, - P132_GET_CONVERSION); + P132_GET_CONVERSION_B); + + addFormSelector(F("Conversion rate Current"), + F("p132_conversion_c"), + INA3221_conversion_OPTION, + conversionRates, + conversionValues, + P132_GET_CONVERSION_S); } success = true; @@ -185,8 +194,9 @@ boolean Plugin_132(uint8_t function, struct EventStruct *event, String& string) P132_SHUNT = getFormItemInt(F("p132_shunt")); uint32_t lSettings = 0; - set3BitToUL(lSettings, P132_FLAG_AVERAGE, getFormItemInt(F("p132_average"))); - set3BitToUL(lSettings, P132_FLAG_CONVERSION, getFormItemInt(F("p132_conversion"))); + set3BitToUL(lSettings, P132_FLAG_AVERAGE, getFormItemInt(F("p132_average"))); + set3BitToUL(lSettings, P132_FLAG_CONVERSION_B, getFormItemInt(F("p132_conversion_v"))); + set3BitToUL(lSettings, P132_FLAG_CONVERSION_S, getFormItemInt(F("p132_conversion_c"))); P132_CONFIG_FLAGS = lSettings; success = true; diff --git a/src/src/PluginStructs/P132_data_struct.cpp b/src/src/PluginStructs/P132_data_struct.cpp index 2511d0b68..ef41a4256 100644 --- a/src/src/PluginStructs/P132_data_struct.cpp +++ b/src/src/PluginStructs/P132_data_struct.cpp @@ -117,8 +117,8 @@ void P132_data_struct::setCalibration_INA3221(struct EventStruct *event) { uint16_t mfgid = I2C_read16_reg(_i2c_address, 0xFE); // read manufacturer ID, should be 0x5449 set3BitToUL(config, INA3221_AVERAGE_BIT, P132_GET_AVERAGE); - set3BitToUL(config, INA3221_CONVERSION_BUS_BIT, P132_GET_CONVERSION); - set3BitToUL(config, INA3221_CONVERSION_SHUNT_BIT, P132_GET_CONVERSION); + set3BitToUL(config, INA3221_CONVERSION_BUS_BIT, P132_GET_CONVERSION_B); + set3BitToUL(config, INA3221_CONVERSION_SHUNT_BIT, P132_GET_CONVERSION_S); # ifndef BUILD_NO_DEBUG diff --git a/src/src/PluginStructs/P132_data_struct.h b/src/src/PluginStructs/P132_data_struct.h index 15bd87b5c..837ce44fe 100644 --- a/src/src/PluginStructs/P132_data_struct.h +++ b/src/src/PluginStructs/P132_data_struct.h @@ -6,20 +6,22 @@ // # define P132_DEBUG_LOG // Enable for some (extra) logging -# define P132_CONFIG_BASE 2 // Better not change this... -# define P132_I2C_ADDR PCONFIG(1) -# define P132_VALUE_1 PCONFIG(P132_CONFIG_BASE) -# define P132_VALUE_2 PCONFIG(P132_CONFIG_BASE + 1) -# define P132_VALUE_3 PCONFIG(P132_CONFIG_BASE + 2) -# define P132_VALUE_4 PCONFIG(P132_CONFIG_BASE + 3) -# define P132_SHUNT PCONFIG(6) +# define P132_CONFIG_BASE 2 // Better not change this... +# define P132_I2C_ADDR PCONFIG(1) +# define P132_VALUE_1 PCONFIG(P132_CONFIG_BASE) +# define P132_VALUE_2 PCONFIG(P132_CONFIG_BASE + 1) +# define P132_VALUE_3 PCONFIG(P132_CONFIG_BASE + 2) +# define P132_VALUE_4 PCONFIG(P132_CONFIG_BASE + 3) +# define P132_SHUNT PCONFIG(6) -# define P132_CONFIG_FLAGS PCONFIG_LONG(0) -# define P132_FLAG_AVERAGE 0 -# define P132_FLAG_CONVERSION 3 +# define P132_CONFIG_FLAGS PCONFIG_LONG(0) +# define P132_FLAG_AVERAGE 0 +# define P132_FLAG_CONVERSION_B 3 +# define P132_FLAG_CONVERSION_S 6 -# define P132_GET_AVERAGE get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_AVERAGE) -# define P132_GET_CONVERSION get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_CONVERSION) +# define P132_GET_AVERAGE get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_AVERAGE) +# define P132_GET_CONVERSION_B get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_CONVERSION_B) +# define P132_GET_CONVERSION_S get3BitFromUL(P132_CONFIG_FLAGS, P132_FLAG_CONVERSION_S) # define INA3221_AVERAGE_BIT 9 # define INA3221_CONVERSION_BUS_BIT 6 From 33e81cb25c7ce53947060bb3502cad5bcc9e75f4 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 23 Apr 2022 13:18:09 +0200 Subject: [PATCH 09/25] [P132] Add documentation --- docs/source/Plugin/P132.rst | 127 ++++++++++++++++++ .../Plugin/P132_AveragingSamplesOptions.png | Bin 0 -> 34077 bytes .../Plugin/P132_ConversionRateOptions.png | Bin 0 -> 31290 bytes .../Plugin/P132_DeviceConfiguration.png | Bin 0 -> 67096 bytes docs/source/Plugin/P132_I2CAddressOptions.png | Bin 0 -> 13912 bytes docs/source/Plugin/P132_PowerValueOptions.png | Bin 0 -> 15844 bytes .../Plugin/P132_ShuntResistorOptions.png | Bin 0 -> 7113 bytes docs/source/Plugin/_Plugin.rst | 3 +- docs/source/Plugin/_plugin_categories.repl | 2 +- docs/source/Plugin/_plugin_substitutions.repl | 1 + .../Plugin/_plugin_substitutions_p13x.repl | 12 ++ 11 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 docs/source/Plugin/P132.rst create mode 100644 docs/source/Plugin/P132_AveragingSamplesOptions.png create mode 100644 docs/source/Plugin/P132_ConversionRateOptions.png create mode 100644 docs/source/Plugin/P132_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P132_I2CAddressOptions.png create mode 100644 docs/source/Plugin/P132_PowerValueOptions.png create mode 100644 docs/source/Plugin/P132_ShuntResistorOptions.png create mode 100644 docs/source/Plugin/_plugin_substitutions_p13x.repl diff --git a/docs/source/Plugin/P132.rst b/docs/source/Plugin/P132.rst new file mode 100644 index 000000000..655990d52 --- /dev/null +++ b/docs/source/Plugin/P132.rst @@ -0,0 +1,127 @@ +.. include:: ../Plugin/_plugin_substitutions_p13x.repl +.. _P132_page: + +|P132_typename| +================================================== + +|P132_shortinfo| + +Plugin details +-------------- + +Type: |P132_type| + +Name: |P132_name| + +Status: |P132_status| + +GitHub: |P132_github|_ + +Maintainer: |P132_maintainer| + +Used libraries: |P132_usedlibraries| + +Description +----------- + +The INA3221 Voltage/Current sensor can be used to measure voltage and/or current for DC input, up to 26V. It has 3 separate channels available. + +It can be used to replace the :ref:`p027_page`, except that the I2C protocol isn't directly compatible, so it is not a drop-in replacement. + +Configuration +------------- + +.. image:: P132_DeviceConfiguration.png + :alt: Device Configuration + +**Name** A unique name should be entered here. + +**Enabled** The device can be disabled or enabled. When not enabled the device should not use any resources. + +I2C Options +^^^^^^^^^^^^ + +The available settings here depend on the build used. At least the **Force Slow I2C speed** option is available, but selections for the I2C Multiplexer can also be shown. For details see the :ref:`Hardware_page` + +**I2C Address**: The address the sensor is using. The different addresses can be selected by connecting the appropriate signal to ``A0``. Often also documented on the board. + +.. image:: P132_I2CAddressOptions.png + :alt: Available I2C address options + +Device Settings +^^^^^^^^^^^^^^^ + +* **Power value 1..4**: As a plugin only has 4 available output values and the sensor has 6 values available, here we have to select what output receives what measured value. + +Available options are: + +.. image:: P132_PowerValueOptions.png + :alt: Available Power Value options + +* *Current channel 1..3*: Measure the current from channel 1..3. +* *Voltage channel 1..3*: Measure the voltage from channel 1..3. + +NB: To get all measured values, an extra Task can be configured to provide the measurements not handled in the current task, or you could f.e. configure separate tasks for Voltage and Current measurements. These tasks shouldn't interfere, assuming both get the same configuration settings for **Shunt resistor**, **Averaging samples** and **Conversion rate Voltage** / **Conversion rate Current**. + +Hardware +^^^^^^^^ + +* **Shunt resistor**: As there are different hardware configurations available for the board, using different shunt resistor values, here you can select the value that is present on the board used. + +.. image:: P132_ShuntResistorOptions.png + :alt: Available options for shunt resistor values + +Measurement +^^^^^^^^^^^ + +* **Averaging samples**: To increase the accuracy of measurements, the chip allows to take the average value for a set of samples. The desired number of samples can be selected in this setting, default: 1. + +.. image:: P132_AveragingSamplesOptions.png + :alt: Averaging samples options + +When combining a higher number of samples with a longer **Conversion rate**, taking all possible measurements will require more time, affecting the **Interval** that would be feasible for a reliable measurement. The worst-case scenarios (maximum **Conversion rate** settings) have been calculated, and are shown as a note below this setting. + +* **Conversion rate Voltage/Current**: To change the accuracy of measurements, a different conversion rate can be selected. Lowering the conversion rate will decrease the accuracy, and allow a higher sampling frequency, but as the measurements are read at a smallest **Interval** of 1 second, there isn't much use in lowering the conversion rate. When increasing the conversion rate, accuracy will increase, but, also depending on the **Averaging samples** configured, increases the time it takes to complete all measurements. (Calculation formula below). + +There are separate **Conversion rate** settings for the **Voltage** and **Current** measurements, as that's available in the chip. + +.. image:: P132_ConversionRateOptions.png + :alt: Conversion rate options + +To calculate the minimally required **Interval** setting for the task, this formula can be used: + + | (3 * Averaging samples * Conversion rate Voltage) + (3 * Averaging samples * Conversion rate Current), and round that up to a seconds value. + + | Example: (Worst case) 3 * 1024 * 0.008244 + 3 * 1024 * 0.008244 = 50.65 seconds => ~51 minimum Interval. + + | Example: (Default case) 3 * 1 * 0.00144 + 3 * 1 * 0.00144 = 0.008 seconds => 1 minimum Interval. + +Data Acquisition +^^^^^^^^^^^^^^^^ + +The Data Acquisition, Send to Controller and Interval settings are standard available configuration items. Send to Controller only when one or more Controllers are configured. + +Values +^^^^^^ + +The Values available for this sensor, are named ``Value1`` through ``Value4``, and can be adjusted as desired. The Formula field can be used to recalculate the shown results. + +.. Commands available +.. ^^^^^^^^^^^^^^^^^^ + +.. .. include:: P132_commands.repl + +.. Events +.. ~~~~~~ + +.. .. include:: P132_events.repl + +Change log +---------- + +.. versionchanged:: 2.0 + ... + + |added| + 2022-04-23 Initial release version. + diff --git a/docs/source/Plugin/P132_AveragingSamplesOptions.png b/docs/source/Plugin/P132_AveragingSamplesOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..e52da84b07ec0e7474bb308a54558642640b8d1c GIT binary patch literal 34077 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
%>q zkt!iU_&Z%X#HhhgQu!DM~4{m~Vm`gI$76 zn;dL2ItsRa{-ry`x~0Pd%P)=>(K3txt)0!~AbZ<#navRFnr^*!lgfc6PCh zs=pYyB)djF$jC@3p!4X`7{^VjG(iikP}w(@v0n*S^}Z$wOB6V7{T*zXQwp?ttF;UF zuR?>LMrzhwzrOpN>)+PNNMHc42XKH)sybi2zqgq5N-6>yH$a7AAhTN~mr@>t9-OAN z2kqJ1w{!4dC7- z+6RGwbv47?t-eLkUp;HF9V#)LYCo!;4nGpp08gHvy%o+{N7k+gMlzJC)K~6sD#1%H zP>~F^JB9lT#c-DXsO+hth@xwh_`R!=hQX}`wg%BU7SEv=+YJlM%V%B%9$hM$zO%yP zoh~Q(8|cp_nM?6{*XVMtoZ2`A+?K2B;mazfq8e`H)S#-19NW9E)ji!4U+!ch?O#CE zTQSpIdsPAeU-d_whT(j6?+mxcz96!9Z)X$_xn)ZIRO#1sO8L)!u|P1bShRQ(CBVJl z69NJ~xldsE#v(DnWf7pdxF$7EXe2*7a(YJ_e(A~604M*a{-nGiaU0%Yp{q|w>sP8Y znaG+{+Y`okbuGBah7wbR#c3uB|A(K|uZQX_Xnr|ffn*@DJ zcp;MD8=AB^Pxm<)tq=A}W~J(yhE&^Ry?;>`#@Sv*MTKw8b@6Ln*ogRi_HFtNL*V2~ zx3*RJmZo4N^zl}(S~y?+J>jE>6+H0b#VXesoC?3l#W=#5@>v1a&r(@L-MJC{w3sWI zyCeS>1-MI${v2W|gybNW=i|MUM~{Fg1;C^wZ++BVUYJ2L_6{oU&po~{IcbJxhnfV# zfXj81LXujSuxO}ksN;>vcYh7c-0xc495&b=l^A~Q5IBq;ur|2rmi1^Byy~J}O+NLd zGSDGBm7R}jEPK(;+*jqq57ea|%vPu!4|yaIisXTskt{T}9yN1rq=>nBcpf2!Qh1J2 z&q5i7f*1>a<Q!2=tKtW}1bDdt#IkN?HlP=z(E_=eHSWm#^C&KV}W&!#RCLg z{@rj8U`5BkyBw>ltH9)p-VFvF@>G0F^5zphC&Kmsx{%0!_EI{iMj39?C!YZ?om@`Z zpy^}>v5bXcuE6A)%O*9#B~Aen6IjX$2G+u{<_%DHGi^ZA2+>0Yyv|^_ug*&310S3} z4ZWs8*)v=z+y` z`WGOiBqjfGyIypotMX+;uWDxs$~jvialascp|9I7ls*SR3YQ|v=aSBM@1N3yQh}Dp zpfdBPo(QP5fHOk#B~xPX#xC{6CEHJS?^;A~y>;MvotFC-h}X-LL^Zbn8&Ufj4fu(c z@G)S$uJ1+!VEz1637SOmmEph;043;r8+MhG=?voQSM32iPTE8Yz(^F>0au_#a=%Ck zlt3q;aC(3b5<1@j%YVzwSAr#kFECPeI!-0Tv^rLeX?N+-0fLPVN9QMr1TJFto0_Qf z(3e&#pa*0;HdG-3=qr1lSvs#h12j{>bx&ua7{fT$a9v%k7Hkf@wA6~wT=11NWy#5~ z^(L~gJ^yzAo)$DYJcB5Jx`qMV0?~iBv$pmz@eHqnFVfJ^l!;-ef>Ag$Q`;$V?Zv|K z8Ou5GUP?rH!g5Z67g&{^obaI*r9MbcWbiSS{LH6`hPz-#m|XDwfi+U6gCT=>W5l^} zT_cL+Jqd%w-{NLGw6<|_==nsG<7_X&7v{I4tHv>!lyD9-o;CgMUwR?FxjHs>% z5+>S6DqreJBH(oVn3BUTO|X*Oy}!rDzP|5tIS&0(Z-tQkU0XBIMePK-+UF!<9rf}9 zkzPY8#B*09Zd%AS7)1dhLll@r-*a~2Mm&M${cALECm6G04PR28*iiPWL>c~7FF=

KQ&~NWBCacpNq3$YHmr9!2l4$a*SJPT#wDISz6j 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P132_PowerValueOptions.png b/docs/source/Plugin/P132_PowerValueOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..7b831bb66b3705daa09c79660c42d6fe0bd95c21 GIT binary patch literal 15844 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/_Plugin.rst b/docs/source/Plugin/_Plugin.rst index 4fec8d521..ac7c3f30f 100644 --- a/docs/source/Plugin/_Plugin.rst +++ b/docs/source/Plugin/_Plugin.rst @@ -149,7 +149,8 @@ There are different released versions of ESP Easy: ":ref:`P124_page`","|P124_status|","P124" ":ref:`P125_page`","|P125_status|","P125" ":ref:`P126_page`","|P126_status|","P126" - ":ref:`P127_page`","|P127_status|","P125" + ":ref:`P127_page`","|P127_status|","P127" + ":ref:`P132_page`","|P132_status|","P132" Internal GPIO handling diff --git a/docs/source/Plugin/_plugin_categories.repl b/docs/source/Plugin/_plugin_categories.repl index 43ddeeb55..f2995882d 100644 --- a/docs/source/Plugin/_plugin_categories.repl +++ b/docs/source/Plugin/_plugin_categories.repl @@ -5,7 +5,7 @@ .. |Plugin_Distance| replace:: :ref:`P110_page`, :ref:`P113_page` .. |Plugin_Dust| replace:: :ref:`P018_page`, :ref:`P053_page`, :ref:`P056_page` .. |Plugin_Energy_AC| replace:: :ref:`P076_page`, :ref:`P077_page`, :ref:`P078_page`, :ref:`P102_page`, :ref:`P108_page` -.. |Plugin_Energy_DC| replace:: :ref:`P027_page`, :ref:`P085_page`, :ref:`P115_page` +.. |Plugin_Energy_DC| replace:: :ref:`P027_page`, :ref:`P085_page`, :ref:`P115_page`, :ref:`P132_page` .. |Plugin_Energy_Heat| replace:: :ref:`P088_page`, :ref:`P093_page` .. |Plugin_Environment| replace:: :ref:`P004_page`, :ref:`P005_page`, :ref:`P006_page`, :ref:`P014_page`, :ref:`P024_page`, :ref:`P028_page`, :ref:`P030_page`, :ref:`P031_page`, :ref:`P032_page`, :ref:`P034_page`, :ref:`P039_page`, :ref:`P047_page`, :ref:`P051_page`, :ref:`P068_page`, :ref:`P069_page`, :ref:`P072_page`, :ref:`P103_page`, :ref:`P104_page`, :ref:`P105_page`, :ref:`P106_page` .. |Plugin_Extra_IO| replace:: :ref:`P011_page`, :ref:`P022_page` diff --git a/docs/source/Plugin/_plugin_substitutions.repl b/docs/source/Plugin/_plugin_substitutions.repl index 9f0022404..56e782b5b 100644 --- a/docs/source/Plugin/_plugin_substitutions.repl +++ b/docs/source/Plugin/_plugin_substitutions.repl @@ -11,3 +11,4 @@ .. include:: ../Plugin/_plugin_substitutions_p10x.repl .. include:: ../Plugin/_plugin_substitutions_p11x.repl .. include:: ../Plugin/_plugin_substitutions_p12x.repl +.. include:: ../Plugin/_plugin_substitutions_p13x.repl diff --git a/docs/source/Plugin/_plugin_substitutions_p13x.repl b/docs/source/Plugin/_plugin_substitutions_p13x.repl new file mode 100644 index 000000000..0576fa019 --- /dev/null +++ b/docs/source/Plugin/_plugin_substitutions_p13x.repl @@ -0,0 +1,12 @@ +.. |P132_name| replace:: :cyan:`INA3221` +.. |P132_type| replace:: :cyan:`Energy (DC)` +.. |P132_typename| replace:: :cyan:`Energy (DC) - INA3221` +.. |P132_porttype| replace:: `.` +.. |P132_status| replace:: :yellow:`ENERGY` +.. |P132_github| replace:: P132_INA3221.ino +.. _P132_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P132_INA3221.ino +.. |P132_usedby| replace:: `.` +.. |P132_shortinfo| replace:: `3-channel I2C DC Voltage/Current sensor` +.. |P132_maintainer| replace:: `tonhuisman` +.. |P132_compileinfo| replace:: `.` +.. |P132_usedlibraries| replace:: `.` From e725ee2ecb48473ab4affc25281172cefd79de46 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 7 May 2022 17:08:20 +0200 Subject: [PATCH 10/25] [Sysvars] Add %systm_hm_0%, %systm_hm_sp%, %systm_hm_am_0%, %systm_hm_am_sp%, %systime_am_0% and %systime_am_sp% --- src/src/Helpers/ESPEasy_time.cpp | 25 ++++++++++++++----------- src/src/Helpers/ESPEasy_time.h | 6 +++--- src/src/Helpers/SystemVariables.cpp | 12 ++++++++++++ src/src/Helpers/SystemVariables.h | 6 ++++++ src/src/WebServer/SysVarPage.cpp | 6 ++++++ 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/src/Helpers/ESPEasy_time.cpp b/src/src/Helpers/ESPEasy_time.cpp index 0c623e89f..d2b79138c 100644 --- a/src/src/Helpers/ESPEasy_time.cpp +++ b/src/src/Helpers/ESPEasy_time.cpp @@ -493,42 +493,45 @@ String ESPEasy_time::getDateString(const struct tm& ts, char delimiter) { return DateString; } -String ESPEasy_time::getTimeString(char delimiter, bool show_seconds /*=true*/) const +String ESPEasy_time::getTimeString(char delimiter, bool show_seconds /*=true*/, char hour_prefix /*='\0'*/) const { - return getTimeString(tm, delimiter, false, show_seconds); + return getTimeString(tm, delimiter, false, show_seconds, hour_prefix); } -String ESPEasy_time::getTimeString_ampm(char delimiter, bool show_seconds /*=true*/) const +String ESPEasy_time::getTimeString_ampm(char delimiter, bool show_seconds /*=true*/, char hour_prefix /*='\0'*/) const { - return getTimeString(tm, delimiter, true, show_seconds); + return getTimeString(tm, delimiter, true, show_seconds, hour_prefix); } // returns the current Time separated by the given delimiter // time format example with ':' delimiter: 23:59:59 (HH:MM:SS) -String ESPEasy_time::getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds) +String ESPEasy_time::getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix /*='\0'*/) { char TimeString[20]; // 19 digits plus the null char + char hour_prefix_s[2] = { 0 }; if (am_pm) { uint8_t hour(ts.tm_hour % 12); if (hour == 0) { hour = 12; } const char a_or_p = ts.tm_hour < 12 ? 'A' : 'P'; + if (hour < 10) { hour_prefix_s[0] = hour_prefix; } if (show_seconds) { - sprintf_P(TimeString, PSTR("%d%c%02d%c%02d %cM"), - hour, delimiter, ts.tm_min, delimiter, ts.tm_sec, a_or_p); + sprintf_P(TimeString, PSTR("%s%d%c%02d%c%02d %cM"), + hour_prefix_s, hour, delimiter, ts.tm_min, delimiter, ts.tm_sec, a_or_p); } else { - sprintf_P(TimeString, PSTR("%d%c%02d %cM"), - hour, delimiter, ts.tm_min, a_or_p); + sprintf_P(TimeString, PSTR("%s%d%c%02d %cM"), + hour_prefix_s, hour, delimiter, ts.tm_min, a_or_p); } } else { if (show_seconds) { sprintf_P(TimeString, PSTR("%02d%c%02d%c%02d"), ts.tm_hour, delimiter, ts.tm_min, delimiter, ts.tm_sec); } else { - sprintf_P(TimeString, PSTR("%d%c%02d"), - ts.tm_hour, delimiter, ts.tm_min); + if (ts.tm_hour < 10) { hour_prefix_s[0] = hour_prefix; } + sprintf_P(TimeString, PSTR("%s%d%c%02d"), + hour_prefix_s, ts.tm_hour, delimiter, ts.tm_min); } } return TimeString; diff --git a/src/src/Helpers/ESPEasy_time.h b/src/src/Helpers/ESPEasy_time.h index 306aec573..ef8da1c79 100644 --- a/src/src/Helpers/ESPEasy_time.h +++ b/src/src/Helpers/ESPEasy_time.h @@ -67,13 +67,13 @@ static String getDateString(const struct tm& ts, char delimiter); // Formats the current Time // Default time format example: 235959 (HHMMSS) -String getTimeString(char delimiter = '\0', bool show_seconds=true) const; +String getTimeString(char delimiter = '\0', bool show_seconds = true, char hour_prefix = '\0') const; -String getTimeString_ampm(char delimiter = '\0', bool show_seconds=true) const; +String getTimeString_ampm(char delimiter = '\0', bool show_seconds = true, char hour_prefix = '\0') const; // returns the current Time separated by the given delimiter // time format example with ':' delimiter: 23:59:59 (HH:MM:SS) -static String getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds); +static String getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix = '\0'); diff --git a/src/src/Helpers/SystemVariables.cpp b/src/src/Helpers/SystemVariables.cpp index 8278efe5a..46e308bb3 100644 --- a/src/src/Helpers/SystemVariables.cpp +++ b/src/src/Helpers/SystemVariables.cpp @@ -162,8 +162,14 @@ void SystemVariables::parseSystemVariables(String& s, boolean useURLencode) case SYSSTACK: value = getValue(LabelType::FREE_STACK); break; case SYSTIME: value = node_time.getTimeString(':'); break; case SYSTIME_AM: value = node_time.getTimeString_ampm(':'); break; + case SYSTIME_AM_0: value = node_time.getTimeString_ampm(':', true, '0'); break; + case SYSTIME_AM_SP: value = node_time.getTimeString_ampm(':', true, ' '); break; case SYSTM_HM: value = node_time.getTimeString(':', false); break; + case SYSTM_HM_0: value = node_time.getTimeString(':', false, '0'); break; + case SYSTM_HM_SP: value = node_time.getTimeString(':', false, ' '); break; case SYSTM_HM_AM: value = node_time.getTimeString_ampm(':', false); break; + case SYSTM_HM_AM_0: value = node_time.getTimeString_ampm(':', false, '0'); break; + case SYSTM_HM_AM_SP: value = node_time.getTimeString_ampm(':', false, ' '); break; case SYSWEEKDAY: value = String(node_time.weekday()); break; case SYSWEEKDAY_S: value = node_time.weekday_str(); break; case SYSYEAR_0: @@ -331,8 +337,14 @@ const __FlashStringHelper * SystemVariables::toString(SystemVariables::Enum enum case Enum::SYSSTACK: return F("%sysstack%"); case Enum::SYSTIME: return F("%systime%"); case Enum::SYSTIME_AM: return F("%systime_am%"); + case Enum::SYSTIME_AM_0: return F("%systime_am_0%"); + case Enum::SYSTIME_AM_SP: return F("%systime_am_sp%"); case Enum::SYSTM_HM: return F("%systm_hm%"); + case Enum::SYSTM_HM_0: return F("%systm_hm_0%"); + case Enum::SYSTM_HM_SP: return F("%systm_hm_sp%"); case Enum::SYSTM_HM_AM: return F("%systm_hm_am%"); + case Enum::SYSTM_HM_AM_0: return F("%systm_hm_am_0%"); + case Enum::SYSTM_HM_AM_SP: return F("%systm_hm_am_sp%"); case Enum::SYSWEEKDAY: return F("%sysweekday%"); case Enum::SYSWEEKDAY_S: return F("%sysweekday_s%"); case Enum::SYSYEAR: return F("%sysyear%"); diff --git a/src/src/Helpers/SystemVariables.h b/src/src/Helpers/SystemVariables.h index 0e58169b7..c090901e9 100644 --- a/src/src/Helpers/SystemVariables.h +++ b/src/src/Helpers/SystemVariables.h @@ -69,8 +69,14 @@ public: SYSSTACK, SYSTIME, SYSTIME_AM, + SYSTIME_AM_0, + SYSTIME_AM_SP, SYSTM_HM, + SYSTM_HM_0, + SYSTM_HM_SP, SYSTM_HM_AM, + SYSTM_HM_AM_0, + SYSTM_HM_AM_SP, SYSWEEKDAY, SYSWEEKDAY_S, SYSYEAR, diff --git a/src/src/WebServer/SysVarPage.cpp b/src/src/WebServer/SysVarPage.cpp index 66a2f13ea..ccc9a5be0 100644 --- a/src/src/WebServer/SysVarPage.cpp +++ b/src/src/WebServer/SysVarPage.cpp @@ -100,9 +100,15 @@ void handle_sysvars() { addSysVar_enum_html(SystemVariables::LCLTIME); addSysVar_enum_html(SystemVariables::LCLTIME_AM); addSysVar_enum_html(SystemVariables::SYSTM_HM); + addSysVar_enum_html(SystemVariables::SYSTM_HM_0); + addSysVar_enum_html(SystemVariables::SYSTM_HM_SP); addSysVar_enum_html(SystemVariables::SYSTM_HM_AM); + addSysVar_enum_html(SystemVariables::SYSTM_HM_AM_0); + addSysVar_enum_html(SystemVariables::SYSTM_HM_AM_SP); addSysVar_enum_html(SystemVariables::SYSTIME); addSysVar_enum_html(SystemVariables::SYSTIME_AM); + addSysVar_enum_html(SystemVariables::SYSTIME_AM_0); + addSysVar_enum_html(SystemVariables::SYSTIME_AM_SP); addSysVar_enum_html(SystemVariables::SYSBUILD_DATE); addSysVar_enum_html(SystemVariables::SYSBUILD_TIME); addSysVar_enum_html(SystemVariables::SYSBUILD_FILENAME); From d1b7ca4620e6b09a821f13bb4b5d24ba06dbda18 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 7 May 2022 17:28:10 +0200 Subject: [PATCH 11/25] [Sysvars] Update documentation --- docs/source/Reference/SystemVariable.rst | 26 +++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/source/Reference/SystemVariable.rst b/docs/source/Reference/SystemVariable.rst index ebbbd5507..883b53e43 100644 --- a/docs/source/Reference/SystemVariable.rst +++ b/docs/source/Reference/SystemVariable.rst @@ -46,17 +46,41 @@ More uses of these system variables can be seen in the rules section and formula - Current time if NTP is enabled (hh:mm:ss, hh:mm prior to v2.0). - * - ``%systm_hm%`` - - 01:23 + - 1:23 - Current time if NTP is enabled (hh:mm "old behavior"). - + * - ``%systm_hm_0%`` + - 01:23 + - Current time if NTP is enabled (0-prefixed if hour < 10). + - + * - ``%systm_hm_sp%`` + - ` 1:23` + - Current time if NTP is enabled (space-prefixed if hour < 10). + - * - ``%systime_am%`` - 1:23:54 AM - Current AM/PM time if NTP is enabled (hh:mm:ss xM). - + * - ``%systime_am_0%`` + - 01:23:54 AM + - Current AM/PM time if NTP is enabled (0-prefixed if hour < 10). + - + * - ``%systime_am_sp%`` + - ` 1:23:54 AM` + - Current AM/PM time if NTP is enabled (space-prefixed if hour < 10). + - * - ``%systm_hm_am%`` - 1:23 AM - Current AM/PM time if NTP is enabled (hh:mm:ss xM). - + * - ``%systm_hm_am_0%`` + - 01:23 AM + - Current AM/PM time if NTP is enabled (0-prefixed if hour < 10). + - + * - ``%systm_hm_am_sp%`` + - ` 1:23 AM` + - Current AM/PM time if NTP is enabled (space-prefixed if hour < 10). + - * - ``%lcltime%`` - 2020-03-16 01:23:54 - Current date/time if NTP is enabled (YYYY-MM-DD hh:mm:ss). From 92ec7a8752ee5f03f4144a93a8cda52321f10166 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 8 May 2022 23:18:17 +0200 Subject: [PATCH 12/25] [P007] Add Input mode selection, Enable Analog output, analogout command, updated documentation --- docs/source/Plugin/P007.rst | 41 +++++++++- .../Plugin/P007_DeviceConfiguration.png | Bin 47142 -> 55077 bytes docs/source/Plugin/P007_InputModeOptions.png | Bin 0 -> 30772 bytes .../Plugin/P007_InputModeSchematics.png | Bin 0 -> 39280 bytes docs/source/Plugin/P007_commands.repl | 14 ++++ src/_P007_PCF8591.ino | 74 ++++++++++++++++-- 6 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 docs/source/Plugin/P007_InputModeOptions.png create mode 100644 docs/source/Plugin/P007_InputModeSchematics.png create mode 100644 docs/source/Plugin/P007_commands.repl diff --git a/docs/source/Plugin/P007.rst b/docs/source/Plugin/P007.rst index 1370c279d..1bf5ea517 100644 --- a/docs/source/Plugin/P007.rst +++ b/docs/source/Plugin/P007.rst @@ -24,7 +24,7 @@ Used libraries: |P007_usedlibraries| Introduction ------------ -The PCF8591 is an Analog to Digital converter, connected via an I2C bus. The plugin supports to read from 1 up to 4 input values. If desired, multiple Tasks *can* be defined, addressing other, or duplicate, inputs. +The PCF8591 is an Analog to Digital and Digital to Analog converter, connected via an I2C bus. The plugin supports to read from 1 up to 4 input values, and has a single analog output that can be changed by a command. If desired, multiple Tasks *can* be defined, addressing other, or duplicate, inputs. Supported hardware ------------------ @@ -54,6 +54,8 @@ I2C Options The available settings here depend on the build used. At least the **Force Slow I2C speed** option is available, but selections for the I2C Multiplexer can also be shown. For details see the :ref:`Hardware_page` +As the chip is specified to only work correctly up to 100 kHz, the **Force Slow I2C speed** checkbox should normally be *enabled*. + * **I2C Address**: The address the device is using. There are a number of addresses the module can use, and they can usually be set at the board using jumper pins. The available options: @@ -88,6 +90,34 @@ When selecting f.e. the Quad option and saving the settings, the number of outpu For any 'excess' values, events *will* be generated! +Hardware configuration +^^^^^^^^^^^^^^^^^^^^^^ + +* **Input mode** The chip supports several input modes, the desired mode can be selected here. + +Available options are: + +.. image:: P007_InputModeOptions.png + :alt: Input mode options + +* *4 single-ended inputs* De standard configuration is to have 4 inputs that are measured with regards to GND. +* *3 differential inputs, A0/A1/A2 differential with AIN3* AIN0 .. AIN2 are measured differential to AIN3, resulting in 3 available values. +* *2 single-ended, A0, A1, AIN2/AIN3 differential -> A2* AIN0 and AIN1 are measured with regards to GND into the first 2 values, the third value is measured differentially from AIN2 and AIN3. +* *AIN0/AIN1 differential -> A0, AIN2/AIN3 differential -> A1* 2 values are measured, the first differentially from AIN0 and AIN1, and the second differentially from AIN2 and AIN3. + +When configuring a differential option from above list, the 4th and 3rd values are undefined when not used, but can still be read. The results are then undefined. + +The chip documentation describes it like this: + +.. image:: P007_InputModeSchematics.png + :alt: Chip documentation for Input mode + +* **Enable Analog output (AOUT)** Enabling the Analog output has 2 effects: + +1) The AOUT pin can be set to a lineair value in the range 0..255 between 0V and Vref (Vref can sometimes be set using a potentiometer on the board) using the ``analogout`` command (see below). + +2) The internal oscillator will be enabled continuesly, causing higher power usage, but also improved measurements when reading an analog input as it avoids the startup time of the oscillator that can cause inaccurate readings. + Data Acquisition ^^^^^^^^^^^^^^^^ @@ -100,10 +130,10 @@ Values The name for the value(s) is initially set to a default name, but can be changed if desired. Also, a formula can be entered to re-calculate a value before display/sending to a controller, and the number of decimals can be changed, for a Temperature, usually 1 decimal is enough to be displayed (value will be rounded). -.. Commands available -.. ^^^^^^^^^^^^^^^^^^ +Commands available +^^^^^^^^^^^^^^^^^^ -.. .. include:: P007_commands.repl +.. include:: P007_commands.repl .. Events .. ~~~~~~ @@ -116,6 +146,9 @@ Change log .. versionchanged:: 2.0 ... + |added| + 2022-05-08 Selection of Input mode, Enable Analog output (AOUT) and ``analogout`` command. + |added| 2021-08-06 Selection of 1 to 4 input values to be read. diff --git a/docs/source/Plugin/P007_DeviceConfiguration.png b/docs/source/Plugin/P007_DeviceConfiguration.png index 7f221b7a0d66b37e3b1753d27ef5fc5f8d90dc07..a69af4fe1b7af3e178b27c63275df08de2692320 100644 GIT binary patch literal 55077 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 literal 47142 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 NnHpmc*B)|>`v`` + + Value: 0..255 + + "," + The value is lineairly scaled from 0V to Vref. Vref is often the same as VCC for the chip, but can sometimes be configured using a potentiometer on the board. + + Only available if **Enable Analog output (AOUT)** is enabled. + " diff --git a/src/_P007_PCF8591.ino b/src/_P007_PCF8591.ino index 6600e6de1..7c42e0137 100644 --- a/src/_P007_PCF8591.ino +++ b/src/_P007_PCF8591.ino @@ -5,6 +5,15 @@ // #################################### Plugin 007: ExtWiredAnalog ####################################### // ####################################################################################################### +/** Changelog: + * 2022-05-08 tonhuisman: Use ESPEasy core I2C functions where possible + * Add support for use of the Analog output pin and 'analogout,' command + * Add configuration of all possible analog input modes + * 2022-05-08 tonhuisman: Started changelog, older changes not recorded + ********************************************************************************************************/ + +// commands: +// analogout, : If the Analog output is enabled, the value range is 0..255, and lineair to Vref # define PLUGIN_007 # define PLUGIN_ID_007 7 @@ -13,6 +22,9 @@ # define P007_SENSOR_TYPE_INDEX 2 # define P007_NR_OUTPUT_VALUES getValueCountFromSensorType(static_cast(PCONFIG(P007_SENSOR_TYPE_INDEX))) +# define P007_INPUT_MODE PCONFIG_LONG(0) +# 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); @@ -77,7 +89,7 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) if (PCONFIG(P007_SENSOR_TYPE_INDEX) == 0) { PCONFIG(P007_SENSOR_TYPE_INDEX) = static_cast(Sensor_VType::SENSOR_TYPE_SINGLE); } - event->Par1 = P004_NR_OUTPUT_VALUES; + event->Par1 = P007_NR_OUTPUT_VALUES; success = true; break; } @@ -129,6 +141,30 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) break; } + case PLUGIN_WEBFORM_LOAD: + { + addFormSubHeader(F("Hardware configuration")); + + const __FlashStringHelper *inputModeOptions[] = { + F("4 single-ended inputs"), + F("3 differential inputs, A0/A1/A2 differential with AIN3"), + F("2 single-ended, A0, A1, AIN2/AIN3 differential -> A2"), + F("AIN0/AIN1 differential -> A0, AIN2/AIN3 differential -> A1"), + }; + const int inputModeValues[] = { + 0b00000000, + 0b00010000, + 0b00100000, + 0b00110000, + }; + addFormSelector(F("Input mode"), F("plugin_007_input_mode"), 4, inputModeOptions, inputModeValues, P007_INPUT_MODE); + + addFormCheckBox(F("Enable Analog output (AOUT)"), F("plugin_007_output_mode"), P007_OUTPUT_MODE == P007_OUTPUT_ENABLED); + + success = true; + break; + } + case PLUGIN_WEBFORM_SAVE: { if (PCONFIG(P007_SENSOR_TYPE_INDEX) == 0) { @@ -138,6 +174,9 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) uint8_t port = getFormItemInt(F("plugin_007_port")); CONFIG_PORT = (((i2c - 0x48) << 2) + port); + P007_INPUT_MODE = getFormItemInt(F("plugin_007_input_mode")); + P007_OUTPUT_MODE = isFormItemChecked(F("plugin_007_output_mode")) ? P007_OUTPUT_ENABLED : 0; + success = true; break; } @@ -158,13 +197,15 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) for (; var < P007_NR_OUTPUT_VALUES; ++port, ++var) { if (port <= 4) { // Only read available ports, hardwired limited to 4 - Wire.beginTransmission(address); + // Setup all required bits to the config register + uint8_t configRegister = port - 1; + configRegister |= P007_INPUT_MODE; + configRegister |= P007_OUTPUT_MODE; // get the current pin value - Wire.write(port - 1); - Wire.endTransmission(); + I2C_write8(address, configRegister); - Wire.requestFrom(address, (uint8_t)0x2); + Wire.requestFrom(address, (uint8_t)0x2); // No fitting I2C standard function available if (Wire.available()) { @@ -173,6 +214,7 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log; + if (log.reserve(40)) { log += F("PCF : Analog port: A"); log += port - 1; @@ -196,6 +238,28 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string) } break; } + + case PLUGIN_WRITE: + { + String command = parseString(string, 1); + + if ((P007_OUTPUT_MODE == P007_OUTPUT_ENABLED) && + command.equals(F("analogout")) && + (event->Par1 >= 0) && (event->Par1 <= 255)) { + uint8_t unit = (CONFIG_PORT - 1) / 4; + uint8_t address = 0x48 + unit; + + // Setup all required bits to the config register + uint8_t configRegister = 0; + configRegister |= P007_INPUT_MODE; + configRegister |= P007_OUTPUT_MODE; + + I2C_write8_reg(address, configRegister, static_cast(event->Par1)); + + success = true; + } + break; + } } return success; } From b66560b08a1de54adcf52518a2f8a2fd145204d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Mon, 9 May 2022 09:08:17 +0200 Subject: [PATCH 13/25] Update AdvancedConfigPage.cpp typo --- src/src/WebServer/AdvancedConfigPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index b8726fbf4..b84b7eeed 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -191,7 +191,7 @@ void handle_advanced() { addFormSubHeader(F("Inter-ESPEasy Network")); - if (Settings.UDPPort != 8266 ) addFormNote(F("Preferred P2P port is 8266")); + if (Settings.UDPPort != 8266 ) addFormNote(F("Preffered P2P port is 8266")); addFormNumericBox(F("UDP port"), F("udpport"), Settings.UDPPort, 0, 65535); // TODO sort settings in groups or move to other pages/groups From 12fab9af5d996f6aa358d52720541bf8854f8266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Zimo=C5=84?= Date: Mon, 9 May 2022 11:48:16 +0200 Subject: [PATCH 14/25] [p2p] typo of typo of typo --- src/src/WebServer/AdvancedConfigPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index b84b7eeed..b8726fbf4 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -191,7 +191,7 @@ void handle_advanced() { addFormSubHeader(F("Inter-ESPEasy Network")); - if (Settings.UDPPort != 8266 ) addFormNote(F("Preffered P2P port is 8266")); + if (Settings.UDPPort != 8266 ) addFormNote(F("Preferred P2P port is 8266")); addFormNumericBox(F("UDP port"), F("udpport"), Settings.UDPPort, 0, 65535); // TODO sort settings in groups or move to other pages/groups From 1a79cf633887d3c1ba185450ecb9e7fe47adb810 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 9 May 2022 20:20:58 +0200 Subject: [PATCH 15/25] [P007] Fix typo --- docs/source/Plugin/P007.rst | 2 +- docs/source/Plugin/P007_commands.repl | 2 +- src/_P007_PCF8591.ino | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/Plugin/P007.rst b/docs/source/Plugin/P007.rst index 1bf5ea517..5f14b0366 100644 --- a/docs/source/Plugin/P007.rst +++ b/docs/source/Plugin/P007.rst @@ -114,7 +114,7 @@ The chip documentation describes it like this: * **Enable Analog output (AOUT)** Enabling the Analog output has 2 effects: -1) The AOUT pin can be set to a lineair value in the range 0..255 between 0V and Vref (Vref can sometimes be set using a potentiometer on the board) using the ``analogout`` command (see below). +1) The AOUT pin can be set to a linear value in the range 0..255 between 0V and Vref (Vref can sometimes be set using a potentiometer on the board) using the ``analogout`` command (see below). 2) The internal oscillator will be enabled continuesly, causing higher power usage, but also improved measurements when reading an analog input as it avoids the startup time of the oscillator that can cause inaccurate readings. diff --git a/docs/source/Plugin/P007_commands.repl b/docs/source/Plugin/P007_commands.repl index e7912cc75..b770d86de 100644 --- a/docs/source/Plugin/P007_commands.repl +++ b/docs/source/Plugin/P007_commands.repl @@ -8,7 +8,7 @@ Value: 0..255 "," - The value is lineairly scaled from 0V to Vref. Vref is often the same as VCC for the chip, but can sometimes be configured using a potentiometer on the board. + The value is linearly scaled from 0V to Vref. Vref is often the same as VCC for the chip, but can sometimes be configured using a potentiometer on the board. Only available if **Enable Analog output (AOUT)** is enabled. " diff --git a/src/_P007_PCF8591.ino b/src/_P007_PCF8591.ino index 7c42e0137..7c8ce962e 100644 --- a/src/_P007_PCF8591.ino +++ b/src/_P007_PCF8591.ino @@ -13,7 +13,7 @@ ********************************************************************************************************/ // commands: -// analogout, : If the Analog output is enabled, the value range is 0..255, and lineair to Vref +// analogout, : If the Analog output is enabled, the value range is 0..255, and linear to Vref # define PLUGIN_007 # define PLUGIN_ID_007 7 From 8ab9865e377bfb7ab0a6d53f2f8ed8b2a443c914 Mon Sep 17 00:00:00 2001 From: Boris Krivonog Date: Thu, 19 May 2022 21:15:53 +0200 Subject: [PATCH 16/25] Should resolve #3531 and #3158. --- docs/source/Plugin/P093.rst | 18 +++++++++++++++++- docs/source/Plugin/P093_commands.repl | 2 +- docs/source/Plugin/P093_examples_http.repl | 19 +++++++++++++++++++ docs/source/Plugin/P093_examples_mqtt.repl | 19 +++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 docs/source/Plugin/P093_examples_http.repl create mode 100644 docs/source/Plugin/P093_examples_mqtt.repl diff --git a/docs/source/Plugin/P093.rst b/docs/source/Plugin/P093.rst index 30c49528d..eaf97d8d2 100644 --- a/docs/source/Plugin/P093.rst +++ b/docs/source/Plugin/P093.rst @@ -89,7 +89,23 @@ Commands Example ------- -A full working example using openHAB can be found `here `_. +There are several ways how to control AC unit using ESP Easy. + +**Using HTTP:** + +Generally commands are send via http using syntax ``http:///control?cmd=`` where ```` is the IP of your ESP Easy device, for example ``192.168.0.100``: + +.. include:: P093_examples_http.repl + +**Using MQTT:** + +Commands are send via MQTT using syntax ``/cmd`` with payload: ````. For example, if your `unit name `_ is ``MyESPEasy``, one would send the below payload to topic ``MyESPEasy/cmd``: + +.. include:: P093_examples_mqtt.repl + +Please check `here `_ for more details on how to send commands using ESP Easy. + +Please `check `_ for an example integration with openHAB. Special thanks -------------- diff --git a/docs/source/Plugin/P093_commands.repl b/docs/source/Plugin/P093_commands.repl index 3901f0e4d..4f7a036f0 100644 --- a/docs/source/Plugin/P093_commands.repl +++ b/docs/source/Plugin/P093_commands.repl @@ -1,5 +1,5 @@ .. csv-table:: - :header: "Command", "Extra information" + :header: "Command", "Description" :widths: 20, 40 " diff --git a/docs/source/Plugin/P093_examples_http.repl b/docs/source/Plugin/P093_examples_http.repl new file mode 100644 index 000000000..791499f2d --- /dev/null +++ b/docs/source/Plugin/P093_examples_http.repl @@ -0,0 +1,19 @@ +.. csv-table:: + :header: "Command", "Description" + :widths: 20, 40 + + " + ``http://192.168.0.100/control?cmd=MitsubishiHP,power,ON`` + "," + Turn on AC + " + " + ``http://192.168.0.100/control?cmd=MitsubishiHP,temperature,23`` + "," + Set target temperature to 23 + " + " + ``http://192.168.0.100/control?cmd=MitsubishiHP,fan,AUTO`` + "," + Set fan mode to ``AUTO`` + " diff --git a/docs/source/Plugin/P093_examples_mqtt.repl b/docs/source/Plugin/P093_examples_mqtt.repl new file mode 100644 index 000000000..26c3c2a61 --- /dev/null +++ b/docs/source/Plugin/P093_examples_mqtt.repl @@ -0,0 +1,19 @@ +.. csv-table:: + :header: "Payload", "Description" + :widths: 20, 40 + + " + ``MitsubishiHP,power,ON`` + "," + Turn on AC + " + " + ``MitsubishiHP,temperature,23`` + "," + Set target temperature to 23 + " + " + ``MitsubishiHP,fan,AUTO`` + "," + Set fan mode to ``AUTO`` + " From b7d630a43daa7bd07543f6db1a8d974abf7e2c99 Mon Sep 17 00:00:00 2001 From: Boris Krivonog Date: Thu, 19 May 2022 21:38:17 +0200 Subject: [PATCH 17/25] Removed invalid (no longer working) url ... --- docs/source/Plugin/P093.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/source/Plugin/P093.rst b/docs/source/Plugin/P093.rst index eaf97d8d2..c20ecad4f 100644 --- a/docs/source/Plugin/P093.rst +++ b/docs/source/Plugin/P093.rst @@ -53,8 +53,6 @@ Parts required to make a CN105 female connector * `PAP-05V-S `_, * `SPHD-002T-P0.5 `_, -One can also get `premade pigtails `_. - Example using D1 mini PRO ~~~~~~~~~~~~~~~~~~~~~~~~~ From b0fc59c82f10d7d4829e27a756ee9eaafc58b921 Mon Sep 17 00:00:00 2001 From: TD-er Date: Thu, 2 Jun 2022 15:54:00 +0200 Subject: [PATCH 18/25] [Build] Fix warnings on unused enums in switch statements + update to PlatformIO 6.0.2 --- requirements.txt | 2 +- src/src/Helpers/SystemVariables.cpp | 93 ++++++++++++++++------------- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/requirements.txt b/requirements.txt index b76df45a9..efe4ff1d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ esptool==4.0 -platformio>=6.0.1 +platformio>=6.0.2 pygit2==1.9.1 \ No newline at end of file diff --git a/src/src/Helpers/SystemVariables.cpp b/src/src/Helpers/SystemVariables.cpp index ec160bc14..8cc8eb50d 100644 --- a/src/src/Helpers/SystemVariables.cpp +++ b/src/src/Helpers/SystemVariables.cpp @@ -70,56 +70,63 @@ String timeReplacement_leadZero(int value) } // FIXME TD-er: Try to match these with StringProvider::getValue - - -String SystemVariables::getSystemVariable(SystemVariables::Enum enumval) { +LabelType::Enum SystemVariables2LabelType(SystemVariables::Enum enumval) { LabelType::Enum label = LabelType::MAX_LABEL; - switch (enumval) { - case IP: label = LabelType::IP_ADDRESS; break; - case SUBNET: label = LabelType::IP_SUBNET; break; - case DNS: label = LabelType::DNS; break; - case DNS_1: label = LabelType::DNS_1; break; - case DNS_2: label = LabelType::DNS_2; break; - case GATEWAY: label = LabelType::GATEWAY; break; - case CLIENTIP: label = LabelType::CLIENT_IP; break; + case SystemVariables::IP: label = LabelType::IP_ADDRESS; break; + case SystemVariables::SUBNET: label = LabelType::IP_SUBNET; break; + case SystemVariables::DNS: label = LabelType::DNS; break; + case SystemVariables::DNS_1: label = LabelType::DNS_1; break; + case SystemVariables::DNS_2: label = LabelType::DNS_2; break; + case SystemVariables::GATEWAY: label = LabelType::GATEWAY; break; + case SystemVariables::CLIENTIP: label = LabelType::CLIENT_IP; break; #ifdef HAS_ETHERNET - case ETHWIFIMODE: label = LabelType::ETH_WIFI_MODE; break; // 0=WIFI, 1=ETH - case ETHCONNECTED: label = LabelType::ETH_CONNECTED; break; // 0=disconnected, 1=connected - case ETHDUPLEX: label = LabelType::ETH_DUPLEX; break; - case ETHSPEED: label = LabelType::ETH_SPEED; break; - case ETHSTATE: label = LabelType::ETH_STATE; break; - case ETHSPEEDSTATE: label = LabelType::ETH_SPEED_STATE; break; + case SystemVariables::ETHWIFIMODE: label = LabelType::ETH_WIFI_MODE; break; // 0=WIFI, 1=ETH + case SystemVariables::ETHCONNECTED: label = LabelType::ETH_CONNECTED; break; // 0=disconnected, 1=connected + case SystemVariables::ETHDUPLEX: label = LabelType::ETH_DUPLEX; break; + case SystemVariables::ETHSPEED: label = LabelType::ETH_SPEED; break; + case SystemVariables::ETHSTATE: label = LabelType::ETH_STATE; break; + case SystemVariables::ETHSPEEDSTATE: label = LabelType::ETH_SPEED_STATE; break; #endif // ifdef HAS_ETHERNET - case LCLTIME: label = LabelType::LOCAL_TIME; break; - case MAC: label = LabelType::STA_MAC; break; - case RSSI: label = LabelType::WIFI_RSSI; break; - case SUNRISE_S: label = LabelType::SUNRISE_S; break; - case SUNSET_S: label = LabelType::SUNSET_S; break; - case SUNRISE_M: label = LabelType::SUNRISE_M; break; - case SUNSET_M: label = LabelType::SUNSET_M; break; - case SYSBUILD_DESCR: label = LabelType::BUILD_DESC; break; - case SYSBUILD_FILENAME: label = LabelType::BINARY_FILENAME; break; - case SYSBUILD_GIT: label = LabelType::GIT_BUILD; break; - case SYSSTACK: label = LabelType::FREE_STACK; break; - case UNIT_sysvar: label = LabelType::UNIT_NR; break; - case FLASH_FREQ: label = LabelType::FLASH_CHIP_SPEED; break; - case FLASH_SIZE: label = LabelType::FLASH_CHIP_REAL_SIZE; break; - case FLASH_CHIP_VENDOR: label = LabelType::FLASH_CHIP_VENDOR; break; - case FLASH_CHIP_MODEL: label = LabelType::FLASH_CHIP_MODEL; break; - case FS_SIZE: label = LabelType::FS_SIZE; break; - case FS_FREE: label = LabelType::FS_FREE; break; + case SystemVariables::LCLTIME: label = LabelType::LOCAL_TIME; break; + case SystemVariables::MAC: label = LabelType::STA_MAC; break; + case SystemVariables::RSSI: label = LabelType::WIFI_RSSI; break; + case SystemVariables::SUNRISE_S: label = LabelType::SUNRISE_S; break; + case SystemVariables::SUNSET_S: label = LabelType::SUNSET_S; break; + case SystemVariables::SUNRISE_M: label = LabelType::SUNRISE_M; break; + case SystemVariables::SUNSET_M: label = LabelType::SUNSET_M; break; + case SystemVariables::SYSBUILD_DESCR: label = LabelType::BUILD_DESC; break; + case SystemVariables::SYSBUILD_FILENAME: label = LabelType::BINARY_FILENAME; break; + case SystemVariables::SYSBUILD_GIT: label = LabelType::GIT_BUILD; break; + case SystemVariables::SYSSTACK: label = LabelType::FREE_STACK; break; + case SystemVariables::UNIT_sysvar: label = LabelType::UNIT_NR; break; + case SystemVariables::FLASH_FREQ: label = LabelType::FLASH_CHIP_SPEED; break; + case SystemVariables::FLASH_SIZE: label = LabelType::FLASH_CHIP_REAL_SIZE; break; + case SystemVariables::FLASH_CHIP_VENDOR: label = LabelType::FLASH_CHIP_VENDOR; break; + case SystemVariables::FLASH_CHIP_MODEL: label = LabelType::FLASH_CHIP_MODEL; break; + case SystemVariables::FS_SIZE: label = LabelType::FS_SIZE; break; + case SystemVariables::FS_FREE: label = LabelType::FS_FREE; break; - case ESP_CHIP_ID: label = LabelType::ESP_CHIP_ID; break; - case ESP_CHIP_FREQ: label = LabelType::ESP_CHIP_FREQ; break; - case ESP_CHIP_MODEL: label = LabelType::ESP_CHIP_MODEL; break; - case ESP_CHIP_REVISION: label = LabelType::ESP_CHIP_REVISION; break; - case ESP_CHIP_CORES: label = LabelType::ESP_CHIP_CORES; break; - case ESP_BOARD_NAME: label = LabelType::ESP_BOARD_NAME; break; + case SystemVariables::ESP_CHIP_ID: label = LabelType::ESP_CHIP_ID; break; + case SystemVariables::ESP_CHIP_FREQ: label = LabelType::ESP_CHIP_FREQ; break; + case SystemVariables::ESP_CHIP_MODEL: label = LabelType::ESP_CHIP_MODEL; break; + case SystemVariables::ESP_CHIP_REVISION: label = LabelType::ESP_CHIP_REVISION; break; + case SystemVariables::ESP_CHIP_CORES: label = LabelType::ESP_CHIP_CORES; break; + case SystemVariables::ESP_BOARD_NAME: label = LabelType::ESP_BOARD_NAME; break; + + default: + // No matching LabelType yet. + break; } + return label; +} + + +String SystemVariables::getSystemVariable(SystemVariables::Enum enumval) { + const LabelType::Enum label = SystemVariables2LabelType(enumval); if (LabelType::MAX_LABEL != label) { return getValue(label); @@ -196,6 +203,10 @@ String SystemVariables::getSystemVariable(SystemVariables::Enum enumval) { case VCC: return String(-1); #endif // if FEATURE_ADC_VCC case WI_CH: return String((WiFiEventData.WiFiDisconnected()) ? 0 : WiFi.channel()); + + default: + // Already handled above. + return EMPTY_STRING; } return EMPTY_STRING; } From 109a8f69896caee0fa18786c199d9b67a11878c1 Mon Sep 17 00:00:00 2001 From: TD-er Date: Sat, 11 Jun 2022 11:49:02 +0200 Subject: [PATCH 19/25] [Cleanup] Small optimizations to reduce bin size --- platformio_special_envs.ini | 18 +++-- src/_C018.cpp | 4 +- src/_P001_Switch.ino | 8 +-- src/_P009_MCP.ino | 10 +-- src/_P013_HCSR04.ino | 2 +- src/_P019_PCF8574.ino | 10 +-- src/_P073_7DGT.ino | 76 +++++++++++----------- src/_P098_PWM_motor.ino | 2 +- src/_P119_ITG3205_Gyro.ino | 5 +- src/src/ESPEasyCore/ESPEasyGPIO.cpp | 4 +- src/src/ESPEasyCore/ESPEasyGPIO.h | 2 +- src/src/PluginStructs/P120_data_struct.cpp | 5 +- src/src/WebServer/HardwarePage.cpp | 4 +- src/src/WebServer/Markup_Forms.cpp | 38 ++++++++++- src/src/WebServer/Markup_Forms.h | 45 +++++++++---- src/src/WebServer/WebServer.cpp | 4 ++ src/src/WebServer/WebServer.h | 2 + 17 files changed, 155 insertions(+), 84 deletions(-) diff --git a/platformio_special_envs.ini b/platformio_special_envs.ini index 0462399c7..9b109ff72 100644 --- a/platformio_special_envs.ini +++ b/platformio_special_envs.ini @@ -74,34 +74,42 @@ lib_ignore = ${regular_platform.lib_ignore} extra_scripts = ${extra_scripts_esp8266.extra_scripts} -[env:spec_debug_custom_ESP32_4M316k] +[env:spec_debug_custom_ESP32_16M8M] extends = esp32_common build_type = ${debug_pio.build_type} check_tool = ${debug_pio.check_tool} check_flags = ${debug_pio.check_flags} platform = ${esp32_common.platform} build_flags = ${esp32_common.build_flags} ${debug_pio.build_flags} -DPLUGIN_BUILD_CUSTOM -board = esp32dev +board = esp32_16M8M +board_upload.maximum_size = 4194304 extra_scripts = ${esp32_common.extra_scripts} pre:tools/pio/pre_custom_esp32.py [env:spec_debug_max_ESP32_16M8M] -extends = esp32_common +extends = esp32_base build_type = ${debug_pio.build_type} check_tool = ${debug_pio.check_tool} check_flags = ${debug_pio.check_flags} lib_ignore = ${esp32_always.lib_ignore} ESP32_ping board_upload.maximum_size = 4194304 -build_flags = ${esp32_common.build_flags} +build_flags = ${esp32_base.build_flags} ${debug_pio.build_flags} + -DUSE_LITTLEFS -DFEATURE_ARDUINO_OTA -DPLUGIN_BUILD_MAX_ESP32 -DPLUGIN_BUILD_IR_EXTENDED +lib_deps = ${esp32_base.lib_deps} + LittleFS +board_build.filesystem = littlefs + ; TODO: To enable PS-RAM Support needs more build flags than these 2, for now define BOARD_HAS_PSRAM is used to en/disable detecting PS-Ram size on Info page ; -DBOARD_HAS_PSRAM // both flags already enabled for Lolin D32 Pro board by PlatformIO ; -mfix-esp32-psram-cache-issue -board = lolin_d32_pro +;board = lolin_d32_pro +board = esp32_16M8M + diff --git a/src/_C018.cpp b/src/_C018.cpp index 99ffb2739..49b079265 100644 --- a/src/_C018.cpp +++ b/src/_C018.cpp @@ -627,8 +627,8 @@ bool CPlugin_018(CPlugin::Function function, struct EventStruct *event, String& } { - String options[2] = { F("OTAA"), F("ABP") }; - int values[2] = { C018_USE_OTAA, C018_USE_ABP }; + const __FlashStringHelper * options[2] = { F("OTAA"), F("ABP") }; + const int values[2] = { C018_USE_OTAA, C018_USE_ABP }; addFormSelector_script(F("Activation Method"), F("joinmethod"), 2, options, values, nullptr, joinmethod, F("joinChanged(this)")); // Script to toggle OTAA/ABP fields visibility when changing selection. diff --git a/src/_P001_Switch.ino b/src/_P001_Switch.ino index 8f4f91543..4daae8afa 100644 --- a/src/_P001_Switch.ino +++ b/src/_P001_Switch.ino @@ -408,7 +408,7 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) // long timerstats = millis(); // Bug fixed: avoid 10xSEC in case of a non-fully configured device (no GPIO defined yet) - const String monitorEventString = F("GPIO"); + const __FlashStringHelper * monitorEventString = F("GPIO"); if (validGpio(CONFIG_PIN1)) { @@ -531,7 +531,7 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) // send task event sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PIN1, output_value); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PIN1, output_value); // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = sendState ? 1 : 0; @@ -625,7 +625,7 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) // send task event sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PIN1, output_value); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PIN1, output_value); // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = sendState ? 1 : 0; @@ -654,7 +654,7 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) // send task event: DO NOT SEND TASK EVENT //sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PIN1, SAFE_BUTTON_EVENT); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PIN1, SAFE_BUTTON_EVENT); // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = tempUserVar; diff --git a/src/_P009_MCP.ino b/src/_P009_MCP.ino index e931ef8c8..52c1878c0 100644 --- a/src/_P009_MCP.ino +++ b/src/_P009_MCP.ino @@ -289,7 +289,7 @@ boolean Plugin_009(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_TEN_PER_SECOND: { const int8_t state = GPIO_MCP_Read(CONFIG_PORT); - const String monitorEventString = F("MCP"); + const __FlashStringHelper * monitorEventString = F("MCP"); /**************************************************************************\ 20181022 - @giig1967g: new doubleclick logic is: @@ -392,7 +392,7 @@ boolean Plugin_009(uint8_t function, struct EventStruct *event, String& string) sendData(event); // send monitor event - if (currentStatus.monitor) { sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, output_value); } + if (currentStatus.monitor) { sendMonitorEvent(monitorEventString, CONFIG_PORT, output_value); } // Reset forceEvent currentStatus.forceEvent = 0; @@ -459,7 +459,7 @@ boolean Plugin_009(uint8_t function, struct EventStruct *event, String& string) sendData(event); // send monitor event - if (currentStatus.monitor) { sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, output_value); } + if (currentStatus.monitor) { sendMonitorEvent(monitorEventString, CONFIG_PORT, output_value); } // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = sendState ? 1 : 0; @@ -483,7 +483,7 @@ boolean Plugin_009(uint8_t function, struct EventStruct *event, String& string) // send task event: DO NOT SEND TASK EVENT //sendData(event); // send monitor event - if (currentStatus.monitor) { sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, 4); } + if (currentStatus.monitor) { sendMonitorEvent(monitorEventString, CONFIG_PORT, 4); } // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = tempUserVar; @@ -506,7 +506,7 @@ boolean Plugin_009(uint8_t function, struct EventStruct *event, String& string) sendData(event); // send monitor event - if (currentStatus.monitor) { sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, -1); } + if (currentStatus.monitor) { sendMonitorEvent(monitorEventString, CONFIG_PORT, -1); } savePortStatus(key, currentStatus); } diff --git a/src/_P013_HCSR04.ino b/src/_P013_HCSR04.ino index dab198098..389560f4d 100644 --- a/src/_P013_HCSR04.ino +++ b/src/_P013_HCSR04.ino @@ -94,7 +94,7 @@ boolean Plugin_013(uint8_t function, struct EventStruct *even } - String strUnit = (measuringUnit == UNIT_CM) ? F("cm") : F("inch"); + const __FlashStringHelper * strUnit = (measuringUnit == UNIT_CM) ? F("cm") : F("inch"); { const __FlashStringHelper *optionsOpMode[2]; diff --git a/src/_P019_PCF8574.ino b/src/_P019_PCF8574.ino index 849eb0eb8..9023f7ece 100644 --- a/src/_P019_PCF8574.ino +++ b/src/_P019_PCF8574.ino @@ -340,7 +340,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_TEN_PER_SECOND: { const int8_t state = Plugin_019_Read(CONFIG_PORT); - const String monitorEventString = F("PCF"); + const __FlashStringHelper * monitorEventString = F("PCF"); /**************************************************************************\ 20181022 - @giig1967g: new doubleclick logic is: @@ -449,7 +449,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) // send task event sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, output_value); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PORT, output_value); // Reset forceEvent currentStatus.forceEvent = 0; @@ -514,7 +514,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) // send task event sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, output_value); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PORT, output_value); // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = sendState ? 1 : 0; @@ -540,7 +540,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) // send task event: DO NOT SEND TASK EVENT //sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, SAFE_BUTTON_EVENT); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PORT, SAFE_BUTTON_EVENT); // reset Userdata so it displays the correct state value in the web page UserVar[event->BaseVarIndex] = tempUserVar; @@ -563,7 +563,7 @@ boolean Plugin_019(uint8_t function, struct EventStruct *event, String& string) // send task event sendData(event); // send monitor event - if (currentStatus.monitor) sendMonitorEvent(monitorEventString.c_str(), CONFIG_PORT, -1); + if (currentStatus.monitor) sendMonitorEvent(monitorEventString, CONFIG_PORT, -1); savePortStatus(key, currentStatus); } diff --git a/src/_P073_7DGT.ino b/src/_P073_7DGT.ino index dfdddf48b..5bcb74728 100644 --- a/src/_P073_7DGT.ino +++ b/src/_P073_7DGT.ino @@ -114,7 +114,7 @@ boolean Plugin_073(uint8_t function, struct EventStruct *event, String& string) F("TM1637 - 4 digit (dots)"), F("TM1637 - 6 digit"), F("MAX7219 - 8 digit") }; - addFormSelector(F("Display Type"), F("plugin_073_displtype"), 4, displtype, nullptr, PCONFIG(0)); + addFormSelector(F("Display Type"), F("displtype"), 4, displtype, nullptr, PCONFIG(0)); } { const __FlashStringHelper *displout[] = { F("Manual"), @@ -123,10 +123,10 @@ boolean Plugin_073(uint8_t function, struct EventStruct *event, String& string) F("Clock 12h - Blink"), F("Clock 12h - No Blink"), F("Date") }; - addFormSelector(F("Display Output"), F("plugin_073_displout"), 6, displout, nullptr, PCONFIG(1)); + addFormSelector(F("Display Output"), F("displout"), 6, displout, nullptr, PCONFIG(1)); } - addFormNumericBox(F("Brightness"), F("plugin_073_brightness"), PCONFIG(2), 0, 15); + addFormNumericBox(F("Brightness"), F("brightness"), PCONFIG(2), 0, 15); addUnit(F("0..15")); # ifdef P073_EXTRA_FONTS @@ -135,16 +135,16 @@ boolean Plugin_073(uint8_t function, struct EventStruct *event, String& string) F("Siekoo"), F("Siekoo with uppercase 'CHNORUX'"), F("dSEG7") }; - addFormSelector(F("Font set"), F("plugin_073_fontset"), 4, fontset, nullptr, PCONFIG(4)); + addFormSelector(F("Font set"), F("fontset"), 4, fontset, nullptr, PCONFIG(4)); addFormNote(F("Check documentation for examples of the font sets.")); } # endif // P073_EXTRA_FONTS addFormSubHeader(F("Options")); - addFormCheckBox(F("Text show periods as dot"), F("plugin_073_periods"), bitRead(PCONFIG_LONG(0), P073_OPTION_PERIOD)); + addFormCheckBox(F("Text show periods as dot"), F("periods"), bitRead(PCONFIG_LONG(0), P073_OPTION_PERIOD)); - addFormCheckBox(F("Hide ° for Temperatures"), F("plugin_073_hide_degree"), bitRead(PCONFIG_LONG(0), P073_OPTION_HIDEDEGREE)); + addFormCheckBox(F("Hide ° for Temperatures"), F("hide_degree"), bitRead(PCONFIG_LONG(0), P073_OPTION_HIDEDEGREE)); # ifdef P073_7DDT_COMMAND addFormNote(F("Commands 7dt,<temp> and 7ddt,<temp1>,<temp2>")); # else // ifdef P073_7DDT_COMMAND @@ -152,38 +152,38 @@ boolean Plugin_073(uint8_t function, struct EventStruct *event, String& string) # endif // P073_7DDT_COMMAND # ifdef P073_SCROLL_TEXT - addFormCheckBox(F("Scroll text > display width"), F("plugin_073_scroll_text"), bitRead(PCONFIG_LONG(0), P073_OPTION_SCROLLTEXT)); - addFormCheckBox(F("Scroll text in from right"), F("plugin_073_scroll_full"), bitRead(PCONFIG_LONG(0), P073_OPTION_SCROLLFULL)); + addFormCheckBox(F("Scroll text > display width"), F("scroll_text"), bitRead(PCONFIG_LONG(0), P073_OPTION_SCROLLTEXT)); + addFormCheckBox(F("Scroll text in from right"), F("scroll_full"), bitRead(PCONFIG_LONG(0), P073_OPTION_SCROLLFULL)); if (PCONFIG(3) == 0) { PCONFIG(3) = 10; } - addFormNumericBox(F("Scroll speed (0.1 sec/step)"), F("plugin_073_scrollspeed"), PCONFIG(3), 1, 600); + addFormNumericBox(F("Scroll speed (0.1 sec/step)"), F("scrollspeed"), PCONFIG(3), 1, 600); addUnit(F("1..600 = 0.1..60 sec/step")); # endif // P073_SCROLL_TEXT addFormSubHeader(F("Options for MAX7219 - 8 digit")); bool bRightAlign = bitRead(PCONFIG_LONG(0), P073_OPTION_RIGHTALIGN); - addFormCheckBox(F("Right-align Temperature (7dt)"), F("plugin_073_temp_rightalign"), bRightAlign); + addFormCheckBox(F("Right-align Temperature (7dt)"), F("temp_rightalign"), bRightAlign); success = true; break; } case PLUGIN_WEBFORM_SAVE: { - PCONFIG(0) = getFormItemInt(F("plugin_073_displtype")); - PCONFIG(1) = getFormItemInt(F("plugin_073_displout")); - PCONFIG(2) = getFormItemInt(F("plugin_073_brightness")); + PCONFIG(0) = getFormItemInt(F("displtype")); + PCONFIG(1) = getFormItemInt(F("displout")); + PCONFIG(2) = getFormItemInt(F("brightness")); uint32_t lSettings = 0; - bitWrite(lSettings, P073_OPTION_PERIOD, isFormItemChecked(F("plugin_073_periods"))); - bitWrite(lSettings, P073_OPTION_HIDEDEGREE, isFormItemChecked(F("plugin_073_hide_degree"))); - bitWrite(lSettings, P073_OPTION_RIGHTALIGN, isFormItemChecked(F("plugin_073_temp_rightalign"))); + bitWrite(lSettings, P073_OPTION_PERIOD, isFormItemChecked(F("periods"))); + bitWrite(lSettings, P073_OPTION_HIDEDEGREE, isFormItemChecked(F("hide_degree"))); + bitWrite(lSettings, P073_OPTION_RIGHTALIGN, isFormItemChecked(F("temp_rightalign"))); # ifdef P073_SCROLL_TEXT - bitWrite(lSettings, P073_OPTION_SCROLLTEXT, isFormItemChecked(F("plugin_073_scroll_text"))); - bitWrite(lSettings, P073_OPTION_SCROLLFULL, isFormItemChecked(F("plugin_073_scroll_full"))); - PCONFIG(3) = getFormItemInt(F("plugin_073_scrollspeed")); + bitWrite(lSettings, P073_OPTION_SCROLLTEXT, isFormItemChecked(F("scroll_text"))); + bitWrite(lSettings, P073_OPTION_SCROLLFULL, isFormItemChecked(F("scroll_full"))); + PCONFIG(3) = getFormItemInt(F("scrollspeed")); # endif // P073_SCROLL_TEXT # ifdef P073_EXTRA_FONTS - PCONFIG(4) = getFormItemInt(F("plugin_073_fontset")); + PCONFIG(4) = getFormItemInt(F("fontset")); # endif // P073_EXTRA_FONTS PCONFIG_LONG(0) = lSettings; @@ -356,8 +356,10 @@ bool p073_plugin_write(struct EventStruct *event, return false; } - String cmd = parseString(string, 1); - String text = parseStringToEndKeepCase(string, 2); + const String cmd = parseString(string, 1); + if (cmd.length() < 3 || cmd[0] != '7') return false; + + const String text = parseStringToEndKeepCase(string, 2); if (cmd.equals("7dn")) { return p073_plugin_write_7dn(event, text); @@ -508,11 +510,11 @@ bool p073_plugin_write_7dt(struct EventStruct *event, return false; } - double p073_temptemp = 0; + float p073_temptemp = 0; bool p073_tempflagdot = false; if (!text.isEmpty()) { - validDoubleFromString(text, p073_temptemp); + validFloatFromString(text, p073_temptemp); } if (loglevelActiveFor(LOG_LEVEL_INFO)) { @@ -581,15 +583,15 @@ bool p073_plugin_write_7ddt(struct EventStruct *event, return false; } - double p073_lefttemp = 0.0; - double p073_righttemp = 0.0; + float p073_lefttemp = 0.0f; + float p073_righttemp = 0.0f; bool p073_tempflagdot = false; if (!text.isEmpty()) { - validDoubleFromString(parseString(text, 1), p073_lefttemp); + validFloatFromString(parseString(text, 1), p073_lefttemp); if (text.indexOf(',') > -1) { - validDoubleFromString(parseString(text, 2), p073_righttemp); + validFloatFromString(parseString(text, 2), p073_righttemp); } } @@ -619,25 +621,25 @@ bool p073_plugin_write_7ddt(struct EventStruct *event, { uint8_t firstDot = -1; // No decimals is no dots uint8_t secondDot = -1; - double hideFactor = P073_data->hideDegree ? 10.0 : 1.0; + float hideFactor = P073_data->hideDegree ? 10.0f : 1.0f; bool firstDecimals = false; bool secondDecimals = false; - if ((p073_lefttemp > 999.99 * hideFactor) || (p073_lefttemp < -99.99 * hideFactor)) { - p073_lefttemp = -101.0 * hideFactor; // Triggers on -100 + if ((p073_lefttemp > 999.99f * hideFactor) || (p073_lefttemp < -99.99f * hideFactor)) { + p073_lefttemp = -101.0f * hideFactor; // Triggers on -100 } else { - if ((p073_lefttemp < 100.0 * hideFactor) && (p073_lefttemp > -10.0 * hideFactor)) { - p073_lefttemp = round(p073_lefttemp * 10.0); + if ((p073_lefttemp < 100.0f * hideFactor) && (p073_lefttemp > -10.0f * hideFactor)) { + p073_lefttemp = round(p073_lefttemp * 10.0f); firstDot = P073_data->hideDegree ? 2 : 1; firstDecimals = true; } } - if ((p073_righttemp > 999.99 * hideFactor) || (p073_righttemp < -99.99 * hideFactor)) { - p073_righttemp = -101.0 * hideFactor; + if ((p073_righttemp > 999.99f * hideFactor) || (p073_righttemp < -99.99f * hideFactor)) { + p073_righttemp = -101.0f * hideFactor; } else { - if ((p073_righttemp < 100.0 * hideFactor) && (p073_righttemp > -10.0 * hideFactor)) { - p073_righttemp = round(p073_righttemp * 10.0); + if ((p073_righttemp < 100.0f * hideFactor) && (p073_righttemp > -10.0f * hideFactor)) { + p073_righttemp = round(p073_righttemp * 10.0f); secondDot = P073_data->hideDegree ? 6 : 5; secondDecimals = true; } diff --git a/src/_P098_PWM_motor.ino b/src/_P098_PWM_motor.ino index 20eac42bf..33ff5eeb1 100644 --- a/src/_P098_PWM_motor.ino +++ b/src/_P098_PWM_motor.ino @@ -169,7 +169,7 @@ boolean Plugin_098(uint8_t function, struct EventStruct *event, String& string) { # define P098_PWM_MODE_TYPES static_cast(P098_config_struct::PWM_mode_type::MAX_TYPE) - String options[P098_PWM_MODE_TYPES]; + const __FlashStringHelper * options[P098_PWM_MODE_TYPES]; int optionValues[P098_PWM_MODE_TYPES]; for (int i = 0; i < P098_PWM_MODE_TYPES; ++i) { diff --git a/src/_P119_ITG3205_Gyro.ino b/src/_P119_ITG3205_Gyro.ino index df6eab3a2..cb83c60eb 100644 --- a/src/_P119_ITG3205_Gyro.ino +++ b/src/_P119_ITG3205_Gyro.ino @@ -111,10 +111,11 @@ boolean Plugin_119(uint8_t function, struct EventStruct *event, String& string) addUnit(F("1..100")); const __FlashStringHelper *frequencyOptions[] = { - F("10x per second"), - F("50x per second") }; + F("10"), + F("50") }; int frequencyValues[] = { P119_FREQUENCY_10, P119_FREQUENCY_50 }; addFormSelector(F("Measuring frequency"), F("p119_frequency"), 2, frequencyOptions, frequencyValues, P119_FREQUENCY); + addUnit(F("Hz")); success = true; break; diff --git a/src/src/ESPEasyCore/ESPEasyGPIO.cpp b/src/src/ESPEasyCore/ESPEasyGPIO.cpp index 8ef57cff2..e3bc0aaf1 100644 --- a/src/src/ESPEasyCore/ESPEasyGPIO.cpp +++ b/src/src/ESPEasyCore/ESPEasyGPIO.cpp @@ -456,7 +456,7 @@ void GPIO_Monitor10xSec() it->second.state = currentState; //update state ONLY if task flag=false otherwise it will not be picked up by 10xSEC function // send event if not task, otherwise is sent in the task PLUGIN_TEN_PER_SECOND if (it->second.monitor) { - sendMonitorEvent(String(eventString).c_str(), gpioPort, currentState); + sendMonitorEvent(eventString, gpioPort, currentState); } } } @@ -467,7 +467,7 @@ void GPIO_Monitor10xSec() } // prefix should be either "GPIO", "PCF", "MCP" -void sendMonitorEvent(const char* prefix, int port, int8_t state) +void sendMonitorEvent(const __FlashStringHelper * prefix, int port, int8_t state) { String eventString = prefix; eventString += '#'; diff --git a/src/src/ESPEasyCore/ESPEasyGPIO.h b/src/src/ESPEasyCore/ESPEasyGPIO.h index 540f89264..47119777d 100644 --- a/src/src/ESPEasyCore/ESPEasyGPIO.h +++ b/src/src/ESPEasyCore/ESPEasyGPIO.h @@ -67,7 +67,7 @@ void GPIO_PCF_WriteAllPins(uint8_t Par1, uint8_t Par2); void GPIO_Monitor10xSec(); // prefix should be either "GPIO", "PCF", "MCP" -void sendMonitorEvent(const char* prefix, int port, int8_t state); +void sendMonitorEvent(const __FlashStringHelper * prefix, int port, int8_t state); bool checkValidPortRange(pluginID_t pluginID, int port); bool checkValidPortAddress(pluginID_t pluginID, uint8_t address); diff --git a/src/src/PluginStructs/P120_data_struct.cpp b/src/src/PluginStructs/P120_data_struct.cpp index 6556761de..49c7f2ef4 100644 --- a/src/src/PluginStructs/P120_data_struct.cpp +++ b/src/src/PluginStructs/P120_data_struct.cpp @@ -528,10 +528,11 @@ bool P120_data_struct::plugin_webform_load(struct EventStruct *event) { addUnit(F("1..100")); const __FlashStringHelper *frequencyOptions[] = { - F("10x per second"), - F("50x per second") }; + F("10"), + F("50") }; int frequencyValues[] = { P120_FREQUENCY_10, P120_FREQUENCY_50 }; addFormSelector(F("Measuring frequency"), F("p120_frequency"), 2, frequencyOptions, frequencyValues, P120_FREQUENCY); + addUnit(F("Hz")); addFormNote(F("Values X/Y/Z are updated 1x per second, Controller updates & Value-events are based on 'Interval' setting.")); } diff --git a/src/src/WebServer/HardwarePage.cpp b/src/src/WebServer/HardwarePage.cpp index 5a6f12c51..856e79849 100644 --- a/src/src/WebServer/HardwarePage.cpp +++ b/src/src/WebServer/HardwarePage.cpp @@ -81,7 +81,7 @@ void handle_hardware() { // do not add the pin state select for these pins. } else { if (validGpio(gpio)) { - String int_pinlabel = "p"; + String int_pinlabel('p'); int_pinlabel += gpio; Settings.setPinBootState(gpio, static_cast(getFormItemInt(int_pinlabel))); } @@ -167,7 +167,7 @@ void handle_hardware() { // Script to show GPIO pins for User-defined SPI GPIOs html_add_script(F("function spiOptionChanged(elem) {var spipinstyle = elem.value == 9 ? '' : 'none';document.getElementById('tr_spipinsclk').style.display = spipinstyle;document.getElementById('tr_spipinmiso').style.display = spipinstyle;document.getElementById('tr_spipinmosi').style.display = spipinstyle;}"), false); - const String spi_options[] = { + const __FlashStringHelper * spi_options[] = { getSPI_optionToString(SPI_Options_e::None), getSPI_optionToString(SPI_Options_e::Vspi), getSPI_optionToString(SPI_Options_e::Hspi), diff --git a/src/src/WebServer/Markup_Forms.cpp b/src/src/WebServer/Markup_Forms.cpp index acd09cb7e..67c03e124 100644 --- a/src/src/WebServer/Markup_Forms.cpp +++ b/src/src/WebServer/Markup_Forms.cpp @@ -462,6 +462,29 @@ void addFormSelector(const String & label, ); } +void addFormSelector_script(const __FlashStringHelper * label, + const __FlashStringHelper * id, + int optionCount, + const __FlashStringHelper * options[], + const int indices[], + const String attr[], + int selectedIndex, + const __FlashStringHelper * onChangeCall + #ifdef ENABLE_TOOLTIPS + , const String& tooltip + #endif // ifdef ENABLE_TOOLTIPS + ) +{ + addRowLabel_tr_id(label, id); + do_addSelector_Head(id, F("wide"), onChangeCall, false + #ifdef ENABLE_TOOLTIPS + , tooltip + #endif // ifdef ENABLE_TOOLTIPS + ); + addSelector_options(optionCount, options, indices, attr, selectedIndex); + addSelector_Foot(); +} + void addFormSelector_script(const String & label, const String & id, int optionCount, @@ -469,7 +492,7 @@ void addFormSelector_script(const String & label, const int indices[], const String attr[], int selectedIndex, - const String& onChangeCall + const __FlashStringHelper * onChangeCall #ifdef ENABLE_TOOLTIPS , const String& tooltip #endif // ifdef ENABLE_TOOLTIPS @@ -582,6 +605,12 @@ bool getCheckWebserverArg_int(const String& key, int& value) { return validIntFromString(valueStr, value); } +bool update_whenset_FormItemInt(const __FlashStringHelper * key, + int & value) +{ + return update_whenset_FormItemInt(String(key), value); +} + bool update_whenset_FormItemInt(const String& key, int& value) { int tmpVal; @@ -592,6 +621,13 @@ bool update_whenset_FormItemInt(const String& key, int& value) { return false; } +bool update_whenset_FormItemInt(const __FlashStringHelper * key, + uint8_t& value) +{ + return update_whenset_FormItemInt(String(key), value); +} + + bool update_whenset_FormItemInt(const String& key, uint8_t& value) { int tmpVal; diff --git a/src/src/WebServer/Markup_Forms.h b/src/src/WebServer/Markup_Forms.h index a1b9456ae..60f87881a 100644 --- a/src/src/WebServer/Markup_Forms.h +++ b/src/src/WebServer/Markup_Forms.h @@ -17,7 +17,7 @@ void addFormSeparator(int clspan); // Add a note as row start // ******************************************************************************** void addFormNote(const __FlashStringHelper * text); -void addFormNote(const String& text, const String& id = ""); +void addFormNote(const String& text, const String& id = EMPTY_STRING); // ******************************************************************************** // Create Forms @@ -128,7 +128,7 @@ void addFormTextBox(const __FlashStringHelper * label, int maxlength, bool readonly = false, bool required = false, - const String& pattern = ""); + const String& pattern = EMPTY_STRING); void addFormTextBox(const String& label, const String& id, @@ -136,7 +136,7 @@ void addFormTextBox(const String& label, int maxlength, bool readonly = false, bool required = false, - const String& pattern = "" + const String& pattern = EMPTY_STRING #ifdef ENABLE_TOOLTIPS , const String& tooltip = EMPTY_STRING @@ -254,15 +254,6 @@ void addFormSelector(const String& label, int selectedIndex, boolean reloadonchange); -void addFormSelector_script(const String& label, - const String& id, - int optionCount, - const __FlashStringHelper * options[], - const int indices[], - const String attr[], - int selectedIndex, - const String& onChangeCall); - void addFormSelector(const String& label, const String& id, @@ -270,7 +261,12 @@ void addFormSelector(const String& label, const String options[], const int indices[], int selectedIndex, - bool reloadonchange); + bool reloadonchange + #ifdef ENABLE_TOOLTIPS + , + const String& tooltip = EMPTY_STRING + #endif + ); void addFormSelector(const String& label, const String& id, @@ -286,6 +282,21 @@ void addFormSelector(const String& label, #endif ); +void addFormSelector_script(const __FlashStringHelper * label, + const __FlashStringHelper * id, + int optionCount, + const __FlashStringHelper * options[], + const int indices[], + const String attr[], + int selectedIndex, + const __FlashStringHelper * onChangeCall + #ifdef ENABLE_TOOLTIPS + , + const String& tooltip = EMPTY_STRING + #endif + ); + + void addFormSelector_script(const String& label, const String& id, int optionCount, @@ -293,7 +304,7 @@ void addFormSelector_script(const String& label, const int indices[], const String attr[], int selectedIndex, - const String& onChangeCall + const __FlashStringHelper * onChangeCall #ifdef ENABLE_TOOLTIPS , const String& tooltip = EMPTY_STRING @@ -317,9 +328,15 @@ int getFormItemInt(const String& key, int defaultValue); bool getCheckWebserverArg_int(const String& key, int & value); +bool update_whenset_FormItemInt(const __FlashStringHelper * key, + int & value); + bool update_whenset_FormItemInt(const String& key, int & value); +bool update_whenset_FormItemInt(const __FlashStringHelper * key, + uint8_t & value); + bool update_whenset_FormItemInt(const String& key, uint8_t & value); diff --git a/src/src/WebServer/WebServer.cpp b/src/src/WebServer/WebServer.cpp index 24ba549b5..5ebfe96a3 100644 --- a/src/src/WebServer/WebServer.cpp +++ b/src/src/WebServer/WebServer.cpp @@ -76,6 +76,10 @@ void safe_strncpy_webserver_arg(char *dest, const String& arg, size_t max_size) } } +void safe_strncpy_webserver_arg(char *dest, const __FlashStringHelper * arg, size_t max_size) { + safe_strncpy_webserver_arg(dest, String(arg), max_size); +} + void sendHeadandTail(const __FlashStringHelper * tmplName, boolean Tail, boolean rebooting) { // This function is called twice per serving a web page. // So it must keep track of the timer longer than the scope of this function. diff --git a/src/src/WebServer/WebServer.h b/src/src/WebServer/WebServer.h index f09d60681..3800753be 100644 --- a/src/src/WebServer/WebServer.h +++ b/src/src/WebServer/WebServer.h @@ -20,6 +20,8 @@ void safe_strncpy_webserver_arg(char *dest, const String& arg, size_t max_size); +void safe_strncpy_webserver_arg(char *dest, const __FlashStringHelper * arg, size_t max_size); + void sendHeadandTail(const __FlashStringHelper * tmplName, boolean Tail = false, boolean rebooting = false); From d2fbc8e038f8308611ed35e4cf0f78210e5517c1 Mon Sep 17 00:00:00 2001 From: TD-er Date: Fri, 10 Jun 2022 16:00:43 +0200 Subject: [PATCH 20/25] [Cleanup] Reduce loading controller settings when not ready to process --- .../ControllerDelayHandlerStruct.h | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/src/ControllerQueue/ControllerDelayHandlerStruct.h b/src/src/ControllerQueue/ControllerDelayHandlerStruct.h index cdb798108..ea36276bb 100644 --- a/src/src/ControllerQueue/ControllerDelayHandlerStruct.h +++ b/src/src/ControllerQueue/ControllerDelayHandlerStruct.h @@ -310,20 +310,16 @@ struct ControllerDelayHandlerStruct { void process_c##NNN####M##_delay_queue() { \ if (C##NNN####M##_DelayHandler == nullptr) return; \ C##NNN####M##_queue_element *element(C##NNN####M##_DelayHandler->getNext()); \ - if (element == nullptr) return; \ - MakeControllerSettings(ControllerSettings); \ - bool ready = true; \ - if (!AllocatedControllerSettings()) { \ - ready = false; \ - } else { \ - LoadControllerSettings(element->controller_idx, ControllerSettings); \ - C##NNN####M##_DelayHandler->configureControllerSettings(ControllerSettings); \ - if (!C##NNN####M##_DelayHandler->readyToProcess(*element)) { ready = false; } \ - } \ - if (ready) { \ - START_TIMER; \ - C##NNN####M##_DelayHandler->markProcessed(do_process_c##NNN####M##_delay_queue(M, *element, ControllerSettings)); \ - STOP_TIMER(C##NNN####M##_DELAY_QUEUE); \ + if (element == nullptr) return; \ + if (C##NNN####M##_DelayHandler->readyToProcess(*element)) { \ + MakeControllerSettings(ControllerSettings); \ + if (AllocatedControllerSettings()) { \ + LoadControllerSettings(element->controller_idx, ControllerSettings); \ + C##NNN####M##_DelayHandler->configureControllerSettings(ControllerSettings); \ + START_TIMER; \ + C##NNN####M##_DelayHandler->markProcessed(do_process_c##NNN####M##_delay_queue(M, *element, ControllerSettings)); \ + STOP_TIMER(C##NNN####M##_DELAY_QUEUE); \ + } \ } \ Scheduler.scheduleNextDelayQueue(ESPEasy_Scheduler::IntervalTimer_e::TIMER_C##NNN####M##_DELAY_QUEUE, C##NNN####M##_DelayHandler->getNextScheduleTime()); \ } \ From 2a8906d2400a119e6b751f3bf5a2765f8a0190ed Mon Sep 17 00:00:00 2001 From: TD-er Date: Fri, 10 Jun 2022 22:44:16 +0200 Subject: [PATCH 21/25] [Cleanup] Add function addFormSelector_YesNo to remove code duplication --- src/_P037_MQTTImport.ino | 10 +++---- src/_P062_MPR121_KeyPad.ino | 6 ++--- src/_P099_XPT2046Touch.ino | 4 +-- src/_P124_MultiRelay.ino | 13 +++------ src/src/WebServer/Markup_Forms.cpp | 38 +++++++++++++++++++++------ src/src/WebServer/Markup_Forms.h | 26 ++++++++++++------ src/src/WebServer/SettingsArchive.cpp | 13 +++++---- 7 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/_P037_MQTTImport.ino b/src/_P037_MQTTImport.ino index 39f679fd6..1489f59c5 100644 --- a/src/_P037_MQTTImport.ino +++ b/src/_P037_MQTTImport.ino @@ -134,19 +134,15 @@ boolean Plugin_037(uint8_t function, struct EventStruct *event, String& string) case PLUGIN_WEBFORM_LOAD: { addFormSubHeader(F("Options")); - # if P037_MAPPING_SUPPORT || P037_JSON_SUPPORT || P037_FILTER_SUPPORT - const __FlashStringHelper *optionsNoYes[2] = { F("No"), F("Yes") }; - int optionValuesNoYes[2] = { 0, 1 }; - # endif // if P037_MAPPING_SUPPORT || P037_JSON_SUPPORT || P037_FILTER_SUPPORT # if P037_JSON_SUPPORT - addFormSelector(F("Parse JSON messages"), F("p037_parse_json"), 2, optionsNoYes, optionValuesNoYes, P037_PARSE_JSON, true); + addFormSelector_YesNo(F("Parse JSON messages"), F("p037_parse_json"), P037_PARSE_JSON, true); # endif // if P037_JSON_SUPPORT # if P037_FILTER_SUPPORT - addFormSelector(F("Apply filters"), F("p037_apply_filters"), 2, optionsNoYes, optionValuesNoYes, P037_APPLY_FILTERS, true); + addFormSelector_YesNo(F("Apply filters"), F("p037_apply_filters"), P037_APPLY_FILTERS, true); # endif // if P037_FILTER_SUPPORT # if P037_MAPPING_SUPPORT - addFormSelector(F("Apply mappings"), F("p037_apply_mappings"), 2, optionsNoYes, optionValuesNoYes, P037_APPLY_MAPPINGS, true); + addFormSelector_YesNo(F("Apply mappings"), F("p037_apply_mappings"), P037_APPLY_MAPPINGS, true); # endif // if P037_MAPPING_SUPPORT # if P037_MAPPING_SUPPORT || P037_JSON_SUPPORT || P037_FILTER_SUPPORT # if !defined(LIMIT_BUILD_SIZE) diff --git a/src/_P062_MPR121_KeyPad.ino b/src/_P062_MPR121_KeyPad.ino index ad4a29e1f..15204a6a3 100644 --- a/src/_P062_MPR121_KeyPad.ino +++ b/src/_P062_MPR121_KeyPad.ino @@ -177,10 +177,8 @@ boolean Plugin_062(uint8_t function, struct EventStruct *event, String& string) html_end_table(); if (canCalibrate) { - const __FlashStringHelper *options1[2] = { F("No"), F("Yes") }; - int optionValues1[2] = { 0, 1 }; - int choice1 = tbUseCalibration ? 1 : 0; - addFormSelector(F("Enable Calibration"), F("p062_use_calibration"), 2, options1, optionValues1, choice1, true); + const int choice1 = tbUseCalibration ? 1 : 0; + addFormSelector_YesNo(F("Enable Calibration"), F("p062_use_calibration"), choice1, true); if (tbUseCalibration) { addFormCheckBox(F("Clear calibrationdata"), F("p062_clear_calibrate"), false); diff --git a/src/_P099_XPT2046Touch.ino b/src/_P099_XPT2046Touch.ino index 6ed48e9f0..7ea207f0e 100644 --- a/src/_P099_XPT2046Touch.ino +++ b/src/_P099_XPT2046Touch.ino @@ -204,10 +204,8 @@ boolean Plugin_099(uint8_t function, struct EventStruct *event, String& string) bool tbUseCalibration = bitRead(P099_CONFIG_FLAGS, P099_FLAGS_USE_CALIBRATION); { - const __FlashStringHelper * options4[2] = { F("No"), F("Yes") }; - int optionValues4[2] = { 0, 1 }; int choice4 = tbUseCalibration ? 1 : 0; - addFormSelector(F("Calibrate to screen resolution"), F("p099_use_calibration"), 2, options4, optionValues4, choice4, true); + addFormSelector_YesNo(F("Calibrate to screen resolution"), F("p099_use_calibration"), choice4, true); } if (tbUseCalibration) { diff --git a/src/_P124_MultiRelay.ino b/src/_P124_MultiRelay.ino index 223d9ff72..b3539ba1b 100644 --- a/src/_P124_MultiRelay.ino +++ b/src/_P124_MultiRelay.ino @@ -105,13 +105,8 @@ boolean Plugin_124(uint8_t function, struct EventStruct *event, String& string) int optionValuesMode2[] { 2, 4, 8 }; addFormSelector(F("Number of relays"), F("plugin_124_relays"), 3, optionsMode2, optionValuesMode2, P124_CONFIG_RELAY_COUNT, true); - const __FlashStringHelper *noYesOptions[] = { - F("No"), - F("Yes") - }; - int noYesValues[] = { 0, 1 }; - addFormSelector(F("Initialize relays on startup"), - getPluginCustomArgName(P124_FLAGS_INIT_RELAYS), 2, noYesOptions, noYesValues, + addFormSelector_YesNo(F("Initialize relays on startup"), + getPluginCustomArgName(P124_FLAGS_INIT_RELAYS), bitRead(P124_CONFIG_FLAGS, P124_FLAGS_INIT_RELAYS) ? 1 : 0, true); String label; @@ -129,8 +124,8 @@ boolean Plugin_124(uint8_t function, struct EventStruct *event, String& string) } } - addFormSelector(F("Reset relays on exit"), - getPluginCustomArgName(P124_FLAGS_EXIT_RELAYS), 2, noYesOptions, noYesValues, + addFormSelector_YesNo(F("Reset relays on exit"), + getPluginCustomArgName(P124_FLAGS_EXIT_RELAYS), bitRead(P124_CONFIG_FLAGS, P124_FLAGS_EXIT_RELAYS) ? 1 : 0, true); if (bitRead(P124_CONFIG_FLAGS, P124_FLAGS_EXIT_RELAYS)) { diff --git a/src/src/WebServer/Markup_Forms.cpp b/src/src/WebServer/Markup_Forms.cpp index 67c03e124..cc05d678a 100644 --- a/src/src/WebServer/Markup_Forms.cpp +++ b/src/src/WebServer/Markup_Forms.cpp @@ -55,7 +55,7 @@ void addFormNote(const String& text, const String& id) // Add a checkbox Form // ******************************************************************************** -void addFormCheckBox_disabled(const String& label, const String& id, boolean checked +void addFormCheckBox_disabled(const String& label, const String& id, bool checked #ifdef ENABLE_TOOLTIPS , const String& tooltip #endif // ifdef ENABLE_TOOLTIPS @@ -67,19 +67,19 @@ void addFormCheckBox_disabled(const String& label, const String& id, boolean che ); } -void addFormCheckBox(const __FlashStringHelper * label, const __FlashStringHelper * id, boolean checked, bool disabled) +void addFormCheckBox(const __FlashStringHelper * label, const __FlashStringHelper * id, bool checked, bool disabled) { addRowLabel_tr_id(label, id); addCheckBox(id, checked, disabled); } -void addFormCheckBox(const __FlashStringHelper * label, const String& id, boolean checked, bool disabled) +void addFormCheckBox(const __FlashStringHelper * label, const String& id, bool checked, bool disabled) { addRowLabel_tr_id(label, id); addCheckBox(id, checked, disabled); } -void addFormCheckBox(const String& label, const String& id, boolean checked, bool disabled +void addFormCheckBox(const String& label, const String& id, bool checked, bool disabled #ifdef ENABLE_TOOLTIPS , const String& tooltip #endif // ifdef ENABLE_TOOLTIPS @@ -93,7 +93,7 @@ void addFormCheckBox(const String& label, const String& id, boolean checked, boo ); } -void addFormCheckBox(LabelType::Enum label, boolean checked, bool disabled +void addFormCheckBox(LabelType::Enum label, bool checked, bool disabled #ifdef ENABLE_TOOLTIPS , const String& tooltip #endif // ifdef ENABLE_TOOLTIPS @@ -105,7 +105,7 @@ void addFormCheckBox(LabelType::Enum label, boolean checked, bool disabled ); } -void addFormCheckBox_disabled(LabelType::Enum label, boolean checked) { +void addFormCheckBox_disabled(LabelType::Enum label, bool checked) { addFormCheckBox(label, checked, true); } @@ -424,7 +424,7 @@ void addFormSelector(const String& label, const int indices[], const String attr[], int selectedIndex, - boolean reloadonchange) + bool reloadonchange) { addRowLabel_tr_id(label, id); addSelector(id, optionCount, options, indices, attr, selectedIndex, reloadonchange, true); @@ -448,7 +448,7 @@ void addFormSelector(const String & label, const int indices[], const String attr[], int selectedIndex, - boolean reloadonchange + bool reloadonchange #ifdef ENABLE_TOOLTIPS , const String& tooltip #endif // ifdef ENABLE_TOOLTIPS @@ -508,6 +508,28 @@ void addFormSelector_script(const String & label, addSelector_Foot(); } +void addFormSelector_YesNo(const __FlashStringHelper * label, + const __FlashStringHelper * id, + int selectedIndex, + bool reloadonchange) +{ + const __FlashStringHelper *optionsNoYes[2] = { F("No"), F("Yes") }; + int optionValuesNoYes[2] = { 0, 1 }; + addFormSelector(label, id, 2, optionsNoYes, optionValuesNoYes, selectedIndex, reloadonchange); +} + +void addFormSelector_YesNo(const __FlashStringHelper * label, + const String& id, + int selectedIndex, + bool reloadonchange) +{ + const __FlashStringHelper *optionsNoYes[2] = { F("No"), F("Yes") }; + int optionValuesNoYes[2] = { 0, 1 }; + addFormSelector(label, id, 2, optionsNoYes, optionValuesNoYes, selectedIndex, reloadonchange); +} + + + // ******************************************************************************** // Add a GPIO pin select dropdown list // ******************************************************************************** diff --git a/src/src/WebServer/Markup_Forms.h b/src/src/WebServer/Markup_Forms.h index 60f87881a..58f9bfd62 100644 --- a/src/src/WebServer/Markup_Forms.h +++ b/src/src/WebServer/Markup_Forms.h @@ -30,7 +30,7 @@ void addFormNote(const String& text, const String& id = EMPTY_STRING); void addFormCheckBox_disabled(const String& label, const String& id, - boolean checked + bool checked #ifdef ENABLE_TOOLTIPS , const String& tooltip = EMPTY_STRING @@ -39,7 +39,7 @@ void addFormCheckBox_disabled(const String& label, void addFormCheckBox(const String& label, const String& id, - boolean checked, + bool checked, bool disabled = false #ifdef ENABLE_TOOLTIPS , @@ -48,7 +48,7 @@ void addFormCheckBox(const String& label, ); void addFormCheckBox(LabelType::Enum label, - boolean checked, + bool checked, bool disabled = false #ifdef ENABLE_TOOLTIPS , @@ -57,9 +57,9 @@ void addFormCheckBox(LabelType::Enum label, ); void addFormCheckBox_disabled(LabelType::Enum label, - boolean checked); -void addFormCheckBox(const __FlashStringHelper * label, const __FlashStringHelper * id, boolean checked, bool disabled = false); -void addFormCheckBox(const __FlashStringHelper * label, const String& id, boolean checked, bool disabled = false); + bool checked); +void addFormCheckBox(const __FlashStringHelper * label, const __FlashStringHelper * id, bool checked, bool disabled = false); +void addFormCheckBox(const __FlashStringHelper * label, const String& id, bool checked, bool disabled = false); // ******************************************************************************** // Add a Numeric Box form @@ -252,7 +252,7 @@ void addFormSelector(const String& label, const int indices[], const String attr[], int selectedIndex, - boolean reloadonchange); + bool reloadonchange); void addFormSelector(const String& label, @@ -275,7 +275,7 @@ void addFormSelector(const String& label, const int indices[], const String attr[], int selectedIndex, - boolean reloadonchange + bool reloadonchange #ifdef ENABLE_TOOLTIPS , const String& tooltip = EMPTY_STRING @@ -311,6 +311,16 @@ void addFormSelector_script(const String& label, #endif ); +void addFormSelector_YesNo(const __FlashStringHelper * label, + const __FlashStringHelper * id, + int selectedIndex, + bool reloadonchange); + +void addFormSelector_YesNo(const __FlashStringHelper * label, + const String& id, + int selectedIndex, + bool reloadonchange); + // ******************************************************************************** // Add a GPIO pin select dropdown list // ******************************************************************************** diff --git a/src/src/WebServer/SettingsArchive.cpp b/src/src/WebServer/SettingsArchive.cpp index a38bd771e..a0f325d71 100644 --- a/src/src/WebServer/SettingsArchive.cpp +++ b/src/src/WebServer/SettingsArchive.cpp @@ -69,7 +69,7 @@ void handle_settingsarchive() { ProvisioningSettings.setPass(web_server.arg(F("pass"))); } } - error += saveProvisioningSettings(ProvisioningSettings); + error = saveProvisioningSettings(ProvisioningSettings); } #endif @@ -82,9 +82,9 @@ void handle_settingsarchive() { if (web_server.hasArg(F("download"))) { // Try downloading files. // Don't use the ProvisioningSettings, as not all may be stored. - String url = webArg(F("url")); - String user = webArg(F("user")); - String pass = webArg(F("pass")); + const String url = webArg(F("url")); + const String user = webArg(F("user")); + const String pass = webArg(F("pass")); addTableSeparator(F("Download result"), 2, 3); bool somethingDownloaded = false; @@ -205,7 +205,7 @@ void handle_settingsarchive() { // download filetype selectors // ******************************************************************************** void addDownloadFiletypeCheckbox(FileType::Enum filetype, unsigned int filenr) { - String filetype_str = getFileName(filetype, filenr); + const String filetype_str = getFileName(filetype, filenr); String label = F("Fetch "); label += filetype_str; @@ -214,8 +214,7 @@ void addDownloadFiletypeCheckbox(FileType::Enum filetype, unsigned int filenr) { } void storeDownloadFiletypeCheckbox(FileType::Enum filetype, unsigned int filenr) { - String filetype_str = getFileName(filetype, filenr); - bool isChecked = isFormItemChecked(filetype_str); + const bool isChecked = isFormItemChecked(getFileName(filetype, filenr)); switch (filetype) { case FileType::CONFIG_DAT: ResetFactoryDefaultPreference.fetchConfigDat(isChecked); break; From 9cecdadf5fc3e43e3219ef8f1eb410accc92b894 Mon Sep 17 00:00:00 2001 From: TD-er Date: Fri, 10 Jun 2022 22:45:27 +0200 Subject: [PATCH 22/25] [Cleanup] Reduce build size by combining controller queue types --- src/_C010.cpp | 2 + src/_C012.cpp | 5 +- src/_P015_TSL2561.ino | 2 + src/_P038_NeoPixel.ino | 17 ++-- src/src/ControllerQueue/C015_queue_element.h | 2 +- .../ControllerQueue/DelayQueueElements.cpp | 13 +-- src/src/ControllerQueue/DelayQueueElements.h | 34 +++---- .../SimpleQueueElement_formatted_Strings.cpp | 98 +++++++++++++++++++ .../SimpleQueueElement_formatted_Strings.h | 64 ++++++++++++ .../queue_element_formatted_uservar.cpp | 89 ----------------- .../queue_element_formatted_uservar.h | 50 ---------- .../queue_element_single_value_base.cpp | 71 -------------- .../queue_element_single_value_base.h | 56 ----------- src/src/PluginStructs/P037_data_struct.cpp | 28 +++--- src/src/PluginStructs/P038_data_struct.cpp | 21 ++-- 15 files changed, 224 insertions(+), 328 deletions(-) create mode 100644 src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp create mode 100644 src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.h delete mode 100644 src/src/ControllerQueue/queue_element_formatted_uservar.cpp delete mode 100644 src/src/ControllerQueue/queue_element_formatted_uservar.h delete mode 100644 src/src/ControllerQueue/queue_element_single_value_base.cpp delete mode 100644 src/src/ControllerQueue/queue_element_single_value_base.h diff --git a/src/_C010.cpp b/src/_C010.cpp index b316971f2..988c1f10c 100644 --- a/src/_C010.cpp +++ b/src/_C010.cpp @@ -89,8 +89,10 @@ bool CPlugin_010(CPlugin::Function function, struct EventStruct *event, String& element.txt[x] = pubname; parseSingleControllerVariable(element.txt[x], event, x, false); element.txt[x].replace(F("%value%"), formattedValue); +#ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG_MORE)) addLog(LOG_LEVEL_DEBUG_MORE, element.txt[x]); +#endif } } } diff --git a/src/_C012.cpp b/src/_C012.cpp index bee7b9aa3..3ffeaac0a 100644 --- a/src/_C012.cpp +++ b/src/_C012.cpp @@ -70,8 +70,11 @@ bool CPlugin_012(CPlugin::Function function, struct EventStruct *event, String& element.txt[x] += event->idx + x; element.txt[x] += F("?value="); element.txt[x] += formattedValue; - if (loglevelActiveFor(LOG_LEVEL_DEBUG_MORE)) + #ifndef BUILD_NO_DEBUG + if (loglevelActiveFor(LOG_LEVEL_DEBUG_MORE)) { addLog(LOG_LEVEL_DEBUG_MORE, element.txt[x]); + } + #endif } } diff --git a/src/_P015_TSL2561.ino b/src/_P015_TSL2561.ino index 39d34449b..6766e1b95 100644 --- a/src/_P015_TSL2561.ino +++ b/src/_P015_TSL2561.ino @@ -152,7 +152,9 @@ boolean Plugin_015(uint8_t function, struct EventStruct *event, String& string) UserVar[event->BaseVarIndex + 3]); // ir_broadband_ratio if (P015_SLEEP) { +#ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_DEBUG_MORE, F("TSL2561: sleeping...")); +#endif P015_data->setPowerDown(); } } diff --git a/src/_P038_NeoPixel.ino b/src/_P038_NeoPixel.ino index ba21876ad..6048bc68f 100644 --- a/src/_P038_NeoPixel.ino +++ b/src/_P038_NeoPixel.ino @@ -102,10 +102,9 @@ boolean Plugin_038(uint8_t function, struct EventStruct *event, String& string) initPluginTaskData(event->TaskIndex, new (std::nothrow) P038_data_struct(CONFIG_PIN1, P038_CONFIG_LEDCOUNT, P038_CONFIG_STRIPTYPE)); P038_data_struct *P038_data = static_cast(getPluginTaskData(event->TaskIndex)); - if (nullptr == P038_data) { - return success; - } - success = P038_data->plugin_init(event); + if (nullptr != P038_data) { + success = P038_data->plugin_init(event); + } break; } @@ -114,10 +113,9 @@ boolean Plugin_038(uint8_t function, struct EventStruct *event, String& string) { P038_data_struct *P038_data = static_cast(getPluginTaskData(event->TaskIndex)); - if (nullptr == P038_data) { - return success; + if (nullptr != P038_data) { + success = P038_data->plugin_exit(event); } - success = P038_data->plugin_exit(event); break; } @@ -126,10 +124,9 @@ boolean Plugin_038(uint8_t function, struct EventStruct *event, String& string) { P038_data_struct *P038_data = static_cast(getPluginTaskData(event->TaskIndex)); - if (nullptr == P038_data) { - return success; + if (nullptr != P038_data) { + success = P038_data->plugin_write(event, string); } - success = P038_data->plugin_write(event, string); break; } diff --git a/src/src/ControllerQueue/C015_queue_element.h b/src/src/ControllerQueue/C015_queue_element.h index 8b70fd305..825ad9eec 100644 --- a/src/src/ControllerQueue/C015_queue_element.h +++ b/src/src/ControllerQueue/C015_queue_element.h @@ -13,7 +13,7 @@ struct EventStruct; /*********************************************************************************************\ * C015_queue_element for queueing requests for 015: Blynk -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ class C015_queue_element { diff --git a/src/src/ControllerQueue/DelayQueueElements.cpp b/src/src/ControllerQueue/DelayQueueElements.cpp index 17eec061d..62cc342a2 100644 --- a/src/src/ControllerQueue/DelayQueueElements.cpp +++ b/src/src/ControllerQueue/DelayQueueElements.cpp @@ -46,7 +46,6 @@ void exit_mqtt_delay_queue() { * C001_queue_element for queueing requests for C001. \*********************************************************************************************/ #ifdef USES_C001 -# define C001_queue_element simple_queue_element_string_only DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 1) // -V522 #endif // ifdef USES_C001 @@ -54,7 +53,6 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 1) // -V522 * C003_queue_element for queueing requests for C003 Nodo Telnet. \*********************************************************************************************/ #ifdef USES_C003 -# define C003_queue_element simple_queue_element_string_only DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 3) // -V522 #endif // ifdef USES_C003 @@ -63,7 +61,6 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 4) // -V522 #endif // ifdef USES_C004 #ifdef USES_C007 -# define C007_queue_element queue_element_formatted_uservar DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 7) // -V522 #endif // ifdef USES_C007 @@ -71,25 +68,22 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 7) // -V522 /*********************************************************************************************\ * C008_queue_element for queueing requests for 008: Generic HTTP -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C008 -# define C008_queue_element queue_element_single_value_base DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 8) // -V522 #endif // ifdef USES_C008 #ifdef USES_C009 -# define C009_queue_element queue_element_formatted_uservar DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP(00, 9) // -V522 #endif // ifdef USES_C009 /*********************************************************************************************\ * C010_queue_element for queueing requests for 010: Generic UDP -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C010 -# define C010_queue_element queue_element_single_value_base DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP( 0, 10) // -V522 #endif // ifdef USES_C010 @@ -105,10 +99,9 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP( 0, 11) // -V522 /*********************************************************************************************\ * C012_queue_element for queueing requests for 012: Blynk -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C012 -# define C012_queue_element queue_element_single_value_base DEFINE_Cxxx_DELAY_QUEUE_MACRO_CPP( 0, 12) // -V522 #endif // ifdef USES_C012 diff --git a/src/src/ControllerQueue/DelayQueueElements.h b/src/src/ControllerQueue/DelayQueueElements.h index e0e9f74d9..a56cd96ac 100644 --- a/src/src/ControllerQueue/DelayQueueElements.h +++ b/src/src/ControllerQueue/DelayQueueElements.h @@ -54,14 +54,14 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 3) #endif // ifdef USES_C003 #ifdef USES_C004 -# include "../ControllerQueue/queue_element_formatted_uservar.h" -# define C004_queue_element queue_element_formatted_uservar +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C004_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 4) #endif // ifdef USES_C004 #ifdef USES_C007 -# include "../ControllerQueue/queue_element_formatted_uservar.h" -# define C007_queue_element queue_element_formatted_uservar +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C007_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 7) #endif // ifdef USES_C007 @@ -69,28 +69,28 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 7) /*********************************************************************************************\ * C008_queue_element for queueing requests for 008: Generic HTTP -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C008 -#include "../ControllerQueue/queue_element_single_value_base.h" -# define C008_queue_element queue_element_single_value_base +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C008_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 8) #endif // ifdef USES_C008 #ifdef USES_C009 -# include "../ControllerQueue/queue_element_formatted_uservar.h" -# define C009_queue_element queue_element_formatted_uservar +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C009_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO(00, 9) #endif // ifdef USES_C009 /*********************************************************************************************\ * C010_queue_element for queueing requests for 010: Generic UDP -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C010 -#include "../ControllerQueue/queue_element_single_value_base.h" -# define C010_queue_element queue_element_single_value_base +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C010_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO( 0, 10) #endif // ifdef USES_C010 @@ -107,11 +107,11 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO( 0, 11) /*********************************************************************************************\ * C012_queue_element for queueing requests for 012: Blynk -* Using queue_element_single_value_base +* Using SimpleQueueElement_formatted_Strings \*********************************************************************************************/ #ifdef USES_C012 -#include "../ControllerQueue/queue_element_single_value_base.h" -# define C012_queue_element queue_element_single_value_base +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C012_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO( 0, 12) #endif // ifdef USES_C012 @@ -142,8 +142,8 @@ DEFINE_Cxxx_DELAY_QUEUE_MACRO(0, 16) #ifdef USES_C017 -# include "../ControllerQueue/queue_element_formatted_uservar.h" -# define C017_queue_element queue_element_formatted_uservar +# include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" +# define C017_queue_element SimpleQueueElement_formatted_Strings DEFINE_Cxxx_DELAY_QUEUE_MACRO(0, 17) #endif // ifdef USES_C017 diff --git a/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp new file mode 100644 index 000000000..9933f852d --- /dev/null +++ b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp @@ -0,0 +1,98 @@ +#include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" + +#include "../DataStructs/ESPEasy_EventStruct.h" + +SimpleQueueElement_formatted_Strings::SimpleQueueElement_formatted_Strings(struct EventStruct *event) : + idx(event->idx), + TaskIndex(event->TaskIndex), + controller_idx(event->ControllerIndex), + sensorType(event->sensorType), + valuesSent(0) +{ + #ifdef USE_SECOND_HEAP + HeapSelectIram ephemeral; + #endif + + valueCount = getValueCountForTask(TaskIndex); + + for (uint8_t i = 0; i < valueCount; ++i) { + txt[i] = formatUserVarNoCheck(event, i); + } +} + +SimpleQueueElement_formatted_Strings::SimpleQueueElement_formatted_Strings(const struct EventStruct *event, uint8_t value_count) : + idx(event->idx), + TaskIndex(event->TaskIndex), + controller_idx(event->ControllerIndex), + sensorType(event->sensorType), + valuesSent(0), + valueCount(value_count) {} + +SimpleQueueElement_formatted_Strings::SimpleQueueElement_formatted_Strings(SimpleQueueElement_formatted_Strings&& rval) + : idx(rval.idx), _timestamp(rval._timestamp), TaskIndex(rval.TaskIndex), + controller_idx(rval.controller_idx), sensorType(rval.sensorType), + valuesSent(rval.valuesSent), valueCount(rval.valueCount) +{ + #ifdef USE_SECOND_HEAP + HeapSelectIram ephemeral; + #endif + + for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { + txt[i] = std::move(rval.txt[i]); + } +} + +SimpleQueueElement_formatted_Strings& SimpleQueueElement_formatted_Strings::operator=(SimpleQueueElement_formatted_Strings&& rval) { + idx = rval.idx; + _timestamp = rval._timestamp; + TaskIndex = rval.TaskIndex; + controller_idx = rval.controller_idx; + sensorType = rval.sensorType; + valuesSent = rval.valuesSent; + valueCount = rval.valueCount; + + for (size_t i = 0; i < VARS_PER_TASK; ++i) { + #ifdef USE_SECOND_HEAP + HeapSelectIram ephemeral; + if (rval.txt[i].length() && !mmu_is_iram(&(rval.txt[i][0]))) { + txt[i] = rval.txt[i]; + } else { + txt[i] = std::move(rval.txt[i]); + } + #else + txt[i] = std::move(rval.txt[i]); + #endif // ifdef USE_SECOND_HEAP + } + return *this; +} + +bool SimpleQueueElement_formatted_Strings::checkDone(bool succesfull) const { + if (succesfull) { ++valuesSent; } + return valuesSent >= valueCount || valuesSent >= VARS_PER_TASK; +} + +size_t SimpleQueueElement_formatted_Strings::getSize() const { + size_t total = sizeof(*this); + + for (int i = 0; i < VARS_PER_TASK; ++i) { + total += txt[i].length(); + } + return total; +} + +bool SimpleQueueElement_formatted_Strings::isDuplicate(const SimpleQueueElement_formatted_Strings& rval) const { + if ((rval.controller_idx != controller_idx) || + (rval.TaskIndex != TaskIndex) || + (rval.sensorType != sensorType) || + (rval.valueCount != valueCount) || + (rval.idx != idx)) { + return false; + } + + for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { + if (rval.txt[i] != txt[i]) { + return false; + } + } + return true; +} diff --git a/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.h b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.h new file mode 100644 index 000000000..833f5e649 --- /dev/null +++ b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.h @@ -0,0 +1,64 @@ +#ifndef CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H +#define CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H + + +#include "../../ESPEasy_common.h" +#include "../CustomBuild/ESPEasyLimits.h" +#include "../DataStructs/DeviceStruct.h" +#include "../DataStructs/UnitMessageCount.h" +#include "../Globals/CPlugins.h" +#include "../Globals/Plugins.h" + +struct EventStruct; + +/*********************************************************************************************\ +* Base element class for keeping task value strings in a controller queue +* Can also be used for controllers only sending a single value at a time. +\*********************************************************************************************/ +class SimpleQueueElement_formatted_Strings { +public: + + SimpleQueueElement_formatted_Strings() = default; + + // Constructor formatting the task values using the default formatter + SimpleQueueElement_formatted_Strings(struct EventStruct *event); + + // Constructor not formatting the values + SimpleQueueElement_formatted_Strings(const struct EventStruct *event, + uint8_t value_count); + + +#ifdef USE_SECOND_HEAP + SimpleQueueElement_formatted_Strings(const SimpleQueueElement_formatted_Strings& rval) = default; +#else + SimpleQueueElement_formatted_Strings(const SimpleQueueElement_formatted_Strings& rval) = delete; +#endif + + SimpleQueueElement_formatted_Strings(SimpleQueueElement_formatted_Strings&& rval); + + SimpleQueueElement_formatted_Strings& operator=(SimpleQueueElement_formatted_Strings&& other); + + + // For controllers that only send a single value per request and thus need to keep track of the number of values already sent. + bool checkDone(bool succesfull) const; + + size_t getSize() const; + + bool isDuplicate(const SimpleQueueElement_formatted_Strings& other) const; + + const UnitMessageCount_t * getUnitMessageCount() const { + return nullptr; + } + + String txt[VARS_PER_TASK]; + int idx = 0; + unsigned long _timestamp = millis(); + taskIndex_t TaskIndex = INVALID_TASK_INDEX; + controllerIndex_t controller_idx = INVALID_CONTROLLER_INDEX; + Sensor_VType sensorType = Sensor_VType::SENSOR_TYPE_NONE; + mutable uint8_t valuesSent = 0; // Value must be set by const function checkDone() + uint8_t valueCount = 0; +}; + + +#endif // CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H diff --git a/src/src/ControllerQueue/queue_element_formatted_uservar.cpp b/src/src/ControllerQueue/queue_element_formatted_uservar.cpp deleted file mode 100644 index afd52778a..000000000 --- a/src/src/ControllerQueue/queue_element_formatted_uservar.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "../ControllerQueue/queue_element_formatted_uservar.h" - -#include "../DataStructs/ESPEasy_EventStruct.h" -#include "../Helpers/StringConverter.h" -#include "../../_Plugin_Helper.h" - - -queue_element_formatted_uservar::queue_element_formatted_uservar(queue_element_formatted_uservar&& other) - : - idx(other.idx), - _timestamp(other._timestamp), - TaskIndex(other.TaskIndex), - controller_idx(other.controller_idx), - sensorType(other.sensorType), - valueCount(other.valueCount) -{ - #ifdef USE_SECOND_HEAP - HeapSelectIram ephemeral; - #endif - - for (size_t i = 0; i < VARS_PER_TASK; ++i) { - txt[i] = std::move(other.txt[i]); - } -} - -queue_element_formatted_uservar::queue_element_formatted_uservar(EventStruct *event) : - idx(event->idx), - TaskIndex(event->TaskIndex), - controller_idx(event->ControllerIndex), - sensorType(event->sensorType) -{ - #ifdef USE_SECOND_HEAP - HeapSelectIram ephemeral; - #endif - - valueCount = getValueCountForTask(TaskIndex); - - for (uint8_t i = 0; i < valueCount; ++i) { - txt[i] = formatUserVarNoCheck(event, i); - } -} - -queue_element_formatted_uservar& queue_element_formatted_uservar::operator=(queue_element_formatted_uservar&& other) { - idx = other.idx; - _timestamp = other._timestamp; - TaskIndex = other.TaskIndex; - controller_idx = other.controller_idx; - sensorType = other.sensorType; - valueCount = other.valueCount; - - for (size_t i = 0; i < VARS_PER_TASK; ++i) { - #ifdef USE_SECOND_HEAP - HeapSelectIram ephemeral; - if (other.txt[i].length() && !mmu_is_iram(&(other.txt[i][0]))) { - txt[i] = other.txt[i]; - } else { - txt[i] = std::move(other.txt[i]); - } - #else - txt[i] = std::move(other.txt[i]); - #endif // ifdef USE_SECOND_HEAP - } - return *this; -} - -size_t queue_element_formatted_uservar::getSize() const { - size_t total = sizeof(*this); - - for (int i = 0; i < VARS_PER_TASK; ++i) { - total += txt[i].length(); - } - return total; -} - -bool queue_element_formatted_uservar::isDuplicate(const queue_element_formatted_uservar& other) const { - if ((other.controller_idx != controller_idx) || - (other.TaskIndex != TaskIndex) || - (other.sensorType != sensorType) || - (other.valueCount != valueCount)) { - return false; - } - - for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { - if (other.txt[i] != txt[i]) { - return false; - } - } - return true; -} diff --git a/src/src/ControllerQueue/queue_element_formatted_uservar.h b/src/src/ControllerQueue/queue_element_formatted_uservar.h deleted file mode 100644 index cd3d6136c..000000000 --- a/src/src/ControllerQueue/queue_element_formatted_uservar.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef CONTROLLERQUEUE_QUEUE_ELEMENT_FORMATTED_USERVAR_H -#define CONTROLLERQUEUE_QUEUE_ELEMENT_FORMATTED_USERVAR_H - -#include "../../ESPEasy_common.h" -#include "../DataStructs/DeviceStruct.h" -#include "../DataStructs/UnitMessageCount.h" -#include "../Globals/CPlugins.h" -#include "../Globals/Plugins.h" - - -struct EventStruct; - -/*********************************************************************************************\ -* For queueing task values already formatted according to the task settings -\*********************************************************************************************/ -class queue_element_formatted_uservar { -public: - - queue_element_formatted_uservar() = default; - -#ifdef USE_SECOND_HEAP - queue_element_formatted_uservar(const queue_element_formatted_uservar& other) = default; -#else - queue_element_formatted_uservar(const queue_element_formatted_uservar& other) = delete; -#endif - - queue_element_formatted_uservar(queue_element_formatted_uservar&& other); - - queue_element_formatted_uservar(struct EventStruct *event); - - queue_element_formatted_uservar& operator=(queue_element_formatted_uservar&& other); - - size_t getSize() const; - - bool isDuplicate(const queue_element_formatted_uservar& other) const; - - const UnitMessageCount_t * getUnitMessageCount() const { - return nullptr; - } - - String txt[VARS_PER_TASK]; - int idx = 0; - unsigned long _timestamp = millis(); - taskIndex_t TaskIndex = INVALID_TASK_INDEX; - controllerIndex_t controller_idx = INVALID_CONTROLLER_INDEX; - Sensor_VType sensorType = Sensor_VType::SENSOR_TYPE_NONE; - uint8_t valueCount = 0; -}; - -#endif // CONTROLLERQUEUE_QUEUE_ELEMENT_FORMATTED_USERVAR_H diff --git a/src/src/ControllerQueue/queue_element_single_value_base.cpp b/src/src/ControllerQueue/queue_element_single_value_base.cpp deleted file mode 100644 index f000dd318..000000000 --- a/src/src/ControllerQueue/queue_element_single_value_base.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "../ControllerQueue/queue_element_single_value_base.h" - -#include "../DataStructs/ESPEasy_EventStruct.h" - -queue_element_single_value_base::queue_element_single_value_base(const struct EventStruct *event, uint8_t value_count) : - idx(event->idx), - TaskIndex(event->TaskIndex), - controller_idx(event->ControllerIndex), - valuesSent(0), - valueCount(value_count) {} - -queue_element_single_value_base::queue_element_single_value_base(queue_element_single_value_base&& rval) - : idx(rval.idx), _timestamp(rval._timestamp), TaskIndex(rval.TaskIndex), - controller_idx(rval.controller_idx), - valuesSent(rval.valuesSent), valueCount(rval.valueCount) -{ - #ifdef USE_SECOND_HEAP - HeapSelectIram ephemeral; - #endif - - for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { - txt[i] = std::move(rval.txt[i]); - } -} - -queue_element_single_value_base& queue_element_single_value_base::operator=(queue_element_single_value_base&& rval) { - idx = rval.idx; - _timestamp = rval._timestamp; - TaskIndex = rval.TaskIndex; - controller_idx = rval.controller_idx; - valuesSent = rval.valuesSent; - valueCount = rval.valueCount; - #ifdef USE_SECOND_HEAP - HeapSelectIram ephemeral; - #endif // ifdef USE_SECOND_HEAP - - for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { - txt[i] = std::move(rval.txt[i]); - } - return *this; -} - -bool queue_element_single_value_base::checkDone(bool succesfull) const { - if (succesfull) { ++valuesSent; } - return valuesSent >= valueCount || valuesSent >= VARS_PER_TASK; -} - -size_t queue_element_single_value_base::getSize() const { - size_t total = sizeof(*this); - - for (int i = 0; i < VARS_PER_TASK; ++i) { - total += txt[i].length(); - } - return total; -} - -bool queue_element_single_value_base::isDuplicate(const queue_element_single_value_base& other) const { - if ((other.controller_idx != controller_idx) || - (other.TaskIndex != TaskIndex) || - (other.valueCount != valueCount) || - (other.idx != idx)) { - return false; - } - - for (uint8_t i = 0; i < VARS_PER_TASK; ++i) { - if (other.txt[i] != txt[i]) { - return false; - } - } - return true; -} diff --git a/src/src/ControllerQueue/queue_element_single_value_base.h b/src/src/ControllerQueue/queue_element_single_value_base.h deleted file mode 100644 index bbe18d164..000000000 --- a/src/src/ControllerQueue/queue_element_single_value_base.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H -#define CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H - - -#include "../../ESPEasy_common.h" -#include "../CustomBuild/ESPEasyLimits.h" -#include "../DataStructs/UnitMessageCount.h" -#include "../Globals/CPlugins.h" -#include "../Globals/Plugins.h" - -struct EventStruct; - -/*********************************************************************************************\ -* Base class for controllers that only send a single value per request and thus needs to -* keep track of the number of values already sent. -\*********************************************************************************************/ -class queue_element_single_value_base { -public: - - queue_element_single_value_base() = default; - - queue_element_single_value_base(const struct EventStruct *event, - uint8_t value_count); - -#ifdef USE_SECOND_HEAP - queue_element_single_value_base(const queue_element_single_value_base& rval) = default; -#else - queue_element_single_value_base(const queue_element_single_value_base& rval) = delete; -#endif - - queue_element_single_value_base(queue_element_single_value_base&& rval); - - queue_element_single_value_base& operator=(queue_element_single_value_base&& other); - - - bool checkDone(bool succesfull) const; - - size_t getSize() const; - - bool isDuplicate(const queue_element_single_value_base& other) const; - - const UnitMessageCount_t * getUnitMessageCount() const { - return nullptr; - } - - String txt[VARS_PER_TASK]; - int idx = 0; - unsigned long _timestamp = millis(); - taskIndex_t TaskIndex = INVALID_TASK_INDEX; - controllerIndex_t controller_idx = INVALID_CONTROLLER_INDEX; - mutable uint8_t valuesSent = 0; // Value must be set by const function checkDone() - uint8_t valueCount = 0; -}; - - -#endif // CONTROLQUEUE_QUEUE_ELEMENT_SINGLE_VALUE_BASE_H diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index a4a17f700..f80a408be 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -178,7 +178,7 @@ bool P037_data_struct::webform_load( addFormSubHeader(F("Topic subscriptions")); // Global topic prefix - addFormTextBox(F("Prefix for all topics"), F("p037_topicprefix"), globalTopicPrefix, 40); + addFormTextBox(F("Prefix for all topics"), F("topicprefix"), globalTopicPrefix, 40); # ifdef P037_JSON_SUPPORT @@ -201,14 +201,14 @@ bool P037_data_struct::webform_load( addHtml(F(" ")); addHtmlInt(varNr + 1); html_TD(); - id = F("p037_template"); + id = F("template"); id += (varNr + 1); addTextBox(id, mqttTopics[varNr], 40, false, false, EMPTY_STRING, F("wide")); html_TD(); - id = F("p037_attribute"); + id = F("attribute"); id += (varNr + 1); addTextBox(id, jsonAttributes[varNr], @@ -220,7 +220,7 @@ bool P037_data_struct::webform_load( { String label = F("MQTT Topic "); label += (varNr + 1); - id = F("p037_template"); + id = F("template"); id += (varNr + 1); addFormTextBox(label, id, mqttTopics[varNr], 40); } @@ -495,7 +495,7 @@ bool P037_data_struct::webform_save( for (uint8_t varNr = 0; varNr < VARS_PER_TASK; varNr++) { - String argName = F("p037_template"); + String argName = F("template"); argName += (varNr + 1); mqttTopics[varNr] = web_server.arg(argName); @@ -503,14 +503,14 @@ bool P037_data_struct::webform_save( # ifdef P037_JSON_SUPPORT if (jsonEnabled) { - argName = F("p037_attribute"); + argName = F("attribute"); argName += (varNr + 1); jsonAttributes[varNr] = web_server.arg(argName); } # endif // P037_JSON_SUPPORT } - globalTopicPrefix = web_server.arg(F("p037_topicprefix")); + globalTopicPrefix = web_server.arg(F("topicprefix")); # if P037_MAPPING_SUPPORT || P037_FILTER_SUPPORT String left, right; @@ -545,8 +545,7 @@ bool P037_data_struct::webform_save( valueArray[mappingOffset] = EMPTY_STRING; } - if ((left.isEmpty() && !right.isEmpty()) || - (!left.isEmpty() && right.isEmpty())) { + if (left.isEmpty() != right.isEmpty()) { if (firstError) { error += F("Name and value should both be filled for mapping "); firstError = false; @@ -592,8 +591,7 @@ bool P037_data_struct::webform_save( valueArray[filterOffset] = EMPTY_STRING; } - if ((left.isEmpty() && !right.isEmpty()) || - (!left.isEmpty() && right.isEmpty())) { + if (left.isEmpty() != right.isEmpty()) { if (firstError) { error += F("Name and value should both be filled for filter "); firstError = false; @@ -656,14 +654,14 @@ String P037_data_struct::mapValue(const String& input, const String& attribute) if (!input.isEmpty()) { parseMappings(); - String operands = P037_OPERAND_LIST; + const String operands = P037_OPERAND_LIST; int8_t idx = 0; for (uint8_t mappingOffset = P037_START_MAPPINGS; mappingOffset <= P037_END_MAPPINGS && idx <= _maxIdx; mappingOffset++) { - String name = parseStringKeepCase(valueArray[mappingOffset], 1, P037_VALUE_SEPARATOR); - String oper = parseString(valueArray[mappingOffset], 2, P037_VALUE_SEPARATOR); - String valu = parseStringKeepCase(valueArray[mappingOffset], 3, P037_VALUE_SEPARATOR); + const String name = parseStringKeepCase(valueArray[mappingOffset], 1, P037_VALUE_SEPARATOR); + const String oper = parseString(valueArray[mappingOffset], 2, P037_VALUE_SEPARATOR); + const String valu = parseStringKeepCase(valueArray[mappingOffset], 3, P037_VALUE_SEPARATOR); if ((name == input) || ((!attribute.isEmpty()) && (name == attribute))) { int8_t operandIndex = operands.indexOf(oper); diff --git a/src/src/PluginStructs/P038_data_struct.cpp b/src/src/PluginStructs/P038_data_struct.cpp index fc18bbe28..904e69341 100644 --- a/src/src/PluginStructs/P038_data_struct.cpp +++ b/src/src/PluginStructs/P038_data_struct.cpp @@ -47,16 +47,21 @@ bool P038_data_struct::plugin_write(struct EventStruct *event, const String& str bool success = false; if (isInitialized()) { - String log; - - if (loglevelActiveFor(LOG_LEVEL_INFO) && - log.reserve(64)) { - log += F("P038 : write - "); - log += string; - addLogMove(LOG_LEVEL_INFO, log); + const String cmd = parseString(string, 1); + if (!cmd.startsWith(F("neo"))) { + return success; } - String cmd = parseString(string, 1); + { + String log; + + if (loglevelActiveFor(LOG_LEVEL_INFO) && + log.reserve(64)) { + log += F("P038 : write - "); + log += string; + addLogMove(LOG_LEVEL_INFO, log); + } + } if (cmd.equals(F("neopixel"))) { // NeoPixel Plugin_038_pixels->setPixelColor(event->Par1 - 1, Plugin_038_pixels->Color(event->Par2, event->Par3, event->Par4, event->Par5)); From e4989725da3b18b77e99157b8cb6fbb2ddd6ddc8 Mon Sep 17 00:00:00 2001 From: TD-er Date: Sat, 11 Jun 2022 00:28:42 +0200 Subject: [PATCH 23/25] [Controller Queue] Add missing includes --- .../ControllerQueue/SimpleQueueElement_formatted_Strings.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp index 9933f852d..dada39c1f 100644 --- a/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp +++ b/src/src/ControllerQueue/SimpleQueueElement_formatted_Strings.cpp @@ -1,6 +1,10 @@ #include "../ControllerQueue/SimpleQueueElement_formatted_Strings.h" #include "../DataStructs/ESPEasy_EventStruct.h" +#include "../Helpers/StringConverter.h" + +#include "../../_Plugin_Helper.h" + SimpleQueueElement_formatted_Strings::SimpleQueueElement_formatted_Strings(struct EventStruct *event) : idx(event->idx), From c5ca9d3344f2ebb8a86bb311a85f80cdaea59a09 Mon Sep 17 00:00:00 2001 From: TD-er Date: Sat, 11 Jun 2022 11:27:42 +0200 Subject: [PATCH 24/25] [PVS Studio] Fix some hints provided by PVS Studio --- src/_P020_Ser2Net.ino | 2 +- src/_P039_Thermosensors.ino | 12 +++++------- src/src/Commands/InternalCommands.cpp | 2 +- src/src/DataStructs_templ/SettingsStruct.cpp | 2 +- src/src/WebServer/NotificationPage.cpp | 2 +- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/_P020_Ser2Net.ino b/src/_P020_Ser2Net.ino index 3838453bf..2344e1b4c 100644 --- a/src/_P020_Ser2Net.ino +++ b/src/_P020_Ser2Net.ino @@ -167,7 +167,7 @@ boolean Plugin_020(uint8_t function, struct EventStruct *event, String& string) const ESPEasySerialPort port = static_cast(CONFIG_PORT); // const ESPEasySerialPort port= ESPEasySerialPort::serial0; - if ((rxPin < 0) && (rxPin < 0)) { + if ((rxPin < 0) && (txPin < 0)) { ESPeasySerialType::getSerialTypePins(port, rxPin, txPin); CONFIG_PIN1 = rxPin; CONFIG_PIN2 = txPin; diff --git a/src/_P039_Thermosensors.ino b/src/_P039_Thermosensors.ino index 61b6e2977..28433f893 100644 --- a/src/_P039_Thermosensors.ino +++ b/src/_P039_Thermosensors.ino @@ -1222,7 +1222,7 @@ float readMax31865(struct EventStruct *event) // read conversion result and faults from plugin data structure // if pointer exists and conversion has been finished - if ((nullptr != P039_data) && (true == P039_data->convReady)) { + if (P039_data->convReady) { rawValue = P039_data->conversionResult; registers[MAX31865_FAULT] = P039_data->deviceFaults; } @@ -1270,14 +1270,12 @@ float readMax31865(struct EventStruct *event) // start time to follow up on BIAS activation before starting the conversion // and start conversion sequence via TIMER API - if(nullptr != P039_data){ - // save current timer for next calculation - P039_data->timer = millis(); + // save current timer for next calculation + P039_data->timer = millis(); - // set next state to MAX31865_BIAS_ON_STATE + // set next state to MAX31865_BIAS_ON_STATE - Scheduler.setPluginTaskTimer(MAX31865_BIAS_WAIT_TIME, event->TaskIndex, MAX31865_BIAS_ON_STATE); - } + Scheduler.setPluginTaskTimer(MAX31865_BIAS_WAIT_TIME, event->TaskIndex, MAX31865_BIAS_ON_STATE); #ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG_MORE)) diff --git a/src/src/Commands/InternalCommands.cpp b/src/src/Commands/InternalCommands.cpp index 42df34a8d..dc5375d47 100644 --- a/src/src/Commands/InternalCommands.cpp +++ b/src/src/Commands/InternalCommands.cpp @@ -194,7 +194,7 @@ bool do_command_case_check(command_case_data & data, if (mustCheckNrArguments) { if (!checkNrArguments(data.cmd, data.line, nrArguments)) { data.status = return_incorrect_nr_arguments(); - data.retval = false; + //data.retval = false; return true; // Command is handled } } diff --git a/src/src/DataStructs_templ/SettingsStruct.cpp b/src/src/DataStructs_templ/SettingsStruct.cpp index a8367929a..28425d28c 100644 --- a/src/src/DataStructs_templ/SettingsStruct.cpp +++ b/src/src/DataStructs_templ/SettingsStruct.cpp @@ -11,7 +11,7 @@ #define DATASTRUCTS_SETTINGSSTRUCT_CPP template -SettingsStruct_tmpl::SettingsStruct_tmpl() : ResetFactoryDefaultPreference(0) { +SettingsStruct_tmpl::SettingsStruct_tmpl() : ResetFactoryDefaultPreference(0) { //-V730 clearAll(); clearNetworkSettings(); } diff --git a/src/src/WebServer/NotificationPage.cpp b/src/src/WebServer/NotificationPage.cpp index 0426d1b76..12d922978 100644 --- a/src/src/WebServer/NotificationPage.cpp +++ b/src/src/WebServer/NotificationPage.cpp @@ -56,7 +56,7 @@ void handle_notifications() { } else { - if (Settings.Notification != 0) + if (Settings.Notification[notificationindex] != 0) { nprotocolIndex_t NotificationProtocolIndex = getNProtocolIndex_from_NotifierIndex(notificationindex); From 67c53fc558119196f74f56ed36e61e54d7780d2c Mon Sep 17 00:00:00 2001 From: TD-er Date: Sat, 11 Jun 2022 11:29:08 +0200 Subject: [PATCH 25/25] [P073, PVS Studio] Fix bug in font handling for Siekoo display Found by PVS Studio --- src/src/PluginStructs/P073_data_struct.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/PluginStructs/P073_data_struct.cpp b/src/src/PluginStructs/P073_data_struct.cpp index b222577f2..b7730bdcb 100644 --- a/src/src/PluginStructs/P073_data_struct.cpp +++ b/src/src/PluginStructs/P073_data_struct.cpp @@ -428,7 +428,7 @@ uint8_t P073_data_struct::mapCharToFontPosition(char character, } else if (isAlpha(character)) { position = character - (isLowerCase(character) ? 'a' : 'A') + 42; } else { - uint8_t idx = specialChars.indexOf(character); + int idx = specialChars.indexOf(character); if (idx > -1) { position = idx + 10;