From e8e4555d46ad170777aa2476631815940421b83d Mon Sep 17 00:00:00 2001 From: alfrix Date: Wed, 27 Jul 2022 16:22:58 -0300 Subject: [PATCH] temperature: Support specific preheat items close #428 --- docs/Configuration.md | 14 ++++--- ks_includes/config.py | 20 ++++----- panels/temperature.py | 96 ++++++++++++++++++++++--------------------- 3 files changed, 65 insertions(+), 65 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index c4466372..3f2a2c25 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -108,14 +108,16 @@ use_dpms: True ## Preheat Options ```py [preheat my_temp_setting] -# Temperature for the heated bed -bed: 40 -# Temperature for the tools extruder: 195 -# Temperature for generic heaters -heater_generic: 40 -# Temperature controlled fans (temperature_fan in klipper config) +extruder1: 60 +heater_bed: 40 +# Use the name +chamber: 60 +# or the full name +heater_generic chamber: 60 +# or for example apply the same temp to devices of the same type temperature_fan: 40 +heater_generic: 60 # optional GCode to run when the option is selected gcode: MY_HEATSOAK_MACRO ``` diff --git a/ks_includes/config.py b/ks_includes/config.py index 1dcae37f..f9972902 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -309,9 +309,15 @@ class KlipperScreenConfig: def get_preheat_options(self): index = "preheat " items = [i[len(index):] for i in self.config.sections() if i.startswith(index)] - return {item: self._build_preheat_item(index + item) for item in items} + def _build_preheat_item(self, name): + if name not in self.config: + return False + cfg = self.config[name] + return {opt: cfg.get("gcode", None) if opt == "gcode" else cfg.getint(opt, None) for opt in cfg} + + def get_printer_config(self, name): if not name.startswith("printer "): name = f"printer {name}" @@ -425,15 +431,3 @@ class KlipperScreenConfig: item["params"] = {} return {name[(len(menu) + 6):]: item} - - def _build_preheat_item(self, name): - if name not in self.config: - return False - cfg = self.config[name] - return { - "extruder": cfg.getint("extruder", None), - "bed": cfg.getint("bed", None), - "heater_generic": cfg.getint("heater_generic", None), - "temperature_fan": cfg.getint("temperature_fan", None), - "gcode": cfg.get("gcode", None) - } diff --git a/panels/temperature.py b/panels/temperature.py index 88a3e14b..ecb0ceac 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -1,5 +1,6 @@ import gi import logging +import contextlib gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango @@ -199,65 +200,68 @@ class TemperaturePanel(ScreenPanel): self.active_heaters.pop(self.active_heaters.index(device)) self.devices[device]['name'].get_style_context().remove_class("button_active") self.devices[device]['select'].set_label(_("Select")) + logging.info(f"Deselecting {device}") return self.active_heaters.append(device) self.devices[device]['name'].get_style_context().add_class("button_active") self.devices[device]['select'].set_label(_("Deselect")) + logging.info(f"Seselecting {device}") return def set_temperature(self, widget, setting): - if len(self.active_heaters) == 0: self._screen.show_popup_message(_("Nothing selected")) else: - if setting == "cooldown": - for heater in self.active_heaters: - if heater.startswith('extruder'): - self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), 0) - elif heater.startswith('heater_bed'): - self._screen._ws.klippy.set_bed_temp(0) - elif heater.startswith('heater_generic '): - self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), 0) - logging.info(f"Setting {heater} to 0") - self._printer.set_dev_stat(heater, "target", 0) - else: - target = None - for heater in self.active_heaters: - max_temp = int(float(self._printer.get_config_section(heater)['max_temp'])) - if heater.startswith('extruder'): - target = self.preheat_options[setting]["extruder"] - if target is not None and 0 <= target <= max_temp: - self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), target) - elif heater.startswith('heater_bed'): - target = self.preheat_options[setting]["bed"] - if target is not None and 0 <= target <= max_temp: - self._screen._ws.klippy.set_bed_temp(target) - elif heater.startswith('heater_generic '): - target = self.preheat_options[setting]["heater_generic"] - if target is not None and 0 <= target <= max_temp: - self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), target) - elif heater.startswith('temperature_fan '): - target = self.preheat_options[setting]["temperature_fan"] - if target is not None and 0 <= target <= max_temp: - self._screen._ws.klippy.set_temp_fan_temp(" ".join(heater.split(" ")[1:]), target) - else: - logging.info(f"Unknown heater: {heater}") - self._screen.show_popup_message(_("Unknown Heater") + " " + heater) + target = 0 if setting == "cooldown" else None + for heater in self.active_heaters: + max_temp = float(self._printer.get_config_section(heater)['max_temp']) + name = heater.split()[1] if len(heater.split()) > 1 else heater + if target is None: + for i in self.preheat_options[setting]: + logging.info(f"{self.preheat_options[setting]}") + if i == name: + # Assign the specific target if available + target = self.preheat_options[setting][name] + elif i == heater: + target = self.preheat_options[setting][heater] + if heater.startswith('extruder'): + if self.validate(heater, target, max_temp): + self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), target) + elif heater.startswith('heater_bed'): if target is None: - continue - if target <= max_temp: - if target >= 0: - self._printer.set_dev_stat(heater, "target", target) - logging.info(f"Setting {heater} to {target}") - else: - self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}') - if setting in self.preheat_options and self.preheat_options[setting]['gcode']: - # This small delay is needed to properly update the target if the user configured something above - # and then changed the target again using preheat gcode - GLib.timeout_add(250, self.preheat_gcode, setting) + with contextlib.suppress(KeyError): + target = self.preheat_options[setting]["bed"] + if self.validate(heater, target, max_temp): + self._screen._ws.klippy.set_bed_temp(target) + elif heater.startswith('heater_generic '): + if target is None: + with contextlib.suppress(KeyError): + target = self.preheat_options[setting]["heater_generic"] + if self.validate(heater, target, max_temp): + self._screen._ws.klippy.set_heater_temp(name, target) + elif heater.startswith('temperature_fan '): + if target is None: + with contextlib.suppress(KeyError): + target = self.preheat_options[setting]["temperature_fan"] + if self.validate(heater, target, max_temp): + self._screen._ws.klippy.set_temp_fan_temp(name, target) + # This small delay is needed to properly update the target if the user configured something above + # and then changed the target again using preheat gcode + GLib.timeout_add(250, self.preheat_gcode, setting) + + def validate(self, heater, target=None, max_temp=None): + if target is not None and max_temp is not None: + if 0 <= target <= max_temp: + self._printer.set_dev_stat(heater, "target", target) + return True + elif target > max_temp: + self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}') + return False + return False def preheat_gcode(self, setting): - self._screen._ws.klippy.gcode_script(self.preheat_options[setting]['gcode']) + with contextlib.suppress(KeyError): + self._screen._ws.klippy.gcode_script(self.preheat_options[setting]['gcode']) return False def add_device(self, device):