@ -1150,18 +1150,20 @@ static void retract_z_probe() {
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					} 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					/// Probe bed height at position (x,y), returns the measured z value
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					static  float  probe_pt ( float  x ,  float  y ,  float  z_before  ) { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					static  float  probe_pt ( float  x ,  float  y ,  float  z_before , int  retract_action = 0  ) { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  // move to right place
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  do_blocking_move_to ( current_position [ X_AXIS ] ,  current_position [ Y_AXIS ] ,  z_before ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  do_blocking_move_to ( x  -  X_PROBE_OFFSET_FROM_EXTRUDER ,  y  -  Y_PROBE_OFFSET_FROM_EXTRUDER ,  current_position [ Z_AXIS ] ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# ifndef Z_PROBE_SLED 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  engage_z_probe ( ) ;    // Engage Z Servo endstop if available
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					   if  ( ( retract_action = = 0 )  | |  ( retract_action = = 1 ) )  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     engage_z_probe ( ) ;    // Engage Z Servo endstop if available
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# endif  // Z_PROBE_SLED
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  run_z_probe ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  float  measured_z  =  current_position [ Z_AXIS ] ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# ifndef Z_PROBE_SLED 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  retract_z_probe ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  if  ( ( retract_action = = 0 )  | |  ( retract_action = = 3 ) )  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     retract_z_probe ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# endif  // Z_PROBE_SLED
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					  SERIAL_PROTOCOLPGM ( MSG_BED ) ; 
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1750,7 +1752,22 @@ void process_commands()
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                  z_before  =  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                float  measured_z  =  probe_pt ( xProbe ,  yProbe ,  z_before ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                float  measured_z ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                //Enhanced G29 - Do not retract servo between probes
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                if  ( code_seen ( ' E ' )  | |  code_seen ( ' e ' )  ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                   { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                   if  ( ( yProbe = = FRONT_PROBE_BED_POSITION )  & &  ( xCount = = 0 ) ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                       { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        measured_z  =  probe_pt ( xProbe ,  yProbe ,  z_before , 1 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                       }  else  if  ( ( yProbe = = BACK_PROBE_BED_POSITION )  & &  ( xCount  = =  AUTO_BED_LEVELING_GRID_POINTS - 1 ) ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                         { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                         measured_z  =  probe_pt ( xProbe ,  yProbe ,  z_before , 3 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                         }  else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                           measured_z  =  probe_pt ( xProbe ,  yProbe ,  z_before , 2 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                         } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    }  else  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    measured_z  =  probe_pt ( xProbe ,  yProbe ,  z_before ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                eqnBVector [ probePointCounter ]  =  measured_z ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1781,15 +1798,30 @@ void process_commands()
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# else  // AUTO_BED_LEVELING_GRID not defined
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Probe at 3 arbitrary points
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // probe 1
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            float  z_at_pt_1  =  probe_pt ( ABL_PROBE_PT_1_X ,  ABL_PROBE_PT_1_Y ,  Z_RAISE_BEFORE_PROBING ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // probe 2
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            float  z_at_pt_2  =  probe_pt ( ABL_PROBE_PT_2_X ,  ABL_PROBE_PT_2_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // probe 3
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            float  z_at_pt_3  =  probe_pt ( ABL_PROBE_PT_3_X ,  ABL_PROBE_PT_3_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Enhanced G29
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            float  z_at_pt_1 , z_at_pt_2 , z_at_pt_3 ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  ( code_seen ( ' E ' )  | |  code_seen ( ' e ' )  ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               // probe 1               
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                z_at_pt_1  =  probe_pt ( ABL_PROBE_PT_1_X ,  ABL_PROBE_PT_1_Y ,  Z_RAISE_BEFORE_PROBING , 1 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               // probe 2
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                z_at_pt_2  =  probe_pt ( ABL_PROBE_PT_2_X ,  ABL_PROBE_PT_2_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS , 2 ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               // probe 3
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                z_at_pt_3  =  probe_pt ( ABL_PROBE_PT_3_X ,  ABL_PROBE_PT_3_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS , 3 ) ;  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               else  
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						        // probe 1
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						        float  z_at_pt_1  =  probe_pt ( ABL_PROBE_PT_1_X ,  ABL_PROBE_PT_1_Y ,  Z_RAISE_BEFORE_PROBING ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                // probe 2
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                float  z_at_pt_2  =  probe_pt ( ABL_PROBE_PT_2_X ,  ABL_PROBE_PT_2_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                // probe 3
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                float  z_at_pt_3  =  probe_pt ( ABL_PROBE_PT_3_X ,  ABL_PROBE_PT_3_Y ,  current_position [ Z_AXIS ]  +  Z_RAISE_BETWEEN_PROBINGS ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					               } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            clean_up_after_endstop_move ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            set_bed_level_equation_3pts ( z_at_pt_1 ,  z_at_pt_2 ,  z_at_pt_3 ) ;