diff --git a/panels/job_status.py b/panels/job_status.py index cf344f72..ca245560 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -590,63 +590,58 @@ class Panel(ScreenPanel): def update_time_left(self): total_duration = float(self._printer.get_stat('print_stats', 'total_duration')) print_duration = float(self._printer.get_stat('print_stats', 'print_duration')) - if 'filament_total' in self.file_metadata and not self.file_metadata['filament_total']: # No-extrusion + if not self.file_metadata.get('filament_total'): # No-extrusion print_duration = total_duration fila_used = float(self._printer.get_stat('print_stats', 'filament_used')) progress = float(self._printer.get_stat("virtual_sdcard", "progress")) self.labels["duration"].set_label(self.format_time(total_duration)) elapsed_label = f"{self.labels['elapsed'].get_text()} {self.labels['duration'].get_text()}" self.buttons['elapsed'].set_label(elapsed_label) - estimated = 0 - slicer_time = filament_time = file_time = None + estimated = slicer_time = filament_time = file_time = 0 timeleft_type = self._config.get_config()['main'].get('print_estimate_method', 'auto') with suppress(KeyError): - if self.file_metadata['estimated_time'] > 0: + if self.file_metadata['estimated_time'] > 1: # speed_factor compensation based on empirical testing spdcomp = sqrt(self.speed_factor) slicer_time = ((self.file_metadata['estimated_time']) / spdcomp) - self.labels["slicer_time"].set_label(self.format_time(slicer_time)) + self.labels["slicer_time"].set_label(self.format_time(slicer_time)) with suppress(Exception): - if self.file_metadata['filament_total'] > fila_used: + if self.file_metadata['filament_total'] >= fila_used: filament_time = (print_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_time(filament_time)) with suppress(ZeroDivisionError): file_time = (print_duration / progress) - self.labels["file_time"].set_label(self.format_time(file_time)) + self.labels["file_time"].set_label(self.format_time(file_time)) if timeleft_type == "file": estimated = file_time elif timeleft_type == "filament": estimated = filament_time - elif slicer_time is not None: - if timeleft_type == "slicer": - estimated = slicer_time - elif filament_time is not None and progress > 0.14: - # Weighted arithmetic mean (Slicer is the most accurate) - estimated = (slicer_time * 3 + filament_time + file_time) / 5 - else: - # At the begining file and filament are innacurate - estimated = slicer_time - - if estimated < 1: - if file_time is None: - return - elif filament_time is not None and filament_time > 1: + elif timeleft_type == "slicer": + estimated = slicer_time + elif estimated < 1: # Auto + if slicer_time > 1: + if progress < 0.15: + # At the begining file and filament are innacurate + estimated = slicer_time + elif filament_time > 1 and file_time > 1: + # Weighted arithmetic mean (Slicer is the most accurate) + estimated = (slicer_time * 3 + filament_time + file_time) / 5 + elif file_time > 1: + # Weighted arithmetic mean (Slicer is the most accurate) + estimated = (slicer_time * 2 + file_time) / 3 + elif filament_time > 1 and file_time > 1: estimated = (filament_time + file_time) / 2 - estimated = file_time - if estimated < 1: - return - progress = min(max(print_duration / estimated, 0), 1) - if progress >= 1: - estimated = file_time + elif file_time > 1: + estimated = file_time + if estimated > 1: progress = min(max(print_duration / estimated, 0), 1) - - self.labels["est_time"].set_label(self.format_time(estimated)) - self.labels["time_left"].set_label(self.format_eta(estimated, print_duration)) - remaining_label = f"{self.labels['left'].get_text()} {self.labels['time_left'].get_text()}" - self.buttons['left'].set_label(remaining_label) + self.labels["est_time"].set_label(self.format_time(estimated)) + self.labels["time_left"].set_label(self.format_eta(estimated, print_duration)) + remaining_label = f"{self.labels['left'].get_text()} {self.labels['time_left'].get_text()}" + self.buttons['left'].set_label(remaining_label) self.update_progress(progress) def update_progress(self, progress: float):