From e8ae51bfe329b4d510ddfce705bb78fc6c2adb82 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Mar 2015 18:06:59 -0700 Subject: [PATCH] Fix G28 homing Y with X - Fixed a typo causing G28 to home incorrectly - Added documentation to G28 - Added homeXYZ bools to neaten the code - Added a note about home_offsets being questionable --- Marlin/Marlin_main.cpp | 90 ++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 222ad08b0a..20bd963b59 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1703,7 +1703,25 @@ inline void gcode_G4() { #endif //FWRETRACT /** - * G28: Home all axes, one at a time + * G28: Home all axes according to settings + * + * Parameters + * + * None Home to all axes with no parameters. + * With QUICK_HOME enabled XY will home together, then Z. + * + * Cartesian parameters + * + * X Home to the X endstop + * Y Home to the Y endstop + * Z Home to the Z endstop + * + * If numbers are included with XYZ set the position as with G92 + * Currently adds the home_offset, which may be wrong and removed soon. + * + * Xn Home X, setting X to n + home_offset[X_AXIS] + * Yn Home Y, setting Y to n + home_offset[Y_AXIS] + * Zn Home Z, setting Z to n + home_offset[Z_AXIS] */ inline void gcode_G28() { #ifdef ENABLE_AUTO_BED_LEVELING @@ -1726,7 +1744,7 @@ inline void gcode_G28() { enable_endstops(true); - for (int i = X_AXIS; i < NUM_AXIS; i++) destination[i] = current_position[i]; + for (int i = 0; i < NUM_AXIS; i++) destination[i] = current_position[i]; // includes E_AXIS feedrate = 0.0; @@ -1757,23 +1775,25 @@ inline void gcode_G28() { #else // NOT DELTA - home_all_axis = !(code_seen(axis_codes[X_AXIS]) || code_seen(axis_codes[Y_AXIS]) || code_seen(axis_codes[Z_AXIS])); + bool homeX = code_seen(axis_codes[X_AXIS]), + homeY = code_seen(axis_codes[Y_AXIS]), + homeZ = code_seen(axis_codes[Z_AXIS]); + + home_all_axis = !homeX && !homeY && !homeZ; // No parameters means home all axes #if Z_HOME_DIR > 0 // If homing away from BED do Z first - if (home_all_axis || code_seen(axis_codes[Z_AXIS])) { - HOMEAXIS(Z); - } + if (home_all_axis || homeZ) HOMEAXIS(Z); #endif #ifdef QUICK_HOME - if (home_all_axis || code_seen(axis_codes[X_AXIS] && code_seen(axis_codes[Y_AXIS]))) { //first diagonal move + if (home_all_axis || (homeX && homeY)) { //first diagonal move current_position[X_AXIS] = current_position[Y_AXIS] = 0; - #ifndef DUAL_X_CARRIAGE - int x_axis_home_dir = home_dir(X_AXIS); - #else + #ifdef DUAL_X_CARRIAGE int x_axis_home_dir = x_home_dir(active_extruder); extruder_duplication_enabled = false; + #else + int x_axis_home_dir = home_dir(X_AXIS); #endif sync_plan_position(); @@ -1807,7 +1827,8 @@ inline void gcode_G28() { } #endif //QUICK_HOME - if ((home_all_axis) || (code_seen(axis_codes[X_AXIS]))) { + // Home X + if (home_all_axis || homeX) { #ifdef DUAL_X_CARRIAGE int tmp_extruder = active_extruder; extruder_duplication_enabled = false; @@ -1825,31 +1846,38 @@ inline void gcode_G28() { #endif } - if (home_all_axis || code_seen(axis_codes[Y_AXIS])) HOMEAXIS(Y); + // Home Y + if (home_all_axis || homeY) HOMEAXIS(Y); + // Set the X position, if included + // Adds the home_offset as well, which may be wrong if (code_seen(axis_codes[X_AXIS])) { - if (code_value_long() != 0) { - current_position[X_AXIS] = code_value() - #ifndef SCARA - + home_offset[X_AXIS] - #endif - ; - } + float v = code_value(); + if (v) current_position[X_AXIS] = v + #ifndef SCARA + + home_offset[X_AXIS] + #endif + ; } - if (code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) { - current_position[Y_AXIS] = code_value() + // Set the Y position, if included + // Adds the home_offset as well, which may be wrong + if (code_seen(axis_codes[Y_AXIS])) { + float v = code_value(); + if (v) current_position[Y_AXIS] = v #ifndef SCARA + home_offset[Y_AXIS] #endif ; } - #if Z_HOME_DIR < 0 // If homing towards BED do Z last + // Home Z last if homing towards the bed + #if Z_HOME_DIR < 0 #ifndef Z_SAFE_HOMING - if (home_all_axis || code_seen(axis_codes[Z_AXIS])) { + if (home_all_axis || homeZ) { + // Raise Z before homing Z? Shouldn't this happen before homing X or Y? #if defined(Z_RAISE_BEFORE_HOMING) && Z_RAISE_BEFORE_HOMING > 0 destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); // Set destination away from bed feedrate = max_feedrate[Z_AXIS]; @@ -1878,7 +1906,7 @@ inline void gcode_G28() { } // Let's see if X and Y are homed and probe is inside bed area. - if (code_seen(axis_codes[Z_AXIS])) { + if (homeZ) { if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) { @@ -1912,13 +1940,15 @@ inline void gcode_G28() { #endif // Z_HOME_DIR < 0 - - if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0) - current_position[Z_AXIS] = code_value() + home_offset[Z_AXIS]; + // Set the Z position, if included + // Adds the home_offset as well, which may be wrong + if (code_seen(axis_codes[Z_AXIS])) { + float v = code_value(); + if (v) current_position[Z_AXIS] = v + home_offset[Z_AXIS]; + } #if defined(ENABLE_AUTO_BED_LEVELING) && (Z_HOME_DIR < 0) - if (home_all_axis || code_seen(axis_codes[Z_AXIS])) - current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative) + if (home_all_axis || homeZ) current_position[Z_AXIS] += zprobe_zoffset; // Add Z_Probe offset (the distance is negative) #endif sync_plan_position(); @@ -2741,7 +2771,7 @@ inline void gcode_M42() { * E = Engage probe for each reading * L = Number of legs of movement before probe * - * This function assumes the bed has been homed. Specificaly, that a G28 command + * This function assumes the bed has been homed. Specifically, that a G28 command * as been issued prior to invoking the M48 Z-Probe repeatability measurement function. * Any information generated by a prior G29 Bed leveling command will be lost and need to be * regenerated.