|
@ -2119,8 +2119,13 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Reset calibration results to zero. |
|
|
* Reset calibration results to zero. |
|
|
|
|
|
* |
|
|
|
|
|
* TODO: Proper functions to disable / enable |
|
|
|
|
|
* bed leveling via a flag, correcting the |
|
|
|
|
|
* current position in each case. |
|
|
*/ |
|
|
*/ |
|
|
void reset_bed_level() { |
|
|
void reset_bed_level() { |
|
|
|
|
|
planner.abl_enabled = false; |
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
#if ENABLED(DEBUG_LEVELING_FEATURE) |
|
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level"); |
|
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level"); |
|
|
#endif |
|
|
#endif |
|
@ -2128,7 +2133,6 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
planner.bed_level_matrix.set_to_identity(); |
|
|
planner.bed_level_matrix.set_to_identity(); |
|
|
#elif ENABLED(AUTO_BED_LEVELING_NONLINEAR) |
|
|
#elif ENABLED(AUTO_BED_LEVELING_NONLINEAR) |
|
|
memset(bed_level_grid, 0, sizeof(bed_level_grid)); |
|
|
memset(bed_level_grid, 0, sizeof(bed_level_grid)); |
|
|
nonlinear_grid_spacing[X_AXIS] = nonlinear_grid_spacing[Y_AXIS] = 0; |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -3505,16 +3509,15 @@ inline void gcode_G28() { |
|
|
|
|
|
|
|
|
stepper.synchronize(); |
|
|
stepper.synchronize(); |
|
|
|
|
|
|
|
|
if (!dryrun) { |
|
|
// Disable auto bed leveling during G29
|
|
|
|
|
|
bool auto_bed_leveling_was_enabled = planner.abl_enabled, |
|
|
|
|
|
abl_should_reenable = auto_bed_leveling_was_enabled; |
|
|
|
|
|
|
|
|
// Reset the bed_level_matrix because leveling
|
|
|
planner.abl_enabled = false; |
|
|
// needs to be done without leveling enabled.
|
|
|
|
|
|
reset_bed_level(); |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
if (!dryrun) { |
|
|
// Re-orient the current position without leveling
|
|
|
// Re-orient the current position without leveling
|
|
|
// based on where the steppers are positioned.
|
|
|
// based on where the steppers are positioned.
|
|
|
//
|
|
|
|
|
|
get_cartesian_from_steppers(); |
|
|
get_cartesian_from_steppers(); |
|
|
memcpy(current_position, cartes, sizeof(cartes)); |
|
|
memcpy(current_position, cartes, sizeof(cartes)); |
|
|
|
|
|
|
|
@ -3525,7 +3528,10 @@ inline void gcode_G28() { |
|
|
setup_for_endstop_or_probe_move(); |
|
|
setup_for_endstop_or_probe_move(); |
|
|
|
|
|
|
|
|
// Deploy the probe. Probe will raise if needed.
|
|
|
// Deploy the probe. Probe will raise if needed.
|
|
|
if (DEPLOY_PROBE()) return; |
|
|
if (DEPLOY_PROBE()) { |
|
|
|
|
|
planner.abl_enabled = abl_should_reenable; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
float xProbe = 0, yProbe = 0, measured_z = 0; |
|
|
float xProbe = 0, yProbe = 0, measured_z = 0; |
|
|
|
|
|
|
|
@ -3537,11 +3543,16 @@ inline void gcode_G28() { |
|
|
|
|
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_NONLINEAR) |
|
|
#if ENABLED(AUTO_BED_LEVELING_NONLINEAR) |
|
|
|
|
|
|
|
|
nonlinear_grid_spacing[X_AXIS] = xGridSpacing; |
|
|
|
|
|
nonlinear_grid_spacing[Y_AXIS] = yGridSpacing; |
|
|
|
|
|
float zoffset = zprobe_zoffset; |
|
|
float zoffset = zprobe_zoffset; |
|
|
if (code_seen('Z')) zoffset += code_value_axis_units(Z_AXIS); |
|
|
if (code_seen('Z')) zoffset += code_value_axis_units(Z_AXIS); |
|
|
|
|
|
|
|
|
|
|
|
if (xGridSpacing != nonlinear_grid_spacing[X_AXIS] || yGridSpacing != nonlinear_grid_spacing[Y_AXIS]) { |
|
|
|
|
|
nonlinear_grid_spacing[X_AXIS] = xGridSpacing; |
|
|
|
|
|
nonlinear_grid_spacing[Y_AXIS] = yGridSpacing; |
|
|
|
|
|
// Can't re-enable (on error) until the new grid is written
|
|
|
|
|
|
abl_should_reenable = false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#elif ENABLED(AUTO_BED_LEVELING_LINEAR_GRID) |
|
|
#elif ENABLED(AUTO_BED_LEVELING_LINEAR_GRID) |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
@ -3600,6 +3611,11 @@ inline void gcode_G28() { |
|
|
|
|
|
|
|
|
measured_z = probe_pt(xProbe, yProbe, stow_probe_after_each, verbose_level); |
|
|
measured_z = probe_pt(xProbe, yProbe, stow_probe_after_each, verbose_level); |
|
|
|
|
|
|
|
|
|
|
|
if (measured_z == NAN) { |
|
|
|
|
|
planner.abl_enabled = abl_should_reenable; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_LINEAR_GRID) |
|
|
#if ENABLED(AUTO_BED_LEVELING_LINEAR_GRID) |
|
|
|
|
|
|
|
|
mean += measured_z; |
|
|
mean += measured_z; |
|
@ -3639,6 +3655,11 @@ inline void gcode_G28() { |
|
|
measured_z = points[i].z = probe_pt(xProbe, yProbe, stow_probe_after_each, verbose_level); |
|
|
measured_z = points[i].z = probe_pt(xProbe, yProbe, stow_probe_after_each, verbose_level); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (measured_z == NAN) { |
|
|
|
|
|
planner.abl_enabled = abl_should_reenable; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!dryrun) { |
|
|
if (!dryrun) { |
|
|
vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); |
|
|
vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); |
|
|
if (planeNormal.z < 0) { |
|
|
if (planeNormal.z < 0) { |
|
@ -3647,12 +3668,23 @@ inline void gcode_G28() { |
|
|
planeNormal.z *= -1; |
|
|
planeNormal.z *= -1; |
|
|
} |
|
|
} |
|
|
planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); |
|
|
planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); |
|
|
|
|
|
|
|
|
|
|
|
// Can't re-enable (on error) until the new grid is written
|
|
|
|
|
|
abl_should_reenable = false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#endif // AUTO_BED_LEVELING_3POINT
|
|
|
#endif // AUTO_BED_LEVELING_3POINT
|
|
|
|
|
|
|
|
|
// Raise to _Z_CLEARANCE_DEPLOY_PROBE. Stow the probe.
|
|
|
// Raise to _Z_CLEARANCE_DEPLOY_PROBE. Stow the probe.
|
|
|
if (STOW_PROBE()) return; |
|
|
if (STOW_PROBE()) { |
|
|
|
|
|
planner.abl_enabled = abl_should_reenable; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
// Unless this is a dry run, auto bed leveling will
|
|
|
|
|
|
// definitely be enabled after this point
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
// Restore state after probing
|
|
|
// Restore state after probing
|
|
|
clean_up_after_endstop_or_probe_move(); |
|
|
clean_up_after_endstop_or_probe_move(); |
|
@ -3842,6 +3874,9 @@ inline void gcode_G28() { |
|
|
report_current_position(); |
|
|
report_current_position(); |
|
|
|
|
|
|
|
|
KEEPALIVE_STATE(IN_HANDLER); |
|
|
KEEPALIVE_STATE(IN_HANDLER); |
|
|
|
|
|
|
|
|
|
|
|
// Auto Bed Leveling is complete! Enable if possible.
|
|
|
|
|
|
planner.abl_enabled = dryrun ? abl_should_reenable : true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#endif // AUTO_BED_LEVELING_FEATURE
|
|
|
#endif // AUTO_BED_LEVELING_FEATURE
|
|
@ -7738,7 +7773,7 @@ void ok_to_send() { |
|
|
|
|
|
|
|
|
// Get the Z adjustment for non-linear bed leveling
|
|
|
// Get the Z adjustment for non-linear bed leveling
|
|
|
float nonlinear_z_offset(float cartesian[XYZ]) { |
|
|
float nonlinear_z_offset(float cartesian[XYZ]) { |
|
|
if (nonlinear_grid_spacing[X_AXIS] == 0 || nonlinear_grid_spacing[Y_AXIS] == 0) return 0; // G29 not done!
|
|
|
if (planner.abl_enabled) return; |
|
|
|
|
|
|
|
|
int half_x = (ABL_GRID_POINTS_X - 1) / 2, |
|
|
int half_x = (ABL_GRID_POINTS_X - 1) / 2, |
|
|
half_y = (ABL_GRID_POINTS_Y - 1) / 2; |
|
|
half_y = (ABL_GRID_POINTS_Y - 1) / 2; |
|
|