def get_homed_offset(self, stepper): if self.get_phase is not None: try: phase = self.get_phase() except Exception as e: msg = "Unable to get stepper %s phase: %s" % (self.name, str(e)) logging.exception(msg) raise homing.EndstopError(msg) if stepper.is_dir_inverted(): phase = (self.phases - 1) - phase else: phase = stepper.get_mcu_position() % self.phases self.phase_history[phase] += 1 if self.endstop_phase is None: logging.info("Setting %s endstop phase to %d", self.name, phase) self.endstop_phase = phase return 0. delta = (phase - self.endstop_phase) % self.phases if delta >= self.phases - self.endstop_phase_accuracy: delta -= self.phases elif delta > self.endstop_phase_accuracy: raise homing.EndstopError( "Endstop %s incorrect phase (got %d vs %d)" % (self.name, phase, self.endstop_phase)) return delta * self.step_dist
def check_move(self, move): move.extrude_r = move.axes_d[3] / move.move_d move.extrude_max_corner_v = 0. if not self.heater.can_extrude: raise homing.EndstopError( "Extrude below minimum temp\n" "See the 'min_extrude_temp' config option for details") if not move.is_kinematic_move or move.extrude_r < 0.: # Extrude only move (or retraction move) - limit accel and velocity if abs(move.axes_d[3]) > self.max_e_dist: raise homing.EndstopError( "Extrude only move too long (%.3fmm vs %.3fmm)\n" "See the 'max_extrude_only_distance' config" " option for details" % (move.axes_d[3], self.max_e_dist)) inv_extrude_r = 1. / abs(move.extrude_r) move.limit_speed(self.max_e_velocity * inv_extrude_r , self.max_e_accel * inv_extrude_r) elif move.extrude_r > self.max_extrude_ratio: if move.axes_d[3] <= self.nozzle_diameter * self.max_extrude_ratio: # Permit extrusion if amount extruded is tiny move.extrude_r = self.max_extrude_ratio return area = move.axes_d[3] * self.filament_area / move.move_d logging.debug("Overextrude: %s vs %s (area=%.3f dist=%.3f)", move.extrude_r, self.max_extrude_ratio, area, move.move_d) raise homing.EndstopError( "Move exceeds maximum extrusion (%.3fmm^2 vs %.3fmm^2)\n" "See the 'max_extrude_cross_section' config option for details" % (area, self.max_extrude_ratio * self.filament_area))
def test_sensor(self): if not self.pin_up_touch_triggered: # Nothing to test return toolhead = self.printer.lookup_object('toolhead') print_time = toolhead.get_last_move_time() if print_time < self.next_test_time: self.next_test_time = print_time + TEST_TIME return # Raise the bltouch probe and test if probe is raised self.sync_print_time() for retry in range(3): check_start_time = self.send_cmd('pin_up', duration=self.pin_move_time) self.send_cmd('touch_mode') check_end_time = self.send_cmd(None) success = self.verify_state(check_start_time, check_end_time, True) self.sync_print_time() if success: # The "bltouch connection" test completed successfully self.next_test_time = check_end_time + TEST_TIME return msg = "BLTouch failed to verify sensor state" if retry >= 2: raise homing.EndstopError(msg) self.gcode.respond_info(msg + '; retrying.') self.send_cmd('reset', duration=RETRY_RESET_TIME)
def test_sensor(self): if not self.test_sensor_pin: return toolhead = self.printer.lookup_object('toolhead') print_time = toolhead.get_last_move_time() if print_time < self.next_test_time: self.next_test_time = print_time + TEST_TIME return # Raise the bltouch probe and test if probe is raised self.send_cmd(print_time, 'reset') home_time = print_time + self.pin_move_time self.send_cmd(home_time, 'touch_mode') self.send_cmd(home_time + MIN_CMD_TIME, None) # Perform endstop check to verify bltouch reports probe raised prev_positions = [s.get_commanded_position() for s in self.mcu_endstop.get_steppers()] self.mcu_endstop.home_start(home_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, ENDSTOP_REST_TIME) try: self.mcu_endstop.home_wait(home_time + MIN_CMD_TIME) except self.mcu_endstop.TimeoutError as e: raise homing.EndstopError("BLTouch sensor test failed") for s, pos in zip(self.mcu_endstop.get_steppers(), prev_positions): s.set_commanded_position(pos) # Test was successful self.next_test_time = home_time + TEST_TIME toolhead.reset_print_time(home_time + 2. * MIN_CMD_TIME)
def home_finalize(self): self.raise_probe() self.sync_print_time() # Verify the probe actually deployed during the attempt for s, mcu_pos in self.start_mcu_pos: if s.get_mcu_position() == mcu_pos: raise homing.EndstopError("BLTouch failed to deploy") self.mcu_endstop.home_finalize()
def probe_finish(self): if self.multi == 'OFF': self.raise_probe() self.sync_print_time() # Verify the probe actually deployed during the attempt for s, mcu_pos in self.start_mcu_pos: if s.get_mcu_position() == mcu_pos: raise homing.EndstopError("BLTouch failed to deploy")
def verify_state(self, check_start_time, check_end_time, triggered, msg): # Perform endstop check to verify bltouch reports desired state self.mcu_endstop.home_start(check_start_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, ENDSTOP_REST_TIME, triggered=triggered) try: self.mcu_endstop.home_wait(check_end_time) except self.mcu_endstop.TimeoutError as e: logging.warning("BLTouch probe verify status failed.") raise homing.EndstopError("BLTouch failed to %s" % (msg,))
def verify_state(self, check_start_time, check_end_time, triggered, msg): # Perform endstop check to verify bltouch reports desired state self.mcu_endstop.home_start(check_start_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, ENDSTOP_REST_TIME, triggered=triggered) did_trigger = self.mcu_endstop.home_wait(check_end_time) if not did_trigger: raise homing.EndstopError("BLTouch failed to %s" % (msg, ))
def verify_state(self, check_start_time, check_end_time, triggered, msg): # Perform endstop check to verify bltouch reports desired state prev_positions = [s.get_commanded_position() for s in self.mcu_endstop.get_steppers()] self.mcu_endstop.home_start(check_start_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, ENDSTOP_REST_TIME, triggered=triggered) try: self.mcu_endstop.home_wait(check_end_time) except self.mcu_endstop.TimeoutError as e: raise homing.EndstopError("BLTouch failed to %s" % (msg,)) for s, pos in zip(self.mcu_endstop.get_steppers(), prev_positions): s.set_commanded_position(pos)
def get_homed_offset(self): if not self.homing_stepper_phases or self.need_motor_enable: return 0 pos = self.mcu_stepper.get_mcu_position() pos %= self.homing_stepper_phases if self.homing_endstop_phase is None: logging.info("Setting %s endstop phase to %d" % (self.name, pos)) self.homing_endstop_phase = pos return 0 delta = (pos - self.homing_endstop_phase) % self.homing_stepper_phases if delta >= self.homing_stepper_phases - self.homing_endstop_accuracy: delta -= self.homing_stepper_phases elif delta > self.homing_endstop_accuracy: raise homing.EndstopError( "Endstop %s incorrect phase (got %d vs %d)" % (self.name, pos, self.homing_endstop_phase)) return delta * self.step_dist
def get_homed_offset(self): if not self.homing_stepper_phases: return 0. - self.homing_offset pos = self.steppers[0].get_mcu_position() pos %= self.homing_stepper_phases if self.homing_endstop_phase is None: self.logger.info("Setting %s endstop phase to %d", self.name, pos) self.homing_endstop_phase = pos return 0. - self.homing_offset delta = (pos - self.homing_endstop_phase) % self.homing_stepper_phases if delta >= self.homing_stepper_phases - self.homing_endstop_accuracy: delta -= self.homing_stepper_phases elif delta > self.homing_endstop_accuracy: raise homing.EndstopError( "Endstop %s incorrect phase (got %d vs %d)" % (self.name, pos, self.homing_endstop_phase)) return (delta * self.homing_step_dist) - self.homing_offset
def test_sensor(self): toolhead = self.printer.lookup_object('toolhead') print_time = toolhead.get_last_move_time() if print_time < self.next_test_time: self.next_test_time = print_time + TEST_TIME return self.send_cmd(print_time, CMD_RESET) home_time = print_time + PIN_MOVE_TIME self.send_cmd(home_time, CMD_TOUCH_MODE) self.send_cmd(home_time + MIN_CMD_TIME, 0.) self.mcu_endstop.home_start(home_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, .001) try: self.mcu_endstop.home_wait(home_time + MIN_CMD_TIME) except self.mcu_endstop.TimeoutError as e: raise homing.EndstopError("BLTouch sensor test failed") self.next_test_time = home_time + TEST_TIME toolhead.reset_print_time(home_time + 2. * MIN_CMD_TIME)
def raise_probe(self): self.sync_mcu_print_time() if not self.pin_up_not_triggered: # No way to verify raise attempt - just issue commands self.send_cmd('reset') self.send_cmd('pin_up', duration=self.pin_move_time) return for retry in range(3): self.send_cmd('pin_up', duration=self.pin_move_time) success = self.verify_state(False) if success: # The "probe raised" test completed successfully break if retry >= 2: raise homing.EndstopError("BLTouch failed to raise probe") msg = "Failed to verify BLTouch probe is raised; retrying." self.gcode.respond_info(msg) self.sync_mcu_print_time() self.send_cmd('reset', duration=RETRY_RESET_TIME)
def query_endstops(self): last_move_time = self.get_last_move_time() try: return self.kin.query_endstops(last_move_time) except self.mcu.error as e: raise homing.EndstopError(str(e))
def home_finalize(self): try: self.deactivate_gcode.run_gcode_from_command() except self.gcode.error as e: raise homing.EndstopError(str(e)) self.mcu_endstop.home_finalize()
def move_error(self, msg="Move out of range"): pos = self.end_pos return homing.EndstopError("%s: %.3f %.3f %.3f [%.3f]" % (msg, pos[0], pos[1], pos[2], pos[3]))