From 3d0a060a7a998b91d815a822bdf7774e3a8b9f6a Mon Sep 17 00:00:00 2001 From: Edward Patel <edward.patel@memention.com> Date: Sat, 21 Mar 2015 14:50:47 +0100 Subject: [PATCH] Added G29 command --- Marlin/Marlin_main.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 87eb77a141..41955d86a6 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1983,6 +1983,89 @@ inline void gcode_G28() { endstops_hit_on_purpose(); } +#if defined(MESH_BED_LEVELING) + + inline void gcode_G29() { + static int probe_point = -1; + int state = 0; + if (code_seen('S') || code_seen('s')) { + state = code_value_long(); + if (state < 0 || state > 2) { + SERIAL_PROTOCOLPGM("S out of range (0-2).\n"); + return; + } + } + + if (state == 0) { // Dump mesh_bed_leveling + if (mbl.active) { + SERIAL_PROTOCOLPGM("Num X,Y: "); + SERIAL_PROTOCOL(MESH_NUM_X_POINTS); + SERIAL_PROTOCOLPGM(","); + SERIAL_PROTOCOL(MESH_NUM_Y_POINTS); + SERIAL_PROTOCOLPGM("\nZ search height: "); + SERIAL_PROTOCOL(MESH_HOME_SEARCH_Z); + SERIAL_PROTOCOLPGM("\nMeasured points:\n"); + for (int y=0; y<MESH_NUM_Y_POINTS; y++) { + for (int x=0; x<MESH_NUM_X_POINTS; x++) { + SERIAL_PROTOCOLPGM(" "); + SERIAL_PROTOCOL_F(mbl.z_values[y][x], 5); + } + SERIAL_EOL; + } + } else { + SERIAL_PROTOCOLPGM("Mesh bed leveling not active.\n"); + } + + } else if (state == 1) { // Begin probing mesh points + + mbl.reset(); + probe_point = 0; + enquecommands_P(PSTR("G28")); + enquecommands_P(PSTR("G29 S2")); + + } else if (state == 2) { // Goto next point + + if (probe_point < 0) { + SERIAL_PROTOCOLPGM("Mesh probing not started.\n"); + return; + } + int ix, iy; + if (probe_point == 0) { + 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]); + } else { + ix = (probe_point-1) % MESH_NUM_X_POINTS; + iy = (probe_point-1) / MESH_NUM_X_POINTS; + if (iy&1) { // Zig zag + ix = (MESH_NUM_X_POINTS - 1) - ix; + } + mbl.set_z(ix, iy, current_position[Z_AXIS]); + current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; + 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(); + } + if (probe_point == MESH_NUM_X_POINTS*MESH_NUM_Y_POINTS) { + SERIAL_PROTOCOLPGM("Mesh done.\n"); + probe_point = -1; + mbl.active = 1; + enquecommands_P(PSTR("G28")); + return; + } + ix = probe_point % MESH_NUM_X_POINTS; + iy = probe_point / MESH_NUM_X_POINTS; + if (iy&1) { // Zig zag + ix = (MESH_NUM_X_POINTS - 1) - ix; + } + current_position[X_AXIS] = mbl.get_x(ix); + current_position[Y_AXIS] = mbl.get_y(iy); + 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++; + } + } + +#endif + #ifdef ENABLE_AUTO_BED_LEVELING // Define the possible boundaries for probing based on set limits @@ -4687,6 +4770,12 @@ void process_commands() { gcode_G28(); break; + #if defined(MESH_BED_LEVELING) + case 29: // G29 Handle mesh based leveling + gcode_G29(); + break; + #endif + #ifdef ENABLE_AUTO_BED_LEVELING case 29: // G29 Detailed Z-Probe, probes the bed at 3 or more points.