From d8b4d2d2936204554ad6c47410a2d3c33a20de1b Mon Sep 17 00:00:00 2001 From: alfrix Date: Fri, 25 Nov 2022 18:22:36 -0300 Subject: [PATCH] job_status: add eta --- ks_includes/screen_panel.py | 19 +++++++++++++++++-- panels/job_status.py | 16 +++++++++------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index 3c64e30f..7b2327f8 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -1,5 +1,5 @@ import logging - +import datetime import gi gi.require_version("Gtk", "3.0") @@ -128,7 +128,6 @@ class ScreenPanel: def format_time(seconds): if seconds is None or seconds <= 0: return "-" - seconds = int(seconds) days = seconds // 86400 seconds %= 86400 hours = seconds // 3600 @@ -140,6 +139,22 @@ class ScreenPanel: f"{f'{minutes:2.0f}m ' if minutes > 0 else ''}" \ f"{f'{seconds:2.0f}s' if days == 0 and hours == 0 and minutes == 0 else ''}" + def format_eta(self, total, elapsed): + if total is None: + return "-" + seconds = total - elapsed + if seconds <= 0: + return "-" + days = seconds // 86400 + seconds %= 86400 + hours = seconds // 3600 + seconds %= 3600 + minutes = seconds // 60 + eta = datetime.datetime.now() + datetime.timedelta(days=days, hours=hours, minutes=minutes) + if self._config.get_main_config().getboolean("24htime", True): + return f"{self.format_time(total - elapsed)} | {eta:%H:%M} {f' +{days:2.0f}d' if days > 0 else ''}" + return f"{self.format_time(total - elapsed)} | {eta:%I:%M %p} {f' +{days:2.0f}d' if days > 0 else ''}" + @staticmethod def format_size(size): size = float(size) diff --git a/panels/job_status.py b/panels/job_status.py index 5fcb3f92..0dc9fe5f 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -630,6 +630,7 @@ class JobStatusPanel(ScreenPanel): return True def update_time_left(self, duration=0, fila_used=0): + self.labels["duration"].set_label(self.format_time(duration)) total_duration = None if self.progress < 1: slicer_time = filament_time = file_time = None @@ -641,16 +642,16 @@ class JobStatusPanel(ScreenPanel): # speed_factor compensation based on empirical testing spdcomp = sqrt(self.speed_factor) slicer_time = (self.file_metadata['estimated_time'] * usrcomp) / spdcomp - self.labels["slicer_time"].set_label(self.format_time(slicer_time)) + self.labels["slicer_time"].set_label(self.format_eta(slicer_time, duration)) with contextlib.suppress(Exception): if self.file_metadata['filament_total'] > fila_used: filament_time = duration / (fila_used / self.file_metadata['filament_total']) - self.labels["filament_time"].set_label(self.format_time(filament_time)) + self.labels["filament_time"].set_label(self.format_eta(filament_time, duration)) with contextlib.suppress(ZeroDivisionError): file_time = duration / self.progress - self.labels["file_time"].set_label(self.format_time(file_time)) + self.labels["file_time"].set_label(self.format_eta(file_time, duration)) if timeleft_type == "file": total_duration = file_time @@ -670,10 +671,11 @@ class JobStatusPanel(ScreenPanel): total_duration = (filament_time + file_time) / 2 else: total_duration = file_time - self.labels["duration"].set_label(self.format_time(duration)) - self.labels["est_time"].set_label(self.format_time(total_duration)) - if total_duration is not None: - self.labels["time_left"].set_label(self.format_time(total_duration - duration)) + self.labels["est_time"].set_label(self.format_eta(total_duration, duration)) + self.labels["time_left"].set_label(self.format_eta(total_duration, duration)) + else: + self.labels["est_time"].set_label("-") + self.labels["time_left"].set_label("-") def state_check(self): ps = self._printer.get_stat("print_stats")