Change how the printer state is handled

This commit is contained in:
alfrix 2022-10-27 15:00:13 -03:00
parent b988c3c8c9
commit 0620d660f5
3 changed files with 28 additions and 47 deletions

View File

@ -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

View File

@ -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):

View File

@ -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()