diff options
Diffstat (limited to 'klippy/extras/fan.py')
-rw-r--r-- | klippy/extras/fan.py | 99 |
1 files changed, 58 insertions, 41 deletions
diff --git a/klippy/extras/fan.py b/klippy/extras/fan.py index c5677ba0..081db642 100644 --- a/klippy/extras/fan.py +++ b/klippy/extras/fan.py @@ -5,60 +5,68 @@ # This file may be distributed under the terms of the GNU GPLv3 license. from . import pulse_counter, output_pin + class Fan: - def __init__(self, config, default_shutdown_speed=0.): + def __init__(self, config, default_shutdown_speed=0.0): self.printer = config.get_printer() - self.last_fan_value = self.last_req_value = 0. + self.last_fan_value = self.last_req_value = 0.0 # Read config - self.max_power = config.getfloat('max_power', 1., above=0., maxval=1.) - self.kick_start_time = config.getfloat('kick_start_time', 0.1, - minval=0.) - self.off_below = config.getfloat('off_below', default=0., - minval=0., maxval=1.) - cycle_time = config.getfloat('cycle_time', 0.010, above=0.) - hardware_pwm = config.getboolean('hardware_pwm', False) + self.max_power = config.getfloat("max_power", 1.0, above=0.0, maxval=1.0) + self.kick_start_time = config.getfloat("kick_start_time", 0.1, minval=0.0) + self.off_below = config.getfloat( + "off_below", default=0.0, minval=0.0, maxval=1.0 + ) + cycle_time = config.getfloat("cycle_time", 0.010, above=0.0) + hardware_pwm = config.getboolean("hardware_pwm", False) shutdown_speed = config.getfloat( - 'shutdown_speed', default_shutdown_speed, minval=0., maxval=1.) + "shutdown_speed", default_shutdown_speed, minval=0.0, maxval=1.0 + ) # Setup pwm object - ppins = self.printer.lookup_object('pins') - self.mcu_fan = ppins.setup_pin('pwm', config.get('pin')) - self.mcu_fan.setup_max_duration(0.) + ppins = self.printer.lookup_object("pins") + self.mcu_fan = ppins.setup_pin("pwm", config.get("pin")) + self.mcu_fan.setup_max_duration(0.0) self.mcu_fan.setup_cycle_time(cycle_time, hardware_pwm) - shutdown_power = max(0., min(self.max_power, shutdown_speed)) - self.mcu_fan.setup_start_value(0., shutdown_power) + shutdown_power = max(0.0, min(self.max_power, shutdown_speed)) + self.mcu_fan.setup_start_value(0.0, shutdown_power) self.enable_pin = None - enable_pin = config.get('enable_pin', None) + enable_pin = config.get("enable_pin", None) if enable_pin is not None: - self.enable_pin = ppins.setup_pin('digital_out', enable_pin) - self.enable_pin.setup_max_duration(0.) + self.enable_pin = ppins.setup_pin("digital_out", enable_pin) + self.enable_pin.setup_max_duration(0.0) # Create gcode request queue - self.gcrq = output_pin.GCodeRequestQueue(config, self.mcu_fan.get_mcu(), - self._apply_speed) + self.gcrq = output_pin.GCodeRequestQueue( + config, self.mcu_fan.get_mcu(), self._apply_speed + ) # Setup tachometer self.tachometer = FanTachometer(config) # Register callbacks - self.printer.register_event_handler("gcode:request_restart", - self._handle_request_restart) + self.printer.register_event_handler( + "gcode:request_restart", self._handle_request_restart + ) def get_mcu(self): return self.mcu_fan.get_mcu() + def _apply_speed(self, print_time, value): if value < self.off_below: - value = 0. - value = max(0., min(self.max_power, value * self.max_power)) + value = 0.0 + value = max(0.0, min(self.max_power, value * self.max_power)) if value == self.last_fan_value: - return "discard", 0. + return "discard", 0.0 if self.enable_pin: if value > 0 and self.last_fan_value == 0: self.enable_pin.set_digital(print_time, 1) elif value == 0 and self.last_fan_value > 0: self.enable_pin.set_digital(print_time, 0) - if (value and self.kick_start_time - and (not self.last_fan_value or value - self.last_fan_value > .5)): + if ( + value + and self.kick_start_time + and (not self.last_fan_value or value - self.last_fan_value > 0.5) + ): # Run fan at full speed for specified kick_start_time self.last_req_value = value self.last_fan_value = self.max_power @@ -66,57 +74,66 @@ class Fan: return "delay", self.kick_start_time self.last_fan_value = self.last_req_value = value self.mcu_fan.set_pwm(print_time, value) + def set_speed(self, value, print_time=None): self.gcrq.send_async_request(value, print_time) + def set_speed_from_command(self, value): self.gcrq.queue_gcode_request(value) + def _handle_request_restart(self, print_time): - self.set_speed(0., print_time) + self.set_speed(0.0, print_time) def get_status(self, eventtime): tachometer_status = self.tachometer.get_status(eventtime) return { - 'speed': self.last_req_value, - 'rpm': tachometer_status['rpm'], + "speed": self.last_req_value, + "rpm": tachometer_status["rpm"], } + class FanTachometer: def __init__(self, config): printer = config.get_printer() self._freq_counter = None - pin = config.get('tachometer_pin', None) + pin = config.get("tachometer_pin", None) if pin is not None: - self.ppr = config.getint('tachometer_ppr', 2, minval=1) - poll_time = config.getfloat('tachometer_poll_interval', - 0.0015, above=0.) - sample_time = 1. + self.ppr = config.getint("tachometer_ppr", 2, minval=1) + poll_time = config.getfloat("tachometer_poll_interval", 0.0015, above=0.0) + sample_time = 1.0 self._freq_counter = pulse_counter.FrequencyCounter( - printer, pin, sample_time, poll_time) + printer, pin, sample_time, poll_time + ) def get_status(self, eventtime): if self._freq_counter is not None: - rpm = self._freq_counter.get_frequency() * 30. / self.ppr + rpm = self._freq_counter.get_frequency() * 30.0 / self.ppr else: rpm = None - return {'rpm': rpm} + return {"rpm": rpm} + class PrinterFan: def __init__(self, config): self.fan = Fan(config) # Register commands - gcode = config.get_printer().lookup_object('gcode') + gcode = config.get_printer().lookup_object("gcode") gcode.register_command("M106", self.cmd_M106) gcode.register_command("M107", self.cmd_M107) + def get_status(self, eventtime): return self.fan.get_status(eventtime) + def cmd_M106(self, gcmd): # Set fan speed - value = gcmd.get_float('S', 255., minval=0.) / 255. + value = gcmd.get_float("S", 255.0, minval=0.0) / 255.0 self.fan.set_speed_from_command(value) + def cmd_M107(self, gcmd): # Turn fan off - self.fan.set_speed_from_command(0.) + self.fan.set_speed_from_command(0.0) + def load_config(config): return PrinterFan(config) |