aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/stepper_enable.py
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/extras/stepper_enable.py')
-rw-r--r--klippy/extras/stepper_enable.py72
1 files changed, 49 insertions, 23 deletions
diff --git a/klippy/extras/stepper_enable.py b/klippy/extras/stepper_enable.py
index 2bad7555..f4a8e29d 100644
--- a/klippy/extras/stepper_enable.py
+++ b/klippy/extras/stepper_enable.py
@@ -7,40 +7,44 @@ import logging
DISABLE_STALL_TIME = 0.100
+
# Tracking of shared stepper enable pins
class StepperEnablePin:
def __init__(self, mcu_enable, enable_count):
self.mcu_enable = mcu_enable
self.enable_count = enable_count
self.is_dedicated = True
+
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)
+
def setup_enable_pin(printer, pin):
if pin is None:
# No enable line (stepper always enabled)
enable = StepperEnablePin(None, 9999)
enable.is_dedicated = False
return enable
- ppins = printer.lookup_object('pins')
- pin_params = ppins.lookup_pin(pin, can_invert=True,
- share_type='stepper_enable')
- enable = pin_params.get('class')
+ ppins = printer.lookup_object("pins")
+ pin_params = ppins.lookup_pin(pin, can_invert=True, share_type="stepper_enable")
+ enable = pin_params.get("class")
if enable is not None:
# Shared enable line
enable.is_dedicated = False
return enable
- mcu_enable = pin_params['chip'].setup_pin('digital_out', pin_params)
- mcu_enable.setup_max_duration(0.)
- enable = pin_params['class'] = StepperEnablePin(mcu_enable, 0)
+ mcu_enable = pin_params["chip"].setup_pin("digital_out", pin_params)
+ mcu_enable.setup_max_duration(0.0)
+ enable = pin_params["class"] = StepperEnablePin(mcu_enable, 0)
return enable
+
# Enable line tracking for each stepper motor
class EnableTracking:
def __init__(self, stepper, enable):
@@ -49,14 +53,17 @@ class EnableTracking:
self.callbacks = []
self.is_enabled = False
self.stepper.add_active_callback(self.motor_enable)
+
def register_state_callback(self, callback):
self.callbacks.append(callback)
+
def motor_enable(self, print_time):
if not self.is_enabled:
for cb in self.callbacks:
cb(print_time, True)
self.enable.set_enable(print_time)
self.is_enabled = True
+
def motor_disable(self, print_time):
if self.is_enabled:
# Enable stepper on future stepper movement
@@ -65,31 +72,39 @@ class EnableTracking:
self.enable.set_disable(print_time)
self.is_enabled = False
self.stepper.add_active_callback(self.motor_enable)
+
def is_motor_enabled(self):
return self.is_enabled
+
def has_dedicated_enable(self):
return self.enable.is_dedicated
+
# Global stepper enable line tracking
class PrinterStepperEnable:
def __init__(self, config):
self.printer = config.get_printer()
self.enable_lines = {}
- self.printer.register_event_handler("gcode:request_restart",
- self._handle_request_restart)
+ self.printer.register_event_handler(
+ "gcode:request_restart", self._handle_request_restart
+ )
# Register M18/M84 commands
- gcode = self.printer.lookup_object('gcode')
+ gcode = self.printer.lookup_object("gcode")
gcode.register_command("M18", self.cmd_M18)
gcode.register_command("M84", self.cmd_M18)
- gcode.register_command("SET_STEPPER_ENABLE",
- self.cmd_SET_STEPPER_ENABLE,
- desc=self.cmd_SET_STEPPER_ENABLE_help)
+ gcode.register_command(
+ "SET_STEPPER_ENABLE",
+ self.cmd_SET_STEPPER_ENABLE,
+ desc=self.cmd_SET_STEPPER_ENABLE_help,
+ )
+
def register_stepper(self, config, mcu_stepper):
name = mcu_stepper.get_name()
- enable = setup_enable_pin(self.printer, config.get('enable_pin', None))
+ enable = setup_enable_pin(self.printer, config.get("enable_pin", None))
self.enable_lines[name] = EnableTracking(mcu_stepper, enable)
+
def motor_off(self):
- toolhead = self.printer.lookup_object('toolhead')
+ toolhead = self.printer.lookup_object("toolhead")
toolhead.dwell(DISABLE_STALL_TIME)
print_time = toolhead.get_last_move_time()
for el in self.enable_lines.values():
@@ -97,8 +112,9 @@ class PrinterStepperEnable:
toolhead.get_kinematics().clear_homing_state("xyz")
self.printer.send_event("stepper_enable:motor_off", print_time)
toolhead.dwell(DISABLE_STALL_TIME)
+
def motor_debug_enable(self, stepper, enable):
- toolhead = self.printer.lookup_object('toolhead')
+ toolhead = self.printer.lookup_object("toolhead")
toolhead.dwell(DISABLE_STALL_TIME)
print_time = toolhead.get_last_move_time()
el = self.enable_lines[stepper]
@@ -109,30 +125,40 @@ class PrinterStepperEnable:
el.motor_disable(print_time)
logging.info("%s has been manually disabled", stepper)
toolhead.dwell(DISABLE_STALL_TIME)
+
def get_status(self, eventtime):
- steppers = { name: et.is_motor_enabled()
- for (name, et) in self.enable_lines.items() }
- return {'steppers': steppers}
+ steppers = {
+ name: et.is_motor_enabled() for (name, et) in self.enable_lines.items()
+ }
+ return {"steppers": steppers}
+
def _handle_request_restart(self, print_time):
self.motor_off()
+
def cmd_M18(self, gcmd):
# Turn off motors
self.motor_off()
+
cmd_SET_STEPPER_ENABLE_help = "Enable/disable individual stepper by name"
+
def cmd_SET_STEPPER_ENABLE(self, gcmd):
- stepper_name = gcmd.get('STEPPER', None)
+ stepper_name = gcmd.get("STEPPER", None)
if stepper_name not in self.enable_lines:
- gcmd.respond_info('SET_STEPPER_ENABLE: Invalid stepper "%s"'
- % (stepper_name,))
+ gcmd.respond_info(
+ 'SET_STEPPER_ENABLE: Invalid stepper "%s"' % (stepper_name,)
+ )
return
- stepper_enable = gcmd.get_int('ENABLE', 1)
+ stepper_enable = gcmd.get_int("ENABLE", 1)
self.motor_debug_enable(stepper_name, stepper_enable)
+
def lookup_enable(self, name):
if name not in self.enable_lines:
raise self.printer.config_error("Unknown stepper '%s'" % (name,))
return self.enable_lines[name]
+
def get_steppers(self):
return list(self.enable_lines.keys())
+
def load_config(config):
return PrinterStepperEnable(config)