From af733afbe5ea3a5e6af2915b7d26fbe841e8ce3b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 6 Jan 2023 14:58:19 +0100 Subject: [PATCH] Fix PID-Control parameter destruction Fix PID-Control parameter destruction and replace all atof() by CharToFloat() saving 8k code size (#17618) --- .../tasmota_xdrv_driver/xdrv_48_timeprop.ino | 2 +- tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino | 69 ++++++++++++------- .../tasmota_xdsp_display/xdsp_11_sevenseg.ino | 4 +- .../tasmota_xdsp_display/xdsp_15_tm1637.ino | 4 +- .../tasmota_xsns_sensor/xsns_69_opentherm.ino | 4 +- 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_48_timeprop.ino b/tasmota/tasmota_xdrv_driver/xdrv_48_timeprop.ino index ab11f6c52..22f25623f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_48_timeprop.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_48_timeprop.ino @@ -205,7 +205,7 @@ bool TimepropCommand() (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : "")); */ if (XdrvMailbox.index >=0 && XdrvMailbox.index < TIMEPROP_NUM_OUTPUTS) { - timeprops[XdrvMailbox.index].setPower( atof(XdrvMailbox.data), Tprop.current_time_secs ); + timeprops[XdrvMailbox.index].setPower( CharToFloat(XdrvMailbox.data), Tprop.current_time_secs ); } Response_P(PSTR("{\"" D_CMND_TIMEPROP D_CMND_TIMEPROP_SETPOWER "%d\":\"%s\"}"), XdrvMailbox.index, XdrvMailbox.data); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino b/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino index dcc226cd2..b2d48a2cd 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino @@ -105,7 +105,7 @@ // with just one relay then this will be 1. // USE_TIMEPROP will be automativally included. You must set the output as // explained in xdrv_48_timeprop.ino - // To disable, override to false in user_config_override.h. If USE_TIMEPROP is + // To disable, override to false in user_config_override.h. If USE_TIMEPROP is // not explicitly defined, then it will not be added by default. #define PID_USE_LOCAL_SENSOR // If defined then the local sensor will be used for pv. Leave undefined if @@ -266,58 +266,78 @@ void PIDShowSensor() { void CmndSetPv(void) { Pid.last_pv_update_secs = Pid.current_time_secs; - Pid.pid.setPv(atof(XdrvMailbox.data), Pid.last_pv_update_secs); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setPv(CharToFloat(XdrvMailbox.data), Pid.last_pv_update_secs); + } // also trigger running the pid algorithm if we have been told to run it each pv sample if (Pid.update_secs == 0) { // this runs it at the next second Pid.run_pid_now = true; } - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + ResponseCmndFloat(Pid.pid.getPv(), 1); } void CmndSetSp(void) { - Pid.pid.setSp(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setSp(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getSp(), 1); } void CmndSetPb(void) { - Pid.pid.setPb(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setPb(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getPb(), 1); } void CmndSetTi(void) { - Pid.pid.setTi(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setTi(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getTi(), 1); } void CmndSetTd(void) { - Pid.pid.setTd(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setTd(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getTd(), 1); } void CmndSetInitialInt(void) { - Pid.pid.setInitialInt(atof(XdrvMailbox.data)); - ResponseCmndNumber(atof(XdrvMailbox.data)); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setInitialInt(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndNumber(Pid.pid.getInitialInt()); } void CmndSetDSmooth(void) { - Pid.pid.setDSmooth(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setDSmooth(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getDSmooth(), 1); } void CmndSetAuto(void) { - Pid.pid.setAuto(atoi(XdrvMailbox.data)); - ResponseCmndNumber(atoi(XdrvMailbox.data)); + if (XdrvMailbox.payload >= 0) { + Pid.pid.setAuto(XdrvMailbox.payload); + } + ResponseCmndNumber(Pid.pid.getAuto()); } void CmndSetManualPower(void) { - Pid.pid.setManualPower(atof(XdrvMailbox.data)); - ResponseCmndFloat(atof(XdrvMailbox.data), 1); + if (XdrvMailbox.data_len > 0) { + Pid.pid.setManualPower(CharToFloat(XdrvMailbox.data)); + } + ResponseCmndFloat(Pid.pid.getManualPower(), 1); } void CmndSetMaxInterval(void) { - Pid.pid.setMaxInterval(atoi(XdrvMailbox.data)); - ResponseCmndNumber(atoi(XdrvMailbox.data)); + if (XdrvMailbox.payload >= 0) { + Pid.pid.setMaxInterval(XdrvMailbox.payload); + } + ResponseCmndNumber(Pid.pid.getMaxInterval()); } // case CMND_PID_SETUPDATE_SECS: @@ -325,9 +345,12 @@ void CmndSetMaxInterval(void) { // if (Pid.update_secs < 0) // Pid.update_secs = 0; void CmndSetUpdateSecs(void) { - Pid.update_secs = (atoi(XdrvMailbox.data)); - if (Pid.update_secs < 0) + if (XdrvMailbox.payload >= 0) { + Pid.update_secs = (XdrvMailbox.payload); + } + if (Pid.update_secs < 0) { Pid.update_secs = 0; + } ResponseCmndNumber(Pid.update_secs); } diff --git a/tasmota/tasmota_xdsp_display/xdsp_11_sevenseg.ino b/tasmota/tasmota_xdsp_display/xdsp_11_sevenseg.ino index bb8792259..faeb738d0 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_11_sevenseg.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_11_sevenseg.ino @@ -91,7 +91,7 @@ void SevensegLog(void) if (strchr( value_level2, '.') == NULL) { sevenseg[unit]->print(atoi(value_level2), DEC); } else { - sevenseg[unit]->printFloat(atof(value_level2), 1, DEC); + sevenseg[unit]->printFloat(CharToFloat(value_level2), 1, DEC); } sevenseg[unit]->writeDisplay(); unit++; @@ -266,7 +266,7 @@ void SevensegDrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uin hasnumber= true; if (outnumtype == FLOAT) { // Floating point number is given - numberf = atof(str+i); + numberf = CharToFloat(str+i); // Find number of fractional digits buf= str+i; char *cp= strchr(buf, '.'); diff --git a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino index 0deb8d4a8..b2ec1e80a 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino @@ -351,7 +351,7 @@ bool CmndTM1637Number(bool clear) position = atoi(sPosition); case 1: subStr(sNum, XdrvMailbox.data, ",", 1); - num = atof(sNum); + num = CharToFloat(sNum); } if ((position < 0) || (position > (Settings->display_width - 1))) @@ -450,7 +450,7 @@ bool CmndTM1637Float(bool clear) position = atoi(sPosition); case 1: subStr(sNum, XdrvMailbox.data, ",", 1); - fnum = atof(sNum); + fnum = CharToFloat(sNum); } if ((position < 0) || (position > (Settings->display_width - 1))) diff --git a/tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino b/tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino index d18f51635..f919ebdfb 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino @@ -500,7 +500,7 @@ void sns_opentherm_boiler_setpoint_cmd(void) bool query = strlen(XdrvMailbox.data) == 0; if (!query) { - sns_ot_boiler_status.m_boilerSetpoint = atof(XdrvMailbox.data); + sns_ot_boiler_status.m_boilerSetpoint = CharToFloat(XdrvMailbox.data); } ResponseCmndFloat(sns_ot_boiler_status.m_boilerSetpoint, Settings->flag2.temperature_resolution); } @@ -510,7 +510,7 @@ void sns_opentherm_hot_water_setpoint_cmd(void) bool query = strlen(XdrvMailbox.data) == 0; if (!query) { - sns_ot_boiler_status.m_hotWaterSetpoint = atof(XdrvMailbox.data); + sns_ot_boiler_status.m_hotWaterSetpoint = CharToFloat(XdrvMailbox.data); } ResponseCmndFloat(sns_ot_boiler_status.m_hotWaterSetpoint, Settings->flag2.temperature_resolution); }