| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  | # Support a fan for cooling the MCU whenever a stepper or heater is on | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2019  Nils Friedchen <nils.friedchen@googlemail.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This file may be distributed under the terms of the GNU GPLv3 license. | 
					
						
							| 
									
										
										
										
											2020-06-12 09:55:57 -04:00
										 |  |  | from . import fan | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | PIN_MIN_TIME = 0.100 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ControllerFan: | 
					
						
							|  |  |  |     def __init__(self, config): | 
					
						
							|  |  |  |         self.printer = config.get_printer() | 
					
						
							|  |  |  |         self.printer.register_event_handler("klippy:ready", self.handle_ready) | 
					
						
							| 
									
										
										
										
											2021-07-20 16:19:59 +02:00
										 |  |  |         self.printer.register_event_handler("klippy:connect", | 
					
						
							|  |  |  |                                             self.handle_connect) | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |         self.stepper_names = config.getlist("stepper", None) | 
					
						
							| 
									
										
										
										
											2020-05-05 14:10:30 -04:00
										 |  |  |         self.stepper_enable = self.printer.load_object(config, 'stepper_enable') | 
					
						
							|  |  |  |         self.printer.load_object(config, 'heaters') | 
					
						
							| 
									
										
										
										
											2019-09-16 13:13:45 +02:00
										 |  |  |         self.heaters = [] | 
					
						
							| 
									
										
										
										
											2020-07-03 23:23:24 -04:00
										 |  |  |         self.fan = fan.Fan(config) | 
					
						
							|  |  |  |         self.fan_speed = config.getfloat('fan_speed', default=1., | 
					
						
							|  |  |  |                                          minval=0., maxval=1.) | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |         self.idle_speed = config.getfloat( | 
					
						
							| 
									
										
										
										
											2020-05-17 13:26:51 -07:00
										 |  |  |             'idle_speed', default=self.fan_speed, minval=0., maxval=1.) | 
					
						
							| 
									
										
										
										
											2019-09-16 13:16:17 +02:00
										 |  |  |         self.idle_timeout = config.getint("idle_timeout", default=30, minval=0) | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |         self.heater_names = config.getlist("heater", ("extruder",)) | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |         self.last_on = self.idle_timeout | 
					
						
							| 
									
										
										
										
											2020-12-01 11:51:29 -05:00
										 |  |  |         self.last_speed = 0. | 
					
						
							| 
									
										
										
										
											2021-07-20 16:19:59 +02:00
										 |  |  |     def handle_connect(self): | 
					
						
							| 
									
										
										
										
											2021-07-20 10:34:14 -04:00
										 |  |  |         # Heater lookup | 
					
						
							|  |  |  |         pheaters = self.printer.lookup_object('heaters') | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |         self.heaters = [pheaters.lookup_heater(n) for n in self.heater_names] | 
					
						
							| 
									
										
										
										
											2021-07-20 10:34:14 -04:00
										 |  |  |         # Stepper lookup | 
					
						
							|  |  |  |         all_steppers = self.stepper_enable.get_steppers() | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |         if self.stepper_names is None: | 
					
						
							| 
									
										
										
										
											2021-07-20 16:19:59 +02:00
										 |  |  |             self.stepper_names = all_steppers | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |         if not all(x in all_steppers for x in self.stepper_names): | 
					
						
							| 
									
										
										
										
											2021-07-20 16:19:59 +02:00
										 |  |  |             raise self.printer.config_error( | 
					
						
							| 
									
										
										
										
											2021-08-19 14:51:48 -04:00
										 |  |  |                 "One or more of these steppers are unknown: " | 
					
						
							|  |  |  |                  "%s (valid steppers are: %s)" | 
					
						
							|  |  |  |                 % (self.stepper_names, ", ".join(all_steppers))) | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |     def handle_ready(self): | 
					
						
							|  |  |  |         reactor = self.printer.get_reactor() | 
					
						
							| 
									
										
										
										
											2020-12-01 11:51:29 -05:00
										 |  |  |         reactor.register_timer(self.callback, reactor.monotonic()+PIN_MIN_TIME) | 
					
						
							| 
									
										
										
										
											2020-11-23 17:55:14 +01:00
										 |  |  |     def get_status(self, eventtime): | 
					
						
							|  |  |  |         return self.fan.get_status(eventtime) | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |     def callback(self, eventtime): | 
					
						
							| 
									
										
										
										
											2020-12-01 11:51:29 -05:00
										 |  |  |         speed = 0. | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |         active = False | 
					
						
							| 
									
										
										
										
											2019-11-12 12:49:21 -05:00
										 |  |  |         for name in self.stepper_names: | 
					
						
							| 
									
										
										
										
											2019-11-12 13:55:50 -05:00
										 |  |  |             active |= self.stepper_enable.lookup_enable(name).is_motor_enabled() | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |         for heater in self.heaters: | 
					
						
							| 
									
										
										
										
											2019-09-16 13:15:23 +02:00
										 |  |  |             _, target_temp = heater.get_temp(eventtime) | 
					
						
							|  |  |  |             if target_temp: | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |                 active = True | 
					
						
							|  |  |  |         if active: | 
					
						
							|  |  |  |             self.last_on = 0 | 
					
						
							| 
									
										
										
										
											2020-12-01 11:51:29 -05:00
										 |  |  |             speed = self.fan_speed | 
					
						
							| 
									
										
										
										
											2019-09-16 13:20:49 +02:00
										 |  |  |         elif self.last_on < self.idle_timeout: | 
					
						
							| 
									
										
										
										
											2020-12-01 11:51:29 -05:00
										 |  |  |             speed = self.idle_speed | 
					
						
							| 
									
										
										
										
											2019-09-16 13:20:49 +02:00
										 |  |  |             self.last_on += 1 | 
					
						
							| 
									
										
										
										
											2020-12-01 12:31:22 -05:00
										 |  |  |         if speed != self.last_speed: | 
					
						
							|  |  |  |             self.last_speed = speed | 
					
						
							| 
									
										
										
										
											2024-09-21 15:42:26 -04:00
										 |  |  |             self.fan.set_speed(speed) | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |         return eventtime + 1. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-10 13:57:01 -04:00
										 |  |  | def load_config_prefix(config): | 
					
						
							| 
									
										
										
										
											2019-01-10 18:12:15 +01:00
										 |  |  |     return ControllerFan(config) |