diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 00ed7e29..fcb66455 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6770,24 +6770,23 @@ void serialecho_temperatures() { void uvlo_() { SERIAL_ECHOLNPGM("UVLO"); save_print_to_eeprom(); - float current_position_bckp[2]; - int feedrate_bckp = feedrate; - current_position_bckp[X_AXIS] = st_get_position_mm(X_AXIS); - current_position_bckp[Y_AXIS] = st_get_position_mm(Y_AXIS); + // feedrate in mm/min + int feedrate_bckp = blocks_queued() ? (block_buffer[block_buffer_tail].nominal_speed * 60.f) : feedrate; - eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0), current_position_bckp[X_AXIS]); - eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position_bckp[Y_AXIS]); + disable_x(); + disable_y(); + planner_abort_hard(); + + eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0), current_position[X_AXIS]); + eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]); eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z), current_position[Z_AXIS]); EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]); eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, target_temperature_bed); eeprom_update_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED, fanSpeed); - disable_x(); - disable_y(); - planner_abort_hard(); // Because the planner_abort_hard() initialized current_position[Z] from the stepper, // Z baystep is no more applied. Reset it. - babystep_reset(); + //babystep_reset(); // Clean the input command queue. cmdqueue_reset(); card.sdprinting = false; @@ -6798,11 +6797,13 @@ void uvlo_() { plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400, active_extruder); st_synchronize(); current_position[Z_AXIS] += UVLO_Z_AXIS_SHIFT; + eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 40, active_extruder); - st_synchronize(); - disable_z(); - eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); - delay(10); + // Move the print head to the side of the print until all the power stored in the power supply capacitors is depleted. + current_position[X_AXIS] = (current_position[X_AXIS] < 0.5f * (X_MIN_POS + X_MAX_POS)) ? X_MIN_POS : X_MAX_POS; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 500, active_extruder); + st_synchronize(); +// disable_z(); SERIAL_ECHOLNPGM("UVLO - end"); cli(); @@ -6876,7 +6877,9 @@ void recover_print() { current_position[Z_AXIS] = z_pos; plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - + if (current_position[Z_AXIS] < 25) + // Lift the print head, so one may remove the excess priming material. + enquecommand_P(PSTR("G1 Z25 F800")); enquecommand_P(PSTR("G28 X")); enquecommand_P(PSTR("G28 Y")); sprintf_P(cmd, PSTR("M109 S%d"), target_temperature[active_extruder]); @@ -6931,10 +6934,10 @@ void restore_print_from_eeprom() { SERIAL_ECHOPGM("Position read from eeprom:"); MYSERIAL.println(position); - enquecommand_P(PSTR("M24")); //M24 - Start SD print sprintf_P(cmd, PSTR("M26 S%lu"), position); - enquecommand(cmd); + enquecommand_P(PSTR("M24")); //M24 - Start SD print + enquecommand_P(PSTR("M83")); //E axis relative mode strcpy(cmd, "G1 X"); strcat(cmd, ftostr32(x_rec));