heatergraph: fix sometimes not reinitializing correctly

This commit is contained in:
alfrix 2024-03-20 14:33:54 -03:00
parent b98bcf857c
commit 3ea10b5404
5 changed files with 21 additions and 33 deletions

View File

@ -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)

View File

@ -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']

View File

@ -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)

View File

@ -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)

View File

@ -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: