From 22c0e1504718b5a841af6a7d1f53978c20a9609f Mon Sep 17 00:00:00 2001 From: Yuri D'Elia Date: Tue, 27 Dec 2022 11:28:33 +0100 Subject: [PATCH] wizard: Rewrite the wizard handling loop Simplify status tracking: - S::Restore to continue to the next logical wizard item - S::Finish for a successful failure - S::Failed to exit while showing a failure --- Firmware/Marlin_main.cpp | 7 +-- Firmware/ultralcd.cpp | 108 +++++++++++++++++++-------------------- Firmware/ultralcd.h | 3 +- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b4dc9ac5f2..da04ee422b 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -761,9 +761,10 @@ static void factory_reset(char level) case 3: // Level 3: Preparation after being serviced // Force language selection at the next boot up. lang_reset(); - // Force the "Follow calibration flow" message at the next boot up. - calibration_status_store(CALIBRATION_STATUS_Z_CALIBRATION); - eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 2); //run wizard + + // Force the wizard in "Follow calibration flow" mode at the next boot up + calibration_status_clear(CALIBRATION_FORCE_PREP); + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 2); farm_disable(); #ifdef FILAMENT_SENSOR diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 8322d21a96..1a50b89321 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -936,10 +936,8 @@ void lcd_commands() lcd_setstatuspgm(MSG_WELCOME); lcd_commands_step = 0; lcd_commands_type = LcdCommands::Idle; - if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) - { + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) lcd_wizard(WizState::RepeatLay1Cal); - } break; } } @@ -3829,14 +3827,13 @@ void lcd_v2_calibration() void lcd_wizard() { bool result = true; - if (calibration_status() != CALIBRATION_STATUS_ASSEMBLED) { + if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) { + // calibration already performed: ask before clearing the previous status result = !lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Running Wizard will delete current calibration results and start from the beginning. Continue?"), false);////MSG_WIZARD_RERUN c=20 r=7 } if (result) { - calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); lcd_wizard(WizState::Run); - } - else { + } else { lcd_return_to_status(); lcd_update_enable(true); lcd_update(2); @@ -3983,52 +3980,56 @@ void lcd_wizard(WizState state) saved_printing = false; if( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){ + // printer pre-assembled: finish remaining steps lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING)); state = S::Restore; } else { + // new printer, factory reset or manual invocation wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_WELCOME), false, LCD_LEFT_BUTTON_CHOICE); if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { state = S::Restore; eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); - } else { // MIDDLE_BUTTON_CHOICE + calibration_status_clear(CALIBRATION_WIZARD_STEPS); + } else { + // user interrupted eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); end = true; } } break; case S::Restore: - switch (calibration_status()) { - case CALIBRATION_STATUS_ASSEMBLED: state = S::Selftest; break; //run selftest - case CALIBRATION_STATUS_XYZ_CALIBRATION: state = S::Xyz; break; //run xyz cal. - case CALIBRATION_STATUS_Z_CALIBRATION: state = S::Z; break; //run z cal. + // clear any previous error for make _new_ errors visible + lcd_reset_alert_level(); + + // determine the next step in the required order + if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { + state = S::Selftest; + } else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { + // S::Xyz *includes* S::Z so it needs to come before + // to avoid repeating Z alignment + state = S::Xyz; + } else if (!calibration_status_get(CALIBRATION_STATUS_Z)) { + state = S::Z; #ifdef TEMP_MODEL - case CALIBRATION_STATUS_TEMP_MODEL_CALIBRATION: state = S::TempModel; break; //run temp model cal. + } else if (!calibration_status_get(CALIBRATION_STATUS_TEMP_MODEL)) { + state = S::TempModel; #endif //TEMP_MODEL - case CALIBRATION_STATUS_LIVE_ADJUST: state = S::IsFil; break; //run live adjust - case CALIBRATION_STATUS_CALIBRATED: end = true; eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); break; - default: state = S::Selftest; break; //if calibration status is unknown, run wizard from the beginning + } else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) { + state = S::IsFil; + } else { + // all required steps completed, finish successfully + state = S::Finish; } - break; + break; case S::Selftest: lcd_show_fullscreen_message_and_wait_P(_i("First, I will run the selftest to check most common assembly problems."));////MSG_WIZARD_SELFTEST c=20 r=8 wizard_event = lcd_selftest(); - if (wizard_event) { - calibration_status_store(CALIBRATION_STATUS_XYZ_CALIBRATION); - state = S::Xyz; - } - else end = true; + state = (wizard_event ? S::Restore : S::Failed); break; case S::Xyz: lcd_show_fullscreen_message_and_wait_P(_i("I will run xyz calibration now. It will take up to 24 mins."));////MSG_WIZARD_XYZ_CAL c=20 r=8 wizard_event = gcode_M45(false, 0); - if (wizard_event) { -#ifdef TEMP_MODEL - lcd_reset_alert_level(); - state = S::TempModel; -#else - state = S::IsFil; -#endif //TEMP_MODEL - } else end = true; + state = (wizard_event ? S::Restore : S::Failed); break; case S::Z: lcd_show_fullscreen_message_and_wait_P(_i("Please remove shipping helpers first."));////MSG_REMOVE_SHIPPING_HELPERS c=20 r=3 @@ -4039,7 +4040,9 @@ void lcd_wizard(WizState state) lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET)); } wizard_event = gcode_M45(true, 0); - if (wizard_event) { + if (!wizard_event) { + state = S::Failed; + } else { raise_z_above(MIN_Z_FOR_SWAP); //current filament needs to be unloaded and then new filament should be loaded //start to preheat nozzle for unloading remaining PLA filament @@ -4051,9 +4054,8 @@ void lcd_wizard(WizState state) //load filament lcd_wizard_load(); setTargetHotend(0, 0); //we are finished, cooldown nozzle - state = S::Finish; //shipped, no need to set first layer, go to final message directly + state = S::Restore; } - else end = true; break; #ifdef TEMP_MODEL case S::TempModel: @@ -4107,16 +4109,15 @@ void lcd_wizard(WizState state) } else { - lcd_show_fullscreen_message_and_wait_P(_i("If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."));////MSG_ADDITIONAL_SHEETS c=20 r=9 - state = S::Finish; + lcd_show_fullscreen_message_and_wait_P(_i("If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."));////MSG_ADDITIONAL_SHEETS c=20 r=9 + state = S::Restore; } break; case S::Finish: + case S::Failed: eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); end = true; break; - - default: break; } } @@ -4124,30 +4125,27 @@ void lcd_wizard(WizState state) const char *msg = NULL; printf_P(_N("Wizard end state: %d\n"), (uint8_t)state); - switch (state) { //final message - case S::Restore: //printer was already calibrated - msg = _T(MSG_WIZARD_DONE); - break; - case S::Selftest: //selftest - case S::Xyz: //xyz cal. - case S::Z: //z cal. - msg = _T(MSG_WIZARD_CALIBRATION_FAILED); + switch (state) { + case S::Run: + // user interrupted + msg = _T(MSG_WIZARD_QUIT); break; - case S::Finish: //we are finished + + case S::Finish: + // we are successfully finished msg = _T(MSG_WIZARD_DONE); lcd_reset_alert_level(); lcd_setstatuspgm(MSG_WELCOME); - lcd_return_to_status(); + lcd_return_to_status(); break; - case S::Preheat: - case S::Lay1CalCold: - case S::Lay1CalHot: -#ifdef TEMP_MODEL - case S::TempModel: // exiting for calibration -#endif //TEMP_MODEL - break; + + case S::Failed: + // aborted due to failure + msg = _T(MSG_WIZARD_CALIBRATION_FAILED); + break; + default: - msg = _T(MSG_WIZARD_QUIT); + // exiting for later re-entry break; } if (msg) { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index d299adcaab..aec00cc8e0 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -241,7 +241,8 @@ enum class WizState : uint8_t Lay1CalCold, //!< First layer calibration, temperature not selected yet Lay1CalHot, //!< First layer calibration, temperature already selected RepeatLay1Cal, //!< Repeat first layer calibration? - Finish, //!< Deactivate wizard + Finish, //!< Deactivate wizard (success) + Failed, //!< Deactivate wizard (failure) }; void lcd_wizard(WizState state);