Skip to content

Commit

Permalink
wizard: Rewrite the wizard handling loop
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wavexx authored and DRracer committed Dec 30, 2022
1 parent a712546 commit 22c0e15
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 59 deletions.
7 changes: 4 additions & 3 deletions Firmware/Marlin_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
108 changes: 53 additions & 55 deletions Firmware/ultralcd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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:
Expand Down Expand Up @@ -4107,47 +4109,43 @@ 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;
}
}

FORCE_BL_ON_END;

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) {
Expand Down
3 changes: 2 additions & 1 deletion Firmware/ultralcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 22c0e15

Please sign in to comment.