MBL: Added keeping MBL active when homing single axises for #3750

This commit is contained in:
Edward Patel
2016-05-24 22:53:15 +02:00
committed by Scott Lahteine
parent 32f8300cc6
commit c06de0f097
6 changed files with 81 additions and 35 deletions

View File

@ -2644,8 +2644,16 @@ inline void gcode_G28() {
* on again when homing all axis
*/
#if ENABLED(MESH_BED_LEVELING)
uint8_t mbl_was_active = mbl.active;
mbl.active = false;
float pre_home_z = MESH_HOME_SEARCH_Z;
if (mbl.is_active()) {
// Save known Z position if already homed
if (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) {
pre_home_z = current_position[Z_AXIS];
pre_home_z += mbl.get_z(current_position[X_AXIS] - home_offset[X_AXIS],
current_position[Y_AXIS] - home_offset[Y_AXIS]);
}
mbl.is_active(false);
}
#endif
setup_for_endstop_move();
@ -2945,20 +2953,31 @@ inline void gcode_G28() {
// Enable mesh leveling again
#if ENABLED(MESH_BED_LEVELING)
if (mbl_was_active && home_all_axis) {
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
sync_plan_position();
mbl.active = 1;
#if ENABLED(MESH_G28_REST_ORIGIN)
current_position[Z_AXIS] = 0.0;
set_destination_to_current();
feedrate = homing_feedrate[Z_AXIS];
line_to_destination();
stepper.synchronize();
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("mbl_was_active", current_position);
#endif
if (mbl.has_mesh()) {
if (home_all_axis || (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && homeZ)) {
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
sync_plan_position();
mbl.is_active(true);
#if ENABLED(MESH_G28_REST_ORIGIN)
current_position[Z_AXIS] = 0.0;
set_destination_to_current();
feedrate = homing_feedrate[Z_AXIS];
line_to_destination();
stepper.synchronize();
#else
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z -
mbl.get_z(current_position[X_AXIS] - home_offset[X_AXIS],
current_position[Y_AXIS] - home_offset[Y_AXIS]);
#endif
}
else if ((axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS]) && (homeX || homeY)) {
current_position[Z_AXIS] = pre_home_z;
sync_plan_position();
mbl.is_active(true);
current_position[Z_AXIS] = pre_home_z -
mbl.get_z(current_position[X_AXIS] - home_offset[X_AXIS],
current_position[Y_AXIS] - home_offset[Y_AXIS]);
}
}
#endif
@ -2978,7 +2997,7 @@ inline void gcode_G28() {
#if ENABLED(MESH_BED_LEVELING)
enum MeshLevelingState { MeshReport, MeshStart, MeshNext, MeshSet, MeshSetZOffset };
enum MeshLevelingState { MeshReport, MeshStart, MeshNext, MeshSet, MeshSetZOffset, MeshReset };
inline void _mbl_goto_xy(float x, float y) {
saved_feedrate = feedrate;
@ -3015,6 +3034,7 @@ inline void gcode_G28() {
* S2 Probe the next mesh point
* S3 Xn Yn Zn.nn Manually modify a single point
* S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed.
* S5 Reset and disable mesh
*
* The S0 report the points as below
*
@ -3028,8 +3048,8 @@ inline void gcode_G28() {
static int probe_point = -1;
MeshLevelingState state = code_seen('S') ? (MeshLevelingState)code_value_short() : MeshReport;
if (state < 0 || state > 4) {
SERIAL_PROTOCOLLNPGM("S out of range (0-4).");
if (state < 0 || state > 5) {
SERIAL_PROTOCOLLNPGM("S out of range (0-5).");
return;
}
@ -3038,8 +3058,13 @@ inline void gcode_G28() {
switch (state) {
case MeshReport:
if (mbl.active) {
SERIAL_PROTOCOLPGM("Num X,Y: ");
if (mbl.has_mesh()) {
SERIAL_PROTOCOLPGM("State: ");
if (mbl.is_active())
SERIAL_PROTOCOLPGM("On");
else
SERIAL_PROTOCOLPGM("Off");
SERIAL_PROTOCOLPGM("\nNum X,Y: ");
SERIAL_PROTOCOL(MESH_NUM_X_POINTS);
SERIAL_PROTOCOLCHAR(',');
SERIAL_PROTOCOL(MESH_NUM_Y_POINTS);
@ -3100,7 +3125,7 @@ inline void gcode_G28() {
// After recording the last point, activate the mbl and home
SERIAL_PROTOCOLLNPGM("Mesh probing done.");
probe_point = -1;
mbl.active = true;
mbl.has_mesh(true);
enqueue_and_echo_commands_P(PSTR("G28"));
}
break;
@ -3147,6 +3172,19 @@ inline void gcode_G28() {
return;
}
mbl.z_offset = z;
break;
case MeshReset:
if (mbl.is_active()) {
current_position[Z_AXIS] +=
mbl.get_z(current_position[X_AXIS] - home_offset[X_AXIS],
current_position[Y_AXIS] - home_offset[Y_AXIS]) - MESH_HOME_SEARCH_Z;
mbl.reset();
sync_plan_position();
}
else
mbl.reset();
} // switch(state)
report_current_position();
@ -5944,7 +5982,7 @@ inline void gcode_M410() {
/**
* M420: Enable/Disable Mesh Bed Leveling
*/
inline void gcode_M420() { if (code_seen('S') && code_has_value()) mbl.active = !!code_value_short(); }
inline void gcode_M420() { if (code_seen('S') && code_has_value()) mbl.has_mesh(!!code_value_short()); }
/**
* M421: Set a single Mesh Bed Leveling Z coordinate
@ -7335,7 +7373,7 @@ void clamp_to_software_endstops(float target[3]) {
// This function is used to split lines on mesh borders so each segment is only part of one mesh area
void mesh_buffer_line(float x, float y, float z, const float e, float feed_rate, const uint8_t& extruder, uint8_t x_splits = 0xff, uint8_t y_splits = 0xff) {
if (!mbl.active) {
if (!mbl.is_active()) {
planner.buffer_line(x, y, z, e, feed_rate, extruder);
set_current_to_destination();
return;