Merge pull request #4547 from 3d-gussner/MK3_PL_Fixes

Fix few PrusaLink/PrusaConnect reported issue
This commit is contained in:
3d-gussner 2024-01-29 13:08:26 +01:00 committed by GitHub
commit 6714d4df3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 66 additions and 48 deletions

View File

@ -321,6 +321,7 @@ uint8_t saved_bed_temperature; //!< Bed temperature
bool saved_extruder_relative_mode; bool saved_extruder_relative_mode;
uint8_t saved_fan_speed = 0; //!< Print fan speed uint8_t saved_fan_speed = 0; //!< Print fan speed
//! @} //! @}
static bool uvlo_auto_recovery_ready = false;
static int saved_feedmultiply_mm = 100; static int saved_feedmultiply_mm = 100;
@ -522,7 +523,8 @@ bool __attribute__((noinline)) printer_active() {
|| (lcd_commands_type != LcdCommands::Idle) || (lcd_commands_type != LcdCommands::Idle)
|| MMU2::mmu2.MMU_PRINT_SAVED() || MMU2::mmu2.MMU_PRINT_SAVED()
|| homing_flag || homing_flag
|| mesh_bed_leveling_flag; || mesh_bed_leveling_flag
|| (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY);
} }
// Currently only used in one place, allowed to be inlined // Currently only used in one place, allowed to be inlined
@ -979,7 +981,7 @@ static void fw_crash_init()
if(xfdump_check_state(&crash_reason)) if(xfdump_check_state(&crash_reason))
{ {
// always signal to the host that a dump is available for retrieval // always signal to the host that a dump is available for retrieval
puts_P(_N("// action:dump_available")); puts_P(_N("//action:dump_available"));
#ifdef EMERGENCY_DUMP #ifdef EMERGENCY_DUMP
if(crash_reason != dump_crash_reason::manual && if(crash_reason != dump_crash_reason::manual &&
@ -1584,7 +1586,8 @@ void setup()
#ifdef DEBUG_UVLO_AUTOMATIC_RECOVER #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER
printf_P(_N("Power panic detected!\nCurrent bed temp:%d\nSaved bed temp:%d\n"), (int)degBed(), eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED)); printf_P(_N("Power panic detected!\nCurrent bed temp:%d\nSaved bed temp:%d\n"), (int)degBed(), eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED));
#endif #endif
if ( degBed() > ( (float)eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED) - AUTOMATIC_UVLO_BED_TEMP_OFFSET) ){ uvlo_auto_recovery_ready = (degBed() > ( (float)eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED) - AUTOMATIC_UVLO_BED_TEMP_OFFSET));
if (uvlo_auto_recovery_ready){
#ifdef DEBUG_UVLO_AUTOMATIC_RECOVER #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER
puts_P(_N("Automatic recovery!")); puts_P(_N("Automatic recovery!"));
#endif #endif
@ -1594,7 +1597,7 @@ void setup()
#ifdef DEBUG_UVLO_AUTOMATIC_RECOVER #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER
puts_P(_N("Normal recovery!")); puts_P(_N("Normal recovery!"));
#endif #endif
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PowerPanic::PRINT_TYPE_USB) { if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PowerPanic::PRINT_TYPE_HOST) {
recover_print(0); recover_print(0);
} else { } else {
const uint8_t btn = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false); const uint8_t btn = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false);
@ -1730,7 +1733,7 @@ void loop()
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);
} }
if (printingIsPaused() && 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_HOST) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing.
usb_timer.start(); usb_timer.start();
} }
else if (usb_timer.expired(USB_TIMER_TIMEOUT)) { //just need to check if it expired. Nothing else is needed to be done. else if (usb_timer.expired(USB_TIMER_TIMEOUT)) { //just need to check if it expired. Nothing else is needed to be done.
@ -4126,10 +4129,10 @@ void process_commands()
// M24 - Start SD print // M24 - Start SD print
enquecommand_P(MSG_M24); enquecommand_P(MSG_M24);
// Print is recovered, clear the recovery flag // Print is recovered, clear the recovery flag
eeprom_update_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); eeprom_update_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
} }
else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_USB) else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST)
{ {
// For Host prints we need to start the timer so that the pause has any effect // For Host prints we need to start the timer so that the pause has any effect
// this will allow g-codes to be processed while in the paused state // this will allow g-codes to be processed while in the paused state
@ -5998,12 +6001,18 @@ Sigma_Exit:
} }
} }
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_USB && printingIsPaused()) { if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST
&& eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY
&& 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
// to resume the print correctly. // to resume the print correctly.
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_UVLO_RECOVERY_READY); if (uvlo_auto_recovery_ready) {
SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY);
} else {
SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_RECOVERY_READY);
}
} }
break; break;
@ -10655,7 +10664,7 @@ void save_print_file_state() {
nlines = planner_calc_sd_length(); //number of lines of commands in planner nlines = planner_calc_sd_length(); //number of lines of commands in planner
saved_sdpos -= nlines; saved_sdpos -= nlines;
saved_sdpos -= buflen; //number of blocks in cmd buffer saved_sdpos -= buflen; //number of blocks in cmd buffer
saved_printing_type = PowerPanic::PRINT_TYPE_USB; saved_printing_type = PowerPanic::PRINT_TYPE_HOST;
} }
else { else {
saved_printing_type = PowerPanic::PRINT_TYPE_NONE; saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
@ -10756,7 +10765,7 @@ void restore_print_file_state() {
card.setIndex(saved_sdpos); card.setIndex(saved_sdpos);
sdpos_atomic = saved_sdpos; sdpos_atomic = saved_sdpos;
card.sdprinting = true; card.sdprinting = true;
} else if (saved_printing_type == PowerPanic::PRINT_TYPE_USB) { //was usb printing } else if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //was usb printing
gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
serial_count = 0; serial_count = 0;
FlushSerialRequestResend(); FlushSerialRequestResend();

View File

@ -228,15 +228,16 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////
const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; //// const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////
const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Supervision required."; //// const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Supervision required."; ////
const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; //// const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////
const char MSG_OCTOPRINT_ASK_PAUSE[] PROGMEM_N1 = "// action:pause"; //// const char MSG_HOST_ACTION_ASK_PAUSE[] PROGMEM_N1 = "//action:pause"; ////
const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; //// const char MSG_HOST_ACTION_PAUSED[] PROGMEM_N1 = "//action:paused"; ////
const char MSG_OCTOPRINT_ASK_RESUME[] PROGMEM_N1 = "// action:resume"; //// const char MSG_HOST_ACTION_ASK_RESUME[] PROGMEM_N1 = "//action:resume"; ////
const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; //// const char MSG_HOST_ACTION_RESUMED[] PROGMEM_N1 = "//action:resumed"; ////
const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; //// const char MSG_HOST_ACTION_CANCEL[] PROGMEM_N1 = "//action:cancel"; ////
const char MSG_OCTOPRINT_READY[] PROGMEM_N1 = "// action:ready"; //// const char MSG_HOST_ACTION_READY[] PROGMEM_N1 = "//action:ready"; ////
const char MSG_OCTOPRINT_NOT_READY[] PROGMEM_N1 = "// action:not_ready"; //// const char MSG_HOST_ACTION_NOT_READY[] PROGMEM_N1 = "//action:not_ready"; ////
const char MSG_OCTOPRINT_START[] PROGMEM_N1 = "// action:start"; //// const char MSG_HOST_ACTION_START[] PROGMEM_N1 = "//action:start"; ////
const char MSG_OCTOPRINT_UVLO_RECOVERY_READY[] PROGMEM_N1 = "// action:uvlo_recovery_ready"; //// const char MSG_HOST_ACTION_UVLO_RECOVERY_READY[] PROGMEM_N1 = "//action:uvlo_recovery_ready"; ////
const char MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY[] PROGMEM_N1 = "//action:uvlo_auto_recovery_ready"; ////
#ifdef HOST_SHUTDOWN #ifdef HOST_SHUTDOWN
const char MSG_HOST_ACTION_SHUTDOWN[] PROGMEM_N1 = "//action:shutdown"; //// const char MSG_HOST_ACTION_SHUTDOWN[] PROGMEM_N1 = "//action:shutdown"; ////
#endif //HOST_SHUTOWN #endif //HOST_SHUTOWN

View File

@ -232,15 +232,16 @@ extern const char MSG_ERR_STOPPED[];
extern const char MSG_ENDSTOP_HIT[]; extern const char MSG_ENDSTOP_HIT[];
extern const char MSG_EJECT_FROM_MMU[]; extern const char MSG_EJECT_FROM_MMU[];
extern const char MSG_CUT_FILAMENT[]; extern const char MSG_CUT_FILAMENT[];
extern const char MSG_OCTOPRINT_ASK_PAUSE[]; extern const char MSG_HOST_ACTION_ASK_PAUSE[];
extern const char MSG_OCTOPRINT_PAUSED[]; extern const char MSG_HOST_ACTION_PAUSED[];
extern const char MSG_OCTOPRINT_ASK_RESUME[]; extern const char MSG_HOST_ACTION_ASK_RESUME[];
extern const char MSG_OCTOPRINT_RESUMED[]; extern const char MSG_HOST_ACTION_RESUMED[];
extern const char MSG_OCTOPRINT_CANCEL[]; extern const char MSG_HOST_ACTION_CANCEL[];
extern const char MSG_OCTOPRINT_READY[]; extern const char MSG_HOST_ACTION_READY[];
extern const char MSG_OCTOPRINT_NOT_READY[]; extern const char MSG_HOST_ACTION_NOT_READY[];
extern const char MSG_OCTOPRINT_START[]; extern const char MSG_HOST_ACTION_START[];
extern const char MSG_OCTOPRINT_UVLO_RECOVERY_READY[]; extern const char MSG_HOST_ACTION_UVLO_RECOVERY_READY[];
extern const char MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY[];
#ifdef HOST_SHUTDOWN #ifdef HOST_SHUTDOWN
extern const char MSG_HOST_ACTION_SHUTDOWN[]; extern const char MSG_HOST_ACTION_SHUTDOWN[];
#endif //HOST_SHUTOWN #endif //HOST_SHUTOWN

View File

@ -473,7 +473,7 @@ void restore_print_from_eeprom(bool mbl_was_active) {
// Set a position in the file. // Set a position in the file.
enquecommandf_P(PSTR("M26 S%lu"), position); enquecommandf_P(PSTR("M26 S%lu"), position);
} }
else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_USB) else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST)
{ {
// Set line number // Set line number
enquecommandf_P(PSTR("M110 N%lu"), position); enquecommandf_P(PSTR("M110 N%lu"), position);

View File

@ -10,7 +10,7 @@ enum PowerPanicFlag : uint8_t {
// Types of printjobs possible when power panic is triggered // Types of printjobs possible when power panic is triggered
enum PrintType : uint8_t { enum PrintType : uint8_t {
PRINT_TYPE_SD = 0, PRINT_TYPE_SD = 0,
PRINT_TYPE_USB = 1, PRINT_TYPE_HOST = 1,
PRINT_TYPE_NONE = 2, PRINT_TYPE_NONE = 2,
}; };
} // namespace PowerPanic } // namespace PowerPanic

View File

@ -45,6 +45,8 @@
#include "Prusa_farm.h" #include "Prusa_farm.h"
#include "power_panic.h"
static void lcd_sd_updir(); static void lcd_sd_updir();
static void lcd_mesh_bed_leveling_settings(); static void lcd_mesh_bed_leveling_settings();
#ifdef LCD_BL_PIN #ifdef LCD_BL_PIN
@ -1033,7 +1035,7 @@ void lcd_pause_print()
{ {
stop_and_save_print_to_ram(0.0, -default_retraction); stop_and_save_print_to_ram(0.0, -default_retraction);
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_PAUSED); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED);
// Indicate that the printer is paused // Indicate that the printer is paused
did_pause_print = true; did_pause_print = true;
@ -1048,7 +1050,7 @@ void lcd_pause_print()
//! @brief Send host action "pause" //! @brief Send host action "pause"
void lcd_pause_usb_print() void lcd_pause_usb_print()
{ {
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_ASK_PAUSE); SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_PAUSE);
} }
static void lcd_move_menu_axis(); static void lcd_move_menu_axis();
@ -5033,7 +5035,7 @@ void lcd_resume_print()
if (print_job_timer.isPaused()) print_job_timer.start(); 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_HOST_ACTION_RESUMED);
custom_message_type = CustomMsg::Status; custom_message_type = CustomMsg::Status;
} }
@ -5044,7 +5046,7 @@ void lcd_resume_usb_print()
if (!resume_print_checks()) return; if (!resume_print_checks()) return;
// resume the usb host // resume the usb host
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_ASK_RESUME); SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_RESUME);
} }
static void change_sheet() static void change_sheet()
@ -5151,10 +5153,10 @@ static void lcd_sheet_menu()
static void lcd_printer_ready_state_toggle() static void lcd_printer_ready_state_toggle()
{ {
if (GetPrinterState() == PrinterState::IsReady) { if (GetPrinterState() == PrinterState::IsReady) {
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_NOT_READY); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_NOT_READY);
} }
else { else {
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_READY); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_READY);
} }
} }
@ -5251,12 +5253,12 @@ static void lcd_main_menu()
MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu); MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu);
} else if (!Stopped) { } else if (!Stopped) {
MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT c=18 MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT c=18
} if (M79_timer_get_status()) {
if (GetPrinterState() < PrinterState::IsSDPrinting && M79_timer_get_status()) { if(GetPrinterState() == PrinterState::IsReady) {
if(GetPrinterState() == PrinterState::IsReady) { MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle);
MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle); } else {
} else { 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 && !printingIsPaused() && !processing_tcode) { if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) {
@ -5281,7 +5283,11 @@ static void lcd_main_menu()
} }
} }
} }
if((printJobOngoing() || printingIsPaused()) && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { if((printJobOngoing()
|| printingIsPaused()
|| (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY))
&& (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
@ -5292,6 +5298,7 @@ static void lcd_main_menu()
// only allow starting SD print if hardware errors (temperature or fan) are cleared // only allow starting SD print if hardware errors (temperature or fan) are cleared
if(!get_temp_error() if(!get_temp_error()
&& !printer_active()
#ifdef FANCHECK #ifdef FANCHECK
&& fan_check_error != EFCE_REPORTED && fan_check_error != EFCE_REPORTED
#endif //FANCHECK #endif //FANCHECK
@ -5714,7 +5721,7 @@ void print_stop(bool interactive)
card.sdprinting = false; card.sdprinting = false;
card.closefile(); card.closefile();
} else { } else {
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_CANCEL);
} }
#ifdef MESH_BED_LEVELING #ifdef MESH_BED_LEVELING
@ -7510,6 +7517,6 @@ void lcd_reprint_from_eeprom() {
//! @brief Send host action "start" //! @brief Send host action "start"
void lcd_send_action_start() void lcd_send_action_start()
{ {
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_START); SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_START);
lcd_return_to_status(); lcd_return_to_status();
} }

View File

@ -568,7 +568,7 @@ void __attribute__((noinline)) xyzcal_scan_pixels_32x32_Zhop(int16_t cx, int16_t
xyzcal_lineXYZ_to((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, delay_us, 0); xyzcal_lineXYZ_to((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, delay_us, 0);
sm4_set_dir(X_AXIS, d); sm4_set_dir(X_AXIS, d);
//@size=242 //@size=242
DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep OctoPrint connection alive DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive
lcd_set_cursor(4,3); lcd_set_cursor(4,3);
lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12 lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12