From 3ea10b5404e2c439fdbebf09f61155a4f0e6bffb Mon Sep 17 00:00:00 2001 From: alfrix Date: Wed, 20 Mar 2024 14:33:54 -0300 Subject: [PATCH] heatergraph: fix sometimes not reinitializing correctly --- ks_includes/printer.py | 5 ++++- ks_includes/widgets/heatergraph.py | 36 ++++++++++-------------------- panels/main_menu.py | 5 +---- panels/temperature.py | 5 +---- screen.py | 3 +++ 5 files changed, 21 insertions(+), 33 deletions(-) diff --git a/ks_includes/printer.py b/ks_includes/printer.py index 30f67ebd..6e372271 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -364,6 +364,9 @@ class Printer: temp[section] = self.tempstore[device][section][-results:] return temp + def get_tempstore_size(self): + return self.tempstore_size + def get_temp_devices(self): if self.temp_devices is None: devices = [ @@ -381,7 +384,7 @@ class Printer: return self.tools.index(tool) def init_temp_store(self, tempstore): - if self.tempstore and list(self.tempstore) != list(tempstore): + if self.tempstore and set(self.tempstore) != set(tempstore): logging.debug("Tempstore has changed") self.tempstore = tempstore self.change_state(self.state) diff --git a/ks_includes/widgets/heatergraph.py b/ks_includes/widgets/heatergraph.py index 4941b34f..186e426e 100644 --- a/ks_includes/widgets/heatergraph.py +++ b/ks_includes/widgets/heatergraph.py @@ -10,14 +10,14 @@ from cairo import Context as cairoContext class HeaterGraph(Gtk.DrawingArea): - def __init__(self, printer, font_size): + def __init__(self, screen, printer, font_size): super().__init__() self.set_hexpand(True) self.set_vexpand(True) self.get_style_context().add_class('heatergraph') + self._screen = screen self.printer = printer self.store = {} - self.max_length = 0 self.connect('draw', self.draw_graph) self.add_events(Gdk.EventMask.TOUCH_MASK) self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) @@ -26,15 +26,10 @@ class HeaterGraph(Gtk.DrawingArea): self.font_size = round(font_size * 0.75) def add_object(self, name, ev_type, rgb=None, dashed=False, fill=False): - if rgb is None: - rgb = [0, 0, 0] - if name not in self.store: - self.store.update({name: {"show": True}}) - self.store[name].update({ev_type: { - "dashed": dashed, - "fill": fill, - "rgb": rgb - }}) + rgb = [0, 0, 0] if rgb is None else rgb + self.store.update( + {name: {"show": True, ev_type: {"dashed": dashed, "fill": fill, "rgb": rgb}}} + ) @staticmethod def event_cb(da, ev): @@ -43,15 +38,6 @@ class HeaterGraph(Gtk.DrawingArea): y = ev.y logging.info(f"Graph area: {x} {y}") - def get_max_length(self): - try: - return min(len(self.printer.get_temp_store(name, "temperatures")) - for name in self.store if "temperatures" in self.store[name] - and self.printer.get_temp_store(name, "temperatures")) - except ValueError: - logging.debug(self.printer.get_temp_devices()) - return 0 - def get_max_num(self, data_points=0): mnum = [0] for device in self.store: @@ -65,7 +51,10 @@ class HeaterGraph(Gtk.DrawingArea): return max(mnum) def draw_graph(self, da: Gtk.DrawingArea, ctx: cairoContext): - + if not self.printer.tempstore: + logging.info("Tempstore not initialized!") + self._screen.init_tempstore() + return x = round(self.font_size * 2.75) y = 10 width = da.get_allocated_width() - 15 @@ -78,9 +67,8 @@ class HeaterGraph(Gtk.DrawingArea): ctx.rectangle(x, y, width - x, height - y) - self.max_length = self.get_max_length() graph_width = gsize[1][0] - gsize[0][0] - points_per_pixel = self.max_length / graph_width + points_per_pixel = self.printer.get_tempstore_size() / graph_width data_points = int(round(graph_width * points_per_pixel, 0)) max_num = math.ceil(self.get_max_num(data_points) * 1.1 / 10) * 10 if points_per_pixel == 0: @@ -170,7 +158,7 @@ class HeaterGraph(Gtk.DrawingArea): ctx.show_text(f"{now - datetime.timedelta(minutes=2) * i:%H:%M}") ctx.stroke() - i += 1 + self.max_length // 601 + i += 1 + self.printer.get_tempstore_size() // 601 def is_showing(self, device): return False if device not in self.store else self.store[device]['show'] diff --git a/panels/main_menu.py b/panels/main_menu.py index a0bdb362..787b7e48 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -40,9 +40,6 @@ class Panel(MenuPanel): if self.left_panel is None: logging.info("No left panel") return - if not self._printer.get_temp_store_devices(): - logging.debug(f"Could not create graph tempstore: {self._printer.get_temp_store_devices()}") - return count = 0 for device in self.devices: visible = self._config.get_config().getboolean(f"graph {self._screen.connected_printer}", @@ -224,7 +221,7 @@ class Panel(MenuPanel): self.labels['devices'].attach(name, 0, 0, 1, 1) self.labels['devices'].attach(temp, 1, 0, 1, 1) - self.labels['da'] = HeaterGraph(self._printer, self._gtk.font_size) + self.labels['da'] = HeaterGraph(self._screen, self._printer, self._gtk.font_size) scroll = self._gtk.ScrolledWindow(steppers=False) scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) diff --git a/panels/temperature.py b/panels/temperature.py index 5291e60f..2a7ee654 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -157,9 +157,6 @@ class Panel(ScreenPanel): logging.info(f"Setting {heater} to {target}") def update_graph_visibility(self): - if not self._printer.get_temp_store_devices(): - logging.debug(f"Could not create graph tempstore: {self._printer.get_temp_store_devices()}") - return count = 0 for device in self.devices: visible = self._config.get_config().getboolean(f"graph {self._screen.connected_printer}", @@ -438,7 +435,7 @@ class Panel(ScreenPanel): self.labels['devices'].attach(name, 0, 0, 1, 1) self.labels['devices'].attach(temp, 1, 0, 1, 1) - self.labels['da'] = HeaterGraph(self._printer, self._gtk.font_size) + self.labels['da'] = HeaterGraph(self._screen, self._printer, self._gtk.font_size) scroll = self._gtk.ScrolledWindow(steppers=False) scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) diff --git a/screen.py b/screen.py index 37c2f2d0..674f8e6e 100755 --- a/screen.py +++ b/screen.py @@ -1010,6 +1010,9 @@ class KlipperScreen(Gtk.Window): logging.error(f'Tempstore not ready: {tempstore} Retrying in 5 seconds') GLib.timeout_add_seconds(5, self.init_tempstore) return + if set(self.printer.tempstore) != set(self.printer.get_temp_devices()): + GLib.timeout_add_seconds(5, self.init_tempstore) + return server_config = self.apiclient.send_request("server/config") if server_config: try: