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
This commit is contained in:
Scott Lahteine 2015-03-29 18:06:59 -07:00
parent a22efc5f11
commit e8ae51bfe3

View File

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