| 
						
					 | 
					 | 
					@@ -380,12 +380,13 @@ bool target_direction;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void get_arc_coordinates();
 | 
					 | 
					 | 
					 | 
					void get_arc_coordinates();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool setTargetedHotend(int code);
 | 
					 | 
					 | 
					 | 
					bool setTargetedHotend(int code);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, float v)
 | 
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, float v)         { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, double v)        { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, double v)
 | 
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void serial_echopair_P(const char *s_P, unsigned long v)
 | 
					 | 
					 | 
					 | 
					#ifdef PREVENT_DANGEROUS_EXTRUDE
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    { serialprintPGM(s_P); SERIAL_ECHO(v); }
 | 
					 | 
					 | 
					 | 
					  float extrude_min_temp = EXTRUDE_MINTEMP;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					#endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#ifdef SDSUPPORT
 | 
					 | 
					 | 
					 | 
					#ifdef SDSUPPORT
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #include "SdFatUtil.h"
 | 
					 | 
					 | 
					 | 
					  #include "SdFatUtil.h"
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1009,8 +1010,11 @@ inline void line_to_current_position() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					inline void line_to_z(float zPosition) {
 | 
					 | 
					 | 
					 | 
					inline void line_to_z(float zPosition) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder);
 | 
					 | 
					 | 
					 | 
					  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					inline void line_to_destination(float mm_m) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], mm_m/60, active_extruder);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					inline void line_to_destination() {
 | 
					 | 
					 | 
					 | 
					inline void line_to_destination() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
 | 
					 | 
					 | 
					 | 
					  line_to_destination(feedrate);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					inline void sync_plan_position() {
 | 
					 | 
					 | 
					 | 
					inline void sync_plan_position() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 | 
					 | 
					 | 
					 | 
					  plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -4099,6 +4103,8 @@ inline void gcode_M226() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#ifdef PREVENT_DANGEROUS_EXTRUDE
 | 
					 | 
					 | 
					 | 
					#ifdef PREVENT_DANGEROUS_EXTRUDE
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  void set_extrude_min_temp(float temp) { extrude_min_temp = temp; }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  /**
 | 
					 | 
					 | 
					 | 
					  /**
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   * M302: Allow cold extrudes, or set the minimum extrude S<temperature>.
 | 
					 | 
					 | 
					 | 
					   * M302: Allow cold extrudes, or set the minimum extrude S<temperature>.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   */
 | 
					 | 
					 | 
					 | 
					   */
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5445,14 +5451,30 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  clamp_to_software_endstops(destination);
 | 
					 | 
					 | 
					 | 
					  clamp_to_software_endstops(destination);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  refresh_cmd_timeout();
 | 
					 | 
					 | 
					 | 
					  refresh_cmd_timeout();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  #ifdef PREVENT_DANGEROUS_EXTRUDE
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    float de = destination[E_AXIS] - current_position[E_AXIS];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if (de) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (degHotend(active_extruder) < extrude_min_temp) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        SERIAL_ECHO_START;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      #ifdef PREVENT_LENGTHY_EXTRUDE
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (labs(de) > EXTRUDE_MAXLENGTH) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          SERIAL_ECHO_START;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          SERIAL_ECHOLNPGM(MSG_ERR_LONG_EXTRUDE_STOP);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      #endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  #endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #ifdef SCARA //for now same as delta-code
 | 
					 | 
					 | 
					 | 
					  #ifdef SCARA //for now same as delta-code
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float difference[NUM_AXIS];
 | 
					 | 
					 | 
					 | 
					    float difference[NUM_AXIS];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (int8_t i = 0; i < NUM_AXIS; i++) difference[i] = destination[i] - current_position[i];
 | 
					 | 
					 | 
					 | 
					    for (int8_t i = 0; i < NUM_AXIS; i++) difference[i] = destination[i] - current_position[i];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float cartesian_mm = sqrt(  sq(difference[X_AXIS]) +
 | 
					 | 
					 | 
					 | 
					    float cartesian_mm = sqrt(sq(difference[X_AXIS]) + sq(difference[Y_AXIS]) + sq(difference[Z_AXIS]));
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                sq(difference[Y_AXIS]) +
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                sq(difference[Z_AXIS]));
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
 | 
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) { return; }
 | 
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) { return; }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
 | 
					 | 
					 | 
					 | 
					    float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5464,9 +5486,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (int s = 1; s <= steps; s++) {
 | 
					 | 
					 | 
					 | 
					    for (int s = 1; s <= steps; s++) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      float fraction = float(s) / float(steps);
 | 
					 | 
					 | 
					 | 
					      float fraction = float(s) / float(steps);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for(int8_t i = 0; i < NUM_AXIS; i++) {
 | 
					 | 
					 | 
					 | 
					      for (int8_t i = 0; i < NUM_AXIS; i++) destination[i] = current_position[i] + difference[i] * fraction;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        destination[i] = current_position[i] + difference[i] * fraction;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  
 | 
					 | 
					 | 
					 | 
					  
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      calculate_delta(destination);
 | 
					 | 
					 | 
					 | 
					      calculate_delta(destination);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("destination[X_AXIS]="); SERIAL_ECHOLN(destination[X_AXIS]);
 | 
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("destination[X_AXIS]="); SERIAL_ECHOLN(destination[X_AXIS]);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5476,9 +5496,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
 | 
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
 | 
					 | 
					 | 
					 | 
					      //SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS],
 | 
					 | 
					 | 
					 | 
					      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        destination[E_AXIS], feedrate*feedmultiply/60/100.0,
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        active_extruder);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #endif // SCARA
 | 
					 | 
					 | 
					 | 
					  #endif // SCARA
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5488,9 +5506,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float difference[NUM_AXIS];
 | 
					 | 
					 | 
					 | 
					    float difference[NUM_AXIS];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for (int8_t i=0; i < NUM_AXIS; i++) difference[i] = destination[i] - current_position[i];
 | 
					 | 
					 | 
					 | 
					    for (int8_t i=0; i < NUM_AXIS; i++) difference[i] = destination[i] - current_position[i];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float cartesian_mm = sqrt(sq(difference[X_AXIS]) +
 | 
					 | 
					 | 
					 | 
					    float cartesian_mm = sqrt(sq(difference[X_AXIS]) + sq(difference[Y_AXIS]) + sq(difference[Z_AXIS]));
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                              sq(difference[Y_AXIS]) +
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                              sq(difference[Z_AXIS]));
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) cartesian_mm = abs(difference[E_AXIS]);
 | 
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) cartesian_mm = abs(difference[E_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) return;
 | 
					 | 
					 | 
					 | 
					    if (cartesian_mm < 0.000001) return;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
 | 
					 | 
					 | 
					 | 
					    float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5507,9 +5523,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      #ifdef ENABLE_AUTO_BED_LEVELING
 | 
					 | 
					 | 
					 | 
					      #ifdef ENABLE_AUTO_BED_LEVELING
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        adjust_delta(destination);
 | 
					 | 
					 | 
					 | 
					        adjust_delta(destination);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      #endif
 | 
					 | 
					 | 
					 | 
					      #endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS],
 | 
					 | 
					 | 
					 | 
					      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                       destination[E_AXIS], feedrate*feedmultiply/60/100.0,
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                       active_extruder);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #endif // DELTA
 | 
					 | 
					 | 
					 | 
					  #endif // DELTA
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5519,8 +5533,8 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0) {
 | 
					 | 
					 | 
					 | 
					      if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // move duplicate extruder into correct duplication position.
 | 
					 | 
					 | 
					 | 
					        // move duplicate extruder into correct duplication position.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_set_position(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 | 
					 | 
					 | 
					 | 
					        plan_set_position(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS] + duplicate_extruder_x_offset, current_position[Y_AXIS], current_position[Z_AXIS],
 | 
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS] + duplicate_extruder_x_offset,
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            current_position[E_AXIS], max_feedrate[X_AXIS], 1);
 | 
					 | 
					 | 
					 | 
					          current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], max_feedrate[X_AXIS], 1);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        sync_plan_position();
 | 
					 | 
					 | 
					 | 
					        sync_plan_position();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        st_synchronize();
 | 
					 | 
					 | 
					 | 
					        st_synchronize();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        extruder_duplication_enabled = true;
 | 
					 | 
					 | 
					 | 
					        extruder_duplication_enabled = true;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5528,23 +5542,21 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					      }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      else if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE) { // handle unparking of head
 | 
					 | 
					 | 
					 | 
					      else if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE) { // handle unparking of head
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (current_position[E_AXIS] == destination[E_AXIS]) {
 | 
					 | 
					 | 
					 | 
					        if (current_position[E_AXIS] == destination[E_AXIS]) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          // this is a travel move - skit it but keep track of current position (so that it can later
 | 
					 | 
					 | 
					 | 
					          // This is a travel move (with no extrusion)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          // be used as start of first non-travel move)
 | 
					 | 
					 | 
					 | 
					          // Skip it, but keep track of the current position
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          // (so it can be used as the start of the next non-travel move)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          if (delayed_move_time != 0xFFFFFFFFUL) {
 | 
					 | 
					 | 
					 | 
					          if (delayed_move_time != 0xFFFFFFFFUL) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            set_current_to_destination();
 | 
					 | 
					 | 
					 | 
					            set_current_to_destination();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (destination[Z_AXIS] > raised_parked_position[Z_AXIS])
 | 
					 | 
					 | 
					 | 
					            if (destination[Z_AXIS] > raised_parked_position[Z_AXIS]) raised_parked_position[Z_AXIS] = destination[Z_AXIS];
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              raised_parked_position[Z_AXIS] = destination[Z_AXIS];
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            delayed_move_time = millis();
 | 
					 | 
					 | 
					 | 
					            delayed_move_time = millis();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            return;
 | 
					 | 
					 | 
					 | 
					            return;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          }
 | 
					 | 
					 | 
					 | 
					          }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        delayed_move_time = 0;
 | 
					 | 
					 | 
					 | 
					        delayed_move_time = 0;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower
 | 
					 | 
					 | 
					 | 
					        // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_buffer_line(raised_parked_position[X_AXIS], raised_parked_position[Y_AXIS], raised_parked_position[Z_AXIS],    current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder);
 | 
					 | 
					 | 
					 | 
					        plan_buffer_line(raised_parked_position[X_AXIS], raised_parked_position[Y_AXIS], raised_parked_position[Z_AXIS], current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], raised_parked_position[Z_AXIS],
 | 
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], raised_parked_position[Z_AXIS], current_position[E_AXIS], min(max_feedrate[X_AXIS], max_feedrate[Y_AXIS]), active_extruder);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            current_position[E_AXIS], min(max_feedrate[X_AXIS],max_feedrate[Y_AXIS]), active_extruder);
 | 
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder);
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS],
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        active_extruder_parked = false;
 | 
					 | 
					 | 
					 | 
					        active_extruder_parked = false;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					      }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5552,7 +5564,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #if !defined(DELTA) && !defined(SCARA)
 | 
					 | 
					 | 
					 | 
					  #if !defined(DELTA) && !defined(SCARA)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    // Do not use feedmultiply for E or Z only moves
 | 
					 | 
					 | 
					 | 
					    // Do not use feedmultiply for E or Z only moves
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if ( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) {
 | 
					 | 
					 | 
					 | 
					    if (current_position[X_AXIS] == destination[X_AXIS] && current_position[Y_AXIS] == destination[Y_AXIS]) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      line_to_destination();
 | 
					 | 
					 | 
					 | 
					      line_to_destination();
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else {
 | 
					 | 
					 | 
					 | 
					    else {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -5560,7 +5572,7 @@ void prepare_move() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], (feedrate/60)*(feedmultiply/100.0), active_extruder);
 | 
					 | 
					 | 
					 | 
					        mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], (feedrate/60)*(feedmultiply/100.0), active_extruder);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return;
 | 
					 | 
					 | 
					 | 
					        return;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      #else
 | 
					 | 
					 | 
					 | 
					      #else
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], (feedrate/60)*(feedmultiply/100.0), active_extruder);
 | 
					 | 
					 | 
					 | 
					        line_to_destination(feedrate * feedmultiply / 100.0);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      #endif  // MESH_BED_LEVELING
 | 
					 | 
					 | 
					 | 
					      #endif  // MESH_BED_LEVELING
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  #endif // !(DELTA || SCARA)
 | 
					 | 
					 | 
					 | 
					  #endif // !(DELTA || SCARA)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					 
 |