Fix and improve PowerPanic

- No wait for heatup during host print recovery
- No extra Z lift when power panic happens during paused print
  - added an extra EEPROM value
  - fixed `EEPROM_LAST_ITEM`
  - changed EEPROM version to 3.14.0
- Added `reset_uvlo` function
This commit is contained in:
3d-gussner 2024-03-27 09:09:55 +01:00
parent 52275322a2
commit 1ac69247d7
4 changed files with 26 additions and 10 deletions

View File

@ -1516,6 +1516,7 @@ void setup()
eeprom_update_byte_notify((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0);
}
eeprom_init_default_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
eeprom_init_default_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
eeprom_init_default_byte((uint8_t*)EEPROM_SD_SORT, 0);
//mbl_mode_init();
@ -4181,7 +4182,7 @@ void process_commands()
enquecommand_P(MSG_M24);
// Print is recovered, clear the recovery flag
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
reset_uvlo();
} 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
// this will allow g-codes to be processed while in the paused state
@ -11069,7 +11070,7 @@ void restore_print_from_ram_and_continue(float e_move)
set_destination_to_current();
restore_print_file_state();
eeprom_update_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
reset_uvlo();
lcd_setstatuspgm(MSG_WELCOME);
saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
saved_printing = false;
@ -11079,7 +11080,7 @@ void restore_print_from_ram_and_continue(float e_move)
// Cancel the state related to a currently saved print
void cancel_saved_printing()
{
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
reset_uvlo();
saved_start_position[0] = SAVED_START_POSITION_UNSET;
saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
saved_printing = false;

View File

@ -83,7 +83,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
To convert hex to dec https://www.rapidtables.com/convert/number/hex-to-decimal.html
Version: 1.0.2
Version: 3.14.0
---------------------------------------------------------------------------------
@ -382,6 +382,8 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
| 0x0C94 3220 | uint8 | EEPROM_KILL_PENDING_FLAG | 42h, ffh | ffh | Kill pending flag (0x42 magic value) | kill() | D3 Ax0c94 C1
| 0x0C91 3217 | char[3] | EEPROM_FILENAME_EXTENSION | ??? | ffffffffh | DOS 8.3 filename extension | Power Panic | D3 Ax0c91 C1
| 0x0C80 3200 | char[17]| EEPROM_CUSTOM_MENDEL_NAME | Prusa i3 MK3S| ffffffffffffffffff... | Custom Printer Name | | D3 Ax0c80 C17
| 0x0C7F 3199 | bool | EEPROM_UVLO_Z_LIFTED | 00h 0 | 00h | Power Panic Z axis NOT lifted | Power Panic | D3 Ax0c7f C1
| ^ | ^ | ^ | 01h 1 | 01h | Power Panic Z axis lifted | ^ | ^
|Address begin|Bit/Type | Name | Valid values | Default/FactoryReset | Description |Gcode/Function| Debug code
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--:
@ -621,9 +623,10 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
#define EEPROM_KILL_PENDING_FLAG (EEPROM_KILL_MESSAGE-1) //uint8
#define EEPROM_FILENAME_EXTENSION (EEPROM_KILL_PENDING_FLAG - 3) // 3 x char
#define EEPROM_CUSTOM_MENDEL_NAME (EEPROM_FILENAME_EXTENSION-17) //char[17]
#define EEPROM_UVLO_Z_LIFTED (EEPROM_CUSTOM_MENDEL_NAME-1) //bool
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
#define EEPROM_LAST_ITEM EEPROM_FILENAME_EXTENSION
#define EEPROM_LAST_ITEM EEPROM_UVLO_Z_LIFTED
// !!!!!
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
// !!!!!

View File

@ -192,6 +192,9 @@ void uvlo_() {
#endif
// Finally store the "power outage" flag.
if (did_pause_print) {
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 1);
}
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::PENDING_RECOVERY);
// Increment power failure counter
@ -316,16 +319,16 @@ void recover_print(uint8_t automatic) {
bool mbl_was_active = recover_machine_state_after_power_panic();
// Undo PP Z Lift by setting current Z pos to + Z_PAUSE_LIFT
// With first PP or Pause + PP the Z has been already lift.
// After a reboot the printer doesn't know the Z height and we have to set its previous value
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PowerPanic::PENDING_RECOVERY_RETRY) {
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED) == 1 ) {
current_position[Z_AXIS] += Z_PAUSE_LIFT;
}
// Lift the print head ONCE plus Z_PAUSE_LIFT first to avoid collisions with oozed material with the print,
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PowerPanic::PENDING_RECOVERY)
{
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED) == 0) {
enquecommandf_P(PSTR("G1 Z%.3f F800"), current_position[Z_AXIS] + Z_PAUSE_LIFT);
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::PENDING_RECOVERY_RETRY);
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 1);
}
// Home X and Y axes. Homing just X and Y shall not touch the babystep and the world2machine
@ -334,7 +337,10 @@ void recover_print(uint8_t automatic) {
// Set the target bed and nozzle temperatures and wait.
enquecommandf_P(PSTR("M104 S%d"), target_temperature[active_extruder]);
enquecommandf_P(PSTR("M140 S%d"), target_temperature_bed);
//No need to wait for hotend heatup while host printing, as print will pause and wait for host.
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_SD) {
enquecommandf_P(PSTR("M109 S%d"), target_temperature[active_extruder]);
}
enquecommand_P(MSG_M83); //E axis relative mode
// If not automatically recoreverd (long power loss)
@ -488,4 +494,9 @@ void restore_print_from_eeprom(bool mbl_was_active) {
enquecommand_P(PSTR("G4 S0"));
enquecommand_P(PSTR("PRUSA uvlo"));
}
void reset_uvlo() {
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
}
#endif //UVLO_SUPPORT

View File

@ -18,3 +18,4 @@ enum PrintType : uint8_t {
void uvlo_();
void recover_print(uint8_t automatic);
void setup_uvlo_interrupt();
void reset_uvlo();