refactor ws reconnect/retry

This commit is contained in:
alfrix 2022-11-16 08:59:28 -03:00
parent 86c52dece8
commit b68cfa40fd
2 changed files with 15 additions and 29 deletions

View File

@ -31,7 +31,6 @@ class KlippyWebsocket(threading.Thread):
_req_id = 0 _req_id = 0
connected = False connected = False
callback_table = {} callback_table = {}
reconnect_timeout = None
reconnect_count = 0 reconnect_count = 0
max_retries = 4 max_retries = 4
@ -58,12 +57,14 @@ class KlippyWebsocket(threading.Thread):
return "wss" return "wss"
return "ws" return "ws"
def retry(self):
self.reconnect_count = 0
self.initial_connect()
def initial_connect(self): def initial_connect(self):
# Enable a timeout so that way if moonraker is not running, it will attempt to reconnect # 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() self.connect()
GLib.timeout_add_seconds(6, self.reconnect)
def connect(self): def connect(self):
def ws_on_close(ws, a=None, b=None): def ws_on_close(ws, a=None, b=None):
@ -83,7 +84,6 @@ class KlippyWebsocket(threading.Thread):
state = self._screen.apiclient.get_server_info() state = self._screen.apiclient.get_server_info()
if state is False: if state is False:
if self.reconnect_count > self.max_retries: if self.reconnect_count > self.max_retries:
self._screen.panels['splash_screen'].add_retry_button()
self._screen.printer_initializing( self._screen.printer_initializing(
_("Cannot connect to Moonraker") _("Cannot connect to Moonraker")
+ f'\n\n{self._url}') + f'\n\n{self._url}')
@ -120,6 +120,9 @@ class KlippyWebsocket(threading.Thread):
def is_connected(self): def is_connected(self):
return self.connected return self.connected
def is_connecting(self):
return self.reconnect_count > self.max_retries
def on_message(self, ws, message): def on_message(self, ws, message):
response = json.loads(message) response = json.loads(message)
if "id" in response and response['id'] in self.callback_table: 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()}") logging.info(f"Self.connected = {self.is_connected()}")
self.connected = True self.connected = True
self.reconnect_count = 0 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: if "on_connect" in self._callback:
Gdk.threads_add_idle( Gdk.threads_add_idle(
GLib.PRIORITY_HIGH_IDLE, GLib.PRIORITY_HIGH_IDLE,
@ -180,9 +179,6 @@ class KlippyWebsocket(threading.Thread):
def on_close(self, ws): def on_close(self, ws):
if self.is_connected() is False: if self.is_connected() is False:
logging.debug("Connection already closed") logging.debug("Connection already closed")
if self.reconnect_timeout is not None:
GLib.source_remove(self.reconnect_timeout)
self.reconnect_timeout = None
return return
if self.closing is True: if self.closing is True:
@ -194,8 +190,6 @@ class KlippyWebsocket(threading.Thread):
logging.info("Moonraker Websocket Closed") logging.info("Moonraker Websocket Closed")
self.connected = False 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: if "on_close" in self._callback:
Gdk.threads_add_idle( Gdk.threads_add_idle(
@ -203,10 +197,10 @@ class KlippyWebsocket(threading.Thread):
self._callback['on_close'], self._callback['on_close'],
"Lost Connection to Moonraker", "Lost Connection to Moonraker",
) )
self.retry()
def reconnect(self): def reconnect(self):
if self.is_connected(): if self.is_connected():
logging.debug("Reconnected")
return False return False
if self.reconnect_count > self.max_retries: if self.reconnect_count > self.max_retries:
logging.debug("Stopping reconnections") logging.debug("Stopping reconnections")

View File

@ -3,7 +3,7 @@ import logging
import os import os
gi.require_version("Gtk", "3.0") 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 from ks_includes.screen_panel import ScreenPanel
@ -18,7 +18,6 @@ class SplashScreenPanel(ScreenPanel):
super().__init__(screen, title, back) super().__init__(screen, title, back)
def initialize(self, panel_name): def initialize(self, panel_name):
self.retry_button = False
image = self._gtk.Image("klipper", self._screen.width / 5, self._screen.height * .5) image = self._gtk.Image("klipper", self._screen.width / 5, self._screen.height * .5)
self.labels['text'] = Gtk.Label(_("Initializing printer...")) self.labels['text'] = Gtk.Label(_("Initializing printer..."))
self.labels['text'].set_line_wrap(True) self.labels['text'].set_line_wrap(True)
@ -38,7 +37,6 @@ class SplashScreenPanel(ScreenPanel):
self.labels['shutdown'].connect("clicked", self.shutdown) self.labels['shutdown'].connect("clicked", self.shutdown)
self.labels['retry'] = self._gtk.ButtonImage("load", _('Retry'), "color3") self.labels['retry'] = self._gtk.ButtonImage("load", _('Retry'), "color3")
self.labels['retry'].connect("clicked", self.retry) 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'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.labels['actions'].set_hexpand(True) self.labels['actions'].set_hexpand(True)
@ -85,14 +83,14 @@ class SplashScreenPanel(ScreenPanel):
logging.info(f"Associated power devices: {power_devices}") logging.info(f"Associated power devices: {power_devices}")
self.add_power_button(self._screen.search_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['restart'])
self.labels['actions'].add(self.labels['firmware_restart']) self.labels['actions'].add(self.labels['firmware_restart'])
else: else:
self.labels['actions'].add(self.labels['restart_system']) self.labels['actions'].add(self.labels['restart_system'])
self.labels['actions'].add(self.labels['shutdown']) self.labels['actions'].add(self.labels['shutdown'])
self.labels['actions'].add(self.labels['menu']) 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'].add(self.labels['retry'])
self.labels['actions'].show_all() self.labels['actions'].show_all()
@ -103,14 +101,6 @@ class SplashScreenPanel(ScreenPanel):
self.check_power_status() self.check_power_status()
self.labels['actions'].add(self.labels['power']) 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): def activate(self):
self.check_power_status() self.check_power_status()
self._screen.base_panel.show_macro_shortcut(False) self._screen.base_panel.show_macro_shortcut(False)
@ -155,4 +145,6 @@ class SplashScreenPanel(ScreenPanel):
os.system("systemctl reboot") os.system("systemctl reboot")
def retry(self, widget): 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()