Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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))
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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()
Ejemplo n.º 6
0
 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")
Ejemplo n.º 7
0
 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,))
Ejemplo n.º 8
0
 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, ))
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
 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))
Ejemplo n.º 15
0
 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()
Ejemplo n.º 16
0
 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]))