Split the software endstop capability by axis.
This commit is contained in:
parent
ec69e97bda
commit
b206f70693
|
@ -785,10 +785,30 @@
|
||||||
#define Y_MAX_POS Y_BED_SIZE
|
#define Y_MAX_POS Y_BED_SIZE
|
||||||
#define Z_MAX_POS 200
|
#define Z_MAX_POS 200
|
||||||
|
|
||||||
// If enabled, axes won't move below MIN_POS in response to movement commands.
|
/**
|
||||||
|
* Software Endstops
|
||||||
|
*
|
||||||
|
* - Prevent moves outside the set machine bounds.
|
||||||
|
* - Individual axes can be disabled, if desired.
|
||||||
|
* - X and Y only apply to Cartesian robots.
|
||||||
|
* - Use 'M211' to set software endstops on/off or report current state
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Min software endstops constrain movement within minimum coordinate bounds
|
||||||
#define MIN_SOFTWARE_ENDSTOPS
|
#define MIN_SOFTWARE_ENDSTOPS
|
||||||
// If enabled, axes won't move above MAX_POS in response to movement commands.
|
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
|
||||||
|
#define MIN_SOFTWARE_ENDSTOP_X
|
||||||
|
#define MIN_SOFTWARE_ENDSTOP_Y
|
||||||
|
#define MIN_SOFTWARE_ENDSTOP_Z
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Max software endstops constrain movement within maximum coordinate bounds
|
||||||
#define MAX_SOFTWARE_ENDSTOPS
|
#define MAX_SOFTWARE_ENDSTOPS
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
|
||||||
|
#define MAX_SOFTWARE_ENDSTOP_X
|
||||||
|
#define MAX_SOFTWARE_ENDSTOP_Y
|
||||||
|
#define MAX_SOFTWARE_ENDSTOP_Z
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filament Runout Sensor
|
* Filament Runout Sensor
|
||||||
|
|
|
@ -793,7 +793,17 @@
|
||||||
#define HEATER_IDLE_HANDLER (ENABLED(ADVANCED_PAUSE_FEATURE) || ENABLED(PROBING_HEATERS_OFF))
|
#define HEATER_IDLE_HANDLER (ENABLED(ADVANCED_PAUSE_FEATURE) || ENABLED(PROBING_HEATERS_OFF))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delta radius/rod trimmers/angle trimmers
|
* Only constrain Z on DELTA / SCARA machines
|
||||||
|
*/
|
||||||
|
#if IS_KINEMATIC
|
||||||
|
#undef MIN_SOFTWARE_ENDSTOP_X
|
||||||
|
#undef MIN_SOFTWARE_ENDSTOP_Y
|
||||||
|
#undef MAX_SOFTWARE_ENDSTOP_X
|
||||||
|
#undef MAX_SOFTWARE_ENDSTOP_Y
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delta endstops, radius/rod trimmers, angle trimmers
|
||||||
*/
|
*/
|
||||||
#if ENABLED(DELTA)
|
#if ENABLED(DELTA)
|
||||||
#ifndef DELTA_CALIBRATION_RADIUS
|
#ifndef DELTA_CALIBRATION_RADIUS
|
||||||
|
|
|
@ -254,6 +254,25 @@
|
||||||
static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
|
static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
|
||||||
"Movement bounds ([XY]_MIN_POS, [XY]_MAX_POS) are too narrow to contain [XY]_BED_SIZE.");
|
"Movement bounds ([XY]_MIN_POS, [XY]_MAX_POS) are too narrow to contain [XY]_BED_SIZE.");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Granular software endstops (Marlin >= 1.1.7)
|
||||||
|
*/
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOPS) && DISABLED(MIN_SOFTWARE_ENDSTOP_Z)
|
||||||
|
#if IS_KINEMATIC
|
||||||
|
#error "MIN_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MIN_SOFTWARE_ENDSTOP_Z."
|
||||||
|
#elif DISABLED(MIN_SOFTWARE_ENDSTOP_X) && DISABLED(MIN_SOFTWARE_ENDSTOP_Y)
|
||||||
|
#error "MIN_SOFTWARE_ENDSTOPS requires at least one of the MIN_SOFTWARE_ENDSTOP_[XYZ] options."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOPS) && DISABLED(MAX_SOFTWARE_ENDSTOP_Z)
|
||||||
|
#if IS_KINEMATIC
|
||||||
|
#error "MAX_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MAX_SOFTWARE_ENDSTOP_Z."
|
||||||
|
#elif DISABLED(MAX_SOFTWARE_ENDSTOP_X) && DISABLED(MAX_SOFTWARE_ENDSTOP_Y)
|
||||||
|
#error "MAX_SOFTWARE_ENDSTOPS requires at least one of the MAX_SOFTWARE_ENDSTOP_[XYZ] options."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Progress Bar
|
* Progress Bar
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2834,17 +2834,35 @@ void kill_screen(const char* lcd_msg) {
|
||||||
float min = current_position[axis] - 1000,
|
float min = current_position[axis] - 1000,
|
||||||
max = current_position[axis] + 1000;
|
max = current_position[axis] + 1000;
|
||||||
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
|
||||||
// Limit to software endstops, if enabled
|
// Limit to software endstops, if enabled
|
||||||
if (soft_endstops_enabled) {
|
#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS)
|
||||||
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
|
if (soft_endstops_enabled) switch (axis) {
|
||||||
min = soft_endstop_min[axis];
|
case X_AXIS:
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_X)
|
||||||
|
min = soft_endstop_min[X_AXIS];
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_X)
|
||||||
max = soft_endstop_max[axis];
|
max = soft_endstop_max[X_AXIS];
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
|
case Y_AXIS:
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
|
||||||
|
min = soft_endstop_min[Y_AXIS];
|
||||||
|
#endif
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
|
||||||
|
max = soft_endstop_max[Y_AXIS];
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case Z_AXIS:
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
|
||||||
|
min = soft_endstop_min[Z_AXIS];
|
||||||
|
#endif
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
|
||||||
|
max = soft_endstop_max[Z_AXIS];
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // MIN_SOFTWARE_ENDSTOPS || MAX_SOFTWARE_ENDSTOPS
|
||||||
|
|
||||||
// Delta limits XY based on the current offset from center
|
// Delta limits XY based on the current offset from center
|
||||||
// This assumes the center is 0,0
|
// This assumes the center is 0,0
|
||||||
|
|
|
@ -456,29 +456,28 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constrain the given coordinates to the software endstops.
|
* Constrain the given coordinates to the software endstops.
|
||||||
|
*
|
||||||
|
* NOTE: This will only apply to Z on DELTA and SCARA. XY is
|
||||||
|
* constrained to a circle on these kinematic systems.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// NOTE: This makes no sense for delta beds other than Z-axis.
|
|
||||||
// For delta the X/Y would need to be clamped at
|
|
||||||
// DELTA_PRINTABLE_RADIUS from center of bed, but delta
|
|
||||||
// now enforces is_position_reachable for X/Y regardless
|
|
||||||
// of HAS_SOFTWARE_ENDSTOPS, so that enforcement would be
|
|
||||||
// redundant here.
|
|
||||||
|
|
||||||
void clamp_to_software_endstops(float target[XYZ]) {
|
void clamp_to_software_endstops(float target[XYZ]) {
|
||||||
if (!soft_endstops_enabled) return;
|
if (!soft_endstops_enabled) return;
|
||||||
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_X)
|
||||||
#if DISABLED(DELTA)
|
|
||||||
NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
|
NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
|
||||||
|
#endif
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_Y)
|
||||||
NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
|
NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
|
||||||
NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);
|
NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_X)
|
||||||
#if DISABLED(DELTA)
|
|
||||||
NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]);
|
NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]);
|
||||||
|
#endif
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_Y)
|
||||||
NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]);
|
NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]);
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLED(MAX_SOFTWARE_ENDSTOP_Z)
|
||||||
NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]);
|
NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue