diff --git a/src/_C018.ino b/src/_C018.ino index 93f763c058..61982014ba 100644 --- a/src/_C018.ino +++ b/src/_C018.ino @@ -677,7 +677,7 @@ bool CPlugin_018(CPlugin::Function function, struct EventStruct *event, String& addHtml(C018_data->sysver()); addRowLabel(F("Voltage")); - addHtml(String(static_cast(C018_data->getVbat()) / 1000.0f, 3)); + addHtml(toString(static_cast(C018_data->getVbat()) / 1000.0f, 3)); addRowLabel(F("Dev Addr")); addHtml(C018_data->getDevaddr()); @@ -942,7 +942,7 @@ bool do_process_c018_delay_queue(int controller_number, const C018_queue_element String log = F("LoRaWAN : Payload Length: "); log += pl + 13; // We have a LoRaWAN header of 13 bytes. log += F(" Air Time: "); - log += String(airtime_ms, 3); + log += toString(airtime_ms, 3); log += F(" ms"); addLog(LOG_LEVEL_INFO, log); } diff --git a/src/_P002_ADC.ino b/src/_P002_ADC.ino index c5e2543916..d220817fc5 100644 --- a/src/_P002_ADC.ino +++ b/src/_P002_ADC.ino @@ -142,11 +142,11 @@ boolean Plugin_002(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Point 1"), F("p002_adc1"), P002_CALIBRATION_POINT1, 0, P002_MAX_ADC_VALUE); html_add_estimate_symbol(); - addTextBox(F("p002_out1"), String(P002_CALIBRATION_VALUE1, 3), 10); + addTextBox(F("p002_out1"), toString(P002_CALIBRATION_VALUE1, 3), 10); addFormNumericBox(F("Point 2"), F("p002_adc2"), P002_CALIBRATION_POINT2, 0, P002_MAX_ADC_VALUE); html_add_estimate_symbol(); - addTextBox(F("p002_out2"), String(P002_CALIBRATION_VALUE2, 3), 10); + addTextBox(F("p002_out2"), toString(P002_CALIBRATION_VALUE2, 3), 10); { // Output the statistics for the current settings. @@ -302,7 +302,7 @@ void P002_formatStatistics(const __FlashStringHelper * label, int raw, float flo addRowLabel(label); addHtmlInt(raw); html_add_estimate_symbol(); - addHtml(String(float_value, 3)); + addHtml(toString(float_value, 3)); } #endif // USES_P002 diff --git a/src/_P021_Level.ino b/src/_P021_Level.ino index f073a10cfb..a1a52967d2 100644 --- a/src/_P021_Level.ino +++ b/src/_P021_Level.ino @@ -76,9 +76,9 @@ boolean Plugin_021(uint8_t function, struct EventStruct *event, String& string) addRowLabel(F("Check Value")); addTaskValueSelect(F("p021_value"), PCONFIG(1), PCONFIG(0)); - addFormTextBox(F("Set Level"), F("p021_setvalue"), String(PCONFIG_FLOAT(0)), 8); + addFormTextBox(F("Set Level"), F("p021_setvalue"), toString(PCONFIG_FLOAT(0)), 8); - addFormTextBox(F("Hysteresis"), F("p021_hyst"), String(PCONFIG_FLOAT(1)), 8); + addFormTextBox(F("Hysteresis"), F("p021_hyst"), toString(PCONFIG_FLOAT(1)), 8); addFormCheckBox(F("Save 'Set Level' after change via config command"), F("p021_save_always"), PCONFIG(2) == 0); // inverted // flag! diff --git a/src/_P025_ADS1115.ino b/src/_P025_ADS1115.ino index 06c6630a20..1092905d9b 100644 --- a/src/_P025_ADS1115.ino +++ b/src/_P025_ADS1115.ino @@ -112,11 +112,11 @@ boolean Plugin_025(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Point 1"), F("p025_adc1"), PCONFIG_LONG(0), -32768, 32767); html_add_estimate_symbol(); - addTextBox(F("p025_out1"), String(PCONFIG_FLOAT(0), 3), 10); + addTextBox(F("p025_out1"), toString(PCONFIG_FLOAT(0), 3), 10); addFormNumericBox(F("Point 2"), F("p025_adc2"), PCONFIG_LONG(1), -32768, 32767); html_add_estimate_symbol(); - addTextBox(F("p025_out2"), String(PCONFIG_FLOAT(1), 3), 10); + addTextBox(F("p025_out2"), toString(PCONFIG_FLOAT(1), 3), 10); success = true; break; diff --git a/src/_P050_TCS34725.ino b/src/_P050_TCS34725.ino index 73219d028b..e70d46bb91 100644 --- a/src/_P050_TCS34725.ino +++ b/src/_P050_TCS34725.ino @@ -408,11 +408,11 @@ boolean Plugin_050(uint8_t function, struct EventStruct *event, String& string) nb = static_cast(b) / t * sRGBFactor; P050_data->applyTransformation(nr, ng, nb, &tr, &tg, &tb); } - RuleEvent += String(tr, 4); + RuleEvent += toString(tr, 4); RuleEvent += ','; - RuleEvent += String(tg, 4); + RuleEvent += toString(tg, 4); RuleEvent += ','; - RuleEvent += String(tb, 4); + RuleEvent += toString(tb, 4); break; case 2: sRGBFactor = 255.0f; @@ -423,11 +423,11 @@ boolean Plugin_050(uint8_t function, struct EventStruct *event, String& string) } else { RuleEvent += F("NormSRGB="); } - RuleEvent += String(static_cast(r) / t * sRGBFactor, 4); + RuleEvent += toString(static_cast(r) / t * sRGBFactor, 4); RuleEvent += ','; - RuleEvent += String(static_cast(g) / t * sRGBFactor, 4); + RuleEvent += toString(static_cast(g) / t * sRGBFactor, 4); RuleEvent += ','; - RuleEvent += String(static_cast(b) / t * sRGBFactor, 4); + RuleEvent += toString(static_cast(b) / t * sRGBFactor, 4); break; default: RuleEvent = EMPTY_STRING; diff --git a/src/_P060_MCP3221.ino b/src/_P060_MCP3221.ino index 9a3e4fc514..933696208a 100644 --- a/src/_P060_MCP3221.ino +++ b/src/_P060_MCP3221.ino @@ -73,11 +73,11 @@ boolean Plugin_060(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Point 1"), F("p060_adc1"), PCONFIG_LONG(0), 0, 4095); html_add_estimate_symbol(); - addTextBox(F("p060_out1"), String(PCONFIG_FLOAT(0), 3), 10); + addTextBox(F("p060_out1"), toString(PCONFIG_FLOAT(0), 3), 10); addFormNumericBox(F("Point 2"), F("p060_adc2"), PCONFIG_LONG(1), 0, 4095); html_add_estimate_symbol(); - addTextBox(F("p060_out2"), String(PCONFIG_FLOAT(1), 3), 10); + addTextBox(F("p060_out2"), toString(PCONFIG_FLOAT(1), 3), 10); success = true; break; diff --git a/src/_P067_HX711_Load_Cell.ino b/src/_P067_HX711_Load_Cell.ino index e6f7548a25..67e2f1c703 100644 --- a/src/_P067_HX711_Load_Cell.ino +++ b/src/_P067_HX711_Load_Cell.ino @@ -197,7 +197,7 @@ boolean Plugin_067(uint8_t function, struct EventStruct *event, String& string) } int2float(PCONFIG(1), PCONFIG(2), &valFloat); - addFormTextBox(F("Offset"), F("p067_offset_chanA"), String(valFloat, 3), 25); + addFormTextBox(F("Offset"), F("p067_offset_chanA"), toString(valFloat, 3), 25); addHtml(F("     ↩ Tare: ")); addCheckBox(F("tareChanA"), 0); //always off @@ -212,7 +212,7 @@ boolean Plugin_067(uint8_t function, struct EventStruct *event, String& string) } int2float(PCONFIG(3), PCONFIG(4), &valFloat); - addFormTextBox(F("Offset"), F("p067_offset_chanB"), String(valFloat, 3), 25); + addFormTextBox(F("Offset"), F("p067_offset_chanB"), toString(valFloat, 3), 25); addHtml(F("     ↩ Tare: ")); addCheckBox(F("tareChanB"), 0); //always off @@ -222,11 +222,11 @@ boolean Plugin_067(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Point 1"), F("p067_adc1_chanA"), PCONFIG_LONG(0)); html_add_estimate_symbol(); - addTextBox(F("p067_out1_chanA"), String(PCONFIG_FLOAT(0), 3), 10); + addTextBox(F("p067_out1_chanA"), toString(PCONFIG_FLOAT(0), 3), 10); addFormNumericBox(F("Point 2"), F("p067_adc2_chanA"), PCONFIG_LONG(1)); html_add_estimate_symbol(); - addTextBox(F("p067_out2_chanA"), String(PCONFIG_FLOAT(1), 3), 10); + addTextBox(F("p067_out2_chanA"), toString(PCONFIG_FLOAT(1), 3), 10); //------------ addFormSubHeader(F("Two Point Calibration Channel B")); @@ -235,11 +235,11 @@ boolean Plugin_067(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Point 1"), F("p067_adc1_chanB"), PCONFIG_LONG(2)); html_add_estimate_symbol(); - addTextBox(F("p067_out1_chanB"), String(PCONFIG_FLOAT(2), 3), 10); + addTextBox(F("p067_out1_chanB"), toString(PCONFIG_FLOAT(2), 3), 10); addFormNumericBox(F("Point 2"), F("p067_adc2_chanB"), PCONFIG_LONG(3)); html_add_estimate_symbol(); - addTextBox(F("p067_out2_chanB"), String(PCONFIG_FLOAT(3), 3), 10); + addTextBox(F("p067_out2_chanB"), toString(PCONFIG_FLOAT(3), 3), 10); success = true; break; diff --git a/src/_P073_7DGT.ino b/src/_P073_7DGT.ino index 78412f5e64..b0e8ad458c 100644 --- a/src/_P073_7DGT.ino +++ b/src/_P073_7DGT.ino @@ -1139,7 +1139,7 @@ bool p073_plugin_write_7dn(struct EventStruct *event, const String& text) { switch (P073_data->displayModel) { case P073_TM1637_4DGTCOLON: { if ((event->Par1 > -1000) && (event->Par1 < 10000)) { - P073_data->FillBufferWithNumber(String(round(event->Par1))); + P073_data->FillBufferWithNumber(String(event->Par1)); } else { P073_data->FillBufferWithDash(); diff --git a/src/_P074_TSL2591.ino b/src/_P074_TSL2591.ino index 8d9e1ae50c..d1248105c9 100644 --- a/src/_P074_TSL2591.ino +++ b/src/_P074_TSL2591.ino @@ -270,7 +270,7 @@ boolean Plugin_074(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log = F("TSL2591: Lux: "); - log += String(lux); + log += toString(lux); log += F(" Full: "); log += String(full); log += F(" Visible: "); diff --git a/src/_P076_HLW8012.ino b/src/_P076_HLW8012.ino index 56ca2da550..b16c61995d 100644 --- a/src/_P076_HLW8012.ino +++ b/src/_P076_HLW8012.ino @@ -217,11 +217,11 @@ boolean Plugin_076(uint8_t function, struct EventStruct *event, String &string) if (Plugin076_LoadMultipliers(event->TaskIndex, current, voltage, power)) { addFormSubHeader(F("Calibration Values")); addFormTextBox(F("Current Multiplier"), F("p076_currmult"), - String(current, 2), 25); + doubleToString(current, 2), 25); addFormTextBox(F("Voltage Multiplier"), F("p076_voltmult"), - String(voltage, 2), 25); + doubleToString(voltage, 2), 25); addFormTextBox(F("Power Multiplier"), F("p076_powmult"), - String(power, 2), 25); + doubleToString(power, 2), 25); } success = true; diff --git a/src/_P082_GPS.ino b/src/_P082_GPS.ino index b83e61284e..b213ffd22f 100644 --- a/src/_P082_GPS.ino +++ b/src/_P082_GPS.ino @@ -677,7 +677,7 @@ void P082_html_show_stats(struct EventStruct *event) { P082_html_show_satStats(event, false, false); addRowLabel(F("HDOP")); - addHtml(String(P082_data->gps->hdop.value() / 100.0f)); + addHtml(toString(P082_data->gps->hdop.value() / 100.0f)); addRowLabel(F("UTC Time")); struct tm dateTime; diff --git a/src/_P090_CCS811.ino b/src/_P090_CCS811.ino index b64e9b62a0..41437e0f33 100644 --- a/src/_P090_CCS811.ino +++ b/src/_P090_CCS811.ino @@ -305,7 +305,7 @@ boolean Plugin_090(uint8_t function, struct EventStruct *event, String& string) if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String log = F("CCS811 : Compensating for Temperature: "); - log += String(temperature) + temp + F(" & Humidity: ") + String(humidity) + F("%"); + log += toString(temperature) + temp + F(" & Humidity: ") + toString(humidity) + F("%"); addLog(LOG_LEVEL_DEBUG, log); } #endif // ifndef BUILD_NO_DEBUG diff --git a/src/_P096_eInk.ino b/src/_P096_eInk.ino index 54d9013a6f..6d36fb30a4 100644 --- a/src/_P096_eInk.ino +++ b/src/_P096_eInk.ino @@ -370,7 +370,7 @@ boolean Plugin_096(uint8_t function, struct EventStruct *event, String& string) #ifndef BUILD_NO_DEBUG s.add(usecPassedSince(statisticsTimerStart)); - tmpString += "
Display timings = " + String(s.getAvg()); + tmpString += "
Display timings = " + toString(s.getAvg()); #endif P096_data->eInkScreen.clearBuffer(); P096_data->plugin_096_sequence_in_progress = false; diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index e55a2e085a..5de0b0edf0 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -190,7 +190,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String &string) addUnit(F("V")); addRowLabel(F("Sensor Data")); - addHtml(String(UserVar[event->BaseVarIndex])); + addHtml(toString(UserVar[event->BaseVarIndex])); switch (board_type) { case PH: diff --git a/src/_P109_ThermOLED.ino b/src/_P109_ThermOLED.ino index 5f303cd6e9..99863e40e1 100644 --- a/src/_P109_ThermOLED.ino +++ b/src/_P109_ThermOLED.ino @@ -340,9 +340,9 @@ boolean Plugin_109(byte function, struct EventStruct *event, String& string) } logstr = F("Thermo : Starting status S:"); - logstr += String(UserVar[event->BaseVarIndex]); + logstr += toString(UserVar[event->BaseVarIndex]); logstr += F(", R:"); - logstr += String(UserVar[event->BaseVarIndex + 1]); + logstr += toString(UserVar[event->BaseVarIndex + 1]); addLog(LOG_LEVEL_INFO, logstr); Plugin_109_changed = 1; diff --git a/src/_P112_AS7265x.ino b/src/_P112_AS7265x.ino index 2394e00ad2..2d86f3455b 100644 --- a/src/_P112_AS7265x.ino +++ b/src/_P112_AS7265x.ino @@ -423,7 +423,7 @@ void queueEvent(taskIndex_t TaskIndex, int wavelength, float value) { RuleEvent += '#'; RuleEvent += wavelength; RuleEvent += '='; - RuleEvent += String(value, 2); + RuleEvent += toString(value, 2); eventQueue.add(RuleEvent); } diff --git a/src/_P117_SCD30.ino b/src/_P117_SCD30.ino index 8064b7d522..330bd99d89 100644 --- a/src/_P117_SCD30.ino +++ b/src/_P117_SCD30.ino @@ -91,7 +91,7 @@ boolean Plugin_117(uint8_t function, struct EventStruct *event, String& string) { addFormNumericBox(F("Altitude"), F("plugin_117_SCD30_alt"), PCONFIG(0), 0, 2000); addUnit(F("0..2000 m")); - addFormTextBox(F("Temp offset"), F("plugin_117_SCD30_tmp"), String(PCONFIG_FLOAT(0), 2), 5); + addFormTextBox(F("Temp offset"), F("plugin_117_SCD30_tmp"), toString(PCONFIG_FLOAT(0), 2), 5); addUnit(F("°C")); success = true; break; @@ -185,7 +185,7 @@ boolean Plugin_117(uint8_t function, struct EventStruct *event, String& string) { P117_data->getTemperatureOffset(&temp); log += F("Temp offset: "); - log += String(temp, 2); + log += toString(temp, 2); success = true; } diff --git a/src/src/Commands/Tasks.cpp b/src/src/Commands/Tasks.cpp index 8252c6df0c..0d0af49db5 100644 --- a/src/src/Commands/Tasks.cpp +++ b/src/src/Commands/Tasks.cpp @@ -101,7 +101,7 @@ const __FlashStringHelper * taskValueSet(struct EventStruct *event, const char * UserVar[uservarIndex] = result; } else { // TODO: Get Task description and var name - serialPrintln(String(UserVar[uservarIndex])); + serialPrintln(toString(UserVar[uservarIndex])); } success = true; return return_command_success(); diff --git a/src/src/DataStructs/Web_StreamingBuffer.cpp b/src/src/DataStructs/Web_StreamingBuffer.cpp index 9b5386ee80..5333a08cc6 100644 --- a/src/src/DataStructs/Web_StreamingBuffer.cpp +++ b/src/src/DataStructs/Web_StreamingBuffer.cpp @@ -9,6 +9,7 @@ #include "../Globals/Services.h" #include "../Helpers/ESPEasy_time_calc.h" +#include "../Helpers/Convert.h" #ifdef ESP8266 @@ -43,12 +44,16 @@ Web_StreamingBuffer& Web_StreamingBuffer::operator+=(char a) { return addString(String(a)); } -Web_StreamingBuffer& Web_StreamingBuffer::operator+=(long unsigned int a) { +Web_StreamingBuffer& Web_StreamingBuffer::operator+=(long unsigned int a) { return addString(String(a)); } -Web_StreamingBuffer& Web_StreamingBuffer::operator+=(float a) { - return addString(String(a)); +Web_StreamingBuffer& Web_StreamingBuffer::operator+=(const float& a) { + return addString(toString(a, 2)); +} + +Web_StreamingBuffer& Web_StreamingBuffer::operator+=(const double& a) { + return addString(doubleToString(a)); } Web_StreamingBuffer& Web_StreamingBuffer::operator+=(int a) { diff --git a/src/src/DataStructs/Web_StreamingBuffer.h b/src/src/DataStructs/Web_StreamingBuffer.h index 7757669a71..9af118ede0 100644 --- a/src/src/DataStructs/Web_StreamingBuffer.h +++ b/src/src/DataStructs/Web_StreamingBuffer.h @@ -39,7 +39,8 @@ class Web_StreamingBuffer { // Web_StreamingBuffer& operator=(const String& a); Web_StreamingBuffer& operator+=(char a); Web_StreamingBuffer& operator+=(long unsigned int a); - Web_StreamingBuffer& operator+=(float a); + Web_StreamingBuffer& operator+=(const float& a); + Web_StreamingBuffer& operator+=(const double& a); Web_StreamingBuffer& operator+=(int a); Web_StreamingBuffer& operator+=(uint32_t a); Web_StreamingBuffer& operator+=(const String& a); diff --git a/src/src/ESPEasyCore/ESPEasyWifi.cpp b/src/src/ESPEasyCore/ESPEasyWifi.cpp index 36a7b301a4..ea44e91258 100644 --- a/src/src/ESPEasyCore/ESPEasyWifi.cpp +++ b/src/src/ESPEasyCore/ESPEasyWifi.cpp @@ -677,14 +677,14 @@ void SetWiFiTXpower(float dBm, float rssi) { if (TX_pwr_int != last_log) { last_log = TX_pwr_int; String log = F("WiFi : Set TX power to "); - log += String(dBm, 0); + log += toString(dBm, 0); log += F("dBm"); log += F(" sensitivity: "); - log += String(threshold, 0); + log += toString(threshold, 0); log += F("dBm"); if (rssi < 0) { log += F(" RSSI: "); - log += String(rssi, 0); + log += toString(rssi, 0); log += F("dBm"); } addLog(LOG_LEVEL_DEBUG, log); diff --git a/src/src/Helpers/Convert.cpp b/src/src/Helpers/Convert.cpp index 7546b1be9c..c0c4c023fb 100644 --- a/src/src/Helpers/Convert.cpp +++ b/src/src/Helpers/Convert.cpp @@ -234,17 +234,48 @@ float ul2float(unsigned long ul) /*********************************************************************************************\ Workaround for removing trailing white space when String() converts a float with 0 decimals \*********************************************************************************************/ -String toString(const float& value, uint8_t decimals) +String toString(const float& value, unsigned int decimalPlaces) { - String sValue = String(value, decimals); + // This has been fixed in ESP32 code, not (yet) in ESP8266 code + // https://github.com/espressif/arduino-esp32/pull/6138/files +// #ifdef ESP8266 + char *buf = (char*)malloc(decimalPlaces + 42); + if (nullptr == buf) { + return F("nan"); + } + String sValue(dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf)); + free(buf); +// #else +// String sValue = String(value, decimalPlaces); +// #endif sValue.trim(); return sValue; } -String doubleToString(const double& value, int decimals, bool trimTrailingZeros) { - String res(value, decimals); +String doubleToString(const double& value, unsigned int decimalPlaces, bool trimTrailingZeros) { + // This has been fixed in ESP32 code, not (yet) in ESP8266 code + // https://github.com/espressif/arduino-esp32/pull/6138/files +// #ifdef ESP8266 + unsigned int expectedChars = decimalPlaces + 4; // 1 dot, 2 minus signs and terminating zero + if (value > 1e32 || value < -1e32) { + expectedChars += 308; // Just assume the worst + } else { + expectedChars += 33; + } + char *buf = (char*)malloc(expectedChars); + + if (nullptr == buf) { + return F("nan"); + } + String res(dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf)); + free(buf); + +// #else +// String res(value, decimalPlaces); +// #endif res.trim(); + if (trimTrailingZeros) { int dot_pos = res.lastIndexOf('.'); if (dot_pos != -1) { diff --git a/src/src/Helpers/Convert.h b/src/src/Helpers/Convert.h index e5c1bf8a80..ed9b41ff3f 100644 --- a/src/src/Helpers/Convert.h +++ b/src/src/Helpers/Convert.h @@ -65,9 +65,9 @@ float ul2float(unsigned long ul); /*********************************************************************************************\ Workaround for removing trailing white space when String() converts a float with 0 decimals \*********************************************************************************************/ -String toString(const float& value, uint8_t decimals); +String toString(const float& value, unsigned int decimalPlaces = 2); -String doubleToString(const double& value, int decimals = 2, bool trimTrailingZeros = false); +String doubleToString(const double& value, unsigned int decimalPlaces = 2, bool trimTrailingZeros = false); #endif // HELPERS_CONVERT_H \ No newline at end of file diff --git a/src/src/Helpers/ESPEasyStatistics.cpp b/src/src/Helpers/ESPEasyStatistics.cpp index c8e1070d0b..8aa0ddbb92 100644 --- a/src/src/Helpers/ESPEasyStatistics.cpp +++ b/src/src/Helpers/ESPEasyStatistics.cpp @@ -6,6 +6,7 @@ #include "../DataStructs/TimingStats.h" #include "../WebServer/WebServer.h" #include "../Globals/Protocol.h" +#include "../Helpers/Convert.h" /* void logStatistics(uint8_t loglevel, bool clearStats) { @@ -56,10 +57,10 @@ void stream_json_timing_stats(const TimingStats& stats, long timeSinceLastReset) float call_per_sec = static_cast(count) / static_cast(timeSinceLastReset) * 1000.0f; json_number(F("count"), String(count)); - json_number(F("call-per-sec"), String(call_per_sec)); + json_number(F("call-per-sec"), toString(call_per_sec, 2)); json_number(F("min"), String(minVal)); json_number(F("max"), String(maxVal)); - json_number(F("avg"), String(stats.getAvg())); + json_number(F("avg"), toString(stats.getAvg(), 2)); json_prop(F("unit"), F("usec")); } diff --git a/src/src/Helpers/ESPEasy_time.cpp b/src/src/Helpers/ESPEasy_time.cpp index 78970a1014..74a97b733e 100644 --- a/src/src/Helpers/ESPEasy_time.cpp +++ b/src/src/Helpers/ESPEasy_time.cpp @@ -195,14 +195,14 @@ unsigned long ESPEasy_time::now() { if (loglevelActiveFor(LOG_LEVEL_INFO)) { String log = F("Time set to "); - log += String(unixTime_d, 3); + log += doubleToString(unixTime_d, 3); if ((-86400 < time_offset) && (time_offset < 86400)) { // Only useful to show adjustment if it is less than a day. log += F(" Time adjusted by "); - log += String(time_offset * 1000.0); + log += doubleToString(time_offset * 1000.0); log += F(" msec. Wander: "); - log += String(timeWander, 3); + log += doubleToString(timeWander, 3); log += F(" msec/second"); log += F(" Source: "); log += toString(timeSource); @@ -444,7 +444,7 @@ bool ESPEasy_time::getNtpTime(double& unixTime_d) // We gained more than 1 second in accuracy fractpart += 1.0; } - log += String(fractpart, 3); + log += doubleToString(fractpart, 3); log += F(" seconds"); addLog(LOG_LEVEL_INFO, log); } diff --git a/src/src/Helpers/StringProvider.cpp b/src/src/Helpers/StringProvider.cpp index 699fd15098..ceaa867882 100644 --- a/src/src/Helpers/StringProvider.cpp +++ b/src/src/Helpers/StringProvider.cpp @@ -22,6 +22,7 @@ #include "../Globals/Settings.h" #include "../Globals/WiFi_AP_Candidates.h" +#include "../Helpers/Convert.h" #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" #include "../Helpers/Scheduler.h" @@ -223,11 +224,11 @@ String getValue(LabelType::Enum label) { case LabelType::TIME_SOURCE: return toString(node_time.timeSource); case LabelType::TIME_WANDER: return String(node_time.timeWander, 3); case LabelType::UPTIME: return String(getUptimeMinutes()); - case LabelType::LOAD_PCT: return String(getCPUload()); + case LabelType::LOAD_PCT: return toString(getCPUload(), 2); case LabelType::LOOP_COUNT: return String(getLoopCountPerSec()); case LabelType::CPU_ECO_MODE: return jsonBool(Settings.EcoPowerMode()); - case LabelType::WIFI_TX_MAX_PWR: return String(Settings.getWiFi_TX_power(), 2); - case LabelType::WIFI_CUR_TX_PWR: return String(WiFiEventData.wifi_TX_pwr, 2); + case LabelType::WIFI_TX_MAX_PWR: return toString(Settings.getWiFi_TX_power(), 2); + case LabelType::WIFI_CUR_TX_PWR: return toString(WiFiEventData.wifi_TX_pwr, 2); case LabelType::WIFI_SENS_MARGIN: return String(Settings.WiFi_sensitivity_margin); case LabelType::WIFI_SEND_AT_MAX_TX_PWR:return jsonBool(Settings.UseMaxTXpowerForSending()); case LabelType::WIFI_NR_EXTRA_SCANS: return String(Settings.NumberExtraWiFiScans); diff --git a/src/src/Helpers/SystemVariables.cpp b/src/src/Helpers/SystemVariables.cpp index ab3ad944af..03cfd4076b 100644 --- a/src/src/Helpers/SystemVariables.cpp +++ b/src/src/Helpers/SystemVariables.cpp @@ -23,6 +23,7 @@ #include "../Globals/Settings.h" #include "../Globals/Statistics.h" +#include "../Helpers/Convert.h" #include "../Helpers/Hardware.h" #include "../Helpers/Misc.h" #include "../Helpers/Numerical.h" @@ -150,7 +151,7 @@ void SystemVariables::parseSystemVariables(String& s, boolean useURLencode) case SYSHEAP: value = String(ESP.getFreeHeap()); break; case SYSHOUR: value = String(node_time.hour()); break; case SYSHOUR_0: value = timeReplacement_leadZero(node_time.hour()); break; - case SYSLOAD: value = String(getCPUload()); break; + case SYSLOAD: value = String(getCPUload(), 2); break; case SYSMIN: value = String(node_time.minute()); break; case SYSMIN_0: value = timeReplacement_leadZero(node_time.minute()); break; case SYSMONTH: value = String(node_time.month()); break; diff --git a/src/src/Helpers/_CPlugin_DomoticzHelper.cpp b/src/src/Helpers/_CPlugin_DomoticzHelper.cpp index 3883437a8d..63a06e7844 100644 --- a/src/src/Helpers/_CPlugin_DomoticzHelper.cpp +++ b/src/src/Helpers/_CPlugin_DomoticzHelper.cpp @@ -284,7 +284,7 @@ String serializeDomoticzJson(struct EventStruct *event) } else { json += ','; - json += to_json_object_value(F("Set%20Level"), String(UserVar[event->BaseVarIndex], 2)); + json += to_json_object_value(F("Set%20Level"), toString(UserVar[event->BaseVarIndex], 2)); } break; diff --git a/src/src/PluginStructs/P121_data_struct.cpp b/src/src/PluginStructs/P121_data_struct.cpp index 8e34f8621c..3cedf21126 100644 --- a/src/src/PluginStructs/P121_data_struct.cpp +++ b/src/src/PluginStructs/P121_data_struct.cpp @@ -29,11 +29,11 @@ bool P121_data_struct::begin(int taskid) log += F(" Unique ID: "); log += sensor.sensor_id; log += F(" Max Value: "); - log += String(sensor.max_value); + log += toString(sensor.max_value); log += F(" Min Value: "); - log += String(sensor.min_value); + log += toString(sensor.min_value); log += F(" Resolution: "); - log += String(sensor.resolution); + log += toString(sensor.resolution); addLog(LOG_LEVEL_DEBUG, log); } #endif diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index ea88175865..c9d1efa2b0 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -257,14 +257,14 @@ void handle_advanced() { addUnit(F("dBm")); String note; note = F("Current max: "); - note += String(maxTXpwr, 2); + note += toString(maxTXpwr, 2); note += F(" dBm"); addFormNote(note); addFormNumericBox(LabelType::WIFI_SENS_MARGIN, Settings.WiFi_sensitivity_margin, -20, 30); addUnit(F("dB")); // Relative, thus the unit is dB, not dBm note = F("Adjust TX power to target the AP with (threshold + margin) dBm signal strength. Current threshold: "); - note += String(threshold, 2); + note += toString(threshold, 2); note += F(" dBm"); addFormNote(note); } diff --git a/src/src/WebServer/Markup.cpp b/src/src/WebServer/Markup.cpp index 808af89bd8..c7aa1b1c86 100644 --- a/src/src/WebServer/Markup.cpp +++ b/src/src/WebServer/Markup.cpp @@ -7,6 +7,7 @@ #include "../Globals/Settings.h" +#include "../Helpers/Convert.h" #include "../Helpers/Hardware.h" #include "../Helpers/StringGenerator_GPIO.h" @@ -683,9 +684,9 @@ void addFloatNumberBox(const String& id, float value, float min, float max, uint html += id; html += '\''; html += F(" min="); - html += String(min, nrDecimals); + html += toString(min, nrDecimals); html += F(" max="); - html += String(max, nrDecimals); + html += toString(max, nrDecimals); html += F(" step="); if (stepsize <= 0.0f) { @@ -696,11 +697,11 @@ void addFloatNumberBox(const String& id, float value, float min, float max, uint } html += '1'; } else { - html += String(stepsize, nrDecimals); + html += toString(stepsize, nrDecimals); } html += F(" style='width:7em;' value="); - html += String(value, nrDecimals); + html += toString(value, nrDecimals); #ifdef ENABLE_TOOLTIPS diff --git a/src/src/WebServer/SysInfoPage.cpp b/src/src/WebServer/SysInfoPage.cpp index 8b9a974abb..8ca69c7f48 100644 --- a/src/src/WebServer/SysInfoPage.cpp +++ b/src/src/WebServer/SysInfoPage.cpp @@ -24,6 +24,7 @@ #include "../Globals/RTC.h" #include "../Globals/Settings.h" +#include "../Helpers/Convert.h" #include "../Helpers/ESPEasyStatistics.h" #include "../Helpers/ESPEasy_Storage.h" #include "../Helpers/Hardware.h" @@ -64,7 +65,7 @@ void handle_sysinfo_json() { json_number(F("unit"), String(Settings.Unit)); json_prop(F("time"), node_time.getDateTimeString('-', ':', ' ')); json_prop(F("uptime"), getExtendedValue(LabelType::UPTIME)); - json_number(F("cpu_load"), String(getCPUload())); + json_number(F("cpu_load"), toString(getCPUload())); json_number(F("loop_count"), String(getLoopCountPerSec())); json_close(); diff --git a/src/src/WebServer/TimingStats.cpp b/src/src/WebServer/TimingStats.cpp index 6ff6b29eec..fc890f92d7 100644 --- a/src/src/WebServer/TimingStats.cpp +++ b/src/src/WebServer/TimingStats.cpp @@ -46,7 +46,7 @@ void handle_timingstats() { addHtml(ESPEasy_time::getDateTimeString(startPeriod, '-', ':', ' ', false)); addRowLabelValue(LabelType::LOCAL_TIME); addRowLabel(F("Time span")); - addHtml(String(timespan)); + addHtml(toString(timespan)); addHtml(F(" sec")); addRowLabel(F("*")); addHtml(F("Duty cycle based on average < 1 msec is highly unreliable")); @@ -63,9 +63,9 @@ void format_using_threshhold(unsigned long value) { float value_msec = value / 1000.0f; if (value > TIMING_STATS_THRESHOLD) { - html_B(String(value_msec, 3)); + html_B(toString(value_msec, 3)); } else { - addHtml(String(value_msec, 3)); + addHtml(toString(value_msec, 3)); } } @@ -78,11 +78,11 @@ void stream_html_timing_stats(const TimingStats& stats, long timeSinceLastReset) html_TD(); const float call_per_sec = static_cast(c) / static_cast(timeSinceLastReset) * 1000.0f; const float avg = stats.getAvg(); - addHtml(String(call_per_sec, 2)); + addHtml(toString(call_per_sec, 2)); html_TD(); { const float duty = (call_per_sec * avg / 10000.0f); - String duty_str = String(duty, 2); + String duty_str = toString(duty, 2); if (avg < 1000) { // Unreliable as average is below 1 msec duty_str += '*'; diff --git a/src/src/WebServer/WebServer.cpp b/src/src/WebServer/WebServer.cpp index 3e115cd834..68244c3ff6 100644 --- a/src/src/WebServer/WebServer.cpp +++ b/src/src/WebServer/WebServer.cpp @@ -1024,7 +1024,7 @@ void addSVG_param(const __FlashStringHelper * key, int value) { } void addSVG_param(const __FlashStringHelper * key, float value) { - addSVG_param(key, String(value, 2)); + addSVG_param(key, toString(value, 2)); } void addSVG_param(const __FlashStringHelper * key, const String& value) {