Add probe option to position_is_reachable

This commit is contained in:
Scott Lahteine 2016-09-21 19:16:01 -05:00
parent fafafcf9d1
commit b800eb0fed

View File

@ -2486,28 +2486,36 @@ void unknown_command_error() {
#endif //HOST_KEEPALIVE_FEATURE #endif //HOST_KEEPALIVE_FEATURE
bool position_is_reachable(float target[XYZ]) { bool position_is_reachable(float target[XYZ]
#if HAS_BED_PROBE
, bool by_probe=false
#endif
) {
float dx = RAW_X_POSITION(target[X_AXIS]), float dx = RAW_X_POSITION(target[X_AXIS]),
dy = RAW_Y_POSITION(target[Y_AXIS]), dy = RAW_Y_POSITION(target[Y_AXIS]),
dz = RAW_Z_POSITION(target[Z_AXIS]); dz = RAW_Z_POSITION(target[Z_AXIS]);
bool good; #if HAS_BED_PROBE
if (by_probe) {
dx -= X_PROBE_OFFSET_FROM_EXTRUDER;
dy -= Y_PROBE_OFFSET_FROM_EXTRUDER;
}
#endif
#if IS_SCARA #if IS_SCARA
#if MIDDLE_DEAD_ZONE_R > 0 #if MIDDLE_DEAD_ZONE_R > 0
const float R2 = HYPOT2(dx - SCARA_OFFSET_X, dy - SCARA_OFFSET_Y); const float R2 = HYPOT2(dx - SCARA_OFFSET_X, dy - SCARA_OFFSET_Y);
good = (R2 >= sq(float(MIDDLE_DEAD_ZONE_R))) && (R2 <= sq(L1 + L2)); return R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) && R2 <= sq(L1 + L2);
#else #else
good = HYPOT2(dx - SCARA_OFFSET_X, dy - SCARA_OFFSET_Y) <= sq(L1 + L2); return HYPOT2(dx - SCARA_OFFSET_X, dy - SCARA_OFFSET_Y) <= sq(L1 + L2);
#endif #endif
#elif ENABLED(DELTA) #elif ENABLED(DELTA)
good = HYPOT2(dx, dy) <= sq(DELTA_PRINTABLE_RADIUS); return HYPOT2(dx, dy) <= sq(DELTA_PRINTABLE_RADIUS);
#else #else
good = true; return dx >= X_MIN_POS - 0.0001 && dx <= X_MAX_POS + 0.0001
#endif
return good && dx >= X_MIN_POS - 0.0001 && dx <= X_MAX_POS + 0.0001
&& dy >= Y_MIN_POS - 0.0001 && dy <= Y_MAX_POS + 0.0001 && dy >= Y_MIN_POS - 0.0001 && dy <= Y_MAX_POS + 0.0001
&& dz >= Z_MIN_POS - 0.0001 && dz <= Z_MAX_POS + 0.0001; && dz >= Z_MIN_POS - 0.0001 && dz <= Z_MAX_POS + 0.0001;
#endif
} }
/************************************************** /**************************************************
@ -2896,7 +2904,13 @@ inline void gcode_G4() {
if (DEBUGGING(LEVELING)) DEBUG_POS("Z_SAFE_HOMING", destination); if (DEBUGGING(LEVELING)) DEBUG_POS("Z_SAFE_HOMING", destination);
#endif #endif
if (position_is_reachable(destination)) { if (position_is_reachable(
destination
#if HAS_BED_PROBE
, true
#endif
)
) {
do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]); do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]);
HOMEAXIS(Z); HOMEAXIS(Z);
} }
@ -4245,7 +4259,7 @@ inline void gcode_M42() {
} }
#else #else
float pos[XYZ] = { X_probe_location, Y_probe_location, 0 }; float pos[XYZ] = { X_probe_location, Y_probe_location, 0 };
if (!position_is_reachable(pos)) { if (!position_is_reachable(pos, true)) {
SERIAL_PROTOCOLLNPGM("? (X,Y) location outside of probeable radius."); SERIAL_PROTOCOLLNPGM("? (X,Y) location outside of probeable radius.");
return; return;
} }