temperature: Support specific preheat items close #428
This commit is contained in:
parent
af158a4279
commit
e8e4555d46
@ -108,14 +108,16 @@ use_dpms: True
|
|||||||
## Preheat Options
|
## Preheat Options
|
||||||
```py
|
```py
|
||||||
[preheat my_temp_setting]
|
[preheat my_temp_setting]
|
||||||
# Temperature for the heated bed
|
|
||||||
bed: 40
|
|
||||||
# Temperature for the tools
|
|
||||||
extruder: 195
|
extruder: 195
|
||||||
# Temperature for generic heaters
|
extruder1: 60
|
||||||
heater_generic: 40
|
heater_bed: 40
|
||||||
# Temperature controlled fans (temperature_fan in klipper config)
|
# 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
|
temperature_fan: 40
|
||||||
|
heater_generic: 60
|
||||||
# optional GCode to run when the option is selected
|
# optional GCode to run when the option is selected
|
||||||
gcode: MY_HEATSOAK_MACRO
|
gcode: MY_HEATSOAK_MACRO
|
||||||
```
|
```
|
||||||
|
@ -309,9 +309,15 @@ class KlipperScreenConfig:
|
|||||||
def get_preheat_options(self):
|
def get_preheat_options(self):
|
||||||
index = "preheat "
|
index = "preheat "
|
||||||
items = [i[len(index):] for i in self.config.sections() if i.startswith(index)]
|
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}
|
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):
|
def get_printer_config(self, name):
|
||||||
if not name.startswith("printer "):
|
if not name.startswith("printer "):
|
||||||
name = f"printer {name}"
|
name = f"printer {name}"
|
||||||
@ -425,15 +431,3 @@ class KlipperScreenConfig:
|
|||||||
item["params"] = {}
|
item["params"] = {}
|
||||||
|
|
||||||
return {name[(len(menu) + 6):]: item}
|
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)
|
|
||||||
}
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import gi
|
import gi
|
||||||
import logging
|
import logging
|
||||||
|
import contextlib
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk, GLib, Pango
|
from gi.repository import Gtk, GLib, Pango
|
||||||
@ -199,65 +200,68 @@ class TemperaturePanel(ScreenPanel):
|
|||||||
self.active_heaters.pop(self.active_heaters.index(device))
|
self.active_heaters.pop(self.active_heaters.index(device))
|
||||||
self.devices[device]['name'].get_style_context().remove_class("button_active")
|
self.devices[device]['name'].get_style_context().remove_class("button_active")
|
||||||
self.devices[device]['select'].set_label(_("Select"))
|
self.devices[device]['select'].set_label(_("Select"))
|
||||||
|
logging.info(f"Deselecting {device}")
|
||||||
return
|
return
|
||||||
self.active_heaters.append(device)
|
self.active_heaters.append(device)
|
||||||
self.devices[device]['name'].get_style_context().add_class("button_active")
|
self.devices[device]['name'].get_style_context().add_class("button_active")
|
||||||
self.devices[device]['select'].set_label(_("Deselect"))
|
self.devices[device]['select'].set_label(_("Deselect"))
|
||||||
|
logging.info(f"Seselecting {device}")
|
||||||
return
|
return
|
||||||
|
|
||||||
def set_temperature(self, widget, setting):
|
def set_temperature(self, widget, setting):
|
||||||
|
|
||||||
if len(self.active_heaters) == 0:
|
if len(self.active_heaters) == 0:
|
||||||
self._screen.show_popup_message(_("Nothing selected"))
|
self._screen.show_popup_message(_("Nothing selected"))
|
||||||
else:
|
else:
|
||||||
if setting == "cooldown":
|
target = 0 if setting == "cooldown" else None
|
||||||
for heater in self.active_heaters:
|
for heater in self.active_heaters:
|
||||||
if heater.startswith('extruder'):
|
max_temp = float(self._printer.get_config_section(heater)['max_temp'])
|
||||||
self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), 0)
|
name = heater.split()[1] if len(heater.split()) > 1 else heater
|
||||||
elif heater.startswith('heater_bed'):
|
if target is None:
|
||||||
self._screen._ws.klippy.set_bed_temp(0)
|
for i in self.preheat_options[setting]:
|
||||||
elif heater.startswith('heater_generic '):
|
logging.info(f"{self.preheat_options[setting]}")
|
||||||
self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), 0)
|
if i == name:
|
||||||
logging.info(f"Setting {heater} to 0")
|
# Assign the specific target if available
|
||||||
self._printer.set_dev_stat(heater, "target", 0)
|
target = self.preheat_options[setting][name]
|
||||||
else:
|
elif i == heater:
|
||||||
target = None
|
target = self.preheat_options[setting][heater]
|
||||||
for heater in self.active_heaters:
|
if heater.startswith('extruder'):
|
||||||
max_temp = int(float(self._printer.get_config_section(heater)['max_temp']))
|
if self.validate(heater, target, max_temp):
|
||||||
if heater.startswith('extruder'):
|
self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(heater), target)
|
||||||
target = self.preheat_options[setting]["extruder"]
|
elif heater.startswith('heater_bed'):
|
||||||
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)
|
|
||||||
if target is None:
|
if target is None:
|
||||||
continue
|
with contextlib.suppress(KeyError):
|
||||||
if target <= max_temp:
|
target = self.preheat_options[setting]["bed"]
|
||||||
if target >= 0:
|
if self.validate(heater, target, max_temp):
|
||||||
self._printer.set_dev_stat(heater, "target", target)
|
self._screen._ws.klippy.set_bed_temp(target)
|
||||||
logging.info(f"Setting {heater} to {target}")
|
elif heater.startswith('heater_generic '):
|
||||||
else:
|
if target is None:
|
||||||
self._screen.show_popup_message(_("Can't set above the maximum:") + f' {max_temp}')
|
with contextlib.suppress(KeyError):
|
||||||
if setting in self.preheat_options and self.preheat_options[setting]['gcode']:
|
target = self.preheat_options[setting]["heater_generic"]
|
||||||
# This small delay is needed to properly update the target if the user configured something above
|
if self.validate(heater, target, max_temp):
|
||||||
# and then changed the target again using preheat gcode
|
self._screen._ws.klippy.set_heater_temp(name, target)
|
||||||
GLib.timeout_add(250, self.preheat_gcode, setting)
|
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):
|
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
|
return False
|
||||||
|
|
||||||
def add_device(self, device):
|
def add_device(self, device):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user