diff options
Diffstat (limited to 'klippy/extras/filament_switch_sensor.py')
-rw-r--r-- | klippy/extras/filament_switch_sensor.py | 73 |
1 files changed, 46 insertions, 27 deletions
diff --git a/klippy/extras/filament_switch_sensor.py b/klippy/extras/filament_switch_sensor.py index d1acadd5..e045764d 100644 --- a/klippy/extras/filament_switch_sensor.py +++ b/klippy/extras/filament_switch_sensor.py @@ -11,21 +11,19 @@ class RunoutHelper: self.name = config.get_name().split()[-1] self.printer = config.get_printer() self.reactor = self.printer.get_reactor() - self.gcode = self.printer.lookup_object('gcode') + self.gcode = self.printer.lookup_object("gcode") # Read config - self.runout_pause = config.getboolean('pause_on_runout', True) + self.runout_pause = config.getboolean("pause_on_runout", True) if self.runout_pause: - self.printer.load_object(config, 'pause_resume') + self.printer.load_object(config, "pause_resume") self.runout_gcode = self.insert_gcode = None - gcode_macro = self.printer.load_object(config, 'gcode_macro') - if self.runout_pause or config.get('runout_gcode', None) is not None: - self.runout_gcode = gcode_macro.load_template( - config, 'runout_gcode', '') - if config.get('insert_gcode', None) is not None: - self.insert_gcode = gcode_macro.load_template( - config, 'insert_gcode') - self.pause_delay = config.getfloat('pause_delay', .5, above=.0) - self.event_delay = config.getfloat('event_delay', 3., minval=.0) + gcode_macro = self.printer.load_object(config, "gcode_macro") + if self.runout_pause or config.get("runout_gcode", None) is not None: + self.runout_gcode = gcode_macro.load_template(config, "runout_gcode", "") + if config.get("insert_gcode", None) is not None: + self.insert_gcode = gcode_macro.load_template(config, "insert_gcode") + self.pause_delay = config.getfloat("pause_delay", 0.5, above=0.0) + self.event_delay = config.getfloat("event_delay", 3.0, minval=0.0) # Internal state self.min_event_systime = self.reactor.NEVER self.filament_present = False @@ -33,33 +31,44 @@ class RunoutHelper: # Register commands and event handlers self.printer.register_event_handler("klippy:ready", self._handle_ready) self.gcode.register_mux_command( - "QUERY_FILAMENT_SENSOR", "SENSOR", self.name, + "QUERY_FILAMENT_SENSOR", + "SENSOR", + self.name, self.cmd_QUERY_FILAMENT_SENSOR, - desc=self.cmd_QUERY_FILAMENT_SENSOR_help) + desc=self.cmd_QUERY_FILAMENT_SENSOR_help, + ) self.gcode.register_mux_command( - "SET_FILAMENT_SENSOR", "SENSOR", self.name, + "SET_FILAMENT_SENSOR", + "SENSOR", + self.name, self.cmd_SET_FILAMENT_SENSOR, - desc=self.cmd_SET_FILAMENT_SENSOR_help) + desc=self.cmd_SET_FILAMENT_SENSOR_help, + ) + def _handle_ready(self): - self.min_event_systime = self.reactor.monotonic() + 2. + self.min_event_systime = self.reactor.monotonic() + 2.0 + def _runout_event_handler(self, eventtime): # Pausing from inside an event requires that the pause portion # of pause_resume execute immediately. pause_prefix = "" if self.runout_pause: - pause_resume = self.printer.lookup_object('pause_resume') + pause_resume = self.printer.lookup_object("pause_resume") pause_resume.send_pause_command() pause_prefix = "PAUSE\n" self.printer.get_reactor().pause(eventtime + self.pause_delay) self._exec_gcode(pause_prefix, self.runout_gcode) + def _insert_event_handler(self, eventtime): self._exec_gcode("", self.insert_gcode) + def _exec_gcode(self, prefix, template): try: self.gcode.run_script(prefix + template.render() + "\nM400") except Exception: logging.exception("Script running error") self.min_event_systime = self.reactor.monotonic() + self.event_delay + def note_filament_present(self, eventtime, is_filament_present): if is_filament_present == self.filament_present: return @@ -80,42 +89,52 @@ class RunoutHelper: # insert detected self.min_event_systime = self.reactor.NEVER logging.info( - "Filament Sensor %s: insert event detected, Time %.2f" % - (self.name, now)) + "Filament Sensor %s: insert event detected, Time %.2f" + % (self.name, now) + ) self.reactor.register_callback(self._insert_event_handler) elif is_printing and self.runout_gcode is not None: # runout detected self.min_event_systime = self.reactor.NEVER logging.info( - "Filament Sensor %s: runout event detected, Time %.2f" % - (self.name, now)) + "Filament Sensor %s: runout event detected, Time %.2f" + % (self.name, now) + ) self.reactor.register_callback(self._runout_event_handler) + def get_status(self, eventtime): return { "filament_detected": bool(self.filament_present), - "enabled": bool(self.sensor_enabled)} + "enabled": bool(self.sensor_enabled), + } + cmd_QUERY_FILAMENT_SENSOR_help = "Query the status of the Filament Sensor" + def cmd_QUERY_FILAMENT_SENSOR(self, gcmd): if self.filament_present: msg = "Filament Sensor %s: filament detected" % (self.name) else: msg = "Filament Sensor %s: filament not detected" % (self.name) gcmd.respond_info(msg) + cmd_SET_FILAMENT_SENSOR_help = "Sets the filament sensor on/off" + def cmd_SET_FILAMENT_SENSOR(self, gcmd): self.sensor_enabled = gcmd.get_int("ENABLE", 1) + class SwitchSensor: def __init__(self, config): printer = config.get_printer() - buttons = printer.load_object(config, 'buttons') - switch_pin = config.get('switch_pin') - buttons.register_debounce_button(switch_pin, self._button_handler - , config) + buttons = printer.load_object(config, "buttons") + switch_pin = config.get("switch_pin") + buttons.register_debounce_button(switch_pin, self._button_handler, config) self.runout_helper = RunoutHelper(config) self.get_status = self.runout_helper.get_status + def _button_handler(self, eventtime, state): self.runout_helper.note_filament_present(eventtime, state) + def load_config_prefix(config): return SwitchSensor(config) |