diff --git a/ks_includes/KlippyGcodes.py b/ks_includes/KlippyGcodes.py index 5fb6fd73..c0a9043a 100644 --- a/ks_includes/KlippyGcodes.py +++ b/ks_includes/KlippyGcodes.py @@ -40,6 +40,10 @@ class KlippyGcodes: def set_ext_temp(temp, tool=0): return "%s T%s S%s" % (KlippyGcodes.SET_EXT_TEMP, str(tool), str(temp)) + @staticmethod + def set_heater_temp(heater, temp): + return 'SET_HEATER_TEMPERATURE heater="%s" target=%s' % (heater, str(temp)) + @staticmethod def set_fan_speed(speed): speed = str( int(float(int(speed) % 101)/100*255) ) diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 6b15d9fe..2bef6082 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -312,6 +312,17 @@ class MoonrakerApi: *args ) + def set_heater_temp(self, heater, target, callback=None, *args): + logger.debug("Sending heater %s to temp: %s", heater, target) + return self._ws.send_method( + "printer.gcode.script", + { + "script": KlippyGcodes.set_heater_temp(heater, target) + }, + callback, + *args + ) + def set_tool_temp(self, tool, target, callback=None, *args): logger.debug("Sending set_tool_temp: %s", KlippyGcodes.set_ext_temp(target, tool)) return self._ws.send_method( diff --git a/ks_includes/config.py b/ks_includes/config.py index a6f66d25..83b6c88e 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -299,6 +299,7 @@ class KlipperScreenConfig: cfg = self.config[name] item = { "extruder": cfg.getint("extruder", 0), - "bed": cfg.getint("bed", 0) + "bed": cfg.getint("bed", 0), + "heater_generic": cfg.getint("heater_generic", 0) } return item diff --git a/ks_includes/printer.py b/ks_includes/printer.py index f57e07cd..7f422f5b 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -46,7 +46,7 @@ class Printer: if "shared_heater" in self.config[x]: continue self.extrudercount += 1 - if x.startswith('heater_bed'): + if x.startswith('heater_bed') or x.startswith('heater_generic '): self.devices[x] = { "temperature": 0, "target": 0 @@ -85,19 +85,11 @@ class Printer: for y in data[x]: self.data[x][y] = data[x][y] - if "heater_bed" in data: - d = data["heater_bed"] - if "target" in d: - self.set_dev_stat("heater_bed", "target", d["target"]) - if "temperature" in d: - self.set_dev_stat("heater_bed", "temperature", d["temperature"]) - for x in self.get_tools(): + for x in (self.get_tools() + self.get_heaters()): if x in data: d = data[x] - if "target" in d: - self.set_dev_stat(x, "target", d["target"]) - if "temperature" in d: - self.set_dev_stat(x, "temperature", d["temperature"]) + for i in d: + self.set_dev_stat(x, i, d[i]) if "webhooks" in data or "idle_timeout" in data or "pause_resume" in data or "print_stats" in data: self.evaluate_state() diff --git a/panels/preheat.py b/panels/preheat.py index acac48b8..da0e7b74 100644 --- a/panels/preheat.py +++ b/panels/preheat.py @@ -21,23 +21,35 @@ class PreheatPanel(ScreenPanel): grid = self._gtk.HomogeneousGrid() - eq_grid = self._gtk.HomogeneousGrid() + eq_grid = Gtk.Grid() + eq_grid.set_hexpand(True) + eq_grid.set_vexpand(True) + + self.heaters = [] i = 0 for x in self._printer.get_tools(): - if i > 3: - break - elif i == 0: + if i == 0: primary_tool = x self.labels[x] = self._gtk.ToggleButtonImage("extruder-"+str(i), self._gtk.formatTemperatureString(0, 0)) - self.labels[x].connect('clicked', self.select_heater, x) - eq_grid.attach(self.labels[x], i%2, i/2, 1, 1) + self.heaters.append(x) + i += 1 + + add_heaters = self._printer.get_heaters() + for h in add_heaters: + if h == "heater_bed": + self.labels[h] = self._gtk.ButtonImage("bed", self._gtk.formatTemperatureString(0, 0)) + else: + name = " ".join(h.split(" ")[1:]) + self.labels[h] = self._gtk.ButtonImage("heat-up", name) + self.heaters.append(h) + + i = 0 + cols = 3 if len(self.heaters) > 4 else (1 if len(self.heaters) <= 2 else 2) + for h in self.heaters: + self.labels[h].connect('clicked', self.select_heater, h) + eq_grid.attach(self.labels[h], i%cols, int(i/cols), 1, 1) i += 1 - if self._printer.has_heated_bed(): - self.labels["heater_bed"] = self._gtk.ToggleButtonImage("bed", self._gtk.formatTemperatureString(0, 0)) - self.labels["heater_bed"].connect('clicked', self.select_heater, "heater_bed") - width = 2 if i > 1 else 1 - eq_grid.attach(self.labels["heater_bed"], 0, i/2+1, width, 1) self.labels["control_grid"] = self._gtk.HomogeneousGrid() @@ -70,8 +82,9 @@ class PreheatPanel(ScreenPanel): if x not in self.active_heaters: self.select_heater(None, x) - if self._printer.has_heated_bed() and "heater_bed" not in self.active_heaters: - self.select_heater(None, "heater_bed") + for h in self._printer.get_heaters(): + if h not in self.active_heaters: + self.select_heater(None, h) def select_heater(self, widget, heater): if heater in self.active_heaters: @@ -86,7 +99,9 @@ class PreheatPanel(ScreenPanel): if setting == "cooldown": for heater in self.active_heaters: print ("Setting %s to %d" % (heater, 0)) - if heater.startswith('heater_bed'): + if heater.startswith('heater_generic '): + self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), 0) + elif heater.startswith('heater_bed'): self._screen._ws.klippy.set_bed_temp(0) self._printer.set_dev_stat(heater,"target", 0) else: @@ -95,7 +110,11 @@ class PreheatPanel(ScreenPanel): return for heater in self.active_heaters: - if heater.startswith('heater_bed'): + if heater.startswith('heater_generic '): + print ("Setting %s to %d" % (heater, self.preheat_options[setting]['heater_generic'])) + self._screen._ws.klippy.set_heater_temp(" ".join(heater.split(" ")[1:]), + self.preheat_options[setting]["heater_generic"]) + elif heater.startswith('heater_bed'): print ("Setting %s to %d" % (heater, self.preheat_options[setting]['bed'])) self._screen._ws.klippy.set_bed_temp(self.preheat_options[setting]["bed"]) self._printer.set_dev_stat(heater,"target", int(self.preheat_options[setting]["bed"])) @@ -109,13 +128,14 @@ class PreheatPanel(ScreenPanel): if action != "notify_status_update": return - if self._printer.has_heated_bed(): - self.update_temp("heater_bed", - self._printer.get_dev_stat("heater_bed","temperature"), - self._printer.get_dev_stat("heater_bed","target") - ) for x in self._printer.get_tools(): self.update_temp(x, self._printer.get_dev_stat(x,"temperature"), self._printer.get_dev_stat(x,"target") ) + for h in self._printer.get_heaters(): + self.update_temp(h, + self._printer.get_dev_stat(h,"temperature"), + self._printer.get_dev_stat(h,"target"), + None if h == "heater_bed" else " ".join(h.split(" ")[1:]) + )