| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -7997,36 +7997,50 @@ void ok_to_send() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ratio_y = y / bilinear_grid_spacing[Y_AXIS];
 | 
					 | 
					 | 
					 | 
					          ratio_y = y / bilinear_grid_spacing[Y_AXIS];
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    // Whole unit is the grid box index
 | 
					 | 
					 | 
					 | 
					    // Whole unit is the grid box index
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    int gridx = constrain(int(ratio_x), 0, ABL_GRID_POINTS_X - 2),
 | 
					 | 
					 | 
					 | 
					    const int gridx = constrain(floor(ratio_x), 0, ABL_GRID_POINTS_X - 2),
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        gridy = constrain(int(ratio_y), 0, ABL_GRID_POINTS_Y - 2);
 | 
					 | 
					 | 
					 | 
					              gridy = constrain(floor(ratio_y), 0, ABL_GRID_POINTS_Y - 2),
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					              nextx = gridx + (x < PROBE_BED_WIDTH ? 1 : 0),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					              nexty = gridy + (y < PROBE_BED_HEIGHT ? 1 : 0);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    // Subtract whole to get the ratio within the grid box
 | 
					 | 
					 | 
					 | 
					    // Subtract whole to get the ratio within the grid box
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ratio_x -= gridx, ratio_y -= gridy;
 | 
					 | 
					 | 
					 | 
					    ratio_x = constrain(ratio_x - gridx, 0.0, 1.0);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ratio_y = constrain(ratio_y - gridy, 0.0, 1.0);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          // Z at the box corners
 | 
					 | 
					 | 
					 | 
					    // Z at the box corners
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    const float z1 = bed_level_grid[gridx][gridy],         // left-front
 | 
					 | 
					 | 
					 | 
					    const float z1 = bed_level_grid[gridx][gridy],  // left-front
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                z2 = bed_level_grid[gridx][gridy + 1],     // left-back
 | 
					 | 
					 | 
					 | 
					                z2 = bed_level_grid[gridx][nexty],  // left-back
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                z3 = bed_level_grid[gridx + 1][gridy],     // right-front
 | 
					 | 
					 | 
					 | 
					                z3 = bed_level_grid[nextx][gridy],  // right-front
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                z4 = bed_level_grid[gridx + 1][gridy + 1], // right-back
 | 
					 | 
					 | 
					 | 
					                z4 = bed_level_grid[nextx][nexty],  // right-back
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                // Bilinear interpolate
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                L = z1 + (z2 - z1) * ratio_y,   // Linear interp. LF -> LB
 | 
					 | 
					 | 
					 | 
					                L = z1 + (z2 - z1) * ratio_y,   // Linear interp. LF -> LB
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                R = z3 + (z4 - z3) * ratio_y;   // Linear interp. RF -> RB
 | 
					 | 
					 | 
					 | 
					                R = z3 + (z4 - z3) * ratio_y,   // Linear interp. RF -> RB
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                offset = L + ratio_x * (R - L);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    /*
 | 
					 | 
					 | 
					 | 
					    /*
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR("gridx=", gridx);
 | 
					 | 
					 | 
					 | 
					    static float last_offset = 0;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" gridy=", gridy);
 | 
					 | 
					 | 
					 | 
					    if (fabs(last_offset - offset) > 0.2) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPGM("Sudden Shift at ");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR("x=", x);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[X_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOLNPAIR(" -> gridx=", gridx);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" y=", y);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[Y_AXIS]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOLNPAIR(" -> gridy=", gridy);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" ratio_x=", ratio_x);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" ratio_x=", ratio_x);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" ratio_y=", ratio_y);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOLNPAIR(" ratio_y=", ratio_y);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z1=", z1);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z1=", z1);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z2=", z2);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z2=", z2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z3=", z3);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z3=", z3);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" z4=", z4);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOLNPAIR(" z4=", z4);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" L=", L);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" L=", L);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" R=", R);
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" R=", R);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SERIAL_ECHOPAIR(" offset=", L + ratio_x * (R - L));
 | 
					 | 
					 | 
					 | 
					      SERIAL_ECHOLNPAIR(" offset=", offset);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    last_offset = offset;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    //*/
 | 
					 | 
					 | 
					 | 
					    //*/
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return L + ratio_x * (R - L);
 | 
					 | 
					 | 
					 | 
					    return offset;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif // AUTO_BED_LEVELING_BILINEAR
 | 
					 | 
					 | 
					 | 
					#endif // AUTO_BED_LEVELING_BILINEAR
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
 
 |