Skip to content

Commit

Permalink
Refactor soft endstop state
Browse files Browse the repository at this point in the history
  • Loading branch information
thinkyhead committed Oct 12, 2020
1 parent cf05468 commit a604909
Show file tree
Hide file tree
Showing 15 changed files with 103 additions and 134 deletions.
6 changes: 4 additions & 2 deletions Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -972,8 +972,6 @@

TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset

TEMPORARY_SOFT_ENDSTOP_STATE(false); // Disable soft endstops until this method exits

MeshFlags done_flags{0};
const xy_int8_t &lpos = location.pos;
do {
Expand Down Expand Up @@ -1011,13 +1009,17 @@

lcd_mesh_edit_setup(new_z);

SET_SOFT_ENDSTOP_LOOSE(true);

do {
idle();
new_z = lcd_mesh_edit();
TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited
SERIAL_FLUSH(); // Prevent host M105 buffer overrun.
} 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 (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing
Expand Down
16 changes: 6 additions & 10 deletions Marlin/src/gcode/bedlevel/abl/G29.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,10 +201,6 @@ G29_TYPE GcodeSuite::G29() {
ABL_VAR int abl_probe_index;
#endif

#if BOTH(HAS_SOFTWARE_ENDSTOPS, PROBE_MANUALLY)
ABL_VAR bool saved_soft_endstops_state = true;
#endif

#if ABL_GRID

#if ENABLED(PROBE_MANUALLY)
Expand Down Expand Up @@ -461,7 +457,7 @@ G29_TYPE GcodeSuite::G29() {
// Abort current G29 procedure, go back to idle state
if (seenA && g29_in_progress) {
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);
g29_in_progress = false;
TERN_(LCD_BED_LEVELING, ui.wait_for_move = false);
Expand All @@ -482,7 +478,7 @@ G29_TYPE GcodeSuite::G29() {

if (abl_probe_index == 0) {
// 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
do_blocking_move_to_z(0);
}
Expand Down Expand Up @@ -552,14 +548,14 @@ G29_TYPE GcodeSuite::G29() {
_manual_goto_xy(probePos); // Can be used here too!
// Disable software endstops to allow manual adjustment
// 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);
}
else {
// Leveling done! Fall through to G29 finishing code below
SERIAL_ECHOLNPGM("Grid probing done.");
// 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)
Expand All @@ -570,15 +566,15 @@ G29_TYPE GcodeSuite::G29() {
_manual_goto_xy(probePos);
// Disable software endstops to allow manual adjustment
// 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);
}
else {

SERIAL_ECHOLNPGM("3-point probing done.");

// Re-enable software endstops, if needed
TERN_(HAS_SOFTWARE_ENDSTOPS, soft_endstops_enabled = saved_soft_endstops_state);
SET_SOFT_ENDSTOP_LOOSE(false);

if (!dryrun) {
vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal();
Expand Down
16 changes: 4 additions & 12 deletions Marlin/src/gcode/bedlevel/mbl/G29.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM("
void GcodeSuite::G29() {

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);
if (!WITHIN(state, 0, 5)) {
Expand Down Expand Up @@ -98,26 +97,19 @@ void GcodeSuite::G29() {
}
// For each G29 S2...
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
do_blocking_move_to_z(0);
}
else {
// Save Z for the previous mesh position
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 (mbl_probe_index < GRID_MAX_POINTS) {
#if HAS_SOFTWARE_ENDSTOPS
// Disable software endstops to allow manual adjustment
// If G29 is not completed, they will not be re-enabled
soft_endstops_enabled = false;
#endif

// Disable software endstops to allow manual adjustment
// If G29 is left hanging without completion they won't be re-enabled!
SET_SOFT_ENDSTOP_LOOSE(true);
mbl.zigzag(mbl_probe_index++, ix, iy);
_manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] });
}
Expand Down
5 changes: 3 additions & 2 deletions Marlin/src/gcode/calibrate/G28.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,9 @@ void GcodeSuite::G28() {
return;
}

// Wait for planner moves to finish!
planner.synchronize();
planner.synchronize(); // Wait for planner moves to finish!

SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state

// Disable the leveling matrix before homing
#if HAS_LEVELING
Expand Down
9 changes: 5 additions & 4 deletions Marlin/src/gcode/calibrate/G425.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -581,13 +581,12 @@ void GcodeSuite::G425() {
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE));
#endif

TEMPORARY_SOFT_ENDSTOP_STATE(false);
TEMPORARY_BED_LEVELING_STATE(false);

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;

if (parser.seen('B'))
Expand All @@ -612,6 +611,8 @@ void GcodeSuite::G425() {
else
calibrate_all();

SET_SOFT_ENDSTOP_LOOSE(false);

#ifdef CALIBRATION_SCRIPT_POST
GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST));
#endif
Expand Down
4 changes: 2 additions & 2 deletions Marlin/src/gcode/control/M211.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ void GcodeSuite::M211() {
l_soft_max = soft_endstop.max.asLogical();
SERIAL_ECHO_START();
SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS);
if (parser.seen('S')) soft_endstops_enabled = parser.value_bool();
serialprint_onoff(soft_endstops_enabled);
if (parser.seen('S')) soft_endstop._enabled = parser.value_bool();
serialprint_onoff(soft_endstop._enabled);
print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" "));
print_xyz(l_soft_max, PSTR(STR_SOFT_MAX));
}
Expand Down
4 changes: 3 additions & 1 deletion Marlin/src/gcode/feature/clean/G12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,11 @@ void GcodeSuite::G12() {
TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active);
#endif

TEMPORARY_SOFT_ENDSTOP_STATE(parser.boolval('E'));
SET_SOFT_ENDSTOP_LOOSE(!parser.boolval('E'));

nozzle.clean(pattern, strokes, radius, objects, cleans);

SET_SOFT_ENDSTOP_LOOSE(false);
}

#endif // NOZZLE_CLEAN_FEATURE
28 changes: 5 additions & 23 deletions Marlin/src/lcd/extui/ui_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,27 +305,9 @@ namespace ExtUI {
}

void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) {
// Start with no limits to movement
float min = current_position[axis] - 1000,
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
// Get motion limit from software endstops, if any
float min, max;
soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max);

// Delta limits XY based on the current offset from center
// This assumes the center is 0,0
Expand Down Expand Up @@ -389,8 +371,8 @@ namespace ExtUI {
}

#if HAS_SOFTWARE_ENDSTOPS
bool getSoftEndstopState() { return soft_endstops_enabled; }
void setSoftEndstopState(const bool value) { soft_endstops_enabled = value; }
bool getSoftEndstopState() { return soft_endstop._enabled; }
void setSoftEndstopState(const bool value) { soft_endstop._enabled = value; }
#endif

#if HAS_TRINAMIC_CONFIG
Expand Down
27 changes: 4 additions & 23 deletions Marlin/src/lcd/menu/menu_motion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,28 +57,9 @@
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.encoderPosition && !ui.manual_move.processing) {

// Start with no limits to movement
float min = current_position[axis] - 1000,
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
// Get motion limit from software endstops, if any
float min, max;
soft_endstop.get_manual_axis_limits(axis, min, max);

// Delta limits XY based on the current offset from center
// This assumes the center is 0,0
Expand Down Expand Up @@ -238,7 +219,7 @@ void menu_move() {
BACK_ITEM(MSG_MOTION);

#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

if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) {
Expand Down
8 changes: 2 additions & 6 deletions Marlin/src/lcd/menu/menu_probe_offset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,12 @@
float z_offset_backup, calculated_z_offset;

TERN_(HAS_LEVELING, bool leveling_was_active);
TERN_(HAS_SOFTWARE_ENDSTOPS, bool store_soft_endstops_enabled);

void prepare_for_calibration() {
z_offset_backup = probe.offset.z;

// Disable soft endstops for free Z movement
#if HAS_SOFTWARE_ENDSTOPS
store_soft_endstops_enabled = soft_endstops_enabled;
soft_endstops_enabled = false;
#endif
SET_SOFT_ENDSTOP_LOOSE(true);

// Disable leveling for raw planner motion
#if HAS_LEVELING
Expand All @@ -68,7 +64,7 @@ void prepare_for_calibration() {

void set_offset_and_go_back(const float &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));
ui.goto_previous_screen_no_defer();
}
Expand Down
24 changes: 3 additions & 21 deletions Marlin/src/lcd/tft/ui_480x320.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -813,27 +813,9 @@ static void moveAxis(AxisEnum axis, const int8_t direction) {
}

if (!ui.manual_move.processing) {
// Start with no limits to movement
float min = current_position[axis] - 1000,
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
// Get motion limit from software endstops, if any
float min, max;
soft_endstop.get_manual_axis_limits(axis, min, max);

// Delta limits XY based on the current offset from center
// This assumes the center is 0,0
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/libs/nozzle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ Nozzle nozzle;
LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \
}while(0)

if (soft_endstops_enabled) {
if (soft_endstop.enabled()) {

LIMIT_AXIS(x);
LIMIT_AXIS(y);
Expand Down
21 changes: 12 additions & 9 deletions Marlin/src/module/motion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -534,12 +534,11 @@ void restore_feedrate_and_scaling() {

#if HAS_SOFTWARE_ENDSTOPS

bool soft_endstops_enabled = true;

// 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_MAX_POS, Y_MAX_POS, Z_MAX_POS }
{ X_MAX_POS, Y_MAX_POS, Z_MAX_POS },
{ true, false }
};

/**
Expand Down Expand Up @@ -624,9 +623,9 @@ void restore_feedrate_and_scaling() {

#endif

if (DEBUGGING(LEVELING))
SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]);
}
if (DEBUGGING(LEVELING))
SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]);
}

/**
* Constrain the given coordinates to the software endstops.
Expand All @@ -636,7 +635,7 @@ void restore_feedrate_and_scaling() {
*/
void apply_motion_limits(xyz_pos_t &target) {

if (!soft_endstops_enabled) return;
if (!soft_endstop._enabled) return;

#if IS_KINEMATIC

Expand Down Expand Up @@ -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

Expand Down
Loading

0 comments on commit a604909

Please sign in to comment.