@ -1657,7 +1657,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# ifdef FWRETRACT # ifdef FWRETRACT  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  void  retract ( bool  retracting ,  bool  swap retract =   false )  { 
  void  retract ( bool  retracting ,  bool  swap ping=  false )  { 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    if  ( retracting  = =  retracted [ active_extruder ] )  return ; 
    if  ( retracting  = =  retracted [ active_extruder ] )  return ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -1668,7 +1668,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
		
			
				
					
					    if  ( retracting )  { 
    if  ( retracting )  { 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      feedrate  =  retract_feedrate  *  60 ; 
      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 ] ) ; 
      plan_set_e_position ( current_position [ E_AXIS ] ) ; 
 
			
		
	
		
		
			
				
					
					      prepare_move ( ) ; 
      prepare_move ( ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1695,7 +1695,7 @@ static void homeaxis(AxisEnum axis) {
 
			
		
	
		
		
			
				
					
					      } 
      } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      feedrate  =  retract_recover_feedrate  *  60 ; 
      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 ] ; 
      current_position [ E_AXIS ]  - =  move_e  /  volumetric_multiplier [ active_extruder ] ; 
 
			
		
	
		
		
			
				
					
					      plan_set_e_position ( current_position [ E_AXIS ] ) ; 
      plan_set_e_position ( current_position [ E_AXIS ] ) ; 
 
			
		
	
		
		
			
				
					
					      prepare_move ( ) ; 
      prepare_move ( ) ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1770,7 +1770,7 @@ inline void gcode_G0_G1() {
 
			
		
	
		
		
			
				
					
					    # endif  //FWRETRACT
 
    # endif  //FWRETRACT
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    prepare_move ( ) ; 
    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 [ X_AXIS ]  =  delta [ X_AXIS ] / axis_scaling [ X_AXIS ] ; 
 
			
		
	
		
		
			
				
					
					      destination [ Y_AXIS ]  =  delta [ Y_AXIS ] / axis_scaling [ Y_AXIS ] ; 
      destination [ Y_AXIS ]  =  delta [ Y_AXIS ] / axis_scaling [ Y_AXIS ] ; 
 
			
		
	
		
		
			
				
					
					      prepare_move ( ) ; 
      prepare_move ( ) ; 
 
			
		
	
		
		
			
				
					
					      // ClearToS end();
      // ok_to_s end();
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      return  true ; 
      return  true ; 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					    return  false ; 
    return  false ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -5515,7 +5515,7 @@ void process_commands() {
 
			
		
	
		
		
			
				
					
					    SERIAL_ECHOLNPGM ( " \" " ) ; 
    SERIAL_ECHOLNPGM ( " \" " ) ; 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  ClearToS end( ) ; 
  ok_to_s end( ) ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  FlushSerialRequestResend ( )  { void  FlushSerialRequestResend ( )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5523,10 +5523,10 @@ void FlushSerialRequestResend() {
 
			
		
	
		
		
			
				
					
					  MYSERIAL . flush ( ) ; 
  MYSERIAL . flush ( ) ; 
 
			
		
	
		
		
			
				
					
					  SERIAL_PROTOCOLPGM ( MSG_RESEND ) ; 
  SERIAL_PROTOCOLPGM ( MSG_RESEND ) ; 
 
			
		
	
		
		
			
				
					
					  SERIAL_PROTOCOLLN ( gcode_LastN  +  1 ) ; 
  SERIAL_PROTOCOLLN ( gcode_LastN  +  1 ) ; 
 
			
		
	
		
		
			
				
					
					  ClearToS end( ) ; 
  ok_to_s end( ) ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  ClearToS end( )  { void  ok_to_s end( )  {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  refresh_cmd_timeout ( ) ; 
  refresh_cmd_timeout ( ) ; 
 
			
		
	
		
		
			
				
					
					  # ifdef SDSUPPORT 
  # ifdef SDSUPPORT 
 
			
		
	
		
		
			
				
					
					    if  ( fromsd [ cmd_queue_index_r ] )  return ; 
    if  ( fromsd [ cmd_queue_index_r ] )  return ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -5755,54 +5755,15 @@ void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# endif  // PREVENT_DANGEROUS_EXTRUDE
 # endif  // PREVENT_DANGEROUS_EXTRUDE
  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  prepare_move ( )  { # if defined(DELTA) || defined(SCARA)  
			
				
				
			
		
	
		
		
			
				
					
					  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
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    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 ( scara_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 ; 
 
			
		
	
		
		
			
				
					
					  
 
			
		
	
		
		
			
				
					
					      calculate_delta ( destination ) ; 
 
			
		
	
		
		
			
				
					
					      //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]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[X_AXIS]="); SERIAL_ECHOLN(delta[X_AXIS]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      plan_buffer_line ( delta [ X_AXIS ] ,  delta [ Y_AXIS ] ,  delta [ Z_AXIS ] ,  destination [ E_AXIS ] ,  feedrate / 60 * feedrate_multiplier / 100.0 ,  active_extruder ) ; 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # endif  // SCARA
 
 
			
		
	
		
		
			
				
					
					  
 
			
		
	
		
		
			
				
					
					  # ifdef DELTA 
 
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  inline  bool  prepare_move_delta ( )  { 
 
			
		
	
		
		
			
				
					
					    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 ] )  +  sq ( difference [ Y_AXIS ] )  +  sq ( difference [ Z_AXIS ] ) ) ; 
    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 )  cartesian_mm  =  abs ( difference [ E_AXIS ] ) ; 
 
			
		
	
		
		
			
				
					
					    if  ( cartesian_mm  <  0.000001 )  return ; 
    if  ( cartesian_mm  <  0.000001 )  return  false ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    float  seconds  =  6000  *  cartesian_mm  /  feedrate  /  feedrate_multiplier ; 
    float  seconds  =  6000  *  cartesian_mm  /  feedrate  /  feedrate_multiplier ; 
 
			
		
	
		
		
			
				
					
					    int  steps  =  max ( 1 ,  int ( delta_segments_per_second  *  seconds ) ) ; 
    int  steps  =  max ( 1 ,  int ( delta_segments_per_second  *  seconds ) ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5811,18 +5772,39 @@ void prepare_move() {
 
			
		
	
		
		
			
				
					
					    // SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
 
    // SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    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 + + )  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 ) ; 
      calculate_delta ( destination ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      # ifdef ENABLE_AUTO_BED_LEVELING 
      # ifdef ENABLE_AUTO_BED_LEVELING 
 
			
		
	
		
		
			
				
					
					        adjust_delta ( destination ) ; 
        adjust_delta ( destination ) ; 
 
			
		
	
		
		
			
				
					
					      # endif 
      # 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]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[X_AXIS]="); SERIAL_ECHOLN(delta[X_AXIS]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
 
 
			
		
	
		
		
			
				
					
					      //SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      plan_buffer_line ( delta [ X_AXIS ] ,  delta [ Y_AXIS ] ,  delta [ Z_AXIS ] ,  destination [ E_AXIS ] ,  feedrate / 60 * feedrate_multiplier / 100.0 ,  active_extruder ) ; 
      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  // DELTA
 
# endif  // DELT A || SCAR A
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # ifdef DUAL_X_CARRIAGE 
# ifdef SCARA  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  inline  bool  prepare_move_scara ( )  {  return  prepare_move_delta ( ) ;  } 
 
			
		
	
		
		
			
				
					
					# endif  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# ifdef DUAL_X_CARRIAGE  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  inline  bool  prepare_move_dual_x_carriage ( )  { 
 
			
		
	
		
		
			
				
					
					    if  ( active_extruder_parked )  { 
    if  ( active_extruder_parked )  { 
 
			
		
	
		
		
			
				
					
					      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.
 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5843,7 +5825,7 @@ void prepare_move() {
 
			
		
	
		
		
			
				
					
					            set_current_to_destination ( ) ; 
            set_current_to_destination ( ) ; 
 
			
		
	
		
		
			
				
					
					            NOLESS ( raised_parked_position [ Z_AXIS ] ,  destination [ Z_AXIS ] ) ; 
            NOLESS ( raised_parked_position [ Z_AXIS ] ,  destination [ Z_AXIS ] ) ; 
 
			
		
	
		
		
			
				
					
					            delayed_move_time  =  millis ( ) ; 
            delayed_move_time  =  millis ( ) ; 
 
			
		
	
		
		
			
				
					
					            return ; 
            return  false  ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					          } 
          } 
 
			
		
	
		
		
			
				
					
					        } 
        } 
 
			
		
	
		
		
			
				
					
					        delayed_move_time  =  0 ; 
        delayed_move_time  =  0 ; 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5854,9 +5836,14 @@ void prepare_move() {
 
			
		
	
		
		
			
				
					
					        active_extruder_parked  =  false ; 
        active_extruder_parked  =  false ; 
 
			
		
	
		
		
			
				
					
					      } 
      } 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					  # endif  // DUAL_X_CARRIAGE
 
    return  true ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # if !defined(DELTA) && !defined(SCARA) 
# 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
 
    // 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 ] )  { 
    if  ( current_position [ X_AXIS ]  = =  destination [ X_AXIS ]  & &  current_position [ Y_AXIS ]  = =  destination [ Y_AXIS ] )  { 
 
			
		
	
		
		
			
				
					
					      line_to_destination ( ) ; 
      line_to_destination ( ) ; 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5864,12 +5851,40 @@ void prepare_move() {
 
			
		
	
		
		
			
				
					
					    else  { 
    else  { 
 
			
		
	
		
		
			
				
					
					      # ifdef MESH_BED_LEVELING 
      # 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 ) ; 
        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 
      # else 
 
			
		
	
		
		
			
				
					
					        line_to_destination ( feedrate  *  feedrate_multiplier  /  100.0 ) ; 
        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 ( ) ; 
  set_current_to_destination ( ) ; 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -5889,37 +5904,37 @@ void prepare_arc_move(char isclockwise) {
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# if HAS_CONTROLLERFAN # if HAS_CONTROLLERFAN  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					millis_t  lastMotor  =  0 ;  // Last time a motor was turned on
   void  controllerFan ( )  {   
			
				
				
			
		
	
		
		
			
				
					
					millis_t  lastMotorCheck  =  0 ;  // Last time the state was checked     static  millis_t  lastMotor  =  0 ;       // Last time a motor was turned on  
 
			
				
				
			
		
	
		
		
			
				
					
					
    static  millis_t  lastMotorCheck  =  0 ;  // Last time the state was checked  
 
			
				
				
			
		
	
		
		
			
				
					
					void  controllerFan ( )  {     millis_t  ms  =  millis ( ) ;   
			
				
				
			
		
	
		
		
			
				
					
					  millis_t  ms  =  millis ( ) ; 
    if  ( ms  > =  lastMotorCheck  +  2500 )  {  // Not a time critical function, so we only check every 2500ms
  
 
			
				
				
			
		
	
		
		
			
				
					
					  if  ( ms  > =  lastMotorCheck  +  2500 )  {  // Not a time critical function, so we only check every 2500ms
 
      lastMotorCheck  =  ms ;  
 
			
				
				
			
		
	
		
		
			
				
					
					    lastMotorCheck  =  ms ; 
      if  ( X_ENABLE_READ  = =  X_ENABLE_ON  | |  Y_ENABLE_READ  = =  Y_ENABLE_ON  | |  Z_ENABLE_READ  = =  Z_ENABLE_ON  | |  soft_pwm_bed  >  0  
 
			
				
				
			
		
	
		
		
			
				
					
					    if  ( X_ENABLE_READ  = =  X_ENABLE_ON  | |  Y_ENABLE_READ  = =  Y_ENABLE_ON  | |  Z_ENABLE_READ  = =  Z_ENABLE_ON  | |  soft_pwm_bed  >  0 
        | |  E0_ENABLE_READ  = =  E_ENABLE_ON  // If any of the drivers are enabled...
  
 
			
				
				
			
		
	
		
		
			
				
					
					      | |  E0_ENABLE_READ  = =  E_ENABLE_ON  // If any of the drivers are enabled...
 
        # if EXTRUDERS > 1  
 
			
				
				
			
		
	
		
		
			
				
					
					      # if EXTRUDERS > 1 
          | |  E1_ENABLE_READ  = =  E_ENABLE_ON  
 
			
				
				
			
		
	
		
		
			
				
					
					        | |  E1_ENABLE_READ  = =  E_ENABLE_ON 
          # if HAS_X2_ENABLE  
 
			
				
				
			
		
	
		
		
			
				
					
					        # if HAS_X2_ENABLE 
            | |  X2_ENABLE_READ  = =  X_ENABLE_ON  
 
			
				
				
			
		
	
		
		
			
				
					
					          | |  X2_ENABLE_READ  = =  X_ENABLE_ON 
          # endif 
 
			
				
				
			
		
	
		
		
			
				
					
					        # end if
           #  EXTRUDERS > 2 
 
			
				
				
			
		
	
		
		
			
				
					
					        # if EXTRUDERS > 2 
            | |  E2_ENABLE_READ  = =  E_ENABLE_ON  
 
			
				
				
			
		
	
		
		
			
				
					
					          | |  E2_ENABLE_READ  = =  E_ENABLE_ON 
            # if EXTRUDERS > 3  
 
			
				
				
			
		
	
		
		
			
				
					
					          # if EXTRUDERS > 3 
              | |  E3_ENABLE_READ  = =  E_ENABLE_ON  
 
			
				
				
			
		
	
		
		
			
				
					
					            | |  E3_ENABLE_READ  = =  E_ENABLE_ON 
            # endif 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					          # endif 
          # endif 
 
			
		
	
		
		
			
				
					
					        # endif 
        # endif 
 
			
		
	
		
		
			
				
					
					      # endif 
      )  { 
 
			
				
				
			
		
	
		
		
			
				
					
					    )  { 
        lastMotor  =  ms ;  //... set time to NOW so the fan will turn on
 
 
			
				
				
			
		
	
		
		
			
				
					
					      lastMotor  =  ms ;  //... set time to NOW so the fan will turn on
 
      } 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					      uint8_t  speed  =  ( lastMotor  = =  0  | |  ms  > =  lastMotor  +  ( CONTROLLERFAN_SECS  *  1000UL ) )  ?  0  :  CONTROLLERFAN_SPEED ; 
 
			
		
	
		
		
			
				
					
					      // allows digital or PWM fan output to be used (see M42 handling)
 
 
			
		
	
		
		
			
				
					
					      digitalWrite ( CONTROLLERFAN_PIN ,  speed ) ; 
 
			
		
	
		
		
			
				
					
					      analogWrite ( CONTROLLERFAN_PIN ,  speed ) ; 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					    uint8_t  speed  =  ( lastMotor  = =  0  | |  ms  > =  lastMotor  +  ( CONTROLLERFAN_SECS  *  1000UL ) )  ?  0  :  CONTROLLERFAN_SPEED ; 
 
			
		
	
		
		
			
				
					
					    // allows digital or PWM fan output to be used (see M42 handling)
 
 
			
		
	
		
		
			
				
					
					    digitalWrite ( CONTROLLERFAN_PIN ,  speed ) ; 
 
			
		
	
		
		
			
				
					
					    analogWrite ( CONTROLLERFAN_PIN ,  speed ) ; 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					} 
 
			
				
				
			
		
	
		
		
			
				
					
					# endif # endif  // HAS_CONTROLLERFAN
  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# ifdef SCARA # ifdef SCARA  
			
		
	
		
		
			
				
					
					void  calculate_SCARA_forward_Transform ( float  f_scara [ 3 ] ) void  calculate_SCARA_forward_Transform ( float  f_scara [ 3 ] )