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 : "")); (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : ""));
*/ */
if (XdrvMailbox.index >=0 && XdrvMailbox.index < TIMEPROP_NUM_OUTPUTS) { 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); Response_P(PSTR("{\"" D_CMND_TIMEPROP D_CMND_TIMEPROP_SETPOWER "%d\":\"%s\"}"), XdrvMailbox.index, XdrvMailbox.data);
} }

View File

@ -266,58 +266,78 @@ void PIDShowSensor() {
void CmndSetPv(void) { void CmndSetPv(void) {
Pid.last_pv_update_secs = Pid.current_time_secs; 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 // also trigger running the pid algorithm if we have been told to run it each pv sample
if (Pid.update_secs == 0) { if (Pid.update_secs == 0) {
// this runs it at the next second // this runs it at the next second
Pid.run_pid_now = true; Pid.run_pid_now = true;
} }
ResponseCmndFloat(atof(XdrvMailbox.data), 1); ResponseCmndFloat(Pid.pid.getPv(), 1);
} }
void CmndSetSp(void) { void CmndSetSp(void) {
Pid.pid.setSp(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setSp(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getSp(), 1);
} }
void CmndSetPb(void) { void CmndSetPb(void) {
Pid.pid.setPb(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setPb(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getPb(), 1);
} }
void CmndSetTi(void) { void CmndSetTi(void) {
Pid.pid.setTi(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setTi(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getTi(), 1);
} }
void CmndSetTd(void) { void CmndSetTd(void) {
Pid.pid.setTd(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setTd(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getTd(), 1);
} }
void CmndSetInitialInt(void) { void CmndSetInitialInt(void) {
Pid.pid.setInitialInt(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndNumber(atof(XdrvMailbox.data)); Pid.pid.setInitialInt(CharToFloat(XdrvMailbox.data));
}
ResponseCmndNumber(Pid.pid.getInitialInt());
} }
void CmndSetDSmooth(void) { void CmndSetDSmooth(void) {
Pid.pid.setDSmooth(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setDSmooth(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getDSmooth(), 1);
} }
void CmndSetAuto(void) { void CmndSetAuto(void) {
Pid.pid.setAuto(atoi(XdrvMailbox.data)); if (XdrvMailbox.payload >= 0) {
ResponseCmndNumber(atoi(XdrvMailbox.data)); Pid.pid.setAuto(XdrvMailbox.payload);
}
ResponseCmndNumber(Pid.pid.getAuto());
} }
void CmndSetManualPower(void) { void CmndSetManualPower(void) {
Pid.pid.setManualPower(atof(XdrvMailbox.data)); if (XdrvMailbox.data_len > 0) {
ResponseCmndFloat(atof(XdrvMailbox.data), 1); Pid.pid.setManualPower(CharToFloat(XdrvMailbox.data));
}
ResponseCmndFloat(Pid.pid.getManualPower(), 1);
} }
void CmndSetMaxInterval(void) { void CmndSetMaxInterval(void) {
Pid.pid.setMaxInterval(atoi(XdrvMailbox.data)); if (XdrvMailbox.payload >= 0) {
ResponseCmndNumber(atoi(XdrvMailbox.data)); Pid.pid.setMaxInterval(XdrvMailbox.payload);
}
ResponseCmndNumber(Pid.pid.getMaxInterval());
} }
// case CMND_PID_SETUPDATE_SECS: // case CMND_PID_SETUPDATE_SECS:
@ -325,9 +345,12 @@ void CmndSetMaxInterval(void) {
// if (Pid.update_secs < 0) // if (Pid.update_secs < 0)
// Pid.update_secs = 0; // Pid.update_secs = 0;
void CmndSetUpdateSecs(void) { void CmndSetUpdateSecs(void) {
Pid.update_secs = (atoi(XdrvMailbox.data)); if (XdrvMailbox.payload >= 0) {
if (Pid.update_secs < 0) Pid.update_secs = (XdrvMailbox.payload);
}
if (Pid.update_secs < 0) {
Pid.update_secs = 0; Pid.update_secs = 0;
}
ResponseCmndNumber(Pid.update_secs); ResponseCmndNumber(Pid.update_secs);
} }

View File

@ -91,7 +91,7 @@ void SevensegLog(void)
if (strchr( value_level2, '.') == NULL) { if (strchr( value_level2, '.') == NULL) {
sevenseg[unit]->print(atoi(value_level2), DEC); sevenseg[unit]->print(atoi(value_level2), DEC);
} else { } else {
sevenseg[unit]->printFloat(atof(value_level2), 1, DEC); sevenseg[unit]->printFloat(CharToFloat(value_level2), 1, DEC);
} }
sevenseg[unit]->writeDisplay(); sevenseg[unit]->writeDisplay();
unit++; unit++;
@ -266,7 +266,7 @@ void SevensegDrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uin
hasnumber= true; hasnumber= true;
if (outnumtype == FLOAT) { if (outnumtype == FLOAT) {
// Floating point number is given // Floating point number is given
numberf = atof(str+i); numberf = CharToFloat(str+i);
// Find number of fractional digits // Find number of fractional digits
buf= str+i; buf= str+i;
char *cp= strchr(buf, '.'); char *cp= strchr(buf, '.');

View File

@ -351,7 +351,7 @@ bool CmndTM1637Number(bool clear)
position = atoi(sPosition); position = atoi(sPosition);
case 1: case 1:
subStr(sNum, XdrvMailbox.data, ",", 1); subStr(sNum, XdrvMailbox.data, ",", 1);
num = atof(sNum); num = CharToFloat(sNum);
} }
if ((position < 0) || (position > (Settings->display_width - 1))) if ((position < 0) || (position > (Settings->display_width - 1)))
@ -450,7 +450,7 @@ bool CmndTM1637Float(bool clear)
position = atoi(sPosition); position = atoi(sPosition);
case 1: case 1:
subStr(sNum, XdrvMailbox.data, ",", 1); subStr(sNum, XdrvMailbox.data, ",", 1);
fnum = atof(sNum); fnum = CharToFloat(sNum);
} }
if ((position < 0) || (position > (Settings->display_width - 1))) 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; bool query = strlen(XdrvMailbox.data) == 0;
if (!query) 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); 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; bool query = strlen(XdrvMailbox.data) == 0;
if (!query) 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); ResponseCmndFloat(sns_ot_boiler_status.m_hotWaterSetpoint, Settings->flag2.temperature_resolution);
} }