From 3a00054c55973ec064858ee39fc5e297ba5359d6 Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Sun, 28 Mar 2021 16:41:46 +0200 Subject: [PATCH] Show the axes invoved during crash detection Explicitly show which axes are affected on the status line when a crash has been detected. When the crash recovery prompt is triggered, also show all axes which have been affected during the detection interval (currently X, Y, or both). The timer detection has been simplified to match the MK3 optical filament timeout handling, which makes more sense: a crash immediately following a crash recovery prompt will trigger the prompt again. The timer needs to properly expire in order to reset the crash count. This helps crash detection tuning (and help users reporting issues with crash detection) without having to monitor the serial line. This currently abuses the MSG_CRASH_DETECTED message by prepending the [X][Y] labels to the message, which is ok in english but might not translate that well for all languages. --- Firmware/Marlin_main.cpp | 52 +++++++++++++++++++++++++--------------- Firmware/messages.cpp | 2 +- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b900492b4..92e0cd332 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -598,23 +598,18 @@ void crashdet_detected(uint8_t mask) { st_synchronize(); static uint8_t crashDet_counter = 0; + static uint8_t crashDet_axes = 0; bool automatic_recovery_after_crash = true; + char msg[LCD_WIDTH+1] = ""; - if (crashDet_counter++ == 0) { - crashDetTimer.start(); - } - else if (crashDetTimer.expired(CRASHDET_TIMER * 1000ul)){ - crashDetTimer.stop(); - crashDet_counter = 0; - } - else if(crashDet_counter == CRASHDET_COUNTER_MAX){ - automatic_recovery_after_crash = false; - crashDetTimer.stop(); - crashDet_counter = 0; - } - else { - crashDetTimer.start(); - } + if (crashDetTimer.expired(CRASHDET_TIMER * 1000ul)) { + crashDet_counter = 0; + } + if(++crashDet_counter >= CRASHDET_COUNTER_MAX) { + automatic_recovery_after_crash = false; + } + crashDetTimer.start(); + crashDet_axes |= mask; lcd_update_enable(true); lcd_clear(); @@ -624,18 +619,23 @@ void crashdet_detected(uint8_t mask) { eeprom_update_byte((uint8_t*)EEPROM_CRASH_COUNT_X, eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X) + 1); eeprom_update_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT, eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT) + 1); + strcat(msg, "X"); } if (mask & Y_AXIS_MASK) { eeprom_update_byte((uint8_t*)EEPROM_CRASH_COUNT_Y, eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y) + 1); eeprom_update_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) + 1); + strcat(msg, "Y"); } - - lcd_update_enable(true); lcd_update(2); - lcd_setstatuspgm(_T(MSG_CRASH_DETECTED)); + + // prepare the status message with the _current_ axes stauts + strcat(msg, " "); + strcat_P(msg, _T(MSG_CRASH_DETECTED)); + lcd_setstatus(msg); + gcode_G28(true, true, false); //home X and Y st_synchronize(); @@ -643,7 +643,21 @@ void crashdet_detected(uint8_t mask) enquecommand_P(PSTR("CRASH_RECOVER")); }else{ setTargetHotend(0, active_extruder); - bool yesno = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Crash detected. Resume print?"), false);////MSG_CRASH_RESUME c=20 r=3 + + // notify the user of *all* the axes previously affected, not just the last one + lcd_update_enable(false); + lcd_clear(); + if (crashDet_axes & X_AXIS_MASK) lcd_putc('X'); + if (crashDet_axes & Y_AXIS_MASK) lcd_putc('Y'); + crashDet_axes = 0; + lcd_putc(' '); + lcd_puts_P(_T(MSG_CRASH_DETECTED)); + + // ask whether to resume printing + lcd_set_cursor(0, 1); + lcd_puts_P(MSG_RESUME_PRINT); + lcd_putc('?'); + bool yesno = lcd_show_yes_no_and_wait(false); lcd_update_enable(true); if (yesno) { diff --git a/Firmware/messages.cpp b/Firmware/messages.cpp index 9bf313bbc..807bdbb28 100644 --- a/Firmware/messages.cpp +++ b/Firmware/messages.cpp @@ -24,7 +24,7 @@ const char MSG_COMMUNITY_MADE[] PROGMEM_I1 = ISTR("Community made"); ////c=18 const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8 const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////c=18 const char MSG_CRASH[] PROGMEM_I1 = ISTR("Crash"); ////c=7 -const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 +const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=17 r=1 const char MSG_CRASHDETECT[] PROGMEM_I1 = ISTR("Crash det."); ////c=13 const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////c=10 const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17