|
|
@ -887,14 +887,35 @@ void lcd_cooldown() { |
|
|
|
*/ |
|
|
|
|
|
|
|
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: |
|
|
|
* - Movement adjusts the Z axis |
|
|
|
* - Click saves the Z and goes to the next mesh point |
|
|
|
* 5. MBL Wait for controller movement and clicks: |
|
|
|
* - Movement adjusts the Z axis |
|
|
|
* - Click saves the Z, goes to the next mesh point |
|
|
|
*/ |
|
|
|
static void _lcd_level_bed_procedure() { |
|
|
|
static bool mbl_wait_for_move = false; |
|
|
|
// Menu handlers may be called in a re-entrant fashion
|
|
|
|
// if they call st_synchronize or plan_buffer_line. So
|
|
|
|
// while waiting for a move we just ignore new input.
|
|
|
@ -931,11 +952,7 @@ void lcd_cooldown() { |
|
|
|
if (LCD_CLICKED) { |
|
|
|
if (!debounce_click) { |
|
|
|
debounce_click = true; // ignore multiple "clicks" in a row
|
|
|
|
int 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
|
|
|
|
mbl.set_z(ix, iy, current_position[Z_AXIS]); |
|
|
|
_lcd_level_bed_position++; |
|
|
|
mbl.set_zigzag_z(_lcd_level_bed_position++, current_position[Z_AXIS]); |
|
|
|
if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) { |
|
|
|
lcd_return_to_status(); |
|
|
|
LCD_ALERTMESSAGEPGM(MSG_LEVEL_BED_DONE); |
|
|
@ -946,24 +963,16 @@ void lcd_cooldown() { |
|
|
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; |
|
|
|
line_to_current(Z_AXIS); |
|
|
|
st_synchronize(); |
|
|
|
mbl.active = 1; |
|
|
|
mbl.active = true; |
|
|
|
enqueue_and_echo_commands_P(PSTR("G28")); |
|
|
|
} |
|
|
|
else { |
|
|
|
#if ENABLED(NEWPANEL) |
|
|
|
lcd_quick_feedback(); |
|
|
|
#endif |
|
|
|
mbl_wait_for_move = true; |
|
|
|
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; |
|
|
|
line_to_current(Z_AXIS); |
|
|
|
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; |
|
|
|
int ix, iy; |
|
|
|
mbl.zigzag(_lcd_level_bed_position, ix, iy); |
|
|
|
_mbl_goto_xy(mbl.get_x(ix), mbl.get_y(iy)); |
|
|
|
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() { |
|
|
|
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING), NULL); |
|
|
|
lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; |
|
|
|
if (mbl_wait_for_move) return; |
|
|
|
if (LCD_CLICKED) { |
|
|
|
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]); |
|
|
|
current_position[X_AXIS] = MESH_MIN_X; |
|
|
|
current_position[Y_AXIS] = MESH_MIN_Y; |
|
|
|
line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS); |
|
|
|
_mbl_goto_xy(MESH_MIN_X, MESH_MIN_Y); |
|
|
|
_lcd_level_bed_position = 0; |
|
|
|
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() { |
|
|
|
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() { |
|
|
|
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() { |
|
|
|
START_MENU(); |
|
|
|