From 0233327554679d6bb9cc87aa090e131d57e3d199 Mon Sep 17 00:00:00 2001 From: alfrix Date: Mon, 21 Nov 2022 16:32:50 -0300 Subject: [PATCH] fix splash_screen reloading and limit klipper reconnects fixes #803 --- ks_includes/KlippyWebsocket.py | 1 + panels/splash_screen.py | 8 ++++++-- screen.py | 25 ++++++++++++++----------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 35d5aa90..c1613db5 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -130,6 +130,7 @@ class KlippyWebsocket(threading.Thread): def on_open(self, *args): logging.info("Moonraker Websocket Open") self.connected = True + self._screen.reinit_count = 0 self.reconnect_count = 0 if "on_connect" in self._callback: GLib.idle_add(self._callback['on_connect']) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 1c83ffd1..3faf475f 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -86,7 +86,7 @@ class SplashScreenPanel(ScreenPanel): self.labels['actions'].add(self.labels['restart_system']) self.labels['actions'].add(self.labels['shutdown']) self.labels['actions'].add(self.labels['menu']) - if self._screen._ws and not self._screen._ws.connecting: + if self._screen._ws and not self._screen._ws.connecting or self._screen.reinit_count > self._screen.max_retries: self.labels['actions'].add(self.labels['retry']) self.labels['actions'].show_all() @@ -141,5 +141,9 @@ class SplashScreenPanel(ScreenPanel): def retry(self, widget): self.update_text((_("Connecting to %s") % self._screen.connecting_to_printer)) - self._screen._ws.retry() + if self._screen._ws and not self._screen._ws.connecting: + self._screen._ws.retry() + else: + self._screen.reinit_count = 0 + self._screen.init_printer() self.show_restart_buttons() diff --git a/screen.py b/screen.py index 5efeeb59..3870364d 100644 --- a/screen.py +++ b/screen.py @@ -84,6 +84,7 @@ class KlipperScreen(Gtk.Window): _ws = None screensaver_timeout = None reinit_count = 0 + max_retries = 4 def __init__(self, args, version): self.blanking_time = 600 @@ -639,7 +640,7 @@ class KlipperScreen(Gtk.Window): callback() def websocket_disconnected(self, msg): - self.printer_initializing(msg) + self.printer_initializing(msg, remove=True) self.connecting = True self.connected_printer = None self.files.reset() @@ -651,7 +652,7 @@ class KlipperScreen(Gtk.Window): def state_disconnected(self): logging.debug("### Going to disconnected") self.close_screensaver() - self.printer_initializing(_("Klipper has disconnected")) + self.printer_initializing(_("Klipper has disconnected"), remove=True) def state_error(self): self.close_screensaver() @@ -661,7 +662,7 @@ class KlipperScreen(Gtk.Window): msg += _("A FIRMWARE_RESTART may fix the issue.") + "\n" elif "micro-controller" in state: msg += _("Please recompile and flash the micro-controller.") + "\n" - self.printer_initializing(msg + "\n" + state) + self.printer_initializing(msg + "\n" + state, remove=True) def state_paused(self): if "job_status" not in self._cur_panels: @@ -686,7 +687,7 @@ class KlipperScreen(Gtk.Window): self.close_screensaver() msg = self.printer.get_stat("webhooks", "state_message") msg = msg if "ready" not in msg else "" - self.printer_initializing(_("Klipper has shutdown") + "\n\n" + msg) + self.printer_initializing(_("Klipper has shutdown") + "\n\n" + msg, remove=True) def toggle_macro_shortcut(self, value): self.base_panel.show_macro_shortcut(value) @@ -781,9 +782,9 @@ class KlipperScreen(Gtk.Window): logging.info(f"{method}: {params}") self._ws.send_method(method, params) - def printer_initializing(self, msg): + def printer_initializing(self, msg, remove=False): self.close_popup_message() - if 'splash_screen' not in self.panels or 'printer_select' not in self._cur_panels: + if 'splash_screen' not in self.panels or remove: self.show_panel('splash_screen', "splash_screen", None, 2) self.panels['splash_screen'].update_text(msg) @@ -815,6 +816,8 @@ class KlipperScreen(Gtk.Window): logging.info("%s is ON", device) def init_printer(self): + if self.reinit_count > self.max_retries or 'printer_select' in self._cur_panels: + return state = self.apiclient.get_server_info() if state is False: logging.info("Moonraker not connected") @@ -832,11 +835,11 @@ class KlipperScreen(Gtk.Window): if state['result']['klippy_connected'] is False: logging.info("Klipper not connected") - self.printer_initializing( - _("Moonraker: connected") - + f"\n\nKlipper: {state['result']['klippy_state']}\n\n" - + _("Retry #%s") % self.reinit_count - ) + msg = _("Moonraker: connected") + "\n\n" + msg += f"Klipper: {state['result']['klippy_state']}" + "\n\n" + if self.reinit_count <= self.max_retries: + msg += _("Retrying") + f' #{self.reinit_count}' + self.printer_initializing(msg) GLib.timeout_add_seconds(3, self.init_printer) return