power panic: add readable flags and optimise ISR(INT4_vect)

Add more readable names for the EEPROM_UVLO values

Change in memory:
Flash: -14 bytes
SRAM: 0 bytes
This commit is contained in:
Guðni Már Gilbert 2023-07-16 14:43:08 +00:00 committed by DRracer
parent 4dc5d97ca9
commit 2cd5ab2349
3 changed files with 26 additions and 12 deletions

View File

@ -1457,7 +1457,7 @@ void setup()
}
eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0);
}
eeprom_init_default_byte((uint8_t*)EEPROM_UVLO, 0);
eeprom_init_default_byte((uint8_t*)EEPROM_UVLO, NO_PENDING_RECOVERY);
eeprom_init_default_byte((uint8_t*)EEPROM_SD_SORT, 0);
//mbl_mode_init();
@ -1578,7 +1578,7 @@ void setup()
fw_crash_init();
#ifdef UVLO_SUPPORT
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != 0) { //previous print was terminated by UVLO
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != NO_PENDING_RECOVERY) { //previous print was terminated by UVLO
manage_heater(); // Update temperatures
#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));
@ -1596,7 +1596,7 @@ void setup()
if ( lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false) == LCD_LEFT_BUTTON_CHOICE) {
recover_print(0);
} else {
eeprom_update_byte((uint8_t*)EEPROM_UVLO, 0);
eeprom_update_byte((uint8_t*)EEPROM_UVLO, NO_PENDING_RECOVERY);
lcd_update_enable(true);
lcd_update(2);
lcd_setstatuspgm(MSG_WELCOME);
@ -4149,7 +4149,7 @@ void process_commands()
printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]);
}
else if (code_seen_P(PSTR("uvlo"))) { // PRUSA uvlo
eeprom_update_byte((uint8_t*)EEPROM_UVLO,0);
eeprom_update_byte((uint8_t*)EEPROM_UVLO, NO_PENDING_RECOVERY);
enquecommand_P(MSG_M24);
}
else if (code_seen_P(PSTR("MMURES"))) // PRUSA MMURES
@ -10660,7 +10660,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((uint8_t*)EEPROM_UVLO, 0);
eeprom_update_byte((uint8_t*)EEPROM_UVLO, NO_PENDING_RECOVERY);
saved_start_position[0] = SAVED_START_POSITION_UNSET;
saved_printing_type = PRINTING_TYPE_NONE;
saved_printing = false;

View File

@ -196,7 +196,7 @@ void uvlo_() {
// Note: Recovering a print from EEPROM currently assumes the user
// is printing from an SD card, this is why this EEPROM byte is only set
// when SD card print is detected
if(sd_print) eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1);
if(sd_print) eeprom_update_byte((uint8_t*)EEPROM_UVLO, PENDING_RECOVERY);
// Increment power failure counter
eeprom_increment_byte((uint8_t*)EEPROM_POWER_COUNT);
@ -268,7 +268,7 @@ static void uvlo_tiny() {
}
// Update the the "power outage" flag.
eeprom_update_byte((uint8_t*)EEPROM_UVLO,2);
eeprom_update_byte((uint8_t*)EEPROM_UVLO, PENDING_RECOVERY_RETRY);
// Increment power failure counter
eeprom_update_byte((uint8_t*)EEPROM_POWER_COUNT, eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) + 1);
@ -290,7 +290,7 @@ void setup_uvlo_interrupt() {
EIMSK |= (1 << 4);
// check if power was lost before we armed the interrupt
if(!(PINE & (1 << 4)) && eeprom_read_byte((uint8_t*)EEPROM_UVLO))
if(!(PINE & (1 << 4)) && eeprom_read_byte((uint8_t*)EEPROM_UVLO) != NO_PENDING_RECOVERY)
{
SERIAL_ECHOLNRPGM(MSG_INT4);
uvlo_drain_reset();
@ -300,9 +300,17 @@ void setup_uvlo_interrupt() {
ISR(INT4_vect) {
EIMSK &= ~(1 << 4); //disable INT4 interrupt to make sure that this code will be executed just once
SERIAL_ECHOLNRPGM(MSG_INT4);
//fire normal uvlo only in case where EEPROM_UVLO is 0 or if IS_SD_PRINTING is 1.
if(printer_active() && (!(eeprom_read_byte((uint8_t*)EEPROM_UVLO)))) uvlo_();
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO)) uvlo_tiny();
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == NO_PENDING_RECOVERY)
{
if(printer_active()) {
uvlo_();
}
} else {
// There is already a pending recovery waiting. Power outage in this scenario
// arrives before we can fully recover the print. In that case call a 'tiny'
// version of uvlo_() which doesn't overwrite the print state already waiting in EEPROM
uvlo_tiny();
}
}
void recover_print(uint8_t automatic) {
@ -315,7 +323,7 @@ void recover_print(uint8_t automatic) {
// Lift the print head 25mm, first to avoid collisions with oozed material with the print,
// and second also so one may remove the excess priming material.
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO) == 1)
if(eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PENDING_RECOVERY)
{
enquecommandf_P(PSTR("G1 Z%.3f F800"), current_position[Z_AXIS] + 25);
}

View File

@ -1,5 +1,11 @@
#pragma once
enum PowerPanicFlag : uint8_t {
NO_PENDING_RECOVERY = 0,
PENDING_RECOVERY = 1, // First power panic, print state is saved in EEPROM
PENDING_RECOVERY_RETRY = 2, // Power outage occured during recovery, print is still saved in EEPROM
};
void uvlo_();
void recover_print(uint8_t automatic);
void setup_uvlo_interrupt();