Fix issues while Moonraker is connected but klipper is disconnected
fixes #548
This commit is contained in:
parent
2a7acea86c
commit
6f86448405
@ -73,16 +73,6 @@ class KlippyWebsocket(threading.Thread):
|
||||
("\n\n%s\n\n") % self._url +
|
||||
_("Retry #%s") % self.reconnect_count)
|
||||
return False
|
||||
if state['result']['klippy_connected'] is False:
|
||||
if self.reconnect_count > 3:
|
||||
self._screen.panels['splash_screen'].update_text(
|
||||
_("Moonraker: connected") +
|
||||
("\n\nKlipper: %s\n\n") % state['result']['klippy_state'] +
|
||||
_("Retry #%s") % self.reconnect_count)
|
||||
return False
|
||||
printer_info = self._screen.apiclient.get_printer_info()
|
||||
if printer_info is False:
|
||||
return False
|
||||
token = self._screen.apiclient.get_oneshot_token()
|
||||
except Exception:
|
||||
logging.debug("Unable to get oneshot token")
|
||||
|
@ -30,6 +30,16 @@ class SplashScreenPanel(ScreenPanel):
|
||||
self.labels['text'].set_halign(Gtk.Align.CENTER)
|
||||
self.labels['text'].set_valign(Gtk.Align.CENTER)
|
||||
|
||||
self.labels['menu'] = self._gtk.ButtonImage("settings", _("Menu"), "color4")
|
||||
self.labels['menu'].connect("clicked", self._screen._go_to_submenu, "")
|
||||
self.labels['restart'] = self._gtk.ButtonImage("refresh", _("Restart") + "\n" + "Klipper", "color1")
|
||||
self.labels['restart'].connect("clicked", self.restart)
|
||||
self.labels['firmware_restart'] = self._gtk.ButtonImage("refresh", _("Firmware\nRestart"), "color2")
|
||||
self.labels['firmware_restart'].connect("clicked", self.firmware_restart)
|
||||
self.labels['restart_system'] = self._gtk.ButtonImage("refresh", _("Restart\nSystem"), "color1")
|
||||
self.labels['restart_system'].connect("clicked", self.restart_system)
|
||||
self.labels['shutdown'] = self._gtk.ButtonImage("shutdown", _('System\nShutdown'), "color2")
|
||||
self.labels['shutdown'].connect("clicked", self.shutdown)
|
||||
|
||||
self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
|
||||
self.labels['actions'].set_hexpand(True)
|
||||
@ -61,6 +71,7 @@ class SplashScreenPanel(ScreenPanel):
|
||||
|
||||
def update_text(self, text):
|
||||
self.labels['text'].set_markup("%s" % text)
|
||||
self.show_restart_buttons()
|
||||
|
||||
def clear_action_bar(self):
|
||||
for child in self.labels['actions'].get_children():
|
||||
@ -69,23 +80,17 @@ class SplashScreenPanel(ScreenPanel):
|
||||
def show_restart_buttons(self):
|
||||
_ = self.lang.gettext
|
||||
|
||||
if "firmware_restart" not in self.labels:
|
||||
self.labels['menu'] = self._gtk.ButtonImage("settings", _("Menu"), "color4")
|
||||
self.labels['menu'].connect("clicked", self._screen._go_to_submenu, "")
|
||||
self.labels['restart'] = self._gtk.ButtonImage("refresh", _("Restart") + "\n" + "Klipper", "color1")
|
||||
self.labels['restart'].connect("clicked", self.restart)
|
||||
self.labels['firmware_restart'] = self._gtk.ButtonImage("refresh", _("Firmware\nRestart"), "color2")
|
||||
self.labels['firmware_restart'].connect("clicked", self.firmware_restart)
|
||||
self.labels['power'] = self._gtk.ButtonImage("shutdown", _("Power On Printer"), "color3")
|
||||
self.labels['restart_system'] = self._gtk.ButtonImage("refresh", _("Restart\nSystem"), "color1")
|
||||
self.labels['restart_system'].connect("clicked", self.restart_system)
|
||||
self.labels['shutdown'] = self._gtk.ButtonImage("shutdown", _('System\nShutdown'), "color2")
|
||||
self.labels['shutdown'].connect("clicked", self.shutdown)
|
||||
|
||||
self.clear_action_bar()
|
||||
printer = self._screen.connected_printer
|
||||
if printer is not None:
|
||||
printer_cfg = self._config.get_printer_config(printer)
|
||||
if printer_cfg is not None:
|
||||
power_devices = printer_cfg.get("power_devices", "")
|
||||
power_devices = [str(i.strip()) for i in power_devices.split(',')]
|
||||
logging.info("Associated power devices: %s", 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":
|
||||
self.search_power_devices()
|
||||
self.labels['actions'].add(self.labels['restart'])
|
||||
self.labels['actions'].add(self.labels['firmware_restart'])
|
||||
self.labels['actions'].add(self.labels['menu'])
|
||||
@ -96,39 +101,27 @@ class SplashScreenPanel(ScreenPanel):
|
||||
|
||||
self.labels['actions'].show_all()
|
||||
|
||||
def search_power_devices(self):
|
||||
power_devices = found_devices = []
|
||||
printer = self._screen.connecting_to_printer
|
||||
logging.info("Connecting to %s", printer)
|
||||
printer_cfg = self._config.get_printer_config(printer)
|
||||
if printer_cfg is not None:
|
||||
power_devices = printer_cfg.get("power_devices", "")
|
||||
power_devices = [str(i.strip()) for i in power_devices.split(',')]
|
||||
logging.info("%s associated power devices: %s", printer, power_devices)
|
||||
devices = self._screen.printer.get_power_devices()
|
||||
logging.debug("Power devices: %s", devices)
|
||||
if devices is not None:
|
||||
for device in devices:
|
||||
for power_device in power_devices:
|
||||
if device == power_device and power_device not in found_devices:
|
||||
found_devices.append(power_device)
|
||||
if len(found_devices) > 0:
|
||||
logging.info("Found %s, Adding power button", found_devices)
|
||||
self.labels['power'].connect("clicked", self.power_on, found_devices)
|
||||
def add_power_button(self, powerdevs):
|
||||
if powerdevs is not None:
|
||||
_ = self.lang.gettext
|
||||
self.labels['power'] = self._gtk.ButtonImage("shutdown", _("Power On Printer"), "color3")
|
||||
self.labels['power'].connect("clicked", self._screen.power_on, powerdevs)
|
||||
self.check_power_status()
|
||||
self.labels['actions'].add(self.labels['power'])
|
||||
else:
|
||||
logging.info("%s power devices not found", printer)
|
||||
|
||||
def power_on(self, widget, devices):
|
||||
_ = self.lang.gettext
|
||||
self._screen.show_popup_message(_("Sending Power ON signal to: %s") % devices, level=1)
|
||||
for device in devices:
|
||||
if self._screen.printer.get_power_device_status(device) == "off":
|
||||
logging.info("%s is OFF, Sending Power ON signal", device)
|
||||
self._screen._ws.klippy.power_device_on(device)
|
||||
elif self._screen.printer.get_power_device_status(device) == "on":
|
||||
logging.info("%s is ON", device)
|
||||
def activate(self):
|
||||
self.check_power_status()
|
||||
|
||||
def check_power_status(self):
|
||||
if 'power' in self.labels:
|
||||
devices = self._screen.printer.get_power_devices()
|
||||
if devices is not None:
|
||||
for device in devices:
|
||||
if self._screen.printer.get_power_device_status(device) == "off":
|
||||
self.labels['power'].set_sensitive(True)
|
||||
break
|
||||
elif self._screen.printer.get_power_device_status(device) == "on":
|
||||
self.labels['power'].set_sensitive(False)
|
||||
|
||||
def firmware_restart(self, widget):
|
||||
self._screen._ws.klippy.restart_firmware()
|
||||
|
75
screen.py
75
screen.py
@ -77,6 +77,7 @@ class KlipperScreen(Gtk.Window):
|
||||
updating = False
|
||||
update_queue = []
|
||||
_ws = None
|
||||
init_printer_timeout = None
|
||||
|
||||
def __init__(self, args, version):
|
||||
self.dpms_timeout = None
|
||||
@ -233,11 +234,6 @@ class KlipperScreen(Gtk.Window):
|
||||
data["moonraker_port"]
|
||||
)
|
||||
|
||||
powerdevs = self.apiclient.send_request("machine/device_power/devices")
|
||||
if powerdevs is not False:
|
||||
self.printer.configure_power_devices(powerdevs['result'])
|
||||
self.panels['splash_screen'].show_restart_buttons()
|
||||
|
||||
self.files = KlippyFiles(self)
|
||||
self._ws.initial_connect()
|
||||
self.connecting = False
|
||||
@ -813,6 +809,7 @@ class KlipperScreen(Gtk.Window):
|
||||
elif action == "notify_power_changed":
|
||||
logging.debug("Power status changed: %s", data)
|
||||
self.printer.process_power_update(data)
|
||||
self.panels['splash_screen'].check_power_status()
|
||||
elif self.printer.get_state() not in ["error", "shutdown"] and action == "notify_gcode_response":
|
||||
if "Klipper state: Shutdown" in data:
|
||||
logging.debug("Shutdown in gcode response, changing state to shutdown")
|
||||
@ -874,25 +871,73 @@ class KlipperScreen(Gtk.Window):
|
||||
self.printer.state = "disconnected"
|
||||
if text is not None:
|
||||
self.panels['splash_screen'].update_text(text)
|
||||
self.panels['splash_screen'].show_restart_buttons()
|
||||
|
||||
def search_power_devices(self, power_devices):
|
||||
if self.connected_printer is not None:
|
||||
found_devices = []
|
||||
devices = self.printer.get_power_devices()
|
||||
logging.debug("Power devices: %s", devices)
|
||||
if devices is not None:
|
||||
for device in devices:
|
||||
for power_device in power_devices:
|
||||
if device == power_device and power_device not in found_devices:
|
||||
found_devices.append(power_device)
|
||||
if len(found_devices) > 0:
|
||||
logging.info("Found %s", found_devices)
|
||||
return found_devices
|
||||
else:
|
||||
logging.info("Power devices not found")
|
||||
return None
|
||||
|
||||
def power_on(self, widget, devices):
|
||||
_ = self.lang.gettext
|
||||
for device in devices:
|
||||
if self.printer.get_power_device_status(device) == "off":
|
||||
self.show_popup_message(_("Sending Power ON signal to: %s") % devices, level=1)
|
||||
logging.info("%s is OFF, Sending Power ON signal", device)
|
||||
self._ws.klippy.power_device_on(device)
|
||||
elif self.printer.get_power_device_status(device) == "on":
|
||||
logging.info("%s is ON", device)
|
||||
|
||||
def init_printer(self):
|
||||
_ = self.lang.gettext
|
||||
|
||||
state = self.apiclient.get_server_info()
|
||||
if state is False:
|
||||
return False
|
||||
else:
|
||||
# Moonraker is ready, set a loop to init the printer
|
||||
self.init_printer_timeout = GLib.timeout_add_seconds(3, self.init_printer)
|
||||
|
||||
powerdevs = self.apiclient.send_request("machine/device_power/devices")
|
||||
if powerdevs is not False:
|
||||
self.printer.configure_power_devices(powerdevs['result'])
|
||||
|
||||
if state['result']['klippy_connected'] is False:
|
||||
self.panels['splash_screen'].update_text(
|
||||
_("Moonraker: connected") +
|
||||
("\n\nKlipper: %s\n\n") % state['result']['klippy_state'])
|
||||
return False
|
||||
|
||||
printer_info = self.apiclient.get_printer_info()
|
||||
if printer_info is False:
|
||||
logging.info("Unable to get printer info from moonraker")
|
||||
msg = "Unable to get printer info from moonraker"
|
||||
logging.info(msg)
|
||||
self.panels['splash_screen'].update_text(msg)
|
||||
return False
|
||||
data = self.apiclient.send_request("printer/objects/query?" + "&".join(PRINTER_BASE_STATUS_OBJECTS))
|
||||
if data is False:
|
||||
logging.info("Error getting printer object data")
|
||||
msg = "Error getting printer object data"
|
||||
logging.info(msg)
|
||||
self.panels['splash_screen'].update_text(msg)
|
||||
return False
|
||||
powerdevs = self.apiclient.send_request("machine/device_power/devices")
|
||||
data = data['result']['status']
|
||||
|
||||
config = self.apiclient.send_request("printer/objects/query?configfile")
|
||||
if config is False:
|
||||
logging.info("Error getting printer config data")
|
||||
msg = "Error getting printer config data"
|
||||
logging.info(msg)
|
||||
self.panels['splash_screen'].update_text(msg)
|
||||
return False
|
||||
|
||||
# Reinitialize printer, in case the printer was shut down and anything has changed.
|
||||
@ -910,7 +955,9 @@ class KlipperScreen(Gtk.Window):
|
||||
data = self.apiclient.send_request("printer/objects/query?" + "&".join(PRINTER_BASE_STATUS_OBJECTS +
|
||||
extra_items))
|
||||
if data is False:
|
||||
logging.info("Error getting printer object data")
|
||||
msg = "Error getting printer object data with extra items"
|
||||
logging.info(msg)
|
||||
self.panels['splash_screen'].update_text(msg)
|
||||
return False
|
||||
|
||||
tempstore = self.apiclient.send_request("server/temperature_store")
|
||||
@ -921,9 +968,9 @@ class KlipperScreen(Gtk.Window):
|
||||
self.files.initialize()
|
||||
self.files.refresh_files()
|
||||
|
||||
if powerdevs is not False:
|
||||
self.printer.configure_power_devices(powerdevs['result'])
|
||||
self.panels['splash_screen'].show_restart_buttons()
|
||||
logging.info("Printer initialized")
|
||||
GLib.source_remove(self.init_printer_timeout)
|
||||
return False
|
||||
|
||||
def printer_ready(self):
|
||||
_ = self.lang.gettext
|
||||
|
Loading…
x
Reference in New Issue
Block a user