# -*- coding: utf-8 -*- import gi import logging gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel from ks_includes.widgets.keypad import Keypad def create_panel(*args): return TemperaturePanel(*args) class TemperaturePanel(ScreenPanel): active_heater = "extruder" tempdeltas = ["1", "5", "10", "25"] tempdelta = "10" def initialize(self, panel_name): _ = self.lang.gettext grid = self._gtk.HomogeneousGrid() eq_grid = Gtk.Grid() eq_grid.set_hexpand(True) eq_grid.set_vexpand(True) self.heaters = [] i = 0 tools = self._printer.get_tools() for x in tools: self.labels[x] = self._gtk.ToggleButtonImage("extruder-"+str(i), self._gtk.formatTemperatureString(0, 0)) if i == 0: self.labels[x].set_active(True) self.heaters.append(x) i += 1 if len(tools) > 0: self.labels[tools[0]].get_style_context().add_class('button_active') 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: if not (h.startswith("temperature_sensor")): self.labels[h].connect('clicked', self.select_heater, h) eq_grid.attach(self.labels[h], i % cols, int(i/cols), 1, 1) i += 1 self.labels["control_grid"] = self._gtk.HomogeneousGrid() self.labels["increase"] = self._gtk.ButtonImage("increase", _("Increase"), "color1") self.labels["increase"].connect("clicked", self.change_target_temp_incremental, "+") self.labels["decrease"] = self._gtk.ButtonImage("decrease", _("Decrease"), "color3") self.labels["decrease"].connect("clicked", self.change_target_temp_incremental, "-") self.labels["npad"] = self._gtk.ButtonImage("hashtag", _("Number Pad"), "color2") self.labels["npad"].connect("clicked", self.show_numpad) tempgrid = Gtk.Grid() j = 0 for i in self.tempdeltas: self.labels['deg' + i] = self._gtk.ToggleButton(i) self.labels['deg' + i].connect("clicked", self.change_temp_delta, i) ctx = self.labels['deg' + i].get_style_context() if j == 0: ctx.add_class("tempbutton_top") elif j == len(self.tempdeltas)-1: ctx.add_class("tempbutton_bottom") else: ctx.add_class("tempbutton") if i == "10": ctx.add_class("distbutton_active") tempgrid.attach(self.labels['deg' + i], 0, j, 1, 1) j += 1 self.labels["deg" + self.tempdelta].set_active(True) vbox = Gtk.VBox() vbox.pack_start(Gtk.Label("Temp °C"), False, False, 4) vbox.pack_end(tempgrid, True, True, 0) self.labels["control_grid"].attach(vbox, 2, 0, 1, 3) self.labels["control_grid"].attach(self.labels["increase"], 3, 0, 1, 1) self.labels["control_grid"].attach(self.labels["decrease"], 3, 1, 1, 1) self.labels["control_grid"].attach(self.labels["npad"], 3, 2, 1, 1) grid.attach(eq_grid, 0, 0, 1, 1) grid.attach(self.labels["control_grid"], 1, 0, 1, 1) self.grid = grid self.content.add(grid) self.update_temp("heater_bed", 35, 40) def change_temp_delta(self, widget, tempdelta): if self.tempdelta == tempdelta: return logging.info("### tempdelta " + str(tempdelta)) ctx = self.labels["deg" + str(self.tempdelta)].get_style_context() ctx.remove_class("distbutton_active") self.tempdelta = tempdelta ctx = self.labels["deg" + self.tempdelta].get_style_context() ctx.add_class("distbutton_active") for i in self.tempdeltas: if i == self.tempdeltas: continue self.labels["deg" + str(i)].set_active(False) def show_numpad(self, widget): _ = self.lang.gettext if "keypad" not in self.labels: self.labels["keypad"] = Keypad(self._screen, self.change_target_temp, self.hide_numpad) self.labels["keypad"].clear() self.grid.remove_column(1) self.grid.attach(self.labels["keypad"], 1, 0, 1, 1) self.grid.show_all() def hide_numpad(self, widget): self.grid.remove_column(1) self.grid.attach(self.labels["control_grid"], 1, 0, 1, 1) self.grid.show_all() def select_heater(self, widget, heater): if self.active_heater == heater: return self.labels[self.active_heater].get_style_context().remove_class('button_active') self.active_heater = heater self.labels[heater].get_style_context().add_class("button_active") if "entry" in self.labels: self.labels['entry'].set_text("") logging.info("### Active heater " + self.active_heater) def process_update(self, action, data): if action != "notify_status_update": return 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:]) ) return def change_target_temp(self, temp): if self.active_heater.startswith('heater_generic '): self._screen._ws.klippy.set_heater_temp(" ".join(self.active_heater.split(" ")[1:]), temp) elif self.active_heater == "heater_bed": temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_BED_TEMP else temp self._screen._ws.klippy.set_bed_temp(temp) else: temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_EXT_TEMP else temp self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(self.active_heater), temp) self._printer.set_dev_stat(self.active_heater, "target", temp) def change_target_temp_incremental(self, widget, dir): logging.debug("Dev stats %s: %s" % (self.active_heater, self._printer.get_dev_stats(self.active_heater))) target = self._printer.get_dev_stat(self.active_heater, "target") if dir == "+": target += int(self.tempdelta) if target > KlippyGcodes.MAX_EXT_TEMP: target = KlippyGcodes.MAX_EXT_TEMP else: target -= int(self.tempdelta) if target < 0: target = 0 self._printer.set_dev_stat(self.active_heater, "target", target) if self.active_heater.startswith("heater_generic "): self._screen._ws.klippy.set_heater_temp(" ".join(self.active_heater.split(" ")[1:]), target) elif self.active_heater == "heater_bed": self._screen._ws.klippy.set_bed_temp(target) elif self.active_heater.startswith("temperature_fan "): self._screen._ws.klippy.set_temp_fan_temp(" ".join(self.active_heater.split(" ")[1:]), target) else: self._screen._ws.klippy.set_tool_temp(self._printer.get_tool_number(self.active_heater), target)