Merge pull request #4560 from gudnimg/fix-print-paused

Fix pause indicator when print job timer is not used
This commit is contained in:
3d-gussner 2024-01-12 14:41:33 +01:00 committed by GitHub
commit 98889cafbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 45 additions and 27 deletions

View File

@ -279,6 +279,7 @@ extern int fan_speed[2];
#define active_extruder 0 #define active_extruder 0
extern bool mesh_bed_leveling_flag; extern bool mesh_bed_leveling_flag;
extern bool did_pause_print;
// save/restore printing // save/restore printing
extern bool saved_printing; extern bool saved_printing;
@ -310,6 +311,9 @@ extern LongTimer safetyTimer;
// the print is paused, that still counts as a "running" print. // the print is paused, that still counts as a "running" print.
bool printJobOngoing(); bool printJobOngoing();
// Printing is paused according to SD or host indicators
bool printingIsPaused();
bool printer_active(); bool printer_active();
//! Beware - mcode_in_progress is set as soon as the command gets really processed, //! Beware - mcode_in_progress is set as soon as the command gets really processed,

View File

@ -167,6 +167,7 @@ int feedmultiply=100; //100->1 200->2
int extrudemultiply=100; //100->1 200->2 int extrudemultiply=100; //100->1 200->2
bool homing_flag = false; bool homing_flag = false;
bool did_pause_print;
LongTimer safetyTimer; LongTimer safetyTimer;
static LongTimer crashDetTimer; static LongTimer crashDetTimer;
@ -510,9 +511,13 @@ bool __attribute__((noinline)) printJobOngoing() {
return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning()); return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning());
} }
bool printingIsPaused() {
return did_pause_print || print_job_timer.isPaused();
}
bool __attribute__((noinline)) printer_active() { bool __attribute__((noinline)) printer_active() {
return printJobOngoing() return printJobOngoing()
|| print_job_timer.isPaused() || printingIsPaused()
|| saved_printing || saved_printing
|| (lcd_commands_type != LcdCommands::Idle) || (lcd_commands_type != LcdCommands::Idle)
|| MMU2::mmu2.MMU_PRINT_SAVED() || MMU2::mmu2.MMU_PRINT_SAVED()
@ -533,7 +538,7 @@ bool check_fsensor() {
bool __attribute__((noinline)) babystep_allowed() { bool __attribute__((noinline)) babystep_allowed() {
return ( !homing_flag return ( !homing_flag
&& !mesh_bed_leveling_flag && !mesh_bed_leveling_flag
&& !print_job_timer.isPaused() && !printingIsPaused()
&& ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
|| printJobOngoing() || printJobOngoing()
|| lcd_commands_type == LcdCommands::Idle || lcd_commands_type == LcdCommands::Idle
@ -631,7 +636,7 @@ void crashdet_detected(uint8_t mask)
void crashdet_recover() void crashdet_recover()
{ {
if (!print_job_timer.isPaused()) crashdet_restore_print_and_continue(); if (!printingIsPaused()) crashdet_restore_print_and_continue();
crashdet_use_eeprom_setting(); crashdet_use_eeprom_setting();
} }
@ -1725,7 +1730,7 @@ void loop()
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);
} }
if (print_job_timer.isPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_USB) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing. if (printingIsPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_USB) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing.
usb_timer.start(); usb_timer.start();
} }
else if (usb_timer.expired(10000)) { //just need to check if it expired. Nothing else is needed to be done. else if (usb_timer.expired(10000)) { //just need to check if it expired. Nothing else is needed to be done.
@ -1822,7 +1827,7 @@ void loop()
} }
//check heater every n milliseconds //check heater every n milliseconds
manage_heater(); manage_heater();
manage_inactivity(print_job_timer.isPaused()); manage_inactivity(printingIsPaused());
checkHitEndstops(); checkHitEndstops();
lcd_update(0); lcd_update(0);
#ifdef TMC2130 #ifdef TMC2130
@ -3411,7 +3416,7 @@ static void gcode_M600(const bool automatic, const float x_position, const float
fanSpeed = 0; fanSpeed = 0;
// Retract E // Retract E
if (!print_job_timer.isPaused()) if (!printingIsPaused())
{ {
current_position[E_AXIS] += e_shift; current_position[E_AXIS] += e_shift;
plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED); plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
@ -3479,7 +3484,7 @@ static void gcode_M600(const bool automatic, const float x_position, const float
// Feed a little of filament to stabilize pressure // Feed a little of filament to stabilize pressure
if (!automatic) { if (!automatic) {
if (print_job_timer.isPaused()) if (printingIsPaused())
{ {
// Return to retracted state during a pause // Return to retracted state during a pause
// @todo is retraction really needed? E-position is reverted a few lines below // @todo is retraction really needed? E-position is reverted a few lines below
@ -3515,7 +3520,7 @@ static void gcode_M600(const bool automatic, const float x_position, const float
feedmultiply = saved_feedmultiply2; feedmultiply = saved_feedmultiply2;
enquecommandf_P(MSG_M220, saved_feedmultiply2); enquecommandf_P(MSG_M220, saved_feedmultiply2);
if (print_job_timer.isPaused()) lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); if (printingIsPaused()) lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
else lcd_setstatuspgm(MSG_WELCOME); else lcd_setstatuspgm(MSG_WELCOME);
custom_message_type = CustomMsg::Status; custom_message_type = CustomMsg::Status;
} }
@ -5271,7 +5276,7 @@ void process_commands()
### M24 - Start SD print <a href="https://reprap.org/wiki/G-code#M24:_Start.2Fresume_SD_print">M24: Start/resume SD print</a> ### M24 - Start SD print <a href="https://reprap.org/wiki/G-code#M24:_Start.2Fresume_SD_print">M24: Start/resume SD print</a>
*/ */
case 24: case 24:
if (print_job_timer.isPaused()) if (printingIsPaused())
lcd_resume_print(); lcd_resume_print();
else else
{ {
@ -5993,7 +5998,7 @@ Sigma_Exit:
} }
} }
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_USB && print_job_timer.isPaused()) { if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_USB && printingIsPaused()) {
// The print is in a paused state. The print was recovered following a power panic // The print is in a paused state. The print was recovered following a power panic
// but up to this point the printer has been waiting for the M79 from the host // but up to this point the printer has been waiting for the M79 from the host
// Send action to the host, so the host can resume the print. It is up to the host // Send action to the host, so the host can resume the print. It is up to the host
@ -7847,7 +7852,7 @@ Sigma_Exit:
SERIAL_ECHOPGM("Z:"); SERIAL_ECHOPGM("Z:");
SERIAL_ECHOLN(pause_position[Z_AXIS]); SERIAL_ECHOLN(pause_position[Z_AXIS]);
*/ */
if (!print_job_timer.isPaused()) { if (!printingIsPaused()) {
st_synchronize(); st_synchronize();
ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front(); ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front();
cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
@ -7861,7 +7866,7 @@ Sigma_Exit:
*/ */
case 602: case 602:
{ {
if (print_job_timer.isPaused()) lcd_resume_print(); if (printingIsPaused()) lcd_resume_print();
} }
break; break;
@ -9749,7 +9754,7 @@ void ThermalStop(bool allow_recovery)
// Either pause or stop the print // Either pause or stop the print
if(allow_recovery && printJobOngoing()) { if(allow_recovery && printJobOngoing()) {
if (!print_job_timer.isPaused()) { if (!printingIsPaused()) {
lcd_setalertstatuspgm(_T(MSG_PAUSED_THERMAL_ERROR), LCD_STATUS_CRITICAL); lcd_setalertstatuspgm(_T(MSG_PAUSED_THERMAL_ERROR), LCD_STATUS_CRITICAL);
// we cannot make a distinction for the host here, the pause must be instantaneous // we cannot make a distinction for the host here, the pause must be instantaneous

View File

@ -238,7 +238,7 @@ void prusa_statistics(uint8_t _message) {
if (busy_state == PAUSED_FOR_USER) { if (busy_state == PAUSED_FOR_USER) {
prusa_statistics_case0(15); prusa_statistics_case0(15);
} }
else if (print_job_timer.isPaused()) { else if (printingIsPaused()) {
prusa_statistics_case0(14); prusa_statistics_case0(14);
} }
else if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) { else if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) {

View File

@ -558,7 +558,7 @@ uint32_t CardReader::getFileSize()
void CardReader::getStatus(bool arg_P) void CardReader::getStatus(bool arg_P)
{ {
if (print_job_timer.isPaused()) if (printingIsPaused())
{ {
if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD)) if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD))
SERIAL_PROTOCOLLNPGM("SD print paused"); SERIAL_PROTOCOLLNPGM("SD print paused");

View File

@ -368,7 +368,7 @@ void get_command()
} }
// start of serial line processing loop // start of serial line processing loop
while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && print_job_timer.isPaused())) && !cmdqueue_serial_disabled) { //is print is saved (crash detection or filament detection), dont process data from serial line while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && printingIsPaused())) && !cmdqueue_serial_disabled) { //is print is saved (crash detection or filament detection), dont process data from serial line
#ifdef ENABLE_MEATPACK #ifdef ENABLE_MEATPACK
// MeatPack Changes // MeatPack Changes

View File

@ -94,7 +94,7 @@ void fanSpeedError(unsigned char _fan) {
if (printJobOngoing()) { if (printJobOngoing()) {
// A print is ongoing, pause the print normally // A print is ongoing, pause the print normally
if(!print_job_timer.isPaused()) { if(!printingIsPaused()) {
if (usb_timer.running()) if (usb_timer.running())
lcd_pause_usb_print(); lcd_pause_usb_print();
else else

View File

@ -1020,6 +1020,9 @@ void lcd_pause_print()
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_PAUSED); SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_PAUSED);
// Indicate that the printer is paused
did_pause_print = true;
print_job_timer.pause(); print_job_timer.pause();
// return to status is required to continue processing in the main loop! // return to status is required to continue processing in the main loop!
@ -1997,7 +2000,7 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
if (!bFilamentPreheatState) if (!bFilamentPreheatState)
{ {
setTargetHotend(0); setTargetHotend(0);
if (!print_job_timer.isPaused()) setTargetBed(0); if (!printingIsPaused()) setTargetBed(0);
menu_back(); menu_back();
} }
menu_back(); menu_back();
@ -4434,7 +4437,7 @@ static void lcd_settings_menu()
MENU_ITEM_SUBMENU_P(_i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE c=18 MENU_ITEM_SUBMENU_P(_i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE c=18
if (!printer_active() || print_job_timer.isPaused()) if (!printer_active() || printingIsPaused())
{ {
MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_axis);////MSG_MOVE_AXIS c=18 MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_axis);////MSG_MOVE_AXIS c=18
MENU_ITEM_GCODE_P(_i("Disable steppers"), MSG_M84);////MSG_DISABLE_STEPPERS c=18 MENU_ITEM_GCODE_P(_i("Disable steppers"), MSG_M84);////MSG_DISABLE_STEPPERS c=18
@ -4478,7 +4481,7 @@ static void lcd_settings_menu()
MENU_ITEM_TOGGLE_P(_T(MSG_RPI_PORT), (selectedSerialPort == 0) ? _T(MSG_OFF) : _T(MSG_ON), lcd_second_serial_set); MENU_ITEM_TOGGLE_P(_T(MSG_RPI_PORT), (selectedSerialPort == 0) ? _T(MSG_OFF) : _T(MSG_ON), lcd_second_serial_set);
#endif //HAS_SECOND_SERIAL #endif //HAS_SECOND_SERIAL
if (!print_job_timer.isPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z); if (!printingIsPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);
#if (LANG_MODE != 0) #if (LANG_MODE != 0)
MENU_ITEM_SUBMENU_P(_T(MSG_SELECT_LANGUAGE), lcd_language_menu); MENU_ITEM_SUBMENU_P(_T(MSG_SELECT_LANGUAGE), lcd_language_menu);
@ -5008,7 +5011,12 @@ void lcd_resume_print()
Stopped = false; Stopped = false;
restore_print_from_ram_and_continue(default_retraction); restore_print_from_ram_and_continue(default_retraction);
print_job_timer.start();
did_pause_print = false;
// Resume the print job timer if it was running
if (print_job_timer.isPaused()) print_job_timer.start();
refresh_cmd_timeout(); refresh_cmd_timeout();
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint
custom_message_type = CustomMsg::Status; custom_message_type = CustomMsg::Status;
@ -5231,14 +5239,14 @@ static void lcd_main_menu()
MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle); MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle);
} }
} }
if (mesh_bed_leveling_flag == false && homing_flag == false && !print_job_timer.isPaused() && !processing_tcode) { if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) {
if (usb_timer.running()) { if (usb_timer.running()) {
MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print); MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print);
} else if (IS_SD_PRINTING) { } else if (IS_SD_PRINTING) {
MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print); MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);
} }
} }
if(print_job_timer.isPaused()) if(printingIsPaused())
{ {
// only allow resuming if hardware errors (temperature or fan) are cleared // only allow resuming if hardware errors (temperature or fan) are cleared
if(!get_temp_error() if(!get_temp_error()
@ -5253,7 +5261,7 @@ static void lcd_main_menu()
} }
} }
} }
if((printJobOngoing() || print_job_timer.isPaused()) && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { if((printJobOngoing() || printingIsPaused()) && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) {
MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop); MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
} }
#ifdef THERMAL_MODEL #ifdef THERMAL_MODEL
@ -5326,7 +5334,7 @@ static void lcd_main_menu()
MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
} }
MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu); MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu);
if(!print_job_timer.isPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu); if(!printingIsPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu);
} }
MENU_ITEM_SUBMENU_P(_i("Statistics"), lcd_menu_statistics);////MSG_STATISTICS c=18 MENU_ITEM_SUBMENU_P(_i("Statistics"), lcd_menu_statistics);////MSG_STATISTICS c=18
@ -5478,7 +5486,7 @@ static void lcd_tune_menu()
if (!farm_mode) if (!farm_mode)
MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change); MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);
#endif #endif
if (print_job_timer.isPaused()) {// Don't allow rehome if actively printing. Maaaaybe it could work to insert on the fly, seems too risky. if (printingIsPaused()) {// Don't allow rehome if actively printing. Maaaaybe it could work to insert on the fly, seems too risky.
MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME),PSTR("G28 XY")); MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME),PSTR("G28 XY"));
} }
#ifdef FILAMENT_SENSOR #ifdef FILAMENT_SENSOR
@ -5656,7 +5664,7 @@ void lcd_print_stop_finish()
if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament()) if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament())
{ {
if (print_job_timer.isPaused()) if (printingIsPaused())
{ {
// Restore temperature saved in ram after pausing print // Restore temperature saved in ram after pausing print
restore_extruder_temperature_from_ram(); restore_extruder_temperature_from_ram();
@ -5690,6 +5698,7 @@ void print_stop(bool interactive)
#endif #endif
// clear any pending paused state immediately // clear any pending paused state immediately
did_pause_print = false;
print_job_timer.stop(); print_job_timer.stop();
if (interactive) { if (interactive) {