Fix PID-Control parameter destruction

Fix PID-Control parameter destruction and replace all atof() by CharToFloat() saving 8k code size (#17618)
This commit is contained in:
Theo Arends 2023-01-06 14:58:19 +01:00
parent 33d6dbed3d
commit af733afbe5
5 changed files with 53 additions and 30 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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, '.');

View File

@ -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)))

View File

@ -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);
}