diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index f8c85fbc9..19e66c674 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -1047,33 +1047,26 @@ void Temperature::init() { int heater_index = heater_id >= 0 ? heater_id : EXTRUDERS; // If the target temperature changes, restart - if (tr_target_temperature[heater_index] != target_temperature) - *state = TRReset; + if (tr_target_temperature[heater_index] != target_temperature) { + tr_target_temperature[heater_index] = target_temperature; + *state = target_temperature > 0 ? TRFirstHeating : TRInactive; + } switch (*state) { - case TRReset: - *timer = 0; - *state = TRInactive; // Inactive state waits for a target temperature to be set - case TRInactive: - if (target_temperature > 0) { - tr_target_temperature[heater_index] = target_temperature; - *state = TRFirstHeating; - } - break; + case TRInactive: break; // When first heating, wait for the temperature to be reached then go to Stable state case TRFirstHeating: - if (temperature >= tr_target_temperature[heater_index]) *state = TRStable; - break; + if (temperature < tr_target_temperature[heater_index]) break; + *state = TRStable; // While the temperature is stable watch for a bad temperature case TRStable: - // If the temperature is over the target (-hysteresis) restart the timer - if (temperature >= tr_target_temperature[heater_index] - hysteresis_degc) - *timer = millis(); - // If the timer goes too long without a reset, trigger shutdown - else if (ELAPSED(millis(), *timer + period_seconds * 1000UL)) + if (temperature < tr_target_temperature[heater_index] - hysteresis_degc && ELAPSED(millis(), *timer)) *state = TRRunaway; - break; + else { + *timer = millis() + period_seconds * 1000UL; + break; + } case TRRunaway: _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), PSTR(MSG_THERMAL_RUNAWAY)); } diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 41e4ac16f..a178f1fed 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -358,17 +358,17 @@ class Temperature { #if ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED - typedef enum TRState { TRReset, TRInactive, TRFirstHeating, TRStable, TRRunaway } TRstate; + typedef enum TRState { TRInactive, TRFirstHeating, TRStable, TRRunaway } TRstate; void thermal_runaway_protection(TRState* state, millis_t* timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc); #if ENABLED(THERMAL_PROTECTION_HOTENDS) - TRState thermal_runaway_state_machine[EXTRUDERS] = { TRReset }; + TRState thermal_runaway_state_machine[EXTRUDERS] = { TRInactive }; millis_t thermal_runaway_timer[EXTRUDERS] = { 0 }; #endif #if HAS_THERMALLY_PROTECTED_BED - TRState thermal_runaway_bed_state_machine = TRReset; + TRState thermal_runaway_bed_state_machine = TRInactive; millis_t thermal_runaway_bed_timer; #endif