diff options
Diffstat (limited to 'klippy/extras/stepper_enable.py')
-rw-r--r-- | klippy/extras/stepper_enable.py | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/klippy/extras/stepper_enable.py b/klippy/extras/stepper_enable.py index 46f93f65..8f028055 100644 --- a/klippy/extras/stepper_enable.py +++ b/klippy/extras/stepper_enable.py @@ -7,24 +7,86 @@ import logging DISABLE_STALL_TIME = 0.100 -class StepperEnable: +# Tracking of shared stepper enable pins +class StepperEnablePin: + def __init__(self, mcu_enable, enable_count=0): + self.mcu_enable = mcu_enable + self.enable_count = enable_count + def set_enable(self, print_time): + if not self.enable_count: + self.mcu_enable.set_digital(print_time, 1) + self.enable_count += 1 + def set_disable(self, print_time): + self.enable_count -= 1 + if not self.enable_count: + self.mcu_enable.set_digital(print_time, 0) + +# Automatic multiple pin enable lines +class StepperMultiEnablePin: + def __init__(self, enable_list): + self.enable_list = enable_list + def set_enable(self, print_time): + for en in self.enable_list: + en.set_enable(print_time) + def set_disable(self, print_time): + for en in self.enable_list: + en.set_disable(print_time) + +# Resolve the 'enable_pin' stepper config setting +def lookup_enable_pin(ppins, pin_list): + if pin_list is None: + return StepperEnablePin(None, 9999) + enable_list = [] + for pin in pin_list.split(','): + pin_params = ppins.lookup_pin(pin, can_invert=True, + share_type='stepper_enable') + enable = pin_params.get('class') + if enable is None: + mcu_enable = pin_params['chip'].setup_pin('digital_out', pin_params) + mcu_enable.setup_max_duration(0.) + pin_params['class'] = enable = StepperEnablePin(mcu_enable) + enable_list.append(enable) + if len(enable_list) == 1: + return enable_list[0] + return StepperMultiEnablePin(enable_list) + +# Enable line tracking for each stepper motor +class EnableTracking: + def __init__(self, printer, stepper, pin): + self.stepper = stepper + self.is_motor_enabled = False + self.stepper.add_active_callback(self.motor_enable) + self.enable = lookup_enable_pin(printer.lookup_object('pins'), pin) + def motor_enable(self, print_time): + if not self.is_motor_enabled: + self.enable.set_enable(print_time) + self.is_motor_enabled = True + def motor_disable(self, print_time): + if self.is_motor_enabled: + # Enable stepper on future stepper movement + self.enable.set_disable(print_time) + self.is_motor_enabled = False + self.stepper.add_active_callback(self.motor_enable) + +class PrinterStepperEnable: def __init__(self, config): self.printer = config.get_printer() - self.steppers = {} + self.enable_lines = {} self.printer.register_event_handler("gcode:request_restart", self._handle_request_restart) # Register M18/M84 commands gcode = self.printer.lookup_object('gcode') gcode.register_command("M18", self.cmd_M18) gcode.register_command("M84", self.cmd_M18) - def register_stepper(self, stepper): - self.steppers[stepper.get_name()] = stepper + def register_stepper(self, stepper, pin): + name = stepper.get_name() + self.enable_lines[name] = EnableTracking(self.printer, stepper, pin) def motor_off(self): toolhead = self.printer.lookup_object('toolhead') toolhead.dwell(DISABLE_STALL_TIME) print_time = toolhead.get_last_move_time() - for s in self.steppers.values(): - s.motor_enable(print_time, 0) + for el in self.enable_lines.values(): + el.motor_disable(print_time) self.printer.send_event("stepper_enable:motor_off", print_time) toolhead.dwell(DISABLE_STALL_TIME) logging.debug('; Max time of %f', print_time) @@ -33,6 +95,12 @@ class StepperEnable: def cmd_M18(self, params): # Turn off motors self.motor_off() + def is_motor_enabled(self, name): + return self.enable_lines[name].is_motor_enabled + def motor_enable(self, name, print_time): + self.enable_lines[name].motor_enable(print_time) + def motor_disable(self, name, print_time): + self.enable_lines[name].motor_disable(print_time) def load_config(config): - return StepperEnable(config) + return PrinterStepperEnable(config) |