|
@@ -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) {
|