@ -1657,7 +1657,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef FWRETRACT  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  void  retract ( bool  retracting ,  bool  swap retract =   false )  { 
 
			
		
	
		
			
				
					  void  retract ( bool  retracting ,  bool  swap ping=  false )  { 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  ( retracting  = =  retracted [ active_extruder ] )  return ; 
 
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1668,7 +1668,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
			
				
					    if  ( retracting )  { 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      feedrate  =  retract_feedrate  *  60 ; 
 
			
		
	
		
			
				
					      current_position [ E_AXIS ]  + =  ( swap retract  ?  retract_length_swap  :  retract_length )  /  volumetric_multiplier [ active_extruder ] ; 
 
			
		
	
		
			
				
					      current_position [ E_AXIS ]  + =  ( swap ping  ?  retract_length_swap  :  retract_length )  /  volumetric_multiplier [ active_extruder ] ; 
 
			
		
	
		
			
				
					      plan_set_e_position ( current_position [ E_AXIS ] ) ; 
 
			
		
	
		
			
				
					      prepare_move ( ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1695,7 +1695,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
			
				
					      } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      feedrate  =  retract_recover_feedrate  *  60 ; 
 
			
		
	
		
			
				
					      float  move_e  =  swap retract  ?  retract_length_swap  +  retract_recover_length_swap  :  retract_length  +  retract_recover_length ; 
 
			
		
	
		
			
				
					      float  move_e  =  swap ping  ?  retract_length_swap  +  retract_recover_length_swap  :  retract_length  +  retract_recover_length ; 
 
			
		
	
		
			
				
					      current_position [ E_AXIS ]  - =  move_e  /  volumetric_multiplier [ active_extruder ] ; 
 
			
		
	
		
			
				
					      plan_set_e_position ( current_position [ E_AXIS ] ) ; 
 
			
		
	
		
			
				
					      prepare_move ( ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1770,7 +1770,7 @@ inline void gcode_G0_G1() {
 
			
		
	
		
			
				
					    # endif  //FWRETRACT
 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    prepare_move ( ) ; 
 
			
		
	
		
			
				
					    // ClearToS end();
 
			
		
	
		
			
				
					    // ok_to_s end();
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -4292,7 +4292,7 @@ inline void gcode_M303() {
 
			
		
	
		
			
				
					      destination [ X_AXIS ]  =  delta [ X_AXIS ] / axis_scaling [ X_AXIS ] ; 
 
			
		
	
		
			
				
					      destination [ Y_AXIS ]  =  delta [ Y_AXIS ] / axis_scaling [ Y_AXIS ] ; 
 
			
		
	
		
			
				
					      prepare_move ( ) ; 
 
			
		
	
		
			
				
					      // ClearToS end();
 
			
		
	
		
			
				
					      // ok_to_s end();
 
			
		
	
		
			
				
					      return  true ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					    return  false ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -5515,7 +5515,7 @@ void process_commands() {
 
			
		
	
		
			
				
					    SERIAL_ECHOLNPGM ( " \" " ) ; 
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  ClearToS end( ) ; 
 
			
		
	
		
			
				
					  ok_to_s end( ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  FlushSerialRequestResend ( )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5523,10 +5523,10 @@ void FlushSerialRequestResend() {
 
			
		
	
		
			
				
					  MYSERIAL . flush ( ) ; 
 
			
		
	
		
			
				
					  SERIAL_PROTOCOLPGM ( MSG_RESEND ) ; 
 
			
		
	
		
			
				
					  SERIAL_PROTOCOLLN ( gcode_LastN  +  1 ) ; 
 
			
		
	
		
			
				
					  ClearToS end( ) ; 
 
			
		
	
		
			
				
					  ok_to_s end( ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  ClearToS end( )  {  
			
		
	
		
			
				
					void  ok_to_s end( )  {  
			
		
	
		
			
				
					  refresh_cmd_timeout ( ) ; 
 
			
		
	
		
			
				
					  # ifdef SDSUPPORT 
 
			
		
	
		
			
				
					    if  ( fromsd [ cmd_queue_index_r ] )  return ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -5755,34 +5755,35 @@ void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# endif  // PREVENT_DANGEROUS_EXTRUDE
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  prepare_move ( )  {  
			
		
	
		
			
				
					  clamp_to_software_endstops ( destination ) ; 
 
			
		
	
		
			
				
					  refresh_cmd_timeout ( ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # ifdef PREVENT_DANGEROUS_EXTRUDE 
 
			
		
	
		
			
				
					    ( void ) prevent_dangerous_extrude ( current_position [ E_AXIS ] ,  destination [ E_AXIS ] ) ; 
 
			
		
	
		
			
				
					  # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # ifdef SCARA  //for now same as delta-code
 
 
			
		
	
		
			
				
					# if defined(DELTA) || defined(SCARA)  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  inline  bool  prepare_move_delta ( )  { 
 
			
		
	
		
			
				
					    float  difference [ NUM_AXIS ] ; 
 
			
		
	
		
			
				
					    for  ( int8_t  i = 0 ;  i  <  NUM_AXIS ;  i + + )  difference [ i ]  =  destination [ i ]  -  current_position [ i ] ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    float  cartesian_mm  =  sqrt ( sq ( difference [ X_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 )  {  return ;  } 
 
			
		
	
		
			
				
					    if  ( cartesian_mm  <  0.000001 )  cartesian_mm  =  abs ( difference [ E_AXIS ] ) ; 
 
			
		
	
		
			
				
					    if  ( cartesian_mm  <  0.000001 )  return  false ; 
 
			
		
	
		
			
				
					    float  seconds  =  6000  *  cartesian_mm  /  feedrate  /  feedrate_multiplier ; 
 
			
		
	
		
			
				
					    int  steps  =  max ( 1 ,  int ( scar a_segments_per_second *  seconds ) ) ; 
 
			
		
	
		
			
				
					    int  steps  =  max ( 1 ,  int ( delt a_segments_per_second *  seconds ) ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
 
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
 
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    for  ( int  s  =  1 ;  s  < =  steps ;  s + + )  { 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      float  fraction  =  float ( s )  /  float ( steps ) ; 
 
			
		
	
		
			
				
					      for  ( int8_t  i  =  0 ;  i  <  NUM_AXIS ;  i + + )  destination [ i ]  =  current_position [ i ]  +  difference [ i ]  *  fraction ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      for  ( int8_t  i  =  0 ;  i  <  NUM_AXIS ;  i + + ) 
 
			
		
	
		
			
				
					        destination [ i ]  =  current_position [ i ]  +  difference [ i ]  *  fraction ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      calculate_delta ( destination ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      # ifdef ENABLE_AUTO_BED_LEVELING 
 
			
		
	
		
			
				
					        adjust_delta ( destination ) ; 
 
			
		
	
		
			
				
					      # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      //SERIAL_ECHOPGM("destination[X_AXIS]="); SERIAL_ECHOLN(destination[X_AXIS]);
 
 
			
		
	
		
			
				
					      //SERIAL_ECHOPGM("destination[Y_AXIS]="); SERIAL_ECHOLN(destination[Y_AXIS]);
 
 
			
		
	
		
			
				
					      //SERIAL_ECHOPGM("destination[Z_AXIS]="); SERIAL_ECHOLN(destination[Z_AXIS]);
 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5792,37 +5793,18 @@ void prepare_move() {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      plan_buffer_line ( delta [ X_AXIS ] ,  delta [ Y_AXIS ] ,  delta [ Z_AXIS ] ,  destination [ E_AXIS ] ,  feedrate / 60 * feedrate_multiplier / 100.0 ,  active_extruder ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					    return  true ; 
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # endif  // SCARA
 
 
			
		
	
		
			
				
					  
 
			
		
	
		
			
				
					  # ifdef DELTA 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    float  difference [ NUM_AXIS ] ; 
 
			
		
	
		
			
				
					    for  ( int8_t  i = 0 ;  i  <  NUM_AXIS ;  i + + )  difference [ i ]  =  destination [ i ]  -  current_position [ i ] ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    float  cartesian_mm  =  sqrt ( sq ( difference [ X_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 )  return ; 
 
			
		
	
		
			
				
					    float  seconds  =  6000  *  cartesian_mm  /  feedrate  /  feedrate_multiplier ; 
 
			
		
	
		
			
				
					    int  steps  =  max ( 1 ,  int ( delta_segments_per_second  *  seconds ) ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
 
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
 
 
			
		
	
		
			
				
					    // SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
 
 
			
		
	
		
			
				
					# endif  // DELTA || SCARA
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    for  ( int  s  =  1 ;  s  < =  steps ;  s + + )  { 
 
			
		
	
		
			
				
					      float  fraction  =  float ( s )  /  float ( steps ) ; 
 
			
		
	
		
			
				
					      for  ( int8_t  i  =  0 ;  i  <  NUM_AXIS ;  i + + )  destination [ i ]  =  current_position [ i ]  +  difference [ i ]  *  fraction ; 
 
			
		
	
		
			
				
					      calculate_delta ( destination ) ; 
 
			
		
	
		
			
				
					      # ifdef ENABLE_AUTO_BED_LEVELING 
 
			
		
	
		
			
				
					        adjust_delta ( destination ) ; 
 
			
		
	
		
			
				
					# ifdef SCARA  
			
		
	
		
			
				
					  inline  bool  prepare_move_scara ( )  {  return  prepare_move_delta ( ) ;  } 
 
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					      plan_buffer_line ( delta [ X_AXIS ] ,  delta [ Y_AXIS ] ,  delta [ Z_AXIS ] ,  destination [ E_AXIS ] ,  feedrate / 60 * feedrate_multiplier / 100.0 ,  active_extruder ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # endif  // DELTA
 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef DUAL_X_CARRIAGE  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  inline  bool  prepare_move_dual_x_carriage ( )  { 
 
			
		
	
		
			
				
					    if  ( active_extruder_parked )  { 
 
			
		
	
		
			
				
					      if  ( dual_x_carriage_mode  = =  DXC_DUPLICATION_MODE  & &  active_extruder  = =  0 )  { 
 
			
		
	
		
			
				
					        // move duplicate extruder into correct duplication position.
 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5843,7 +5825,7 @@ void prepare_move() {
 
			
		
	
		
			
				
					            set_current_to_destination ( ) ; 
 
			
		
	
		
			
				
					            NOLESS ( raised_parked_position [ Z_AXIS ] ,  destination [ Z_AXIS ] ) ; 
 
			
		
	
		
			
				
					            delayed_move_time  =  millis ( ) ; 
 
			
		
	
		
			
				
					            return ; 
 
			
		
	
		
			
				
					            return  false  ; 
 
			
		
	
		
			
				
					          } 
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					        delayed_move_time  =  0 ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5854,9 +5836,14 @@ void prepare_move() {
 
			
		
	
		
			
				
					        active_extruder_parked  =  false ; 
 
			
		
	
		
			
				
					      } 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					    return  true ; 
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# endif  // DUAL_X_CARRIAGE
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# if !defined(DELTA) && !defined(SCARA)  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  inline  bool  prepare_move_cartesian ( )  { 
 
			
		
	
		
			
				
					    // Do not use feedrate_multiplier for E or Z only moves
 
 
			
		
	
		
			
				
					    if  ( current_position [ X_AXIS ]  = =  destination [ X_AXIS ]  & &  current_position [ Y_AXIS ]  = =  destination [ Y_AXIS ] )  { 
 
			
		
	
		
			
				
					      line_to_destination ( ) ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5864,12 +5851,40 @@ void prepare_move() {
 
			
		
	
		
			
				
					    else  { 
 
			
		
	
		
			
				
					      # ifdef MESH_BED_LEVELING 
 
			
		
	
		
			
				
					        mesh_plan_buffer_line ( destination [ X_AXIS ] ,  destination [ Y_AXIS ] ,  destination [ Z_AXIS ] ,  destination [ E_AXIS ] ,  ( feedrate / 60 ) * ( feedrate_multiplier / 100.0 ) ,  active_extruder ) ; 
 
			
		
	
		
			
				
					        return ; 
 
			
		
	
		
			
				
					        return  false  ; 
 
			
		
	
		
			
				
					      # else 
 
			
		
	
		
			
				
					        line_to_destination ( feedrate  *  feedrate_multiplier  /  100.0 ) ; 
 
			
		
	
		
			
				
					      # endif   // MESH_BED_LEVELING
  
 
			
		
	
		
			
				
					      # endif 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					  # endif  // !(DELTA || SCARA)
 
 
			
		
	
		
			
				
					    return  true ; 
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# endif  // !DELTA && !SCARA
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/**
  
			
		
	
		
			
				
					 *  Prepare  a  single  move  and  get  ready  for  the  next  one 
 
			
		
	
		
			
				
					 */ 
 
			
		
	
		
			
				
					void  prepare_move ( )  {  
			
		
	
		
			
				
					  clamp_to_software_endstops ( destination ) ; 
 
			
		
	
		
			
				
					  refresh_cmd_timeout ( ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # ifdef PREVENT_DANGEROUS_EXTRUDE 
 
			
		
	
		
			
				
					    prevent_dangerous_extrude ( current_position [ E_AXIS ] ,  destination [ E_AXIS ] ) ; 
 
			
		
	
		
			
				
					  # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # ifdef SCARA 
 
			
		
	
		
			
				
					    if  ( ! prepare_move_scara ( ) )  return ; 
 
			
		
	
		
			
				
					  # elif defined(DELTA) 
 
			
		
	
		
			
				
					    if  ( ! prepare_move_delta ( ) )  return ; 
 
			
		
	
		
			
				
					  # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # ifdef DUAL_X_CARRIAGE 
 
			
		
	
		
			
				
					    if  ( ! prepare_move_dual_x_carriage ( ) )  return ; 
 
			
		
	
		
			
				
					  # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # if !defined(DELTA) && !defined(SCARA) 
 
			
		
	
		
			
				
					    if  ( ! prepare_move_cartesian ( ) )  return ; 
 
			
		
	
		
			
				
					  # endif 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  set_current_to_destination ( ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -5889,10 +5904,9 @@ void prepare_arc_move(char isclockwise) {
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# if HAS_CONTROLLERFAN  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					millis_t  lastMotor  =  0 ;  // Last time a motor was turned on
  
			
		
	
		
			
				
					millis_t  lastMotorCheck  =  0 ;  // Last time the state was checked
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  void  controllerFan ( )  { 
 
			
		
	
		
			
				
					    static  millis_t  lastMotor  =  0 ;       // Last time a motor was turned on
 
 
			
		
	
		
			
				
					    static  millis_t  lastMotorCheck  =  0 ;  // Last time the state was checked
 
 
			
		
	
		
			
				
					    millis_t  ms  =  millis ( ) ; 
 
			
		
	
		
			
				
					    if  ( ms  > =  lastMotorCheck  +  2500 )  {  // Not a time critical function, so we only check every 2500ms
 
 
			
		
	
		
			
				
					      lastMotorCheck  =  ms ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -5919,7 +5933,8 @@ void controllerFan() {
 
			
		
	
		
			
				
					      analogWrite ( CONTROLLERFAN_PIN ,  speed ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					  } 
 
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# endif  // HAS_CONTROLLERFAN
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# ifdef SCARA  
			
		
	
		
			
				
					void  calculate_SCARA_forward_Transform ( float  f_scara [ 3 ] )