Add loose soft endstop state, apply to UBL fine-tune (#19681)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
parent
2b326ebc84
commit
dffe7b9072
@ -1009,6 +1009,8 @@
|
|||||||
|
|
||||||
lcd_mesh_edit_setup(new_z);
|
lcd_mesh_edit_setup(new_z);
|
||||||
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
idle();
|
idle();
|
||||||
new_z = lcd_mesh_edit();
|
new_z = lcd_mesh_edit();
|
||||||
@ -1016,6 +1018,8 @@
|
|||||||
SERIAL_FLUSH(); // Prevent host M105 buffer overrun.
|
SERIAL_FLUSH(); // Prevent host M105 buffer overrun.
|
||||||
} while (!ui.button_pressed());
|
} while (!ui.button_pressed());
|
||||||
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
|
|
||||||
if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status
|
if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status
|
||||||
|
|
||||||
if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing
|
if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing
|
||||||
|
@ -201,10 +201,6 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
ABL_VAR int abl_probe_index;
|
ABL_VAR int abl_probe_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BOTH(HAS_SOFTWARE_ENDSTOPS, PROBE_MANUALLY)
|
|
||||||
ABL_VAR bool saved_soft_endstops_state = true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ABL_GRID
|
#if ABL_GRID
|
||||||
|
|
||||||
#if ENABLED(PROBE_MANUALLY)
|
#if ENABLED(PROBE_MANUALLY)
|
||||||
@ -461,7 +457,7 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
// Abort current G29 procedure, go back to idle state
|
// Abort current G29 procedure, go back to idle state
|
||||||
if (seenA && g29_in_progress) {
|
if (seenA && g29_in_progress) {
|
||||||
SERIAL_ECHOLNPGM("Manual G29 aborted");
|
SERIAL_ECHOLNPGM("Manual G29 aborted");
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state);
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
set_bed_leveling_enabled(abl_should_enable);
|
set_bed_leveling_enabled(abl_should_enable);
|
||||||
g29_in_progress = false;
|
g29_in_progress = false;
|
||||||
TERN_(LCD_BED_LEVELING, ui.wait_for_move = false);
|
TERN_(LCD_BED_LEVELING, ui.wait_for_move = false);
|
||||||
@ -482,7 +478,7 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
|
|
||||||
if (abl_probe_index == 0) {
|
if (abl_probe_index == 0) {
|
||||||
// For the initial G29 S2 save software endstop state
|
// For the initial G29 S2 save software endstop state
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, saved_soft_endstops_state = soft_endstops_enabled);
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
// Move close to the bed before the first point
|
// Move close to the bed before the first point
|
||||||
do_blocking_move_to_z(0);
|
do_blocking_move_to_z(0);
|
||||||
}
|
}
|
||||||
@ -552,14 +548,14 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
_manual_goto_xy(probePos); // Can be used here too!
|
_manual_goto_xy(probePos); // Can be used here too!
|
||||||
// Disable software endstops to allow manual adjustment
|
// Disable software endstops to allow manual adjustment
|
||||||
// If G29 is not completed, they will not be re-enabled
|
// If G29 is not completed, they will not be re-enabled
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = false);
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
G29_RETURN(false);
|
G29_RETURN(false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Leveling done! Fall through to G29 finishing code below
|
// Leveling done! Fall through to G29 finishing code below
|
||||||
SERIAL_ECHOLNPGM("Grid probing done.");
|
SERIAL_ECHOLNPGM("Grid probing done.");
|
||||||
// Re-enable software endstops, if needed
|
// Re-enable software endstops, if needed
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state);
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif ENABLED(AUTO_BED_LEVELING_3POINT)
|
#elif ENABLED(AUTO_BED_LEVELING_3POINT)
|
||||||
@ -570,7 +566,7 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
_manual_goto_xy(probePos);
|
_manual_goto_xy(probePos);
|
||||||
// Disable software endstops to allow manual adjustment
|
// Disable software endstops to allow manual adjustment
|
||||||
// If G29 is not completed, they will not be re-enabled
|
// If G29 is not completed, they will not be re-enabled
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = false);
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
G29_RETURN(false);
|
G29_RETURN(false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -578,7 +574,7 @@ G29_TYPE GcodeSuite::G29() {
|
|||||||
SERIAL_ECHOLNPGM("3-point probing done.");
|
SERIAL_ECHOLNPGM("3-point probing done.");
|
||||||
|
|
||||||
// Re-enable software endstops, if needed
|
// Re-enable software endstops, if needed
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state);
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
|
|
||||||
if (!dryrun) {
|
if (!dryrun) {
|
||||||
vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal();
|
vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal();
|
||||||
|
@ -61,7 +61,6 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM("
|
|||||||
void GcodeSuite::G29() {
|
void GcodeSuite::G29() {
|
||||||
|
|
||||||
static int mbl_probe_index = -1;
|
static int mbl_probe_index = -1;
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, static bool saved_soft_endstops_state);
|
|
||||||
|
|
||||||
MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport);
|
MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport);
|
||||||
if (!WITHIN(state, 0, 5)) {
|
if (!WITHIN(state, 0, 5)) {
|
||||||
@ -98,26 +97,19 @@ void GcodeSuite::G29() {
|
|||||||
}
|
}
|
||||||
// For each G29 S2...
|
// For each G29 S2...
|
||||||
if (mbl_probe_index == 0) {
|
if (mbl_probe_index == 0) {
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
|
||||||
// For the initial G29 S2 save software endstop state
|
|
||||||
saved_soft_endstops_state = soft_endstops_enabled;
|
|
||||||
#endif
|
|
||||||
// Move close to the bed before the first point
|
// Move close to the bed before the first point
|
||||||
do_blocking_move_to_z(0);
|
do_blocking_move_to_z(0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Save Z for the previous mesh position
|
// Save Z for the previous mesh position
|
||||||
mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z);
|
mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z);
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state);
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
}
|
}
|
||||||
// If there's another point to sample, move there with optional lift.
|
// If there's another point to sample, move there with optional lift.
|
||||||
if (mbl_probe_index < GRID_MAX_POINTS) {
|
if (mbl_probe_index < GRID_MAX_POINTS) {
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
// Disable software endstops to allow manual adjustment
|
||||||
// Disable software endstops to allow manual adjustment
|
// If G29 is left hanging without completion they won't be re-enabled!
|
||||||
// If G29 is not completed, they will not be re-enabled
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
soft_endstops_enabled = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mbl.zigzag(mbl_probe_index++, ix, iy);
|
mbl.zigzag(mbl_probe_index++, ix, iy);
|
||||||
_manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] });
|
_manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] });
|
||||||
}
|
}
|
||||||
|
@ -222,8 +222,9 @@ void GcodeSuite::G28() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for planner moves to finish!
|
planner.synchronize(); // Wait for planner moves to finish!
|
||||||
planner.synchronize();
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state
|
||||||
|
|
||||||
// Disable the leveling matrix before homing
|
// Disable the leveling matrix before homing
|
||||||
#if HAS_LEVELING
|
#if HAS_LEVELING
|
||||||
|
@ -40,7 +40,7 @@ void GcodeSuite::G34() {
|
|||||||
|
|
||||||
if (homing_needed()) return;
|
if (homing_needed()) return;
|
||||||
|
|
||||||
TEMPORARY_SOFT_ENDSTOP_STATE(false);
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
TEMPORARY_BED_LEVELING_STATE(false);
|
TEMPORARY_BED_LEVELING_STATE(false);
|
||||||
TemporaryGlobalEndstopsState unlock_z(false);
|
TemporaryGlobalEndstopsState unlock_z(false);
|
||||||
|
|
||||||
@ -148,6 +148,8 @@ void GcodeSuite::G34() {
|
|||||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands");
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands");
|
||||||
gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST));
|
gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // MECHANICAL_GANTRY_CALIBRATION
|
#endif // MECHANICAL_GANTRY_CALIBRATION
|
||||||
|
@ -581,13 +581,12 @@ void GcodeSuite::G425() {
|
|||||||
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE));
|
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEMPORARY_SOFT_ENDSTOP_STATE(false);
|
|
||||||
TEMPORARY_BED_LEVELING_STATE(false);
|
|
||||||
|
|
||||||
if (homing_needed_error()) return;
|
if (homing_needed_error()) return;
|
||||||
|
|
||||||
measurements_t m;
|
TEMPORARY_BED_LEVELING_STATE(false);
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
|
|
||||||
|
measurements_t m;
|
||||||
float uncertainty = parser.seenval('U') ? parser.value_float() : CALIBRATION_MEASUREMENT_UNCERTAIN;
|
float uncertainty = parser.seenval('U') ? parser.value_float() : CALIBRATION_MEASUREMENT_UNCERTAIN;
|
||||||
|
|
||||||
if (parser.seen('B'))
|
if (parser.seen('B'))
|
||||||
@ -612,6 +611,8 @@ void GcodeSuite::G425() {
|
|||||||
else
|
else
|
||||||
calibrate_all();
|
calibrate_all();
|
||||||
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
|
|
||||||
#ifdef CALIBRATION_SCRIPT_POST
|
#ifdef CALIBRATION_SCRIPT_POST
|
||||||
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST));
|
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST));
|
||||||
#endif
|
#endif
|
||||||
|
@ -37,8 +37,8 @@ void GcodeSuite::M211() {
|
|||||||
l_soft_max = soft_endstop.max.asLogical();
|
l_soft_max = soft_endstop.max.asLogical();
|
||||||
SERIAL_ECHO_START();
|
SERIAL_ECHO_START();
|
||||||
SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS);
|
SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS);
|
||||||
if (parser.seen('S')) soft_endstops_enabled = parser.value_bool();
|
if (parser.seen('S')) soft_endstop._enabled = parser.value_bool();
|
||||||
serialprint_onoff(soft_endstops_enabled);
|
serialprint_onoff(soft_endstop._enabled);
|
||||||
print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" "));
|
print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" "));
|
||||||
print_xyz(l_soft_max, PSTR(STR_SOFT_MAX));
|
print_xyz(l_soft_max, PSTR(STR_SOFT_MAX));
|
||||||
}
|
}
|
||||||
|
@ -70,9 +70,11 @@ void GcodeSuite::G12() {
|
|||||||
TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active);
|
TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TEMPORARY_SOFT_ENDSTOP_STATE(parser.boolval('E'));
|
SET_SOFT_ENDSTOP_LOOSE(!parser.boolval('E'));
|
||||||
|
|
||||||
nozzle.clean(pattern, strokes, radius, objects, cleans);
|
nozzle.clean(pattern, strokes, radius, objects, cleans);
|
||||||
|
|
||||||
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // NOZZLE_CLEAN_FEATURE
|
#endif // NOZZLE_CLEAN_FEATURE
|
||||||
|
@ -305,27 +305,9 @@ namespace ExtUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) {
|
void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) {
|
||||||
// Start with no limits to movement
|
// Get motion limit from software endstops, if any
|
||||||
float min = current_position[axis] - 1000,
|
float min, max;
|
||||||
max = current_position[axis] + 1000;
|
soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max);
|
||||||
|
|
||||||
// Limit to software endstops, if enabled
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
|
||||||
if (soft_endstops_enabled) switch (axis) {
|
|
||||||
case X_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x);
|
|
||||||
break;
|
|
||||||
case Y_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y);
|
|
||||||
break;
|
|
||||||
case Z_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z);
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
#endif // HAS_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
|
||||||
@ -389,8 +371,8 @@ namespace ExtUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
#if HAS_SOFTWARE_ENDSTOPS
|
||||||
bool getSoftEndstopState() { return soft_endstops_enabled; }
|
bool getSoftEndstopState() { return soft_endstop._enabled; }
|
||||||
void setSoftEndstopState(const bool value) { soft_endstops_enabled = value; }
|
void setSoftEndstopState(const bool value) { soft_endstop._enabled = value; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TRINAMIC_CONFIG
|
#if HAS_TRINAMIC_CONFIG
|
||||||
|
@ -57,28 +57,9 @@
|
|||||||
static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) {
|
static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) {
|
||||||
if (ui.use_click()) return ui.goto_previous_screen_no_defer();
|
if (ui.use_click()) return ui.goto_previous_screen_no_defer();
|
||||||
if (ui.encoderPosition && !ui.manual_move.processing) {
|
if (ui.encoderPosition && !ui.manual_move.processing) {
|
||||||
|
// Get motion limit from software endstops, if any
|
||||||
// Start with no limits to movement
|
float min, max;
|
||||||
float min = current_position[axis] - 1000,
|
soft_endstop.get_manual_axis_limits(axis, min, max);
|
||||||
max = current_position[axis] + 1000;
|
|
||||||
|
|
||||||
// Limit to software endstops, if enabled
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
|
||||||
if (soft_endstops_enabled) switch (axis) {
|
|
||||||
case X_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x);
|
|
||||||
break;
|
|
||||||
case Y_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y);
|
|
||||||
break;
|
|
||||||
case Z_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z);
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
#endif // HAS_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
|
||||||
@ -238,7 +219,7 @@ void menu_move() {
|
|||||||
BACK_ITEM(MSG_MOTION);
|
BACK_ITEM(MSG_MOTION);
|
||||||
|
|
||||||
#if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM)
|
#if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM)
|
||||||
EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstops_enabled);
|
EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) {
|
if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) {
|
||||||
|
@ -48,16 +48,12 @@
|
|||||||
float z_offset_backup, calculated_z_offset;
|
float z_offset_backup, calculated_z_offset;
|
||||||
|
|
||||||
TERN_(HAS_LEVELING, bool leveling_was_active);
|
TERN_(HAS_LEVELING, bool leveling_was_active);
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, bool store_soft_endstops_enabled);
|
|
||||||
|
|
||||||
void prepare_for_calibration() {
|
void prepare_for_calibration() {
|
||||||
z_offset_backup = probe.offset.z;
|
z_offset_backup = probe.offset.z;
|
||||||
|
|
||||||
// Disable soft endstops for free Z movement
|
// Disable soft endstops for free Z movement
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
SET_SOFT_ENDSTOP_LOOSE(true);
|
||||||
store_soft_endstops_enabled = soft_endstops_enabled;
|
|
||||||
soft_endstops_enabled = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Disable leveling for raw planner motion
|
// Disable leveling for raw planner motion
|
||||||
#if HAS_LEVELING
|
#if HAS_LEVELING
|
||||||
@ -68,7 +64,7 @@ void prepare_for_calibration() {
|
|||||||
|
|
||||||
void set_offset_and_go_back(const float &z) {
|
void set_offset_and_go_back(const float &z) {
|
||||||
probe.offset.z = z;
|
probe.offset.z = z;
|
||||||
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = store_soft_endstops_enabled);
|
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||||
TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active));
|
TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active));
|
||||||
ui.goto_previous_screen_no_defer();
|
ui.goto_previous_screen_no_defer();
|
||||||
}
|
}
|
||||||
|
@ -813,27 +813,9 @@ static void moveAxis(AxisEnum axis, const int8_t direction) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ui.manual_move.processing) {
|
if (!ui.manual_move.processing) {
|
||||||
// Start with no limits to movement
|
// Get motion limit from software endstops, if any
|
||||||
float min = current_position[axis] - 1000,
|
float min, max;
|
||||||
max = current_position[axis] + 1000;
|
soft_endstop.get_manual_axis_limits(axis, min, max);
|
||||||
|
|
||||||
// Limit to software endstops, if enabled
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
|
||||||
if (soft_endstops_enabled) switch (axis) {
|
|
||||||
case X_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x);
|
|
||||||
break;
|
|
||||||
case Y_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y);
|
|
||||||
break;
|
|
||||||
case Z_AXIS:
|
|
||||||
TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z);
|
|
||||||
TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z);
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
#endif // HAS_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
|
||||||
|
@ -161,7 +161,7 @@ Nozzle nozzle;
|
|||||||
LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \
|
LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \
|
||||||
}while(0)
|
}while(0)
|
||||||
|
|
||||||
if (soft_endstops_enabled) {
|
if (soft_endstop.enabled()) {
|
||||||
|
|
||||||
LIMIT_AXIS(x);
|
LIMIT_AXIS(x);
|
||||||
LIMIT_AXIS(y);
|
LIMIT_AXIS(y);
|
||||||
|
@ -534,12 +534,11 @@ void restore_feedrate_and_scaling() {
|
|||||||
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
#if HAS_SOFTWARE_ENDSTOPS
|
||||||
|
|
||||||
bool soft_endstops_enabled = true;
|
|
||||||
|
|
||||||
// Software Endstops are based on the configured limits.
|
// Software Endstops are based on the configured limits.
|
||||||
axis_limits_t soft_endstop = {
|
soft_endstops_t soft_endstop = {
|
||||||
{ X_MIN_POS, Y_MIN_POS, Z_MIN_POS },
|
{ X_MIN_POS, Y_MIN_POS, Z_MIN_POS },
|
||||||
{ X_MAX_POS, Y_MAX_POS, Z_MAX_POS }
|
{ X_MAX_POS, Y_MAX_POS, Z_MAX_POS },
|
||||||
|
{ true, false }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -624,9 +623,9 @@ void restore_feedrate_and_scaling() {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (DEBUGGING(LEVELING))
|
if (DEBUGGING(LEVELING))
|
||||||
SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]);
|
SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constrain the given coordinates to the software endstops.
|
* Constrain the given coordinates to the software endstops.
|
||||||
@ -636,7 +635,7 @@ void restore_feedrate_and_scaling() {
|
|||||||
*/
|
*/
|
||||||
void apply_motion_limits(xyz_pos_t &target) {
|
void apply_motion_limits(xyz_pos_t &target) {
|
||||||
|
|
||||||
if (!soft_endstops_enabled) return;
|
if (!soft_endstop._enabled) return;
|
||||||
|
|
||||||
#if IS_KINEMATIC
|
#if IS_KINEMATIC
|
||||||
|
|
||||||
@ -688,7 +687,11 @@ void restore_feedrate_and_scaling() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_SOFTWARE_ENDSTOPS
|
#else // !HAS_SOFTWARE_ENDSTOPS
|
||||||
|
|
||||||
|
soft_endstops_t soft_endstop;
|
||||||
|
|
||||||
|
#endif // !HAS_SOFTWARE_ENDSTOPS
|
||||||
|
|
||||||
#if !UBL_SEGMENTED
|
#if !UBL_SEGMENTED
|
||||||
|
|
||||||
|
@ -148,26 +148,61 @@ inline float home_bump_mm(const AxisEnum axis) {
|
|||||||
constexpr xyz_pos_t hotend_offset[1] = { { 0 } };
|
constexpr xyz_pos_t hotend_offset[1] = { { 0 } };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct { xyz_pos_t min, max; } axis_limits_t;
|
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
#if HAS_SOFTWARE_ENDSTOPS
|
||||||
extern bool soft_endstops_enabled;
|
|
||||||
extern axis_limits_t soft_endstop;
|
typedef struct {
|
||||||
|
xyz_pos_t min, max;
|
||||||
|
struct {
|
||||||
|
bool _enabled:1;
|
||||||
|
bool _loose:1;
|
||||||
|
};
|
||||||
|
bool enabled() { return _enabled && !_loose; }
|
||||||
|
void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) {
|
||||||
|
amin = -100000; amax = 100000; // "No limits"
|
||||||
|
#if HAS_SOFTWARE_ENDSTOPS
|
||||||
|
if (enabled()) switch (axis) {
|
||||||
|
case X_AXIS:
|
||||||
|
TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x);
|
||||||
|
TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x);
|
||||||
|
break;
|
||||||
|
case Y_AXIS:
|
||||||
|
TERN_(MIN_SOFTWARE_ENDSTOP_Y, amin = min.y);
|
||||||
|
TERN_(MAX_SOFTWARE_ENDSTOP_Y, amax = max.y);
|
||||||
|
break;
|
||||||
|
case Z_AXIS:
|
||||||
|
TERN_(MIN_SOFTWARE_ENDSTOP_Z, amin = min.z);
|
||||||
|
TERN_(MAX_SOFTWARE_ENDSTOP_Z, amax = max.z);
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
} soft_endstops_t;
|
||||||
|
|
||||||
|
extern soft_endstops_t soft_endstop;
|
||||||
void apply_motion_limits(xyz_pos_t &target);
|
void apply_motion_limits(xyz_pos_t &target);
|
||||||
void update_software_endstops(const AxisEnum axis
|
void update_software_endstops(const AxisEnum axis
|
||||||
#if HAS_HOTEND_OFFSET
|
#if HAS_HOTEND_OFFSET
|
||||||
, const uint8_t old_tool_index=0, const uint8_t new_tool_index=0
|
, const uint8_t old_tool_index=0, const uint8_t new_tool_index=0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
#define TEMPORARY_SOFT_ENDSTOP_STATE(enable) REMEMBER(tes, soft_endstops_enabled, enable);
|
#define SET_SOFT_ENDSTOP_LOOSE(loose) (soft_endstop._loose = loose)
|
||||||
#else
|
|
||||||
constexpr bool soft_endstops_enabled = false;
|
#else // !HAS_SOFTWARE_ENDSTOPS
|
||||||
//constexpr axis_limits_t soft_endstop = {
|
|
||||||
// { X_MIN_POS, Y_MIN_POS, Z_MIN_POS },
|
typedef struct {
|
||||||
// { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } };
|
bool enabled() { return false; }
|
||||||
#define apply_motion_limits(V) NOOP
|
void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) {
|
||||||
|
// No limits
|
||||||
|
amin = current_position[axis] - 1000;
|
||||||
|
amax = current_position[axis] + 1000;
|
||||||
|
}
|
||||||
|
} soft_endstops_t;
|
||||||
|
extern soft_endstops_t soft_endstop;
|
||||||
|
#define apply_motion_limits(V) NOOP
|
||||||
#define update_software_endstops(...) NOOP
|
#define update_software_endstops(...) NOOP
|
||||||
#define TEMPORARY_SOFT_ENDSTOP_STATE(...) NOOP
|
#define SET_SOFT_ENDSTOP_LOOSE() NOOP
|
||||||
#endif
|
|
||||||
|
#endif // !HAS_SOFTWARE_ENDSTOPS
|
||||||
|
|
||||||
void report_real_position();
|
void report_real_position();
|
||||||
void report_current_position();
|
void report_current_position();
|
||||||
|
@ -1017,14 +1017,10 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
|
|||||||
// Raise by a configured distance to avoid workpiece, except with
|
// Raise by a configured distance to avoid workpiece, except with
|
||||||
// SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead.
|
// SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead.
|
||||||
if (!no_move) {
|
if (!no_move) {
|
||||||
#if HAS_SOFTWARE_ENDSTOPS
|
const float newz = current_position.z + _MAX(-diff.z, 0.0);
|
||||||
const float maxz = _MIN(soft_endstop.max.z, Z_MAX_POS);
|
|
||||||
#else
|
|
||||||
constexpr float maxz = Z_MAX_POS;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check if Z has space to compensate at least z_offset, and if not, just abort now
|
// Check if Z has space to compensate at least z_offset, and if not, just abort now
|
||||||
const float newz = current_position.z + _MAX(-diff.z, 0.0);
|
const float maxz = _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS);
|
||||||
if (newz > maxz) return;
|
if (newz > maxz) return;
|
||||||
|
|
||||||
current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz);
|
current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz);
|
||||||
|
Loading…
Reference in New Issue
Block a user