|
|
@ -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. |
|
|
|