diff options
Diffstat (limited to 'klippy/homing.py')
-rw-r--r-- | klippy/homing.py | 62 |
1 files changed, 35 insertions, 27 deletions
diff --git a/klippy/homing.py b/klippy/homing.py index 9fde0000..db99fea9 100644 --- a/klippy/homing.py +++ b/klippy/homing.py @@ -29,61 +29,69 @@ class Homing: return thcoord def retract(self, newpos, speed): self.toolhead.move(self._fill_coord(newpos), speed) - def home(self, forcepos, movepos, endstops, speed, second_home=False): - # Alter kinematics class to think printer is at forcepos - self.toolhead.set_position(self._fill_coord(forcepos)) - # Start homing and issue move - if not second_home: - est_move_d = sum([abs(forcepos[i]-movepos[i]) - for i in range(3) if movepos[i] is not None]) - est_steps = sum([est_move_d / s.get_step_dist() - for es, n in endstops for s in es.get_steppers()]) - self.toolhead.dwell(est_steps * HOMING_STEP_DELAY, check_stall=False) + def set_homed_position(self, pos): + self.toolhead.set_position(self._fill_coord(pos)) + def homing_move(self, movepos, endstops, speed): + # Start endstop checking print_time = self.toolhead.get_last_move_time() - start_mcu_pos = [(s, name, s.get_mcu_position()) - for es, name in endstops for s in es.get_steppers()] for mcu_endstop, name in endstops: min_step_dist = min([s.get_step_dist() for s in mcu_endstop.get_steppers()]) mcu_endstop.home_start( print_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, min_step_dist / speed) - self.toolhead.move(self._fill_coord(movepos), speed) + # Issue move + error = None + try: + self.toolhead.move(self._fill_coord(movepos), speed) + except EndstopError as e: + error = "Error during homing move: %s" % (str(e),) + # Wait for endstops to trigger move_end_print_time = self.toolhead.get_last_move_time() self.toolhead.reset_print_time(print_time) for mcu_endstop, name in endstops: - mcu_endstop.home_finalize(move_end_print_time) - # Wait for endstops to trigger - for mcu_endstop, name in endstops: try: - mcu_endstop.home_wait() - except mcu_endstop.error as e: - raise EndstopError("Failed to home stepper %s: %s" % ( - name, str(e))) + mcu_endstop.home_wait(move_end_print_time) + except mcu_endstop.TimeoutError as e: + if error is None: + error = "Failed to home %s: %s" % (name, str(e)) + if error is not None: + raise EndstopError(error) + def home(self, forcepos, movepos, endstops, speed, second_home=False): + # Alter kinematics class to think printer is at forcepos + self.toolhead.set_position(self._fill_coord(forcepos)) + # Add a CPU delay when homing a large axis + if not second_home: + est_move_d = sum([abs(forcepos[i]-movepos[i]) + for i in range(3) if movepos[i] is not None]) + est_steps = sum([est_move_d / s.get_step_dist() + for es, n in endstops for s in es.get_steppers()]) + self.toolhead.dwell(est_steps * HOMING_STEP_DELAY, check_stall=False) + # Setup for retract verification + self.toolhead.get_last_move_time() + start_mcu_pos = [(s, name, s.get_mcu_position()) + for es, name in endstops for s in es.get_steppers()] + # Issue homing move + self.homing_move(movepos, endstops, speed) # Verify retract led to some movement on second home if second_home and self.verify_retract: for s, name, pos in start_mcu_pos: if s.get_mcu_position() == pos: raise EndstopError( "Endstop %s still triggered after retract" % (name,)) - def set_homed_position(self, pos): - self.toolhead.set_position(self._fill_coord(pos)) def query_endstops(print_time, query_flags, steppers): if query_flags == "get_mcu_position": # Only the commanded position is requested return [(s.name.upper(), s.mcu_stepper.get_mcu_position()) for s in steppers] + out = [] for s in steppers: for mcu_endstop, name in s.get_endstops(): mcu_endstop.query_endstop(print_time) - out = [] for s in steppers: for mcu_endstop, name in s.get_endstops(): - try: - out.append((name, mcu_endstop.query_endstop_wait())) - except mcu_endstop.error as e: - raise EndstopError(str(e)) + out.append((name, mcu_endstop.query_endstop_wait())) return out class EndstopError(Exception): |