diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 1496efb6..8fa8da9a 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -31,7 +31,6 @@ class KlippyWebsocket(threading.Thread): _req_id = 0 connected = False callback_table = {} - reconnect_timeout = None reconnect_count = 0 max_retries = 4 @@ -58,12 +57,14 @@ class KlippyWebsocket(threading.Thread): return "wss" return "ws" + def retry(self): + self.reconnect_count = 0 + self.initial_connect() + def initial_connect(self): # Enable a timeout so that way if moonraker is not running, it will attempt to reconnect - self.reconnect_count = 0 - if not self.reconnect_timeout: - self.reconnect_timeout = GLib.timeout_add_seconds(6, self.reconnect) self.connect() + GLib.timeout_add_seconds(6, self.reconnect) def connect(self): def ws_on_close(ws, a=None, b=None): @@ -83,7 +84,6 @@ class KlippyWebsocket(threading.Thread): state = self._screen.apiclient.get_server_info() if state is False: if self.reconnect_count > self.max_retries: - self._screen.panels['splash_screen'].add_retry_button() self._screen.printer_initializing( _("Cannot connect to Moonraker") + f'\n\n{self._url}') @@ -120,6 +120,9 @@ class KlippyWebsocket(threading.Thread): def is_connected(self): return self.connected + def is_connecting(self): + return self.reconnect_count > self.max_retries + def on_message(self, ws, message): response = json.loads(message) if "id" in response and response['id'] in self.callback_table: @@ -167,10 +170,6 @@ class KlippyWebsocket(threading.Thread): logging.info(f"Self.connected = {self.is_connected()}") self.connected = True self.reconnect_count = 0 - self._screen.panels['splash_screen'].remove_retry_button() - if self.reconnect_timeout is not None: - GLib.source_remove(self.reconnect_timeout) - self.reconnect_timeout = None if "on_connect" in self._callback: Gdk.threads_add_idle( GLib.PRIORITY_HIGH_IDLE, @@ -180,9 +179,6 @@ class KlippyWebsocket(threading.Thread): def on_close(self, ws): if self.is_connected() is False: logging.debug("Connection already closed") - if self.reconnect_timeout is not None: - GLib.source_remove(self.reconnect_timeout) - self.reconnect_timeout = None return if self.closing is True: @@ -194,8 +190,6 @@ class KlippyWebsocket(threading.Thread): logging.info("Moonraker Websocket Closed") self.connected = False - if self.reconnect_timeout is None: - self.reconnect_timeout = GLib.timeout_add_seconds(9, self.reconnect) if "on_close" in self._callback: Gdk.threads_add_idle( @@ -203,10 +197,10 @@ class KlippyWebsocket(threading.Thread): self._callback['on_close'], "Lost Connection to Moonraker", ) + self.retry() def reconnect(self): if self.is_connected(): - logging.debug("Reconnected") return False if self.reconnect_count > self.max_retries: logging.debug("Stopping reconnections") diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 5a239658..777fb427 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -3,7 +3,7 @@ import logging import os gi.require_version("Gtk", "3.0") -from gi.repository import Gdk, Gtk, Pango +from gi.repository import Gtk, Pango from ks_includes.screen_panel import ScreenPanel @@ -18,7 +18,6 @@ class SplashScreenPanel(ScreenPanel): super().__init__(screen, title, back) def initialize(self, panel_name): - self.retry_button = False image = self._gtk.Image("klipper", self._screen.width / 5, self._screen.height * .5) self.labels['text'] = Gtk.Label(_("Initializing printer...")) self.labels['text'].set_line_wrap(True) @@ -38,7 +37,6 @@ class SplashScreenPanel(ScreenPanel): self.labels['shutdown'].connect("clicked", self.shutdown) self.labels['retry'] = self._gtk.ButtonImage("load", _('Retry'), "color3") self.labels['retry'].connect("clicked", self.retry) - self.labels['retry'].connect("clicked", self.remove_retry_button) self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self.labels['actions'].set_hexpand(True) @@ -85,14 +83,14 @@ class SplashScreenPanel(ScreenPanel): logging.info(f"Associated power devices: {power_devices}") self.add_power_button(self._screen.search_power_devices(power_devices)) - if self._screen.printer is not None and self._screen.printer.state != "disconnected": + if self._screen._ws and self._screen._ws.is_connected(): self.labels['actions'].add(self.labels['restart']) self.labels['actions'].add(self.labels['firmware_restart']) else: self.labels['actions'].add(self.labels['restart_system']) self.labels['actions'].add(self.labels['shutdown']) self.labels['actions'].add(self.labels['menu']) - if self.retry_button: + if self._screen._ws and self._screen._ws.is_connecting(): self.labels['actions'].add(self.labels['retry']) self.labels['actions'].show_all() @@ -103,14 +101,6 @@ class SplashScreenPanel(ScreenPanel): self.check_power_status() self.labels['actions'].add(self.labels['power']) - def add_retry_button(self): - self.retry_button = True - - def remove_retry_button(self, *args): - self.retry_button = False - self.update_text((_("Connecting to %s") % self._screen.connecting_to_printer)) - self.show_restart_buttons() - def activate(self): self.check_power_status() self._screen.base_panel.show_macro_shortcut(False) @@ -155,4 +145,6 @@ class SplashScreenPanel(ScreenPanel): os.system("systemctl reboot") def retry(self, widget): - self._screen._ws.initial_connect() + self.update_text((_("Connecting to %s") % self._screen.connecting_to_printer)) + self._screen._ws.retry() + self.show_restart_buttons()