|
|
@ -2432,33 +2432,41 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
/**
|
|
|
|
* Print calibration results for plotting or manual frame adjustment. |
|
|
|
*/ |
|
|
|
static void print_bilinear_leveling_grid() { |
|
|
|
SERIAL_ECHOPGM("Bilinear Leveling Grid:\n "); |
|
|
|
for (uint8_t x = 0; x < ABL_GRID_MAX_POINTS_X; x++) { |
|
|
|
SERIAL_PROTOCOLPGM(" "); |
|
|
|
if (x < 10) SERIAL_PROTOCOLCHAR(' '); |
|
|
|
static void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, float (*fn)(const uint8_t, const uint8_t)) { |
|
|
|
for (uint8_t x = 0; x < sx; x++) { |
|
|
|
for (uint8_t i = 0; i < precision + 2 + (x < 10 ? 1 : 0); i++) |
|
|
|
SERIAL_PROTOCOLCHAR(' '); |
|
|
|
SERIAL_PROTOCOL((int)x); |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
for (uint8_t y = 0; y < ABL_GRID_MAX_POINTS_Y; y++) { |
|
|
|
for (uint8_t y = 0; y < sy; y++) { |
|
|
|
if (y < 10) SERIAL_PROTOCOLCHAR(' '); |
|
|
|
SERIAL_PROTOCOL((int)y); |
|
|
|
for (uint8_t x = 0; x < ABL_GRID_MAX_POINTS_X; x++) { |
|
|
|
for (uint8_t x = 0; x < sx; x++) { |
|
|
|
SERIAL_PROTOCOLCHAR(' '); |
|
|
|
float offset = bed_level_grid[x][y]; |
|
|
|
float offset = fn(x, y); |
|
|
|
if (offset != UNPROBED) { |
|
|
|
if (offset > 0) SERIAL_CHAR('+'); |
|
|
|
SERIAL_PROTOCOL_F(offset, 2); |
|
|
|
if (offset >= 0) SERIAL_CHAR('+'); |
|
|
|
SERIAL_PROTOCOL_F(offset, precision); |
|
|
|
} |
|
|
|
else |
|
|
|
SERIAL_PROTOCOLPGM(" ===="); |
|
|
|
for (uint8_t i = 0; i < precision + 3; i++) |
|
|
|
SERIAL_PROTOCOLCHAR(i ? '=' : ' '); |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
} |
|
|
|
|
|
|
|
static void print_bilinear_leveling_grid() { |
|
|
|
SERIAL_ECHOLNPGM("Bilinear Leveling Grid:"); |
|
|
|
print_2d_array(ABL_GRID_MAX_POINTS_X, ABL_GRID_MAX_POINTS_Y, 2, |
|
|
|
[](const uint8_t x, const uint8_t y) { return bed_level_grid[x][y]; } |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
#if ENABLED(ABL_BILINEAR_SUBDIVISION) |
|
|
|
|
|
|
|
#define ABL_GRID_POINTS_VIRT_X (ABL_GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 |
|
|
|
#define ABL_GRID_POINTS_VIRT_Y (ABL_GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 |
|
|
|
#define ABL_TEMP_POINTS_X (ABL_GRID_MAX_POINTS_X + 2) |
|
|
@ -2468,29 +2476,11 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
|
|
|
|
static void bed_level_virt_print() { |
|
|
|
SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); |
|
|
|
for (uint8_t x = 0; x < ABL_GRID_POINTS_VIRT_X; x++) { |
|
|
|
SERIAL_PROTOCOLPGM(" "); |
|
|
|
if (x < 10) SERIAL_PROTOCOLCHAR(' '); |
|
|
|
SERIAL_PROTOCOL((int)x); |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
for (uint8_t y = 0; y < ABL_GRID_POINTS_VIRT_Y; y++) { |
|
|
|
if (y < 10) SERIAL_PROTOCOLCHAR(' '); |
|
|
|
SERIAL_PROTOCOL((int)y); |
|
|
|
for (uint8_t x = 0; x < ABL_GRID_POINTS_VIRT_X; x++) { |
|
|
|
SERIAL_PROTOCOLCHAR(' '); |
|
|
|
float offset = bed_level_grid_virt[x][y]; |
|
|
|
if (offset != UNPROBED) { |
|
|
|
if (offset >= 0) SERIAL_CHAR('+'); |
|
|
|
SERIAL_PROTOCOL_F(offset, 5); |
|
|
|
} |
|
|
|
else |
|
|
|
SERIAL_PROTOCOLPGM(" ===="); |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
} |
|
|
|
SERIAL_EOL; |
|
|
|
print_2d_array(ABL_GRID_POINTS_VIRT_X, ABL_GRID_POINTS_VIRT_Y, 5, |
|
|
|
[](const uint8_t x, const uint8_t y) { return bed_level_grid_virt[x][y]; } |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
#define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) |
|
|
|
float bed_level_virt_coord(const uint8_t x, const uint8_t y) { |
|
|
|
uint8_t ep = 0, ip = 1; |
|
|
@ -2528,6 +2518,7 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
} |
|
|
|
return bed_level_grid[x - 1][y - 1]; |
|
|
|
} |
|
|
|
|
|
|
|
static float bed_level_virt_cmr(const float p[4], const uint8_t i, const float t) { |
|
|
|
return ( |
|
|
|
p[i-1] * -t * sq(1 - t) |
|
|
@ -2536,6 +2527,7 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
- p[i+2] * sq(t) * (1 - t) |
|
|
|
) * 0.5; |
|
|
|
} |
|
|
|
|
|
|
|
static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { |
|
|
|
float row[4], column[4]; |
|
|
|
for (uint8_t i = 0; i < 4; i++) { |
|
|
@ -2546,6 +2538,7 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
} |
|
|
|
return bed_level_virt_cmr(row, 1, tx); |
|
|
|
} |
|
|
|
|
|
|
|
void bed_level_virt_interpolate() { |
|
|
|
for (uint8_t y = 0; y < ABL_GRID_MAX_POINTS_Y; y++) |
|
|
|
for (uint8_t x = 0; x < ABL_GRID_MAX_POINTS_X; x++) |
|
|
@ -2565,7 +2558,6 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
#endif // ABL_BILINEAR_SUBDIVISION
|
|
|
|
#endif // AUTO_BED_LEVELING_BILINEAR
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Home an individual linear axis |
|
|
|
*/ |
|
|
|