@ -1300,6 +1300,10 @@ static void setup_for_endstop_move() {
 
			
		
	
		
		
			
				
					
					    feedrate  =  oldFeedRate ; 
    feedrate  =  oldFeedRate ; 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  inline  void  do_blocking_move_to_xy ( float  x ,  float  y )  {  do_blocking_move_to ( x ,  y ,  current_position [ Z_AXIS ] ) ;  } 
 
			
		
	
		
		
			
				
					
					  inline  void  do_blocking_move_to_x ( float  x )  {  do_blocking_move_to ( x ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ] ) ;  } 
 
			
		
	
		
		
			
				
					
					  inline  void  do_blocking_move_to_z ( float  z )  {  do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  z ) ;  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  static  void  clean_up_after_endstop_move ( )  { 
  static  void  clean_up_after_endstop_move ( )  { 
 
			
		
	
		
		
			
				
					
					    # ifdef ENDSTOPS_ONLY_FOR_HOMING 
    # ifdef ENDSTOPS_ONLY_FOR_HOMING 
 
			
		
	
		
		
			
				
					
					      enable_endstops ( false ) ; 
      enable_endstops ( false ) ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1408,7 +1412,7 @@ static void setup_for_endstop_move() {
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					        # if Z_RAISE_AFTER_PROBING > 0 
        # if Z_RAISE_AFTER_PROBING > 0 
 
			
		
	
		
		
			
				
					
					          if  ( doRaise )  { 
          if  ( doRaise )  { 
 
			
		
	
		
		
			
				
					
					            do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ]  +  Z_RAISE_AFTER_PROBING ) ;  // this also updates current_position
 
            do_blocking_move_to _z(  current_position [ Z_AXIS ]  +  Z_RAISE_AFTER_PROBING ) ;  // this also updates current_position
 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					            st_synchronize ( ) ; 
            st_synchronize ( ) ; 
 
			
		
	
		
		
			
				
					
					          } 
          } 
 
			
		
	
		
		
			
				
					
					        # endif 
        # endif 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1494,8 +1498,8 @@ static void setup_for_endstop_move() {
 
			
		
	
		
		
			
				
					
					  // Probe bed height at position (x,y), returns the measured z value
 
  // Probe bed height at position (x,y), returns the measured z value
 
 
			
		
	
		
		
			
				
					
					  static  float  probe_pt ( float  x ,  float  y ,  float  z_before ,  ProbeAction  probe_action = ProbeDeployAndStow ,  int  verbose_level = 1 )  { 
  static  float  probe_pt ( float  x ,  float  y ,  float  z_before ,  ProbeAction  probe_action = ProbeDeployAndStow ,  int  verbose_level = 1 )  { 
 
			
		
	
		
		
			
				
					
					    // Move Z up to the z_before height, then move the probe to the given XY
 
    // Move Z up to the z_before height, then move the probe to the given XY
 
 
			
		
	
		
		
			
				
					
					    do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  z_before ) ;  // this also updates current_position
 
    do_blocking_move_to _z(  z_before ) ;  // this also updates current_position
 
 
			
				
				
			
		
	
		
		
			
				
					
					    do_blocking_move_to ( x  -  X_PROBE_OFFSET_FROM_EXTRUDER ,  y  -  Y_PROBE_OFFSET_FROM_EXTRUDER ,  current_position [ Z_AXIS ] ) ;  // this also updates current_position
 
    do_blocking_move_to _xy ( x  -  X_PROBE_OFFSET_FROM_EXTRUDER ,  y  -  Y_PROBE_OFFSET_FROM_EXTRUDER ) ;  // this also updates current_position
 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    # if !defined(Z_PROBE_SLED) && !defined(Z_PROBE_ALLEN_KEY) 
    # if !defined(Z_PROBE_SLED) && !defined(Z_PROBE_ALLEN_KEY) 
 
			
		
	
		
		
			
				
					
					      if  ( probe_action  &  ProbeDeploy )  deploy_z_probe ( ) ; 
      if  ( probe_action  &  ProbeDeploy )  deploy_z_probe ( ) ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1604,20 +1608,18 @@ static void setup_for_endstop_move() {
 
			
		
	
		
		
			
				
					
					      return ; 
      return ; 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    if  ( dock )  { 
 
			
		
	
		
		
			
				
					
					    float  oldXpos  =  current_position [ X_AXIS ] ;  // save x position
 
    float  oldXpos  =  current_position [ X_AXIS ] ;  // save x position
 
 
			
		
	
		
		
			
				
					
					      do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ]  +  Z_RAISE_AFTER_PROBING ) ;  // rise Z   
 
    if  ( dock )  { 
 
			
				
				
			
		
	
		
		
			
				
					
					      do_blocking_move_to ( X_MAX_POS  +  SLED_DOCKING_OFFSET  +  offset  -  1 ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ] ) ;   // Dock sled a bit closer to ensure proper capturing                                                                                                                           
 
      do_blocking_move_to_z ( current_position [ Z_AXIS ]  +  Z_RAISE_AFTER_PROBING ) ;  // raise Z   
 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					      do_blocking_move_to_x ( X_MAX_POS  +  SLED_DOCKING_OFFSET  +  offset  -  1 ) ;   // Dock sled a bit closer to ensure proper capturing
 
 
			
		
	
		
		
			
				
					
					      digitalWrite ( SLED_PIN ,  LOW ) ;  // turn off magnet
 
      digitalWrite ( SLED_PIN ,  LOW ) ;  // turn off magnet
 
 
			
		
	
		
		
			
				
					
					      do_blocking_move_to ( oldXpos ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ] ) ;  // return to position before docking
 
 
			
		
	
		
		
			
				
					
					    }  else  { 
    }  else  { 
 
			
		
	
		
		
			
				
					
					      float  oldXpos  =  current_position [ X_AXIS ] ;  // save x position
 
 
			
		
	
		
		
			
				
					
					      float  z_loc  =  current_position [ Z_AXIS ] ; 
      float  z_loc  =  current_position [ Z_AXIS ] ; 
 
			
		
	
		
		
			
				
					
					      if  ( z_loc  <  Z_RAISE_BEFORE_PROBING  +  5 )  z_loc  =  Z_RAISE_BEFORE_PROBING ; 
      if  ( z_loc  <  Z_RAISE_BEFORE_PROBING  +  5 )  z_loc  =  Z_RAISE_BEFORE_PROBING ; 
 
			
		
	
		
		
			
				
					
					      do_blocking_move_to ( X_MAX_POS  +  SLED_DOCKING_OFFSET  +  offset ,  current_position [ Y_AXIS ] ,  z_loc ) ;  // this also updates current_position
 
      do_blocking_move_to ( X_MAX_POS  +  SLED_DOCKING_OFFSET  +  offset ,  current_position [ Y_AXIS ] ,  z_loc ) ;  // this also updates current_position
 
 
			
		
	
		
		
			
				
					
					      digitalWrite ( SLED_PIN ,  HIGH ) ;  // turn on magnet
 
      digitalWrite ( SLED_PIN ,  HIGH ) ;  // turn on magnet
 
 
			
		
	
		
		
			
				
					
					      do_blocking_move_to ( oldXpos ,  current_position [ Y_AXIS ] ,  current_position [ Z_AXIS ] ) ;  // return to position before docking
 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					    do_blocking_move_to_x ( oldXpos ) ;  // return to position before docking
 
 
			
		
	
		
		
			
				
					
					  } 
  } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# endif  // Z_PROBE_SLED
 # endif  // Z_PROBE_SLED
  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -2744,11 +2746,28 @@ inline void gcode_G28() {
 
			
		
	
		
		
			
				
					
					        float  x_tmp  =  current_position [ X_AXIS ]  +  X_PROBE_OFFSET_FROM_EXTRUDER , 
        float  x_tmp  =  current_position [ X_AXIS ]  +  X_PROBE_OFFSET_FROM_EXTRUDER , 
 
			
		
	
		
		
			
				
					
					              y_tmp  =  current_position [ Y_AXIS ]  +  Y_PROBE_OFFSET_FROM_EXTRUDER , 
              y_tmp  =  current_position [ Y_AXIS ]  +  Y_PROBE_OFFSET_FROM_EXTRUDER , 
 
			
		
	
		
		
			
				
					
					              z_tmp  =  current_position [ Z_AXIS ] , 
              z_tmp  =  current_position [ Z_AXIS ] , 
 
			
		
	
		
		
			
				
					
					              real_z  =  st_get_position_mm ( Z_AXIS ) ;   //get the real Z (since  the auto bed leveling is already  correcting the plane)
              real_z  =  st_get_position_mm ( Z_AXIS ) ;   //get the real Z (since  plan_get_position is now  correcting the plane)
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					        apply_rotation_xyz ( plan_bed_level_matrix ,  x_tmp ,  y_tmp ,  z_tmp ) ;  // Apply the correction sending the probe offset
 
        apply_rotation_xyz ( plan_bed_level_matrix ,  x_tmp ,  y_tmp ,  z_tmp ) ;  // Apply the correction sending the probe offset
 
 
			
		
	
		
		
			
				
					
					        //line below controls z probe offset, zprobe_zoffset is the actual offset that can be modified via m851 or is read from EEPROM
 
 
			
				
				
			
		
	
		
		
			
				
					
					        current_position [ Z_AXIS ]  =  z_tmp  -  real_z  -  zprobe_zoffset ;  // The difference is added to current position and sent to planner.
 
        // Get the current Z position and send it to the planner.
 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        // >> (z_tmp - real_z) : The rotated current Z minus the uncorrected Z (most recent plan_set_position/sync_plan_position)
 
 
			
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        // >> zprobe_zoffset : Z distance from nozzle to probe (set by default, M851, EEPROM, or Menu)
 
 
			
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        // >> Z_RAISE_AFTER_PROBING : The distance the probe will have lifted after the last probe
 
 
			
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        // >> Should home_offset[Z_AXIS] be included?
 
 
			
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        //      Discussion: home_offset[Z_AXIS] was applied in G28 to set the starting Z.
 
 
			
		
	
		
		
			
				
					
					        //      If Z is not tweaked in G29 -and- the Z probe in G29 is not actually "homing" Z...
 
 
			
		
	
		
		
			
				
					
					        //      then perhaps it should not be included here. The purpose of home_offset[] is to
 
 
			
		
	
		
		
			
				
					
					        //      adjust for inaccurate endstops, not for reasonably accurate probes. If it were
 
 
			
		
	
		
		
			
				
					
					        //      added here, it could be seen as a compensating factor for the Z probe.
 
 
			
		
	
		
		
			
				
					
					        //
 
 
			
		
	
		
		
			
				
					
					        current_position [ Z_AXIS ]  =  - zprobe_zoffset  +  Z_RAISE_AFTER_PROBING  +  ( z_tmp  -  real_z ) ; 
 
			
		
	
		
		
			
				
					
					        // current_position[Z_AXIS] += home_offset[Z_AXIS]; // The probe determines Z=0, not "Z home"
 
 
			
		
	
		
		
			
				
					
					        sync_plan_position ( ) ; 
        sync_plan_position ( ) ; 
 
			
		
	
		
		
			
				
					
					      } 
      } 
 
			
		
	
		
		
			
				
					
					    # endif  // !DELTA
 
    # endif  // !DELTA
 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -4542,8 +4561,7 @@ inline void gcode_M400() { st_synchronize(); }
 
			
		
	
		
		
			
				
					
					    void  raise_z_for_servo ( )  { 
    void  raise_z_for_servo ( )  { 
 
			
		
	
		
		
			
				
					
					      float  zpos  =  current_position [ Z_AXIS ] ,  z_dest  =  Z_RAISE_BEFORE_HOMING ; 
      float  zpos  =  current_position [ Z_AXIS ] ,  z_dest  =  Z_RAISE_BEFORE_HOMING ; 
 
			
		
	
		
		
			
				
					
					      z_dest  + =  axis_known_position [ Z_AXIS ]  ?  zprobe_zoffset  :  zpos ; 
      z_dest  + =  axis_known_position [ Z_AXIS ]  ?  zprobe_zoffset  :  zpos ; 
 
			
		
	
		
		
			
				
					
					      if  ( zpos  <  z_dest ) 
      if  ( zpos  <  z_dest )  do_blocking_move_to_z ( z_dest ) ;  // also updates current_position
 
 
			
				
				
			
		
	
		
		
			
				
					
					        do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  z_dest ) ;  // also updates current_position
 
 
			
		
	
		
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					  # endif 
  # endif