Exemple #1
0
 def probe_finalize(self):
     toolhead = self.printer.lookup_object('toolhead')
     start_pos = toolhead.get_position()
     self.deactivate_gcode.run_gcode_from_command()
     if toolhead.get_position()[:3] != start_pos[:3]:
         raise homing.CommandError(
             "Toolhead moved during probe deactivate_gcode script")
Exemple #2
0
 def drip_move(self, newpos, speed):
     # Validate move
     move = Move(self, self.commanded_pos, newpos, speed)
     if move.axes_d[3]:
         raise homing.CommandError("Invalid drip move")
     if not move.move_d or not move.is_kinematic_move:
         return
     self.kin.check_move(move)
     speed = math.sqrt(move.max_cruise_v2)
     # Transition to "Flushed" state and then to "Drip" state
     self._full_flush()
     self.special_queuing_state = "Drip"
     self.need_check_stall = self.reactor.NEVER
     self.reactor.update_timer(self.flush_timer, self.reactor.NEVER)
     self.move_queue.set_flush_time(self.reactor.NEVER)
     self.drip_completion = self.reactor.completion()
     # Split move into many tiny moves and queue them
     num_moves = max(1, int(math.ceil(move.min_move_t / DRIP_SEGMENT_TIME)))
     inv_num_moves = 1. / float(num_moves)
     submove_d = [d * inv_num_moves for d in move.axes_d]
     prev_pos = move.start_pos
     for i in range(num_moves - 1):
         next_pos = [p + d for p, d in zip(prev_pos, submove_d)]
         self.move_queue.add_move(Move(self, prev_pos, next_pos, speed))
         prev_pos = next_pos
     self.move_queue.add_move(Move(self, prev_pos, move.end_pos, speed))
     # Transmit moves
     self._calc_print_time()
     try:
         self.move_queue.flush()
     except DripModeEndSignal as e:
         self.move_queue.reset()
     # Return to "Flushed" state
     self._full_flush()
Exemple #3
0
 def do_homing_move(self, movepos, speed, accel, triggered):
     if not self.can_home:
         raise self.gcode.error("No endstop for this manual stepper")
     # Start endstop checking
     self.sync_print_time()
     endstops = self.rail.get_endstops()
     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(self.next_cmd_time,
                                ENDSTOP_SAMPLE_TIME,
                                ENDSTOP_SAMPLE_COUNT,
                                min_step_dist / speed,
                                triggered=triggered)
     # Issue move
     self.do_move(movepos, speed, accel)
     # Wait for endstops to trigger
     error = None
     for mcu_endstop, name in endstops:
         try:
             mcu_endstop.home_wait(self.next_cmd_time)
         except mcu_endstop.TimeoutError as e:
             if error is None:
                 error = "Failed to home %s: %s" % (name, str(e))
     self.sync_print_time()
     if error is not None:
         raise homing.CommandError(error)
Exemple #4
0
 def home_prepare(self):
     toolhead = self.printer.lookup_object('toolhead')
     start_pos = toolhead.get_position()
     self.activate_gcode.run_gcode_from_command()
     if toolhead.get_position()[:3] != start_pos[:3]:
         raise homing.CommandError(
             "Toolhead moved during probe activate_gcode script")
     self.mcu_endstop.home_prepare()
Exemple #5
0
 def run_probe(self, params={}):
     speed = self.gcode.get_float("PROBE_SPEED",
                                  params,
                                  self.speed,
                                  above=0.)
     lift_speed = self.get_lift_speed(params)
     sample_count = self.gcode.get_int("SAMPLES",
                                       params,
                                       self.sample_count,
                                       minval=1)
     sample_retract_dist = self.gcode.get_float("SAMPLE_RETRACT_DIST",
                                                params,
                                                self.sample_retract_dist,
                                                above=0.)
     samples_tolerance = self.gcode.get_float("SAMPLES_TOLERANCE",
                                              params,
                                              self.samples_tolerance,
                                              minval=0.)
     samples_retries = self.gcode.get_int("SAMPLES_TOLERANCE_RETRIES",
                                          params,
                                          self.samples_retries,
                                          minval=0)
     samples_result = self.gcode.get_str("SAMPLES_RESULT", params,
                                         self.samples_result)
     must_notify_multi_probe = not self.multi_probe_pending
     if must_notify_multi_probe:
         self.multi_probe_begin()
     retries = 0
     positions = []
     while len(positions) < sample_count:
         # Probe position
         pos = self._probe(speed)
         positions.append(pos)
         # Check samples tolerance
         z_positions = [p[2] for p in positions]
         if max(z_positions) - min(z_positions) > samples_tolerance:
             if retries >= samples_retries:
                 raise homing.CommandError(
                     "Probe samples exceed samples_tolerance")
             self.gcode.respond_info(
                 "Probe samples exceed tolerance. Retrying...")
             retries += 1
             positions = []
         # Retract
         if len(positions) < sample_count:
             liftpos = [None, None, pos[2] + sample_retract_dist]
             self._move(liftpos, lift_speed)
     if must_notify_multi_probe:
         self.multi_probe_end()
     # Calculate and return result
     if samples_result == 'median':
         return self._calc_median(positions)
     return self._calc_mean(positions)
Exemple #6
0
 def finalize_probe(self):
     endstops = [(self.mcu_probe, "probe")]
     probe_instance, name = endstops[0]
     if hasattr(probe_instance, 'stow_probe'):
         probe_instance.stow_probe()
     error = None
     for mcu_endstop, name in endstops:
         try:
             mcu_endstop.home_finalize()
         except homing.CommandError as e:
             if error is None:
                 error = str(e)
     if error is not None:
         raise homing.CommandError(error)
Exemple #7
0
 def _probe(self, speed):
     toolhead = self.printer.lookup_object('toolhead')
     homing_state = homing.Homing(self.printer)
     pos = toolhead.get_position()
     pos[2] = self.z_position
     endstops = [(self.mcu_probe, "probe")]
     verify = self.printer.get_start_args().get('debugoutput') is None
     try:
         homing_state.homing_move(pos, endstops, speed,
                                  probe_pos=True, verify_movement=verify)
     except homing.CommandError as e:
         reason = str(e)
         if "Timeout during endstop homing" in reason:
             reason += HINT_TIMEOUT
         raise homing.CommandError(reason)
     pos = toolhead.get_position()
     self.gcode.respond_info("probe at %.3f,%.3f is z=%.6f" % (
         pos[0], pos[1], pos[2]))
     self.gcode.reset_last_position()
     return pos[:3]
Exemple #8
0
    def _probe(self, speed):
        pheater = self.printer.lookup_object('heater')
        try:
            heater_bed = pheater.lookup_heater("heater_bed")
        except self.printer.config_error as e:
            heater_bed = None

        if heater_bed is not None and self.disable_bed_heater:
            heated_bed_target_temp = heater_bed.target_temp
            self.gcode.respond_info("Heated bed target temp before probe" +
                                    " run: %.1f degrees"
                                    % heated_bed_target_temp)
            heater_bed.set_temp(0., 0.)

        toolhead = self.printer.lookup_object('toolhead')
        homing_state = homing.Homing(self.printer)
        pos = toolhead.get_position()
        pos[2] = self.z_position
        endstops = [(self.mcu_probe, "probe")]
        verify = self.printer.get_start_args().get('debugoutput') is None
        try:
            homing_state.homing_move(pos, endstops, speed,
                                     probe_pos=True, verify_movement=verify)
        except homing.CommandError as e:
            reason = str(e)
            if "Timeout during endstop homing" in reason:
                reason += HINT_TIMEOUT
            raise homing.CommandError(reason)
        pos = toolhead.get_position()
        self.gcode.respond_info("probe at %.3f,%.3f is z=%.6f" % (
            pos[0], pos[1], pos[2]))
        self.gcode.reset_last_position()

        if heater_bed is not None and self.disable_bed_heater:
            heater_bed.set_temp(0., heated_bed_target_temp)
            self.gcode.respond_info("Heater bed reset to %.1f degrees"
                                    % heated_bed_target_temp)

        return pos[:3]
Exemple #9
0
 def do_homing_move(self, movepos, speed, accel, triggered, check_trigger):
     if not self.can_home:
         raise self.printer.command_error(
             "No endstop for this manual stepper")
     # Notify start of homing/probing move
     endstops = self.rail.get_endstops()
     self.printer.send_event("homing:homing_move_begin",
                             [es for es, name in endstops])
     # Start endstop checking
     self.sync_print_time()
     endstops = self.rail.get_endstops()
     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(self.next_cmd_time,
                                ENDSTOP_SAMPLE_TIME,
                                ENDSTOP_SAMPLE_COUNT,
                                min_step_dist / speed,
                                triggered=triggered)
     # Issue move
     self.do_move(movepos, speed, accel)
     # Wait for endstops to trigger
     error = None
     for mcu_endstop, name in endstops:
         did_trigger = mcu_endstop.home_wait(self.next_cmd_time)
         if not did_trigger and check_trigger and error is None:
             error = "Failed to home %s: Timeout during homing" % (name, )
     # Signal homing/probing move complete
     try:
         self.printer.send_event("homing:homing_move_end",
                                 [es for es, name in endstops])
     except CommandError as e:
         if error is None:
             error = str(e)
     self.sync_print_time()
     if error is not None:
         raise homing.CommandError(error)
Exemple #10
0
 def get_heater(self):
     raise homing.CommandError("Extruder not configured")