diff options
Diffstat (limited to 'klippy/extras/probe.py')
-rw-r--r-- | klippy/extras/probe.py | 71 |
1 files changed, 49 insertions, 22 deletions
diff --git a/klippy/extras/probe.py b/klippy/extras/probe.py index 24223cfb..3d0bf775 100644 --- a/klippy/extras/probe.py +++ b/klippy/extras/probe.py @@ -1,9 +1,9 @@ # Z-Probe support # -# Copyright (C) 2017-2018 Kevin O'Connor <kevin@koconnor.net> +# Copyright (C) 2017-2019 Kevin O'Connor <kevin@koconnor.net> # # This file may be distributed under the terms of the GNU GPLv3 license. -import pins, homing +import pins, homing, manual_probe HINT_TIMEOUT = """ Make sure to home the printer before probing. If the probe @@ -15,6 +15,7 @@ the Z axis minimum position so the probe can travel further class PrinterProbe: def __init__(self, config, mcu_probe): self.printer = config.get_printer() + self.name = config.get_name() self.mcu_probe = mcu_probe self.speed = config.getfloat('speed', 5.0) self.x_offset = config.getfloat('x_offset', 0.) @@ -31,10 +32,12 @@ class PrinterProbe: self.printer.lookup_object('pins').register_chip('probe', self) # Register PROBE/QUERY_PROBE commands self.gcode = self.printer.lookup_object('gcode') - self.gcode.register_command( - 'PROBE', self.cmd_PROBE, desc=self.cmd_PROBE_help) - self.gcode.register_command( - 'QUERY_PROBE', self.cmd_QUERY_PROBE, desc=self.cmd_QUERY_PROBE_help) + self.gcode.register_command('PROBE', self.cmd_PROBE, + desc=self.cmd_PROBE_help) + self.gcode.register_command('QUERY_PROBE', self.cmd_QUERY_PROBE, + desc=self.cmd_QUERY_PROBE_help) + self.gcode.register_command('PROBE_CALIBRATE', self.cmd_PROBE_CALIBRATE, + desc=self.cmd_PROBE_CALIBRATE_help) def setup_pin(self, pin_type, pin_params): if pin_type != 'endstop' or pin_params['pin'] != 'z_virtual_endstop': raise pins.error("Probe virtual endstop only useful as endstop pin") @@ -50,9 +53,10 @@ class PrinterProbe: 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, self.speed, - probe_pos=True, verify_movement=True) + probe_pos=True, verify_movement=verify) except homing.EndstopError as e: reason = str(e) if "Timeout during endstop homing" in reason: @@ -70,6 +74,32 @@ class PrinterProbe: res = self.mcu_probe.query_endstop_wait() self.gcode.respond_info( "probe: %s" % (["open", "TRIGGERED"][not not res],)) + def probe_calibrate_finalize(self, kin_pos): + if kin_pos is None: + return + z_pos = self.z_offset - kin_pos[2] + self.gcode.respond_info( + "%s: z_offset: %.3f\n" + "The SAVE_CONFIG command will update the printer config file\n" + "with the above and restart the printer." % (self.name, z_pos)) + configfile = self.printer.lookup_object('configfile') + configfile.set(self.name, 'z_offset', "%.3f" % (z_pos,)) + cmd_PROBE_CALIBRATE_help = "Calibrate the probe's z_offset" + def cmd_PROBE_CALIBRATE(self, params): + # Perform initial probe + self.cmd_PROBE(params) + # Move away from the bed + toolhead = self.printer.lookup_object('toolhead') + curpos = toolhead.get_position() + curpos[2] += 5. + toolhead.move(curpos, self.speed) + # Move the nozzle over the probe point + curpos[0] += self.x_offset + curpos[1] += self.y_offset + toolhead.move(curpos, self.speed) + # Start manual probe + manual_probe.ManualProbeHelper(self.printer, params, + self.probe_calibrate_finalize) # Endstop wrapper that enables probe specific features class ProbeEndstopWrapper: @@ -139,7 +169,7 @@ class ProbePointsHelper: 'sample_retract_dist', 2., above=0.) # Internal probing state self.results = [] - self.busy = False + self.busy = self.manual_probe = False self.gcode = self.toolhead = None def get_lift_speed(self): return self.lift_speed @@ -177,6 +207,9 @@ class ProbePointsHelper: self._finalize(False) raise self.gcode.error(str(e)) self.gcode.reset_last_position() + if self.manual_probe: + manual_probe.ManualProbeHelper(self.printer, {}, + self._manual_probe_finalize) def _automatic_probe_point(self): positions = [] for i in range(self.samples): @@ -199,13 +232,14 @@ class ProbePointsHelper: probe = self.printer.lookup_object('probe', None) method = self.gcode.get_str('METHOD', params, 'automatic').lower() if probe is not None and method == 'automatic': + self.manual_probe = False self.lift_speed = min(self.speed, probe.speed) self.probe_offsets = probe.get_offsets() if self.horizontal_move_z < self.probe_offsets[2]: raise self.gcode.error("horizontal_move_z can't be less than" " probe's z_offset") else: - probe = None + self.manual_probe = True self.lift_speed = self.speed self.probe_offsets = (0., 0., 0.) # Start probe @@ -213,27 +247,20 @@ class ProbePointsHelper: self.busy = True self._lift_z(self.horizontal_move_z, speed=self.speed) self._move_next() - if probe is None: - # Setup for manual probing - self.gcode.register_command('NEXT', None) - self.gcode.register_command('NEXT', self.cmd_NEXT, - desc=self.cmd_NEXT_help) - else: + if not self.manual_probe: # Perform automatic probing while self.busy: self._automatic_probe_point() self._move_next() - cmd_NEXT_help = "Move to the next XY position to probe" - def cmd_NEXT(self, params): - # Record current position for manual probe - self.toolhead.get_last_move_time() - self.results.append(self.toolhead.get_kinematics().calc_position()) - # Move to next position + def _manual_probe_finalize(self, kin_pos): + if kin_pos is None: + self._finalize(False) + return + self.results.append(kin_pos) self._move_next() def _finalize(self, success): self.busy = False self.gcode.reset_last_position() - self.gcode.register_command('NEXT', None) if success: self.finalize_callback(self.probe_offsets, self.results) |