|  |  |  | @ -750,9 +750,6 @@ void servo_init() { | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     endstops.enable_z_probe(false); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /**
 | 
			
		
	
		
			
				
					|  |  |  |  |      * Set position of Z Servo Endstop | 
			
		
	
		
			
				
					|  |  |  |  |      * | 
			
		
	
	
		
			
				
					|  |  |  | @ -763,8 +760,11 @@ void servo_init() { | 
			
		
	
		
			
				
					|  |  |  |  |      * | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     STOW_Z_SERVO(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif // HAS_Z_SERVO_ENDSTOP
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if HAS_BED_PROBE | 
			
		
	
		
			
				
					|  |  |  |  |     endstops.enable_z_probe(false); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /**
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1661,6 +1661,29 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //HAS_BED_PROBE
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   /**
 | 
			
		
	
		
			
				
					|  |  |  |  |    * Raise Z to a minimum height to make room for a servo to move | 
			
		
	
		
			
				
					|  |  |  |  |    * | 
			
		
	
		
			
				
					|  |  |  |  |    * zprobe_zoffset: Negative of the Z height where the probe engages | 
			
		
	
		
			
				
					|  |  |  |  |    *         z_dest: The before / after probing raise distance | 
			
		
	
		
			
				
					|  |  |  |  |    * | 
			
		
	
		
			
				
					|  |  |  |  |    * The zprobe_zoffset is negative for a switch below the nozzle, so | 
			
		
	
		
			
				
					|  |  |  |  |    * multiply by Z_HOME_DIR (-1) to move enough away from the bed. | 
			
		
	
		
			
				
					|  |  |  |  |    */ | 
			
		
	
		
			
				
					|  |  |  |  |   void raise_z_for_servo(float z_dest) { | 
			
		
	
		
			
				
					|  |  |  |  |     z_dest += home_offset[Z_AXIS]; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if ((Z_HOME_DIR) < 0 && zprobe_zoffset < 0) | 
			
		
	
		
			
				
					|  |  |  |  |       z_dest -= zprobe_zoffset; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (z_dest > current_position[Z_AXIS]) | 
			
		
	
		
			
				
					|  |  |  |  |       do_blocking_move_to_z(z_dest); // also updates current_position
 | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if ENABLED(AUTO_BED_LEVELING_FEATURE) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if ENABLED(AUTO_BED_LEVELING_GRID) | 
			
		
	
	
		
			
				
					|  |  |  | @ -1861,6 +1884,9 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // Make room for Z Servo
 | 
			
		
	
		
			
				
					|  |  |  |  |       raise_z_for_servo(Z_RAISE_BEFORE_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // Engage Z Servo endstop if enabled
 | 
			
		
	
		
			
				
					|  |  |  |  |       DEPLOY_Z_SERVO(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1941,17 +1967,14 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  |     #endif // Z_PROBE_ALLEN_KEY
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |       // Noting to be done. Just set endstops.z_probe_enabled
 | 
			
		
	
		
			
				
					|  |  |  |  |       // Nothing to be done. Just enable_z_probe below...
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     endstops.enable_z_probe(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   static void stow_z_probe(bool doRaise = true) { | 
			
		
	
		
			
				
					|  |  |  |  |     #if !(HAS_Z_SERVO_ENDSTOP && (Z_RAISE_AFTER_PROBING > 0)) | 
			
		
	
		
			
				
					|  |  |  |  |       UNUSED(doRaise); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   static void stow_z_probe() { | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
			
				
					|  |  |  |  |       if (DEBUGGING(LEVELING)) DEBUG_POS("stow_z_probe", current_position); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
	
		
			
				
					|  |  |  | @ -1960,13 +1983,8 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // Retract Z Servo endstop if enabled
 | 
			
		
	
		
			
				
					|  |  |  |  |       #if Z_RAISE_AFTER_PROBING > 0 | 
			
		
	
		
			
				
					|  |  |  |  |         if (doRaise) { | 
			
		
	
		
			
				
					|  |  |  |  |           raise_z_after_probing(); // this also updates current_position
 | 
			
		
	
		
			
				
					|  |  |  |  |           stepper.synchronize(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |       // Make room for the servo
 | 
			
		
	
		
			
				
					|  |  |  |  |       raise_z_for_servo(Z_RAISE_AFTER_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // Change the Z servo angle
 | 
			
		
	
		
			
				
					|  |  |  |  |       STOW_Z_SERVO(); | 
			
		
	
	
		
			
				
					|  |  |  | @ -2034,9 +2052,7 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |  |           stop(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     #endif // Z_PROBE_ALLEN_KEY
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |     #elif ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |       // Nothing to do here. Just clear endstops.z_probe_enabled
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -2195,29 +2211,6 @@ static void setup_for_endstop_move() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif // AUTO_BED_LEVELING_FEATURE
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   /**
 | 
			
		
	
		
			
				
					|  |  |  |  |    * Raise Z to a minimum height to make room for a servo to move | 
			
		
	
		
			
				
					|  |  |  |  |    * | 
			
		
	
		
			
				
					|  |  |  |  |    * zprobe_zoffset: Negative of the Z height where the probe engages | 
			
		
	
		
			
				
					|  |  |  |  |    *         z_dest: The before / after probing raise distance | 
			
		
	
		
			
				
					|  |  |  |  |    * | 
			
		
	
		
			
				
					|  |  |  |  |    * The zprobe_zoffset is negative for a switch below the nozzle, so | 
			
		
	
		
			
				
					|  |  |  |  |    * multiply by Z_HOME_DIR (-1) to move enough away from the bed. | 
			
		
	
		
			
				
					|  |  |  |  |    */ | 
			
		
	
		
			
				
					|  |  |  |  |   void raise_z_for_servo(float z_dest) { | 
			
		
	
		
			
				
					|  |  |  |  |     z_dest += home_offset[Z_AXIS]; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if ((Z_HOME_DIR) < 0 && zprobe_zoffset < 0) | 
			
		
	
		
			
				
					|  |  |  |  |       z_dest -= zprobe_zoffset; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (z_dest > current_position[Z_AXIS]) | 
			
		
	
		
			
				
					|  |  |  |  |       do_blocking_move_to_z(z_dest); // also updates current_position
 | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_SAFE_HOMING) || ENABLED(AUTO_BED_LEVELING_FEATURE) | 
			
		
	
		
			
				
					|  |  |  |  |   static void axis_unhomed_error(bool xyz=false) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (xyz) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -2313,7 +2306,7 @@ static void homeaxis(AxisEnum axis) { | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(Z_PROBE_SLED) | 
			
		
	
		
			
				
					|  |  |  |  |       #define _Z_DEPLOY           (dock_sled(false)) | 
			
		
	
		
			
				
					|  |  |  |  |       #define _Z_STOW             (dock_sled(true)) | 
			
		
	
		
			
				
					|  |  |  |  |     #elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |     #elif ENABLED(AUTO_BED_LEVELING_FEATURE) && (HAS_Z_SERVO_ENDSTOP || ENABLED(FIX_MOUNTED_PROBE)) | 
			
		
	
		
			
				
					|  |  |  |  |       #define _Z_DEPLOY           (deploy_z_probe()) | 
			
		
	
		
			
				
					|  |  |  |  |       #define _Z_STOW             (stow_z_probe()) | 
			
		
	
		
			
				
					|  |  |  |  |     #elif HAS_Z_SERVO_ENDSTOP | 
			
		
	
	
		
			
				
					|  |  |  | @ -2322,10 +2315,10 @@ static void homeaxis(AxisEnum axis) { | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // Homing Z towards the bed? Deploy the Z probe or endstop.
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) || HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_SLED) || ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |       if (axis == Z_AXIS && axis_home_dir < 0) { | 
			
		
	
		
			
				
					|  |  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
			
				
					|  |  |  |  |           if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_DEPLOY)); | 
			
		
	
		
			
				
					|  |  |  |  |           if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM(" > " STRINGIFY(_Z_DEPLOY)); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |         _Z_DEPLOY; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
	
		
			
				
					|  |  |  | @ -2445,10 +2438,10 @@ static void homeaxis(AxisEnum axis) { | 
			
		
	
		
			
				
					|  |  |  |  |     axis_homed[axis] = true; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // Put away the Z probe
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE) || HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_SLED) || ENABLED(FIX_MOUNTED_PROBE) | 
			
		
	
		
			
				
					|  |  |  |  |       if (axis == Z_AXIS && axis_home_dir < 0) { | 
			
		
	
		
			
				
					|  |  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
			
				
					|  |  |  |  |           if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_STOW)); | 
			
		
	
		
			
				
					|  |  |  |  |           if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM(" > " STRINGIFY(_Z_STOW)); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |         _Z_STOW; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
	
		
			
				
					|  |  |  | @ -3474,7 +3467,7 @@ inline void gcode_G28() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(Z_PROBE_SLED) | 
			
		
	
		
			
				
					|  |  |  |  |       dock_sled(false); // engage (un-dock) the Z probe
 | 
			
		
	
		
			
				
					|  |  |  |  |     #elif ENABLED(FIX_MOUNTED_PROBE) || ENABLED(MECHANICAL_PROBE) || ENABLED(Z_PROBE_ALLEN_KEY) || (ENABLED(DELTA) && SERVO_LEVELING) | 
			
		
	
		
			
				
					|  |  |  |  |     #elif ENABLED(FIX_MOUNTED_PROBE) || ENABLED(MECHANICAL_PROBE) || ENABLED(Z_PROBE_ALLEN_KEY) || (ENABLED(DELTA) && HAS_Z_SERVO_ENDSTOP) | 
			
		
	
		
			
				
					|  |  |  |  |       deploy_z_probe(); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -3727,7 +3720,7 @@ inline void gcode_G28() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if ENABLED(DELTA) | 
			
		
	
		
			
				
					|  |  |  |  |       // Allen Key Probe for Delta
 | 
			
		
	
		
			
				
					|  |  |  |  |       #if ENABLED(Z_PROBE_ALLEN_KEY) || SERVO_LEVELING | 
			
		
	
		
			
				
					|  |  |  |  |       #if ENABLED(Z_PROBE_ALLEN_KEY) || HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |         stow_z_probe(); | 
			
		
	
		
			
				
					|  |  |  |  |       #else | 
			
		
	
		
			
				
					|  |  |  |  |         raise_z_after_probing(); // for non Allen Key probes, such as simple mechanical probe
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -3848,9 +3841,6 @@ inline void gcode_G28() { | 
			
		
	
		
			
				
					|  |  |  |  |      * G30: Do a single Z probe at the current XY | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     inline void gcode_G30() { | 
			
		
	
		
			
				
					|  |  |  |  |       #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |         raise_z_for_servo(Z_RAISE_BEFORE_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |       deploy_z_probe(); // Engage Z Servo endstop if available. Z_PROBE_SLED is missed here.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       stepper.synchronize(); | 
			
		
	
	
		
			
				
					|  |  |  | @ -3869,10 +3859,7 @@ inline void gcode_G28() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       clean_up_after_endstop_move(); // Too early. must be done after the stowing.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |         raise_z_for_servo(Z_RAISE_AFTER_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |       stow_z_probe(false); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed here.
 | 
			
		
	
		
			
				
					|  |  |  |  |       stow_z_probe(); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed here.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       report_current_position(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  |  | @ -5989,9 +5976,6 @@ inline void gcode_M400() { stepper.synchronize(); } | 
			
		
	
		
			
				
					|  |  |  |  |    * M401: Engage Z Servo endstop if available | 
			
		
	
		
			
				
					|  |  |  |  |    */ | 
			
		
	
		
			
				
					|  |  |  |  |   inline void gcode_M401() { | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |       raise_z_for_servo(Z_RAISE_BEFORE_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     deploy_z_probe(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -5999,10 +5983,7 @@ inline void gcode_M400() { stepper.synchronize(); } | 
			
		
	
		
			
				
					|  |  |  |  |    * M402: Retract Z Servo endstop if enabled | 
			
		
	
		
			
				
					|  |  |  |  |    */ | 
			
		
	
		
			
				
					|  |  |  |  |   inline void gcode_M402() { | 
			
		
	
		
			
				
					|  |  |  |  |     #if HAS_Z_SERVO_ENDSTOP | 
			
		
	
		
			
				
					|  |  |  |  |       raise_z_for_servo(Z_RAISE_AFTER_PROBING); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     stow_z_probe(false); | 
			
		
	
		
			
				
					|  |  |  |  |     stow_z_probe(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif // AUTO_BED_LEVELING_FEATURE && (HAS_Z_SERVO_ENDSTOP || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |