Merge pull request #3488 from thinkyhead/rc_more_manual_level_fix
Mesh Bed Leveling – Add lift between probes, comments, cleanup
This commit is contained in:
commit
5da7de8431
@ -2465,7 +2465,7 @@ inline void gcode_G28() {
|
|||||||
*/
|
*/
|
||||||
#if ENABLED(MESH_BED_LEVELING)
|
#if ENABLED(MESH_BED_LEVELING)
|
||||||
uint8_t mbl_was_active = mbl.active;
|
uint8_t mbl_was_active = mbl.active;
|
||||||
mbl.active = 0;
|
mbl.active = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setup_for_endstop_move();
|
setup_for_endstop_move();
|
||||||
@ -2799,6 +2799,28 @@ inline void gcode_G28() {
|
|||||||
|
|
||||||
enum MeshLevelingState { MeshReport, MeshStart, MeshNext, MeshSet, MeshSetZOffset };
|
enum MeshLevelingState { MeshReport, MeshStart, MeshNext, MeshSet, MeshSetZOffset };
|
||||||
|
|
||||||
|
inline void _mbl_goto_xy(float x, float y) {
|
||||||
|
saved_feedrate = feedrate;
|
||||||
|
feedrate = homing_feedrate[X_AXIS];
|
||||||
|
|
||||||
|
#if MIN_Z_HEIGHT_FOR_HOMING > 0
|
||||||
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + MIN_Z_HEIGHT_FOR_HOMING;
|
||||||
|
line_to_current_position();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
current_position[X_AXIS] = x + home_offset[X_AXIS];
|
||||||
|
current_position[Y_AXIS] = y + home_offset[Y_AXIS];
|
||||||
|
line_to_current_position();
|
||||||
|
|
||||||
|
#if MIN_Z_HEIGHT_FOR_HOMING > 0
|
||||||
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
|
line_to_current_position();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
feedrate = saved_feedrate;
|
||||||
|
st_synchronize();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* G29: Mesh-based Z probe, probes a grid and produces a
|
* G29: Mesh-based Z probe, probes a grid and produces a
|
||||||
* mesh to compensate for variable bed height
|
* mesh to compensate for variable bed height
|
||||||
@ -2866,37 +2888,32 @@ inline void gcode_G28() {
|
|||||||
SERIAL_PROTOCOLLNPGM("Start mesh probing with \"G29 S1\" first.");
|
SERIAL_PROTOCOLLNPGM("Start mesh probing with \"G29 S1\" first.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// For each G29 S2...
|
||||||
if (probe_point == 0) {
|
if (probe_point == 0) {
|
||||||
// Set Z to a positive value before recording the first Z.
|
// For the intial G29 S2 make Z a positive value (e.g., 4.0)
|
||||||
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + home_offset[Z_AXIS];
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
sync_plan_position();
|
sync_plan_position();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// For others, save the Z of the previous point, then raise Z again.
|
// For G29 S2 after adjusting Z.
|
||||||
ix = (probe_point - 1) % (MESH_NUM_X_POINTS);
|
mbl.set_zigzag_z(probe_point - 1, current_position[Z_AXIS]);
|
||||||
iy = (probe_point - 1) / (MESH_NUM_X_POINTS);
|
|
||||||
if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
|
|
||||||
mbl.set_z(ix, iy, current_position[Z_AXIS]);
|
|
||||||
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + home_offset[Z_AXIS];
|
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
|
|
||||||
st_synchronize();
|
|
||||||
}
|
}
|
||||||
// Is there another point to sample? Move there.
|
// If there's another point to sample, move there with optional lift.
|
||||||
if (probe_point < (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
|
if (probe_point < (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
|
||||||
ix = probe_point % (MESH_NUM_X_POINTS);
|
mbl.zigzag(probe_point, ix, iy);
|
||||||
iy = probe_point / (MESH_NUM_X_POINTS);
|
_mbl_goto_xy(mbl.get_x(ix), mbl.get_y(iy));
|
||||||
if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
|
|
||||||
current_position[X_AXIS] = mbl.get_x(ix) + home_offset[X_AXIS];
|
|
||||||
current_position[Y_AXIS] = mbl.get_y(iy) + home_offset[Y_AXIS];
|
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 60, active_extruder);
|
|
||||||
st_synchronize();
|
|
||||||
probe_point++;
|
probe_point++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// One last "return to the bed" (as originally coded) at completion
|
||||||
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
|
line_to_current_position();
|
||||||
|
st_synchronize();
|
||||||
|
|
||||||
// After recording the last point, activate the mbl and home
|
// After recording the last point, activate the mbl and home
|
||||||
SERIAL_PROTOCOLLNPGM("Mesh probing done.");
|
SERIAL_PROTOCOLLNPGM("Mesh probing done.");
|
||||||
probe_point = -1;
|
probe_point = -1;
|
||||||
mbl.active = 1;
|
mbl.active = true;
|
||||||
enqueue_and_echo_commands_P(PSTR("G28"));
|
enqueue_and_echo_commands_P(PSTR("G28"));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -551,7 +551,7 @@ void Config_ResetDefault() {
|
|||||||
home_offset[X_AXIS] = home_offset[Y_AXIS] = home_offset[Z_AXIS] = 0;
|
home_offset[X_AXIS] = home_offset[Y_AXIS] = home_offset[Z_AXIS] = 0;
|
||||||
|
|
||||||
#if ENABLED(MESH_BED_LEVELING)
|
#if ENABLED(MESH_BED_LEVELING)
|
||||||
mbl.active = 0;
|
mbl.active = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
|
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
class mesh_bed_leveling {
|
class mesh_bed_leveling {
|
||||||
public:
|
public:
|
||||||
uint8_t active;
|
bool active;
|
||||||
float z_offset;
|
float z_offset;
|
||||||
float z_values[MESH_NUM_Y_POINTS][MESH_NUM_X_POINTS];
|
float z_values[MESH_NUM_Y_POINTS][MESH_NUM_X_POINTS];
|
||||||
|
|
||||||
@ -41,6 +41,18 @@
|
|||||||
float get_y(int i) { return MESH_MIN_Y + (MESH_Y_DIST) * i; }
|
float get_y(int i) { return MESH_MIN_Y + (MESH_Y_DIST) * i; }
|
||||||
void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; }
|
void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; }
|
||||||
|
|
||||||
|
inline void zigzag(int index, int &ix, int &iy) {
|
||||||
|
ix = index % (MESH_NUM_X_POINTS);
|
||||||
|
iy = index / (MESH_NUM_X_POINTS);
|
||||||
|
if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_zigzag_z(int index, float z) {
|
||||||
|
int ix, iy;
|
||||||
|
zigzag(index, ix, iy);
|
||||||
|
set_z(ix, iy, z);
|
||||||
|
}
|
||||||
|
|
||||||
int select_x_index(float x) {
|
int select_x_index(float x) {
|
||||||
int i = 1;
|
int i = 1;
|
||||||
while (x > get_x(i) && i < MESH_NUM_X_POINTS - 1) i++;
|
while (x > get_x(i) && i < MESH_NUM_X_POINTS - 1) i++;
|
||||||
|
@ -887,14 +887,35 @@ void lcd_cooldown() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int _lcd_level_bed_position;
|
static int _lcd_level_bed_position;
|
||||||
|
static bool mbl_wait_for_move = false;
|
||||||
|
|
||||||
|
// Utility to go to the next mesh point
|
||||||
|
// A raise is added between points if MIN_Z_HEIGHT_FOR_HOMING is in use
|
||||||
|
// Note: During Manual Bed Leveling the homed Z position is MESH_HOME_SEARCH_Z
|
||||||
|
// Z position will be restored with the final action, a G28
|
||||||
|
inline void _mbl_goto_xy(float x, float y) {
|
||||||
|
mbl_wait_for_move = true;
|
||||||
|
#if MIN_Z_HEIGHT_FOR_HOMING > 0
|
||||||
|
current_position[Z_AXIS] += MIN_Z_HEIGHT_FOR_HOMING;
|
||||||
|
line_to_current(Z_AXIS);
|
||||||
|
#endif
|
||||||
|
current_position[X_AXIS] = x + home_offset[X_AXIS];
|
||||||
|
current_position[Y_AXIS] = y + home_offset[Y_AXIS];
|
||||||
|
line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
|
||||||
|
#if MIN_Z_HEIGHT_FOR_HOMING > 0
|
||||||
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
|
line_to_current(Z_AXIS);
|
||||||
|
#endif
|
||||||
|
st_synchronize();
|
||||||
|
mbl_wait_for_move = false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MBL Wait for controller movement and clicks:
|
* 5. MBL Wait for controller movement and clicks:
|
||||||
* - Movement adjusts the Z axis
|
* - Movement adjusts the Z axis
|
||||||
* - Click saves the Z and goes to the next mesh point
|
* - Click saves the Z, goes to the next mesh point
|
||||||
*/
|
*/
|
||||||
static void _lcd_level_bed_procedure() {
|
static void _lcd_level_bed_procedure() {
|
||||||
static bool mbl_wait_for_move = false;
|
|
||||||
// Menu handlers may be called in a re-entrant fashion
|
// Menu handlers may be called in a re-entrant fashion
|
||||||
// if they call st_synchronize or plan_buffer_line. So
|
// if they call st_synchronize or plan_buffer_line. So
|
||||||
// while waiting for a move we just ignore new input.
|
// while waiting for a move we just ignore new input.
|
||||||
@ -931,11 +952,7 @@ void lcd_cooldown() {
|
|||||||
if (LCD_CLICKED) {
|
if (LCD_CLICKED) {
|
||||||
if (!debounce_click) {
|
if (!debounce_click) {
|
||||||
debounce_click = true; // ignore multiple "clicks" in a row
|
debounce_click = true; // ignore multiple "clicks" in a row
|
||||||
int ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS),
|
mbl.set_zigzag_z(_lcd_level_bed_position++, current_position[Z_AXIS]);
|
||||||
iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
|
|
||||||
if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
|
|
||||||
mbl.set_z(ix, iy, current_position[Z_AXIS]);
|
|
||||||
_lcd_level_bed_position++;
|
|
||||||
if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
|
if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
|
||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
LCD_ALERTMESSAGEPGM(MSG_LEVEL_BED_DONE);
|
LCD_ALERTMESSAGEPGM(MSG_LEVEL_BED_DONE);
|
||||||
@ -946,24 +963,16 @@ void lcd_cooldown() {
|
|||||||
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
line_to_current(Z_AXIS);
|
line_to_current(Z_AXIS);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
mbl.active = 1;
|
mbl.active = true;
|
||||||
enqueue_and_echo_commands_P(PSTR("G28"));
|
enqueue_and_echo_commands_P(PSTR("G28"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if ENABLED(NEWPANEL)
|
#if ENABLED(NEWPANEL)
|
||||||
lcd_quick_feedback();
|
lcd_quick_feedback();
|
||||||
#endif
|
#endif
|
||||||
mbl_wait_for_move = true;
|
int ix, iy;
|
||||||
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
mbl.zigzag(_lcd_level_bed_position, ix, iy);
|
||||||
line_to_current(Z_AXIS);
|
_mbl_goto_xy(mbl.get_x(ix), mbl.get_y(iy));
|
||||||
ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS);
|
|
||||||
iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
|
|
||||||
if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
|
|
||||||
current_position[X_AXIS] = mbl.get_x(ix);
|
|
||||||
current_position[Y_AXIS] = mbl.get_y(iy);
|
|
||||||
line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
|
|
||||||
st_synchronize();
|
|
||||||
mbl_wait_for_move = false;
|
|
||||||
encoderPosition = 0;
|
encoderPosition = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -973,22 +982,25 @@ void lcd_cooldown() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 4. MBL Display "Click to Begin", wait for click
|
||||||
|
* Move to the first probe position
|
||||||
|
*/
|
||||||
static void _lcd_level_bed_homing_done() {
|
static void _lcd_level_bed_homing_done() {
|
||||||
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING), NULL);
|
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING), NULL);
|
||||||
lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW;
|
lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW;
|
||||||
|
if (mbl_wait_for_move) return;
|
||||||
if (LCD_CLICKED) {
|
if (LCD_CLICKED) {
|
||||||
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
||||||
current_position[X_AXIS] = MESH_MIN_X;
|
_mbl_goto_xy(MESH_MIN_X, MESH_MIN_Y);
|
||||||
current_position[Y_AXIS] = MESH_MIN_Y;
|
|
||||||
line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
|
|
||||||
_lcd_level_bed_position = 0;
|
_lcd_level_bed_position = 0;
|
||||||
lcd_goto_menu(_lcd_level_bed_procedure, true);
|
lcd_goto_menu(_lcd_level_bed_procedure, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MBL Move to mesh starting point
|
* 3. MBL Display "Hoing XYZ" - Wait for homing to finish
|
||||||
*/
|
*/
|
||||||
static void _lcd_level_bed_homing() {
|
static void _lcd_level_bed_homing() {
|
||||||
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL);
|
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL);
|
||||||
@ -998,7 +1010,7 @@ void lcd_cooldown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MBL Continue Bed Leveling...
|
* 2. MBL Continue Bed Leveling...
|
||||||
*/
|
*/
|
||||||
static void _lcd_level_bed_continue() {
|
static void _lcd_level_bed_continue() {
|
||||||
defer_return_to_status = true;
|
defer_return_to_status = true;
|
||||||
@ -1009,7 +1021,7 @@ void lcd_cooldown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MBL entry-point
|
* 1. MBL entry-point: "Cancel" or "Level Bed"
|
||||||
*/
|
*/
|
||||||
static void lcd_level_bed() {
|
static void lcd_level_bed() {
|
||||||
START_MENU();
|
START_MENU();
|
||||||
|
Loading…
Reference in New Issue
Block a user