job_status: refactor the estimation code
fixes no-extrusion cases, and some edge cases
This commit is contained in:
parent
6df55f4570
commit
c6a91a1562
@ -590,63 +590,58 @@ class Panel(ScreenPanel):
|
|||||||
def update_time_left(self):
|
def update_time_left(self):
|
||||||
total_duration = float(self._printer.get_stat('print_stats', 'total_duration'))
|
total_duration = float(self._printer.get_stat('print_stats', 'total_duration'))
|
||||||
print_duration = float(self._printer.get_stat('print_stats', 'print_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
|
print_duration = total_duration
|
||||||
fila_used = float(self._printer.get_stat('print_stats', 'filament_used'))
|
fila_used = float(self._printer.get_stat('print_stats', 'filament_used'))
|
||||||
progress = float(self._printer.get_stat("virtual_sdcard", "progress"))
|
progress = float(self._printer.get_stat("virtual_sdcard", "progress"))
|
||||||
self.labels["duration"].set_label(self.format_time(total_duration))
|
self.labels["duration"].set_label(self.format_time(total_duration))
|
||||||
elapsed_label = f"{self.labels['elapsed'].get_text()} {self.labels['duration'].get_text()}"
|
elapsed_label = f"{self.labels['elapsed'].get_text()} {self.labels['duration'].get_text()}"
|
||||||
self.buttons['elapsed'].set_label(elapsed_label)
|
self.buttons['elapsed'].set_label(elapsed_label)
|
||||||
estimated = 0
|
estimated = slicer_time = filament_time = file_time = 0
|
||||||
slicer_time = filament_time = file_time = None
|
|
||||||
timeleft_type = self._config.get_config()['main'].get('print_estimate_method', 'auto')
|
timeleft_type = self._config.get_config()['main'].get('print_estimate_method', 'auto')
|
||||||
|
|
||||||
with suppress(KeyError):
|
with suppress(KeyError):
|
||||||
if self.file_metadata['estimated_time'] > 0:
|
if self.file_metadata['estimated_time'] > 1:
|
||||||
# speed_factor compensation based on empirical testing
|
# speed_factor compensation based on empirical testing
|
||||||
spdcomp = sqrt(self.speed_factor)
|
spdcomp = sqrt(self.speed_factor)
|
||||||
slicer_time = ((self.file_metadata['estimated_time']) / spdcomp)
|
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):
|
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']))
|
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):
|
with suppress(ZeroDivisionError):
|
||||||
file_time = (print_duration / progress)
|
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":
|
if timeleft_type == "file":
|
||||||
estimated = file_time
|
estimated = file_time
|
||||||
elif timeleft_type == "filament":
|
elif timeleft_type == "filament":
|
||||||
estimated = filament_time
|
estimated = filament_time
|
||||||
elif slicer_time is not None:
|
elif timeleft_type == "slicer":
|
||||||
if timeleft_type == "slicer":
|
estimated = slicer_time
|
||||||
estimated = slicer_time
|
elif estimated < 1: # Auto
|
||||||
elif filament_time is not None and progress > 0.14:
|
if slicer_time > 1:
|
||||||
# Weighted arithmetic mean (Slicer is the most accurate)
|
if progress < 0.15:
|
||||||
estimated = (slicer_time * 3 + filament_time + file_time) / 5
|
# At the begining file and filament are innacurate
|
||||||
else:
|
estimated = slicer_time
|
||||||
# At the begining file and filament are innacurate
|
elif filament_time > 1 and file_time > 1:
|
||||||
estimated = slicer_time
|
# Weighted arithmetic mean (Slicer is the most accurate)
|
||||||
|
estimated = (slicer_time * 3 + filament_time + file_time) / 5
|
||||||
if estimated < 1:
|
elif file_time > 1:
|
||||||
if file_time is None:
|
# Weighted arithmetic mean (Slicer is the most accurate)
|
||||||
return
|
estimated = (slicer_time * 2 + file_time) / 3
|
||||||
elif filament_time is not None and filament_time > 1:
|
elif filament_time > 1 and file_time > 1:
|
||||||
estimated = (filament_time + file_time) / 2
|
estimated = (filament_time + file_time) / 2
|
||||||
estimated = file_time
|
elif file_time > 1:
|
||||||
if estimated < 1:
|
estimated = file_time
|
||||||
return
|
if estimated > 1:
|
||||||
progress = min(max(print_duration / estimated, 0), 1)
|
|
||||||
if progress >= 1:
|
|
||||||
estimated = file_time
|
|
||||||
progress = min(max(print_duration / estimated, 0), 1)
|
progress = min(max(print_duration / estimated, 0), 1)
|
||||||
|
self.labels["est_time"].set_label(self.format_time(estimated))
|
||||||
self.labels["est_time"].set_label(self.format_time(estimated))
|
self.labels["time_left"].set_label(self.format_eta(estimated, print_duration))
|
||||||
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()}"
|
||||||
remaining_label = f"{self.labels['left'].get_text()} {self.labels['time_left'].get_text()}"
|
self.buttons['left'].set_label(remaining_label)
|
||||||
self.buttons['left'].set_label(remaining_label)
|
|
||||||
self.update_progress(progress)
|
self.update_progress(progress)
|
||||||
|
|
||||||
def update_progress(self, progress: float):
|
def update_progress(self, progress: float):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user