diff --git a/scripts/wk/hw/cpu.py b/scripts/wk/hw/cpu.py index c28a6f67..74708d60 100644 --- a/scripts/wk/hw/cpu.py +++ b/scripts/wk/hw/cpu.py @@ -68,16 +68,20 @@ def check_cooling_results(sensors, test_object) -> None: # Build report report_labels = ['Idle'] + average_labels = [] if 'Sysbench' in sensors.temp_labels: + average_labels.append('Sysbench') report_labels.extend(['Sysbench', 'Cooldown']) if 'Prime95' in sensors.temp_labels: + average_labels.append('Prime95') report_labels.append('Prime95') if 'Cooldown' not in report_labels: report_labels.append('Cooldown') if len(sensors.temp_labels.intersection(['Prime95', 'Sysbench'])) < 1: # Include overall max temp if needed report_labels.append('Max') - for line in sensors.generate_report(*report_labels, only_cpu=True): + for line in sensors.generate_report( + *report_labels, only_cpu=True, include_avg_for=average_labels): test_object.report.append(f' {line}') diff --git a/scripts/wk/hw/sensors.py b/scripts/wk/hw/sensors.py index eb0098f3..00d5d33f 100644 --- a/scripts/wk/hw/sensors.py +++ b/scripts/wk/hw/sensors.py @@ -42,8 +42,9 @@ class Sensors(): self.background_thread: Thread | None = None self.data: dict[Any, Any] = get_sensor_data() self.history: list[tuple[str, dict]] = [] - self.out_path: pathlib.Path | str | None = None + self.history_index: dict[str, int] = {} self.history_next_label: str = 'Idle' + self.out_path: pathlib.Path | str | None = None self.temp_labels: set = set(['Current', 'Max']) def clear_temps(self, next_label: str, save_history: bool = True) -> None: @@ -53,7 +54,22 @@ class Sensors(): # Save history if save_history: - self.history.append((prev_label, deepcopy(self.data))) + cur_data = deepcopy(self.data) + + # Calculate averages + for adapters in cur_data.values(): + for sources in adapters.values(): + for name in sources: + temp_list = sources[name]['Temps'] + try: + sources[name]['Average'] = sum(temp_list) / len(temp_list) + except ZeroDivisionError: + LOG.error('Failed to calculate averate temp for %s', name) + sources[name]['Average'] = 0 + + # Add to history + self.history.append((prev_label, cur_data)) + self.history_index[prev_label] = len(self.history) - 1 # Clear data for adapters in self.data.values(): @@ -78,9 +94,15 @@ class Sensors(): return False def generate_report( - self, *temp_labels, colored=True, only_cpu=False) -> list[str]: + self, + *temp_labels: str, + colored: bool = True, + only_cpu: bool = False, + include_avg_for: list[str] | None = None, + ) -> list[str]: """Generate report based on given temp_labels, returns list.""" report = [] + include_avg_for = include_avg_for if include_avg_for else [] for section, adapters in sorted(self.data.items()): if only_cpu and not section.startswith('CPU'): @@ -94,6 +116,10 @@ class Sensors(): for label in temp_labels: if label != 'Current': line += f' {label.lower()}: ' + if label in include_avg_for: + avg_temp = self.get_avg_temp( + label, section, adapter, source, colored) + line += f'{avg_temp} / ' line += get_temp_str( source_data.get(label, '???'), colored=colored, @@ -113,6 +139,13 @@ class Sensors(): # Done return report + def get_avg_temp(self, label, section, adapter, source, colored) -> str: + """Get average temp from history, return str.""" + # NOTE: This is Super-ugly + label_index = self.history_index[label] + avg_temp = self.history[label_index][1][section][adapter][source]['Average'] + return get_temp_str(avg_temp, colored=colored) + def get_cpu_temp(self, label) -> float: """Get temp for label from any CPU source, returns float.