Files
klipper/klippy/extras/qdprobe.py
2024-05-10 10:41:37 +08:00

136 lines
7.1 KiB
Python

# -*- coding: utf-8 -*-
import logging
from . import smart_effector
from . import probe
# Makerbase Endstop wrapper
class MakerbaseProbeEndstopWrapper:
def __init__(self, config):
self.printer = config.get_printer()
self.position_endstop = config.getfloat('z_offset')
self.stow_on_each_sample = config.getboolean(
'deactivate_on_each_sample', True)
gcode_macro = self.printer.load_object(config, 'gcode_macro')
self.activate_gcode = gcode_macro.load_template(
config, 'activate_gcode', '')
self.deactivate_gcode = gcode_macro.load_template(
config, 'deactivate_gcode', '')
ppins = self.printer.lookup_object('pins')
pin = config.get('pin')
pin_params = ppins.lookup_pin(pin, can_invert=True, can_pullup=True)
mcu = pin_params['chip']
self.mcu_endstop = mcu.setup_pin('endstop', pin_params)
self.printer.register_event_handler('klippy:mcu_identify',
self._handle_mcu_identify)
# Wrappers
self.get_mcu = self.mcu_endstop.get_mcu
self.add_stepper = self.mcu_endstop.add_stepper
self.get_steppers = self.mcu_endstop.get_steppers
self.home_start = self.mcu_endstop.home_start
self.home_wait = self.mcu_endstop.home_wait
self.query_endstop = self.mcu_endstop.query_endstop
# multi probes state
self.multi = 'OFF'
def _handle_mcu_identify(self):
kin = self.printer.lookup_object('toolhead').get_kinematics()
for stepper in kin.get_steppers():
if stepper.is_active_axis('z'):
self.add_stepper(stepper)
def raise_probe(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 self.printer.command_error(
"Toolhead moved during probe activate_gcode script")
def lower_probe(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 self.printer.command_error(
"Toolhead moved during probe deactivate_gcode script")
def multi_probe_begin(self):
if self.stow_on_each_sample:
return
self.multi = 'FIRST'
def multi_probe_end(self):
if self.stow_on_each_sample:
return
self.raise_probe()
self.multi = 'OFF'
def probe_prepare(self, hmove):
if self.multi == 'OFF' or self.multi == 'FIRST':
self.lower_probe()
if self.multi == 'FIRST':
self.multi = 'ON'
def probe_finish(self, hmove):
if self.multi == 'OFF':
self.raise_probe()
def get_position_endstop(self):
return self.position_endstop
class MakerBase:
def __init__(self, config):
self.printer = config.get_printer()
self.gcode = self.printer.lookup_object('gcode')
# self.speed = config.getfloat('speed', 5.0, above=0.)
# self.lift_speed = config.getfloat('lift_speed', self.speed, above=0.)
# self.x_offset = config.getfloat('x_offset', 0.)
# self.y_offset = config.getfloat('y_offset', 0.)
# self.z_offset = config.getfloat('z_offset')
self.probe = self.printer.lookup_object('probe')
self.endstop_wrapper = probe.ProbeEndstopWrapper(config)
# self.probe_accel = config.getfloat('probe_accel', 0., minval=0.)
# self.recovery_time = config.getfloat('recovery_time', 0.4, minval=0.)
# Register MakerBase commands
self.gcode.register_command('MKS_PROBE_PIN_1', self.cmd_MKS_PROBE_PIN_1,
desc=self.cmd_MKS_PROBE_PIN_1_help)
self.gcode.register_command('MKS_PROBE_PIN_2', self.cmd_MKS_PROBE_PIN_2,
desc=self.cmd_MKS_PROBE_PIN_2_help)
self.gcode.register_command('QIDI_PROBE_PIN_1', self.cmd_MKS_PROBE_PIN_1,
desc=self.cmd_MKS_PROBE_PIN_1_help)
self.gcode.register_command('QIDI_PROBE_PIN_2', self.cmd_MKS_PROBE_PIN_2,
desc=self.cmd_MKS_PROBE_PIN_2_help)
self.gcode.register_command('MKS_REMOVE', self.cmd_MKS_REMOVE,
desc=self.cmd_MKS_REMOVE_help)
cmd_MKS_PROBE_PIN_2_help = 'ENABLE_PROBE_PIN_2'
def cmd_MKS_PROBE_PIN_2(self, gcmd):
self.probe.mcu_probe.probe_wrapper = self.endstop_wrapper
# Wrappers
self.probe.mcu_probe.get_mcu = self.endstop_wrapper.get_mcu
self.probe.mcu_probe.add_stepper = self.endstop_wrapper.add_stepper
self.probe.mcu_probe.get_steppers = self.endstop_wrapper.get_steppers
self.probe.mcu_probe.home_start = self.endstop_wrapper.home_start
self.probe.mcu_probe.home_wait = self.endstop_wrapper.home_wait
self.probe.mcu_probe.query_endstop = self.endstop_wrapper.query_endstop
self.probe.mcu_probe.multi_probe_begin = self.endstop_wrapper.multi_probe_begin
self.probe.mcu_probe.multi_probe_end = self.endstop_wrapper.multi_probe_end
# gcmd.respond_raw("%s" % (self.cmd_MKS_PROBE_PIN_2_help, ))
cmd_MKS_REMOVE_help = 'MKS_REMOVE'
def cmd_MKS_REMOVE(self, gcmd):
self.printer.remove_object('probe')
self.printer.lookup_object('gcode').remove_command('PROBE')
self.printer.lookup_object('gcode').remove_command('QUERY_PROBE')
self.printer.lookup_object('gcode').remove_command('PROBE_CALIBRATE')
self.printer.lookup_object('gcode').remove_command('PROBE_ACCURACY')
self.printer.lookup_object('gcode').remove_command('Z_OFFSET_APPLY_PROBE')
self.printer.lookup_object('gcode').remove_command('MKS_SHOW_Z_OFFSET')
self.printer.lookup_object('pins').remove_chip('probe')
cmd_MKS_PROBE_PIN_1_help = 'ENABLE_PROBE_PIN_1'
def cmd_MKS_PROBE_PIN_1(self, gcmd):
self.probe.mcu_probe.probe_wrapper = self.probe.mcu_probe.probe_wrapper_2
# Wrappers
self.probe.mcu_probe.get_mcu = self.probe.mcu_probe.probe_wrapper_2.get_mcu
self.probe.mcu_probe.add_stepper = self.probe.mcu_probe.probe_wrapper_2.add_stepper
self.probe.mcu_probe.get_steppers = self.probe.mcu_probe.probe_wrapper_2.get_steppers
self.probe.mcu_probe.home_start = self.probe.mcu_probe.probe_wrapper_2.home_start
self.probe.mcu_probe.home_wait = self.probe.mcu_probe.probe_wrapper_2.home_wait
self.probe.mcu_probe.query_endstop = self.probe.mcu_probe.probe_wrapper_2.query_endstop
self.probe.mcu_probe.multi_probe_begin = self.probe.mcu_probe.probe_wrapper_2.multi_probe_begin
self.probe.mcu_probe.multi_probe_end = self.probe.mcu_probe.probe_wrapper_2.multi_probe_end
# gcmd.respond_raw("%s" % (self.cmd_MKS_PROBE_PIN_1_help, ))
def load_config(config):
return MakerBase(config)