TM: Pause the print and allow recovery from a thermal error
Do not allow resuming until all thermal and fan errors are clear. Call the appropriate resume function when resuming a printing depending on the saved_print state (is saved_print is available, then we always need to resume from the saved state even when printing via usb). Clear the Stopped state when resuming, so that commands can be accepted again.
This commit is contained in:
parent
f454d1ecf2
commit
b9fc73c4c3
@ -9989,7 +9989,7 @@ void ThermalStop(bool pause)
|
|||||||
Stopped = true;
|
Stopped = true;
|
||||||
if(pause && (IS_SD_PRINTING || usb_timer.running())) {
|
if(pause && (IS_SD_PRINTING || usb_timer.running())) {
|
||||||
if (!isPrintPaused) {
|
if (!isPrintPaused) {
|
||||||
// we cannot make a distinction for an host here, the pause must be instantaneous
|
// we cannot make a distinction for the host here, the pause must be instantaneous
|
||||||
lcd_pause_print();
|
lcd_pause_print();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -10005,7 +10005,9 @@ void ThermalStop(bool pause)
|
|||||||
// higher-priority alert status message)
|
// higher-priority alert status message)
|
||||||
LCD_MESSAGERPGM(_T(MSG_STOPPED));
|
LCD_MESSAGERPGM(_T(MSG_STOPPED));
|
||||||
|
|
||||||
Sound_MakeCustom(1000,0,true);
|
// Make a warning sound! We cannot use Sound_MakeCustom as this would stop further moves.
|
||||||
|
// Turn on the speaker here (if not already), and turn it off when back in the main loop.
|
||||||
|
WRITE(BEEPER, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return to the status screen to stop any pending menu action which could have been
|
// Return to the status screen to stop any pending menu action which could have been
|
||||||
@ -10857,8 +10859,14 @@ void long_pause() //long pause print
|
|||||||
plan_buffer_line_curposXYZE(50);
|
plan_buffer_line_curposXYZE(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// did we come here from a thermal error?
|
||||||
|
if(get_temp_error()) {
|
||||||
|
// time to stop the error beep
|
||||||
|
WRITE(BEEPER, LOW);
|
||||||
|
} else {
|
||||||
// Turn off the print fan
|
// Turn off the print fan
|
||||||
fanSpeed = 0;
|
fanSpeed = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialecho_temperatures() {
|
void serialecho_temperatures() {
|
||||||
|
@ -161,6 +161,7 @@ const char MSG_IR_UNKNOWN[] PROGMEM_I1 = ISTR("unknown state");////MSG_IR_UNKNOW
|
|||||||
#endif
|
#endif
|
||||||
#ifdef TEMP_MODEL
|
#ifdef TEMP_MODEL
|
||||||
extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");////c=20
|
extern const char MSG_THERMAL_ANOMALY[] PROGMEM_I1 = ISTR("THERMAL ANOMALY");////c=20
|
||||||
|
extern const char MSG_PAUSED_THERMAL_ERROR[] PROGMEM_I1 = ISTR("PAUSED THERMAL ERROR");////c=20
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//not internationalized messages
|
//not internationalized messages
|
||||||
|
@ -170,6 +170,7 @@ extern const char MSG_IR_UNKNOWN[];
|
|||||||
#endif
|
#endif
|
||||||
#ifdef TEMP_MODEL
|
#ifdef TEMP_MODEL
|
||||||
extern const char MSG_THERMAL_ANOMALY[];
|
extern const char MSG_THERMAL_ANOMALY[];
|
||||||
|
extern const char MSG_PAUSED_THERMAL_ERROR[];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//not internationalized messages
|
//not internationalized messages
|
||||||
|
@ -512,6 +512,11 @@ void set_temp_error(TempErrorSource source, uint8_t index, TempErrorType type)
|
|||||||
temp_error_state.assert = true;
|
temp_error_state.assert = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_temp_error()
|
||||||
|
{
|
||||||
|
return temp_error_state.v;
|
||||||
|
}
|
||||||
|
|
||||||
void handle_temp_error();
|
void handle_temp_error();
|
||||||
|
|
||||||
void manage_heater()
|
void manage_heater()
|
||||||
@ -1751,8 +1756,11 @@ void handle_temp_error()
|
|||||||
#ifdef TEMP_MODEL
|
#ifdef TEMP_MODEL
|
||||||
case TempErrorType::model:
|
case TempErrorType::model:
|
||||||
if(temp_error_state.assert) {
|
if(temp_error_state.assert) {
|
||||||
// TODO: do something meaningful
|
if(IsStopped() == false) {
|
||||||
|
lcd_setalertstatuspgm(MSG_PAUSED_THERMAL_ERROR, LCD_STATUS_CRITICAL);
|
||||||
SERIAL_ECHOLNPGM("TM: error triggered!");
|
SERIAL_ECHOLNPGM("TM: error triggered!");
|
||||||
|
}
|
||||||
|
ThermalStop(true);
|
||||||
WRITE(BEEPER, HIGH);
|
WRITE(BEEPER, HIGH);
|
||||||
} else {
|
} else {
|
||||||
temp_error_state.v = 0;
|
temp_error_state.v = 0;
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
void soft_pwm_init(); //initialize the soft pwm isr
|
void soft_pwm_init(); //initialize the soft pwm isr
|
||||||
void temp_mgr_init(); //initialize the temperature handler
|
void temp_mgr_init(); //initialize the temperature handler
|
||||||
void manage_heater(); //it is critical that this is called periodically.
|
void manage_heater(); //it is critical that this is called periodically.
|
||||||
|
bool get_temp_error(); //return true if any thermal error is set
|
||||||
|
|
||||||
extern bool checkAllHotends(void);
|
extern bool checkAllHotends(void);
|
||||||
|
|
||||||
|
@ -5698,16 +5698,20 @@ static bool fan_error_selftest()
|
|||||||
void lcd_resume_print()
|
void lcd_resume_print()
|
||||||
{
|
{
|
||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
lcd_reset_alert_level(); //for fan speed error
|
lcd_reset_alert_level();
|
||||||
if (fan_error_selftest()) {
|
|
||||||
|
// ensure thermal issues (temp or fan) are resolved before we allow to resume
|
||||||
|
if (get_temp_error() || fan_error_selftest()) {
|
||||||
if (usb_timer.running()) SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
|
if (usb_timer.running()) SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
|
||||||
return; //abort if error persists
|
return; // abort if error persists
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdqueue_serial_disabled = false;
|
cmdqueue_serial_disabled = false;
|
||||||
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
|
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
custom_message_type = CustomMsg::Resuming;
|
custom_message_type = CustomMsg::Resuming;
|
||||||
isPrintPaused = false;
|
isPrintPaused = false;
|
||||||
|
Stopped = false; // resume processing USB commands again
|
||||||
restore_print_from_ram_and_continue(default_retraction);
|
restore_print_from_ram_and_continue(default_retraction);
|
||||||
pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation
|
pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation
|
||||||
refresh_cmd_timeout();
|
refresh_cmd_timeout();
|
||||||
@ -5899,14 +5903,16 @@ static void lcd_main_menu()
|
|||||||
}
|
}
|
||||||
if(isPrintPaused)
|
if(isPrintPaused)
|
||||||
{
|
{
|
||||||
|
// only allow resuming if hardware errors (temperature or fan) are cleared
|
||||||
|
if(!get_temp_error()
|
||||||
#ifdef FANCHECK
|
#ifdef FANCHECK
|
||||||
if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
|
&& ((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
|
||||||
#endif //FANCHECK
|
#endif //FANCHECK
|
||||||
{
|
) {
|
||||||
if (usb_timer.running()) {
|
if (saved_printing) {
|
||||||
MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);
|
|
||||||
} else {
|
|
||||||
MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);
|
MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);
|
||||||
|
} else {
|
||||||
|
MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6332,6 +6338,15 @@ void print_stop()
|
|||||||
}
|
}
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
|
||||||
|
// did we come here from a thermal error?
|
||||||
|
if(get_temp_error()) {
|
||||||
|
// time to stop the error beep
|
||||||
|
WRITE(BEEPER, LOW);
|
||||||
|
} else {
|
||||||
|
// Turn off the print fan
|
||||||
|
fanSpeed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (mmu_enabled) extr_unload(); //M702 C
|
if (mmu_enabled) extr_unload(); //M702 C
|
||||||
finishAndDisableSteppers(); //M84
|
finishAndDisableSteppers(); //M84
|
||||||
axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
|
axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
|
||||||
|
Loading…
Reference in New Issue
Block a user