diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 4e0511c19..da0cf7376 100755
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -1857,7 +1857,7 @@ void loop()
}
#ifdef FANCHECK
- if (fan_check_error && isPrintPaused)
+ if (fan_check_error && isPrintPaused && !IS_SD_PRINTING)
{
KEEPALIVE_STATE(PAUSED_FOR_USER);
host_keepalive(); //prevent timeouts since usb processing is disabled until print is resumed. This is for a crude way of pausing a print on all hosts.
@@ -3763,12 +3763,14 @@ There are reasons why some G Codes aren't in numerical order.
void process_commands()
{
#ifdef FANCHECK
- if(fan_check_error == EFCE_DETECTED){
- fan_check_error = EFCE_REPORTED;
- // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
- lcd_pause_print();
- cmdqueue_serial_disabled = true;
- }
+ if(fan_check_error == EFCE_DETECTED)
+ {
+ fan_check_error = EFCE_REPORTED;
+ if (is_usb_printing)
+ lcd_pause_usb_print();
+ else
+ lcd_pause_print();
+ }
#endif
if (!buflen) return; //empty command
@@ -8154,11 +8156,17 @@ Sigma_Exit:
/*!
### M602 - Resume print M602: Resume print
*/
- case 602: {
- if (isPrintPaused)
- lcd_resume_print();
- }
- break;
+ case 602:
+ {
+ if (isPrintPaused)
+ {
+ if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
+ lcd_resume_print();
+ else
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //inform octoprint of pause
+ }
+ }
+ break;
/*!
### M603 - Stop print M603: Stop print
diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp
index 0cb12f54e..1fbeb83b7 100755
--- a/Firmware/ultralcd.cpp
+++ b/Firmware/ultralcd.cpp
@@ -1526,10 +1526,9 @@ void lcd_return_to_status()
eFilamentAction = FilamentAction::None; // i.e. non-autoLoad
}
-//! @brief Pause print, disable nozzle heater, move to park position
+//! @brief Pause print, disable nozzle heater, move to park position, send host action "paused"
void lcd_pause_print()
{
- SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint
stop_and_save_print_to_ram(0.0, -default_retraction);
lcd_return_to_status();
isPrintPaused = true;
@@ -1537,12 +1536,13 @@ void lcd_pause_print()
{
lcd_commands_type = LcdCommands::LongPause;
}
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
}
-//! @brief Pause USB/host print, disable nozzle heater, move to park position
+//! @brief Send host action "pause"
void lcd_pause_usb_print()
{
- SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //pause for octoprint
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE);
}
@@ -6482,7 +6482,7 @@ static bool fan_error_selftest()
return 0;
}
-//! @brief Resume paused print
+//! @brief Resume paused print, send host action "resumed"
//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(),
//! as restore_print_from_ram_and_continue() calls lcd_update() internally.
void lcd_resume_print()
@@ -6490,23 +6490,23 @@ void lcd_resume_print()
lcd_return_to_status();
lcd_reset_alert_level(); //for fan speed error
if (fan_error_selftest()) return; //abort if error persists
- cmdqueue_serial_disabled = false;
+ cmdqueue_serial_disabled = false;
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
st_synchronize();
lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); ////MSG_RESUMING_PRINT c=20
- isPrintPaused = false;
restore_print_from_ram_and_continue(default_retraction);
pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation
refresh_cmd_timeout();
- SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint
+ isPrintPaused = false;
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //trigger octoprint to resume print
}
-//! @brief Resume paused USB/host print
+//! @brief Resume paused USB/host print, send host action "resume"
void lcd_resume_usb_print()
{
- SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUME); //resume octoprint
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUME); //resume octoprint
}
static void change_sheet()
@@ -6673,7 +6673,7 @@ static void lcd_main_menu()
if (farm_mode)
MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8
- if ( moves_planned() || IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal))
+ if ( moves_planned() || PRINTER_ACTIVE || isPrintPaused)
{
MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE
} else
@@ -6683,14 +6683,14 @@ static void lcd_main_menu()
if (mesh_bed_leveling_flag == false && homing_flag == false && !isPrintPaused)
{
- if (IS_SD_PRINTING)
- {
- MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);////MSG_PAUSE_PRINT c=18
- }
- else if (is_usb_printing)
+ if (is_usb_printing)
{
MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print);////MSG_PAUSE_PRINT c=18
}
+ else if (IS_SD_PRINTING)
+ {
+ MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);////MSG_PAUSE_PRINT c=18
+ }
}
if(isPrintPaused)
{
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index 62aed6dff..f262107da 100755
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -44,6 +44,7 @@ void lcd_change_success();
void lcd_loading_color();
void lcd_sdcard_stop();
void lcd_pause_print();
+void lcd_pause_usb_print();
void lcd_resume_print();
void lcd_print_stop();
void prusa_statistics(int _message, uint8_t _col_nr = 0);