job_status: Logic updates for printing state

This commit is contained in:
Jordan Ruthe 2021-03-12 12:35:33 -05:00
parent 55193e227f
commit 029c59436c
3 changed files with 124 additions and 88 deletions

View File

@ -99,7 +99,7 @@ class Printer:
for i in d: for i in d:
self.set_dev_stat(x, i, d[i]) self.set_dev_stat(x, i, d[i])
if "webhooks" in data or "idle_timeout" in data or "pause_resume" in data or "print_stats" in data: if "webhooks" in data or "idle_timeout" in data or "print_stats" in data:
self.evaluate_state() self.evaluate_state()
def evaluate_state(self): def evaluate_state(self):
@ -111,9 +111,12 @@ class Printer:
new_state = "ready" new_state = "ready"
if print_state == "paused": if print_state == "paused":
new_state = "paused" new_state = "paused"
elif idle_state == "printing" and print_state != "printing": # Not printing a file, toolhead moving
new_state = "busy"
elif idle_state == "printing": elif 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" new_state = "printing"
if new_state != "busy": if new_state != "busy":

View File

@ -24,6 +24,8 @@ class JobStatusPanel(ScreenPanel):
def initialize(self, panel_name): def initialize(self, panel_name):
_ = self.lang.gettext _ = self.lang.gettext
self.timeleft_type = "file" self.timeleft_type = "file"
self.timeout = None
self.close_timeouts = []
self.create_buttons() self.create_buttons()
@ -227,6 +229,9 @@ class JobStatusPanel(ScreenPanel):
self.set_state(ps['state']) self.set_state(ps['state'])
self.show_buttons_for_state() self.show_buttons_for_state()
if self.timeout == None:
GLib.timeout_add(500, self.state_check)
def add_labels(self): def add_labels(self):
for child in self.labels['i1_box'].get_children(): for child in self.labels['i1_box'].get_children():
self.labels['i1_box'].remove(child) self.labels['i1_box'].remove(child)
@ -270,6 +275,12 @@ class JobStatusPanel(ScreenPanel):
if self.filename != "none": if self.filename != "none":
self._screen._ws.klippy.print_start(self.filename) self._screen._ws.klippy.print_start(self.filename)
for to in self.close_timeouts:
GLib.source_remove(to)
self.close_timeouts.remove(to)
if self.timeout == None:
self.timeout = GLib.timeout_add(500, self.state_check)
def resume(self, widget): def resume(self, widget):
#self.disable_button("resume","cancel") #self.disable_button("resume","cancel")
self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel") self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel")
@ -314,7 +325,11 @@ class JobStatusPanel(ScreenPanel):
self.enable_button(*args) self.enable_button(*args)
def close_panel(self, widget=None): def close_panel(self, widget=None):
if self._screen.is_printing(): logging.debug("Closing job_status panel")
for to in self.close_timeouts:
GLib.source_remove(to)
self.close_timeouts.remove(to)
self._screen.printer_ready() self._screen.printer_ready()
return False return False
@ -332,7 +347,13 @@ class JobStatusPanel(ScreenPanel):
self._files.remove_file_callback(self._callback_metadata) self._files.remove_file_callback(self._callback_metadata)
def process_update(self, action, data): def process_update(self, action, data):
if action != "notify_status_update": if action == "notify_gcode_response":
if "action:cancel" in data:
self.set_state("cancelling")
elif "action:paused" in data:
self.set_state("paused")
return
elif action != "notify_status_update":
return return
_ = self.lang.gettext _ = self.lang.gettext
@ -347,6 +368,8 @@ class JobStatusPanel(ScreenPanel):
self._printer.get_dev_stat(x,"target") self._printer.get_dev_stat(x,"target")
) )
ps = self._printer.get_stat("print_stats")
vsd = self._printer.get_stat("virtual_sdcard")
if "toolhead" in data: if "toolhead" in data:
if "extruder" in data["toolhead"]: if "extruder" in data["toolhead"]:
@ -371,53 +394,11 @@ class JobStatusPanel(ScreenPanel):
if "speed_factor" in data["gcode_move"]: if "speed_factor" in data["gcode_move"]:
self.speed = int(data["gcode_move"]["speed_factor"]*100) self.speed = int(data["gcode_move"]["speed_factor"]*100)
self.labels['speed'].set_text("%3d%%" % self.speed) self.labels['speed'].set_text("%3d%%" % self.speed)
if "fan" in data and "speed" in data['fan']: if "fan" in data and "speed" in data['fan']:
self.fan = int(round(data['fan']['speed'],2)*100) self.fan = int(round(data['fan']['speed'],2)*100)
self.labels['fan'].set_text("%3d%%" % self.fan) self.labels['fan'].set_text("%3d%%" % self.fan)
if "print_stats" in data or "virtual_sdcard" in data:
ps = self._printer.get_stat("print_stats")
vsd = self._printer.get_stat("virtual_sdcard")
if ps['state'] == "printing" and self.state != "printing":
self.set_state("printing")
self.show_buttons_for_state()
elif ps['state'] == "complete" and self.state != "complete":
self.progress = 1
self.update_progress()
self.set_state("complete")
self.show_buttons_for_state()
timeout = self._config.get_main_config().getint("job_complete_timeout", 30)
if timeout != 0:
GLib.timeout_add(timeout * 1000, self.close_panel)
elif ps['state'] == "error" and self.state != "error":
logging.debug("Error!")
self.set_state("error")
self.labels['status'].set_text("%s - %s" % (_("Error"), ps['message']))
self.show_buttons_for_state()
timeout = self._config.get_main_config().getint("job_error_timeout", 0)
if timeout != 0:
GLib.timeout_add(timeout * 1000, self.close_panel)
elif ps['state'] == "standby":
# Print was cancelled
self.set_state("cancelled")
self.show_buttons_for_state()
timeout = self._config.get_main_config().getint("job_cancelled_timeout", 0)
if timeout != 0:
GLib.timeout_add(timeout * 1000, self.close_panel)
elif ps['state'] == "paused":
self.set_state("paused")
self.show_buttons_for_state()
if self.filename != ps['filename']:
if ps['filename'] != "":
self.filename = ps['filename']
self.file_metadata = {}
self.update_text("file", self.filename.split("/")[-1])
else:
file = "Unknown"
self.update_text("file", "Unknown file")
if "gcode_start_byte" in self.file_metadata: if "gcode_start_byte" in self.file_metadata:
progress = (max(vsd['file_position'] - self.file_metadata['gcode_start_byte'],0) / progress = (max(vsd['file_position'] - self.file_metadata['gcode_start_byte'],0) /
(self.file_metadata['gcode_end_byte'] - self.file_metadata['gcode_start_byte'])) (self.file_metadata['gcode_end_byte'] - self.file_metadata['gcode_start_byte']))
@ -429,11 +410,11 @@ class JobStatusPanel(ScreenPanel):
if progress != self.progress: if progress != self.progress:
self.progress = progress self.progress = progress
self.labels['darea'].queue_draw() self.labels['darea'].queue_draw()
self.update_progress()
self.update_text("duration", str(self._gtk.formatTimeString(ps['print_duration']))) self.update_text("duration", str(self._gtk.formatTimeString(ps['print_duration'])))
timeleft_type = self._config.get_config()['main'].get('print_estimate_method','file') timeleft_type = self._config.get_config()['main'].get('print_estimate_method','file')
if timeleft_type != self.timeleft_type: if timeleft_type != self.timeleft_type:
if self.timeleft_type == "duration": if self.timeleft_type == "duration":
self.labels['it_box'].add(self.labels['est_time']) self.labels['it_box'].add(self.labels['est_time'])
@ -452,11 +433,54 @@ class JobStatusPanel(ScreenPanel):
elif timeleft_type == "slicer": elif timeleft_type == "slicer":
total_duration = (self.file_metadata['estimated_time'] if "estimated_time" in self.file_metadata total_duration = (self.file_metadata['estimated_time'] if "estimated_time" in self.file_metadata
else duration) else duration)
time_left = max(total_duration - duration, 0) time_left = max(total_duration - duration, 0)
self.update_text("time_left", str(self._gtk.formatTimeString(time_left))) self.update_text("time_left", str(self._gtk.formatTimeString(time_left)))
def state_check(self):
ps = self._printer.get_stat("print_stats")
if ps['state'] == self.state:
return True
if ps['state'] == "printing" and self.state != "printing" and self.state != "cancelling":
self.set_state("printing")
elif ps['state'] == "complete" and self.state != "complete":
self.progress = 1
self.update_progress() self.update_progress()
self.set_state("complete")
timeout = self._config.get_main_config().getint("job_complete_timeout", 30)
if timeout != 0:
self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel))
return False
elif ps['state'] == "error" and self.state != "error":
logging.debug("Error!")
self.set_state("error")
self.labels['status'].set_text("%s - %s" % (_("Error"), ps['message']))
timeout = self._config.get_main_config().getint("job_error_timeout", 0)
if timeout != 0:
self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel))
return False
elif ps['state'] == "standby":
# Print was cancelled
self.set_state("cancelled")
timeout = self._config.get_main_config().getint("job_cancelled_timeout", 0)
if timeout != 0:
self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel))
return False
elif ps['state'] == "paused":
self.set_state("paused")
self.show_buttons_for_state()
# TODO: Remove this in the future
if self.filename != ps['filename']:
if ps['filename'] != "":
self.filename = ps['filename']
self.file_metadata = {}
self.update_text("file", self.filename.split("/")[-1])
else:
file = "Unknown"
self.update_text("file", "Unknown file")
return True
def set_state(self, state): def set_state(self, state):
_ = self.lang.gettext _ = self.lang.gettext
@ -464,6 +488,7 @@ class JobStatusPanel(ScreenPanel):
if self.state == state: if self.state == state:
return return
logging.debug("Changing job_status state from '%s' to '%s'" % (self.state, state))
self.state = state self.state = state
if state == "paused": if state == "paused":
self.labels['button_grid'].remove(self.labels['resume']) self.labels['button_grid'].remove(self.labels['resume'])
@ -477,10 +502,13 @@ class JobStatusPanel(ScreenPanel):
self.labels['button_grid'].attach(self.labels['resume'], 0, 0, 1, 1) self.labels['button_grid'].attach(self.labels['resume'], 0, 0, 1, 1)
self.labels['button_grid'].show_all() self.labels['button_grid'].show_all()
self.update_text("status",_("Printing")) self.update_text("status",_("Printing"))
elif state == "cancelling":
self.update_text("status",_("Cancelling"))
elif state == "cancelled": elif state == "cancelled":
self.update_text("status",_("Cancelled")) self.update_text("status",_("Cancelled"))
elif state == "complete": elif state == "complete":
self.update_text("status",_("Complete")) self.update_text("status",_("Complete"))
self.show_buttons_for_state()
def show_buttons_for_state(self): def show_buttons_for_state(self):
@ -496,6 +524,11 @@ class JobStatusPanel(ScreenPanel):
self.labels['button_grid'].attach(self.labels['cancel'], 1, 0, 1, 1) self.labels['button_grid'].attach(self.labels['cancel'], 1, 0, 1, 1)
self.labels['button_grid'].attach(self.labels['fine_tune'], 2, 0, 1, 1) self.labels['button_grid'].attach(self.labels['fine_tune'], 2, 0, 1, 1)
self.labels['button_grid'].attach(self.labels['control'], 3, 0, 1, 1) self.labels['button_grid'].attach(self.labels['control'], 3, 0, 1, 1)
elif self.state == "cancelling":
self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1)
self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1)
self.labels['button_grid'].attach(self.labels['fine_tune'], 2, 0, 1, 1)
self.labels['button_grid'].attach(self.labels['control'], 3, 0, 1, 1)
elif self.state == "error" or self.state == "complete" or self.state == "cancelled": elif self.state == "error" or self.state == "complete" or self.state == "cancelled":
self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1) self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1)
self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1) self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1)

View File

@ -391,7 +391,7 @@ class KlipperScreen(Gtk.Window):
) )
def is_printing(self): def is_printing(self):
return "job_status" in self._cur_panels return self.printer.get_state() == "printing"
def _go_to_submenu(self, widget, name): def _go_to_submenu(self, widget, name):
logging.info("#### Go to submenu " + str(name)) logging.info("#### Go to submenu " + str(name))