|
@ -51,7 +51,7 @@ |
|
|
|
|
|
|
|
|
#if ENABLED(NEWPANEL) |
|
|
#if ENABLED(NEWPANEL) |
|
|
void lcd_return_to_status(); |
|
|
void lcd_return_to_status(); |
|
|
extern void _lcd_ubl_output_map_lcd(); |
|
|
void _lcd_ubl_output_map_lcd(); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
extern float meshedit_done; |
|
|
extern float meshedit_done; |
|
@ -96,8 +96,8 @@ |
|
|
* previous measurements. |
|
|
* previous measurements. |
|
|
* |
|
|
* |
|
|
* C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle |
|
|
* C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle |
|
|
* location in its search for the closest unmeasured Mesh Point. Instead, attempt to |
|
|
* location in its search for the closest unmeasured Mesh Point. Instead, attempt to |
|
|
* start at one end of the uprobed points and Continue sequentually. |
|
|
* start at one end of the uprobed points and Continue sequentially. |
|
|
* |
|
|
* |
|
|
* G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. |
|
|
* G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. |
|
|
* |
|
|
* |
|
@ -1038,12 +1038,12 @@ |
|
|
|
|
|
|
|
|
static uint8_t ubl_state_at_invocation = 0; |
|
|
static uint8_t ubl_state_at_invocation = 0; |
|
|
|
|
|
|
|
|
#if ENABLED(UBL_DEVEL_DEBUGGING) |
|
|
#ifdef UBL_DEVEL_DEBUGGING |
|
|
static uint8_t ubl_state_recursion_chk = 0; |
|
|
static uint8_t ubl_state_recursion_chk = 0; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
void unified_bed_leveling::save_ubl_active_state_and_disable() { |
|
|
void unified_bed_leveling::save_ubl_active_state_and_disable() { |
|
|
#if ENABLED(UBL_DEVEL_DEBUGGING) |
|
|
#ifdef UBL_DEVEL_DEBUGGING |
|
|
ubl_state_recursion_chk++; |
|
|
ubl_state_recursion_chk++; |
|
|
if (ubl_state_recursion_chk != 1) { |
|
|
if (ubl_state_recursion_chk != 1) { |
|
|
SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); |
|
|
SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); |
|
@ -1059,7 +1059,7 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void unified_bed_leveling::restore_ubl_active_state_and_leave() { |
|
|
void unified_bed_leveling::restore_ubl_active_state_and_leave() { |
|
|
#if ENABLED(UBL_DEVEL_DEBUGGING) |
|
|
#ifdef UBL_DEVEL_DEBUGGING |
|
|
if (--ubl_state_recursion_chk) { |
|
|
if (--ubl_state_recursion_chk) { |
|
|
SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); |
|
|
SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); |
|
|
#if ENABLED(NEWPANEL) |
|
|
#if ENABLED(NEWPANEL) |
|
@ -1143,7 +1143,7 @@ |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
safe_delay(50); |
|
|
safe_delay(50); |
|
|
|
|
|
|
|
|
#if ENABLED(UBL_DEVEL_DEBUGGING) |
|
|
#ifdef UBL_DEVEL_DEBUGGING |
|
|
SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation); |
|
|
SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk); |
|
|
SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk); |
|
@ -1257,22 +1257,22 @@ |
|
|
|
|
|
|
|
|
found_a_NAN = true; |
|
|
found_a_NAN = true; |
|
|
|
|
|
|
|
|
int8_t closest_x=-1, closest_y=-1; |
|
|
int8_t closest_x = -1, closest_y = -1; |
|
|
float d1, d2 = 99999.9; |
|
|
float d1, d2 = 99999.9; |
|
|
for (int8_t k = 0; k < GRID_MAX_POINTS_X; k++) { |
|
|
for (int8_t k = 0; k < GRID_MAX_POINTS_X; k++) { |
|
|
for (int8_t l = 0; l < GRID_MAX_POINTS_Y; l++) { |
|
|
for (int8_t l = 0; l < GRID_MAX_POINTS_Y; l++) { |
|
|
if (!isnan(z_values[k][l])) { |
|
|
if (!isnan(z_values[k][l])) { |
|
|
found_a_real = true; |
|
|
found_a_real = true; |
|
|
|
|
|
|
|
|
// Add in a random weighting factor that scrambles the probing of the
|
|
|
// Add in a random weighting factor that scrambles the probing of the
|
|
|
// last half of the mesh (when every unprobed mesh point is one index
|
|
|
// last half of the mesh (when every unprobed mesh point is one index
|
|
|
// from a probed location).
|
|
|
// from a probed location).
|
|
|
|
|
|
|
|
|
d1 = HYPOT(i - k, j - l) + (1.0 / ((millis() % 47) + 13)); |
|
|
d1 = HYPOT(i - k, j - l) + (1.0 / ((millis() % 47) + 13)); |
|
|
|
|
|
|
|
|
if (d1 < d2) { // found a closer distance from invalid mesh point at (i,j) to defined mesh point at (k,l)
|
|
|
if (d1 < d2) { // found a closer distance from invalid mesh point at (i,j) to defined mesh point at (k,l)
|
|
|
d2 = d1; // found a closer location with
|
|
|
d2 = d1; // found a closer location with
|
|
|
closest_x = i; // an assigned mesh point value
|
|
|
closest_x = i; // an assigned mesh point value
|
|
|
closest_y = j; |
|
|
closest_y = j; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -1280,7 +1280,7 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//
|
|
|
//
|
|
|
// at this point d2 should have the closest defined mesh point to invalid mesh point (i,j)
|
|
|
// At this point d2 should have the closest defined mesh point to invalid mesh point (i,j)
|
|
|
//
|
|
|
//
|
|
|
|
|
|
|
|
|
if (found_a_real && (closest_x >= 0) && (d2 > out_mesh.distance)) { |
|
|
if (found_a_real && (closest_x >= 0) && (d2 > out_mesh.distance)) { |
|
@ -1523,7 +1523,7 @@ |
|
|
y_min = max(MIN_PROBE_Y, MESH_MIN_Y), |
|
|
y_min = max(MIN_PROBE_Y, MESH_MIN_Y), |
|
|
y_max = min(MAX_PROBE_Y, MESH_MAX_Y); |
|
|
y_max = min(MAX_PROBE_Y, MESH_MAX_Y); |
|
|
|
|
|
|
|
|
bool abort_flag=false; |
|
|
bool abort_flag = false; |
|
|
|
|
|
|
|
|
float measured_z; |
|
|
float measured_z; |
|
|
|
|
|
|
|
@ -1532,7 +1532,7 @@ |
|
|
|
|
|
|
|
|
struct linear_fit_data lsf_results; |
|
|
struct linear_fit_data lsf_results; |
|
|
|
|
|
|
|
|
// float z1, z2, z3; // Needed for algorithm validation down below.
|
|
|
//float z1, z2, z3; // Needed for algorithm validation down below.
|
|
|
|
|
|
|
|
|
incremental_LSF_reset(&lsf_results); |
|
|
incremental_LSF_reset(&lsf_results); |
|
|
|
|
|
|
|
@ -1542,8 +1542,8 @@ |
|
|
abort_flag = true; |
|
|
abort_flag = true; |
|
|
else { |
|
|
else { |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_1_X, UBL_PROBE_PT_1_Y); |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_1_X, UBL_PROBE_PT_1_Y); |
|
|
// z1 = measured_z;
|
|
|
//z1 = measured_z;
|
|
|
if (g29_verbose_level>3) { |
|
|
if (g29_verbose_level > 3) { |
|
|
serial_spaces(16); |
|
|
serial_spaces(16); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
} |
|
|
} |
|
@ -1552,12 +1552,12 @@ |
|
|
|
|
|
|
|
|
if (!abort_flag) { |
|
|
if (!abort_flag) { |
|
|
measured_z = probe_pt(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y, false, g29_verbose_level); |
|
|
measured_z = probe_pt(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y, false, g29_verbose_level); |
|
|
// z2 = measured_z;
|
|
|
//z2 = measured_z;
|
|
|
if (isnan(measured_z)) |
|
|
if (isnan(measured_z)) |
|
|
abort_flag = true; |
|
|
abort_flag = true; |
|
|
else { |
|
|
else { |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y); |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y); |
|
|
if (g29_verbose_level>3) { |
|
|
if (g29_verbose_level > 3) { |
|
|
serial_spaces(16); |
|
|
serial_spaces(16); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
} |
|
|
} |
|
@ -1567,12 +1567,12 @@ |
|
|
|
|
|
|
|
|
if (!abort_flag) { |
|
|
if (!abort_flag) { |
|
|
measured_z = probe_pt(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y, true, g29_verbose_level); |
|
|
measured_z = probe_pt(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y, true, g29_verbose_level); |
|
|
// z3 = measured_z;
|
|
|
//z3 = measured_z;
|
|
|
if (isnan(measured_z)) |
|
|
if (isnan(measured_z)) |
|
|
abort_flag = true; |
|
|
abort_flag = true; |
|
|
else { |
|
|
else { |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y); |
|
|
measured_z -= get_z_correction(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y); |
|
|
if (g29_verbose_level>3) { |
|
|
if (g29_verbose_level > 3) { |
|
|
serial_spaces(16); |
|
|
serial_spaces(16); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); |
|
|
} |
|
|
} |
|
@ -1584,54 +1584,54 @@ |
|
|
SERIAL_ECHOPGM("?Error probing point. Aborting operation.\n"); |
|
|
SERIAL_ECHOPGM("?Error probing point. Aborting operation.\n"); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} |
|
|
|
|
|
else { // !do_3_pt_leveling
|
|
|
|
|
|
|
|
|
bool zig_zag = false; |
|
|
bool zig_zag = false; |
|
|
for (uint8_t ix = 0; ix < g29_grid_size; ix++) { |
|
|
for (uint8_t ix = 0; ix < g29_grid_size; ix++) { |
|
|
const float rx = float(x_min) + ix * dx; |
|
|
const float rx = float(x_min) + ix * dx; |
|
|
for (int8_t iy = 0; iy < g29_grid_size; iy++) { |
|
|
for (int8_t iy = 0; iy < g29_grid_size; iy++) { |
|
|
const float ry = float(y_min) + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); |
|
|
const float ry = float(y_min) + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); |
|
|
|
|
|
|
|
|
if (!abort_flag) { |
|
|
if (!abort_flag) { |
|
|
measured_z = probe_pt(rx, ry, parser.seen('E'), g29_verbose_level); // TODO: Needs error handling
|
|
|
measured_z = probe_pt(rx, ry, parser.seen('E'), g29_verbose_level); // TODO: Needs error handling
|
|
|
|
|
|
|
|
|
if (isnan(measured_z)) |
|
|
abort_flag = isnan(measured_z); |
|
|
abort_flag = true; |
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
|
|
|
if (DEBUGGING(LEVELING)) { |
|
|
|
|
|
SERIAL_CHAR('('); |
|
|
|
|
|
SERIAL_PROTOCOL_F(rx, 7); |
|
|
|
|
|
SERIAL_CHAR(','); |
|
|
|
|
|
SERIAL_PROTOCOL_F(ry, 7); |
|
|
|
|
|
SERIAL_ECHOPGM(") logical: "); |
|
|
|
|
|
SERIAL_CHAR('('); |
|
|
|
|
|
SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 7); |
|
|
|
|
|
SERIAL_CHAR(','); |
|
|
|
|
|
SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 7); |
|
|
|
|
|
SERIAL_ECHOPGM(") measured: "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(measured_z, 7); |
|
|
|
|
|
SERIAL_ECHOPGM(" correction: "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(get_z_correction(rx, ry), 7); |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
measured_z -= get_z_correction(rx, ry) /* + zprobe_zoffset */ ; |
|
|
if (DEBUGGING(LEVELING)) { |
|
|
|
|
|
SERIAL_CHAR('('); |
|
|
|
|
|
SERIAL_PROTOCOL_F(rx, 7); |
|
|
|
|
|
SERIAL_CHAR(','); |
|
|
|
|
|
SERIAL_PROTOCOL_F(ry, 7); |
|
|
|
|
|
SERIAL_ECHOPGM(") logical: "); |
|
|
|
|
|
SERIAL_CHAR('('); |
|
|
|
|
|
SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 7); |
|
|
|
|
|
SERIAL_CHAR(','); |
|
|
|
|
|
SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 7); |
|
|
|
|
|
SERIAL_ECHOPGM(") measured: "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(measured_z, 7); |
|
|
|
|
|
SERIAL_ECHOPGM(" correction: "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(get_z_correction(rx, ry), 7); |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
measured_z -= get_z_correction(rx, ry) /* + zprobe_zoffset */ ; |
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
|
|
|
if (DEBUGGING(LEVELING)) { |
|
|
|
|
|
SERIAL_ECHOPGM(" final >>>---> "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(measured_z, 7); |
|
|
|
|
|
SERIAL_EOL(); |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
incremental_LSF(&lsf_results, rx, ry, measured_z); |
|
|
if (DEBUGGING(LEVELING)) { |
|
|
|
|
|
SERIAL_ECHOPGM(" final >>>---> "); |
|
|
|
|
|
SERIAL_PROTOCOL_F(measured_z, 7); |
|
|
|
|
|
SERIAL_EOL(); |
|
|
|
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
incremental_LSF(&lsf_results, rx, ry, measured_z); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
zig_zag ^= true; |
|
|
zig_zag ^= true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1640,7 +1640,6 @@ |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1.0000).get_normal(); |
|
|
vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1.0000).get_normal(); |
|
|
|
|
|
|
|
|
if (g29_verbose_level > 2) { |
|
|
if (g29_verbose_level > 2) { |
|
@ -1714,22 +1713,22 @@ |
|
|
SERIAL_ECHOPGM("]\n"); |
|
|
SERIAL_ECHOPGM("]\n"); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
|
|
|
|
|
|
/*
|
|
|
/**
|
|
|
* The following code can be used to check the validity of the mesh tilting algorithm. |
|
|
* The following code can be used to check the validity of the mesh tilting algorithm. |
|
|
* When a 3-Point Mesh Tilt is done, the same algorithm is used as the grid based tilting. |
|
|
* When a 3-Point Mesh Tilt is done, the same algorithm is used as the grid based tilting. |
|
|
* The only difference is just 3 points are used in the calculations. That fact guarantees |
|
|
* The only difference is just 3 points are used in the calculations. That fact guarantees |
|
|
* each probed point should have an exact match when a get_z_correction() for that location |
|
|
* each probed point should have an exact match when a get_z_correction() for that location |
|
|
* is calculated. The Z error between the probed point locations and the get_z_correction() |
|
|
* is calculated. The Z error between the probed point locations and the get_z_correction() |
|
|
* numbers for those locations should be 0.000 |
|
|
* numbers for those locations should be 0.000 |
|
|
*/ |
|
|
*/ |
|
|
/*
|
|
|
#if 0 |
|
|
float t, t1, d; |
|
|
float t, t1, d; |
|
|
t = normal.x * (UBL_PROBE_PT_1_X) + normal.y * (UBL_PROBE_PT_1_Y); |
|
|
t = normal.x * (UBL_PROBE_PT_1_X) + normal.y * (UBL_PROBE_PT_1_Y); |
|
|
d = t + normal.z * z1; |
|
|
d = t + normal.z * z1; |
|
|
SERIAL_ECHOPGM("D from 1st point: "); |
|
|
SERIAL_ECHOPGM("D from 1st point: "); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHO_F(normal.z*z1-get_z_correction(UBL_PROBE_PT_1_X, UBL_PROBE_PT_1_Y),6); |
|
|
SERIAL_ECHO_F(normal.z*z1-get_z_correction(UBL_PROBE_PT_1_X, UBL_PROBE_PT_1_Y), 6); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
|
|
|
|
|
|
t = normal.x * (UBL_PROBE_PT_2_X) + normal.y * (UBL_PROBE_PT_2_Y); |
|
|
t = normal.x * (UBL_PROBE_PT_2_X) + normal.y * (UBL_PROBE_PT_2_Y); |
|
@ -1738,7 +1737,7 @@ |
|
|
SERIAL_ECHOPGM("D from 2nd point: "); |
|
|
SERIAL_ECHOPGM("D from 2nd point: "); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHO_F(normal.z*z2-get_z_correction(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y),6); |
|
|
SERIAL_ECHO_F(normal.z*z2-get_z_correction(UBL_PROBE_PT_2_X, UBL_PROBE_PT_2_Y), 6); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
|
|
|
|
|
|
t = normal.x * (UBL_PROBE_PT_3_X) + normal.y * (UBL_PROBE_PT_3_Y); |
|
|
t = normal.x * (UBL_PROBE_PT_3_X) + normal.y * (UBL_PROBE_PT_3_Y); |
|
@ -1746,7 +1745,7 @@ |
|
|
SERIAL_ECHOPGM("D from 3rd point: "); |
|
|
SERIAL_ECHOPGM("D from 3rd point: "); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHOPGM(" Z error: "); |
|
|
SERIAL_ECHO_F(normal.z*z3-get_z_correction(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y),6); |
|
|
SERIAL_ECHO_F(normal.z*z3-get_z_correction(UBL_PROBE_PT_3_X, UBL_PROBE_PT_3_Y), 6); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
|
|
|
|
|
|
t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); |
|
|
t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); |
|
@ -1760,13 +1759,13 @@ |
|
|
SERIAL_ECHOPGM("D from home location using mesh value for Z: "); |
|
|
SERIAL_ECHOPGM("D from home location using mesh value for Z: "); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
SERIAL_ECHO_F(d, 6); |
|
|
|
|
|
|
|
|
SERIAL_ECHOPAIR(" Z error: (", Z_SAFE_HOMING_X_POINT ); |
|
|
SERIAL_ECHOPAIR(" Z error: (", Z_SAFE_HOMING_X_POINT); |
|
|
SERIAL_ECHOPAIR(",", Z_SAFE_HOMING_Y_POINT ); |
|
|
SERIAL_ECHOPAIR(",", Z_SAFE_HOMING_Y_POINT ); |
|
|
SERIAL_ECHOPGM(") = "); |
|
|
SERIAL_ECHOPGM(") = "); |
|
|
SERIAL_ECHO_F( get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT),6); |
|
|
SERIAL_ECHO_F(get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT), 6); |
|
|
SERIAL_EOL(); |
|
|
SERIAL_EOL(); |
|
|
*/ |
|
|
#endif |
|
|
} |
|
|
} // DEBUGGING(LEVELING)
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|