Change how the printer state is handled
This commit is contained in:
parent
b988c3c8c9
commit
0620d660f5
@ -134,8 +134,8 @@ class Printer:
|
||||
self.data[x] = {}
|
||||
self.data[x].update(data[x])
|
||||
|
||||
if "webhooks" in data or "idle_timeout" in data or "print_stats" in data or "pause_resume" in data:
|
||||
self.evaluate_state()
|
||||
if "webhooks" in data or "print_stats" in data:
|
||||
self.process_status_update()
|
||||
|
||||
def get_updates(self):
|
||||
updates = self.data.copy()
|
||||
@ -143,39 +143,27 @@ class Printer:
|
||||
return updates
|
||||
|
||||
def evaluate_state(self):
|
||||
wh_state = self.data['webhooks']['state'].lower() # possible values: startup, ready, shutdown, error
|
||||
# webhooks states: startup, ready, shutdown, error
|
||||
if self.data['webhooks']['state'] == "ready":
|
||||
if self.data['print_stats']: # standby, printing, paused, error, complete
|
||||
if self.data['print_stats']['state'] == 'paused' or self.data.get('pause_resume').get('is_paused'):
|
||||
return "paused"
|
||||
if self.data['print_stats']['state'] == 'printing':
|
||||
return "printing"
|
||||
return self.data['webhooks']['state']
|
||||
|
||||
if wh_state == "ready":
|
||||
new_state = "ready"
|
||||
if self.data.get('pause_resume').get('is_paused'):
|
||||
new_state = "paused"
|
||||
elif self.data['print_stats']:
|
||||
print_state = self.data['print_stats']['state'].lower() # complete, error, paused, printing, standby
|
||||
if print_state == "paused":
|
||||
new_state = "paused"
|
||||
if self.data['idle_timeout']:
|
||||
idle_state = self.data['idle_timeout']['state'].lower() # idle, printing, ready
|
||||
if idle_state == "printing":
|
||||
if print_state == "complete":
|
||||
new_state = "ready"
|
||||
elif print_state != "printing": # Not printing a file, toolhead moving
|
||||
new_state = "busy"
|
||||
else:
|
||||
new_state = "printing"
|
||||
|
||||
if new_state != "busy":
|
||||
self.change_state(new_state)
|
||||
else:
|
||||
self.change_state(wh_state)
|
||||
def process_status_update(self):
|
||||
state = self.evaluate_state()
|
||||
if state != self.state:
|
||||
self.change_state(state)
|
||||
|
||||
def process_power_update(self, data):
|
||||
if data['device'] in self.power_devices:
|
||||
self.power_devices[data['device']]['status'] = data['status']
|
||||
|
||||
def change_state(self, state):
|
||||
if state == self.state or state not in list(self.state_callbacks):
|
||||
if state not in list(self.state_callbacks): # disconnected, startup, ready, shutdown, error, paused, printing
|
||||
return
|
||||
|
||||
logging.debug(f"Changing state from '{self.state}' to '{state}'")
|
||||
prev_state = self.state
|
||||
self.state = state
|
||||
|
@ -436,9 +436,11 @@ class JobStatusPanel(ScreenPanel):
|
||||
widget.destroy()
|
||||
|
||||
def restart(self, widget):
|
||||
self.disable_button("restart")
|
||||
if self.filename != "none":
|
||||
self._screen._ws.klippy.print_start(self.filename)
|
||||
self.new_print()
|
||||
GLib.timeout_add_seconds(5, self.enable_button("restart"))
|
||||
|
||||
def resume(self, widget):
|
||||
self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel")
|
||||
@ -466,7 +468,6 @@ class JobStatusPanel(ScreenPanel):
|
||||
label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
|
||||
|
||||
self._gtk.Dialog(self._screen, buttons, label, self.cancel_confirm)
|
||||
self.disable_button("pause", "cancel")
|
||||
|
||||
def cancel_confirm(self, widget, response_id):
|
||||
widget.destroy()
|
||||
@ -489,11 +490,15 @@ class JobStatusPanel(ScreenPanel):
|
||||
self.enable_button(*args)
|
||||
|
||||
def close_panel(self, widget=None):
|
||||
self.disable_button("menu")
|
||||
logging.debug("Closing job_status panel")
|
||||
self.remove_close_timeout()
|
||||
self.state_check()
|
||||
if self.state not in ["printing", "paused"]:
|
||||
if self.state not in ["printing", "paused", "cancelling"]:
|
||||
self._screen.printer_ready()
|
||||
self._printer.change_state("ready")
|
||||
GLib.timeout_add_seconds(5, self.enable_button("menu"))
|
||||
|
||||
return False
|
||||
|
||||
def remove_close_timeout(self):
|
||||
@ -743,13 +748,11 @@ class JobStatusPanel(ScreenPanel):
|
||||
self.set_state("complete")
|
||||
return self._add_timeout("job_complete_timeout")
|
||||
elif ps['state'] == "error":
|
||||
logging.debug("Error!")
|
||||
self.set_state("error")
|
||||
self.labels['status'].set_text(_("Error"))
|
||||
self._screen.show_popup_message(ps['message'])
|
||||
return self._add_timeout("job_error_timeout")
|
||||
elif ps['state'] == "cancelled":
|
||||
# Print was cancelled
|
||||
self.set_state("cancelled")
|
||||
return self._add_timeout("job_cancelled_timeout")
|
||||
elif ps['state'] == "paused":
|
||||
@ -816,7 +819,8 @@ class JobStatusPanel(ScreenPanel):
|
||||
|
||||
if self.filename is not None:
|
||||
self.buttons['button_grid'].attach(self.buttons['restart'], 2, 0, 1, 1)
|
||||
self.buttons['button_grid'].attach(self.buttons['menu'], 3, 0, 1, 1)
|
||||
if self.state != "cancelling":
|
||||
self.buttons['button_grid'].attach(self.buttons['menu'], 3, 0, 1, 1)
|
||||
self.show_all()
|
||||
|
||||
def show_file_thumbnail(self):
|
||||
|
19
screen.py
19
screen.py
@ -7,7 +7,6 @@ import json
|
||||
import importlib
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import signal
|
||||
import subprocess
|
||||
import pathlib
|
||||
@ -850,9 +849,7 @@ class KlipperScreen(Gtk.Window):
|
||||
del self.panels[panel]
|
||||
for dialog in self.dialogs:
|
||||
dialog.destroy()
|
||||
state = self.printer.state
|
||||
self.printer.state = None
|
||||
self.printer.change_state(state)
|
||||
self.printer.change_state(self.printer.state)
|
||||
|
||||
def _websocket_callback(self, action, data):
|
||||
|
||||
@ -860,9 +857,10 @@ class KlipperScreen(Gtk.Window):
|
||||
return
|
||||
|
||||
if action == "notify_klippy_disconnected":
|
||||
logging.debug("Received notify_klippy_disconnected")
|
||||
self.printer.change_state("disconnected")
|
||||
return
|
||||
elif action == "notify_klippy_shutdown":
|
||||
self.printer.change_state("shutdown")
|
||||
elif action == "notify_klippy_ready":
|
||||
self.printer.change_state("ready")
|
||||
elif action == "notify_status_update" and self.printer.get_state() != "shutdown":
|
||||
@ -880,17 +878,11 @@ class KlipperScreen(Gtk.Window):
|
||||
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")
|
||||
self.printer.change_state("shutdown")
|
||||
|
||||
if not (data.startswith("B:") and
|
||||
re.search(r'B:[0-9\.]+\s/[0-9\.]+\sT[0-9]+:[0-9\.]+', data)):
|
||||
if not (data.startswith("B:") or data.startswith("T:")):
|
||||
if data.startswith("echo: "):
|
||||
self.show_popup_message(data[6:], 1)
|
||||
elif data.startswith("!! "):
|
||||
self.show_popup_message(data[3:], 3)
|
||||
logging.debug(json.dumps([action, data], indent=2))
|
||||
if "SAVE_CONFIG" in data and self.printer.get_state() == "ready":
|
||||
script = {"script": "SAVE_CONFIG"}
|
||||
self._confirm_send_action(
|
||||
@ -1049,10 +1041,7 @@ class KlipperScreen(Gtk.Window):
|
||||
return False
|
||||
|
||||
def printer_ready(self):
|
||||
|
||||
self.close_popup_message()
|
||||
# Force an update to printer webhooks state in case the update is missed due to websocket subscribe not yet sent
|
||||
self.printer.process_update({"webhooks": {"state": "ready", "state_message": "Printer is ready"}})
|
||||
self.show_panel('main_panel', "main_menu", _("Home"), 2,
|
||||
items=self._config.get_menu_items("__main"), extrudercount=self.printer.get_extruder_count())
|
||||
self.ws_subscribe()
|
||||
|
Loading…
x
Reference in New Issue
Block a user