diff --git a/.bin/Scripts/functions/hw_diags.py b/.bin/Scripts/functions/hw_diags.py index 1a5bed02..8673e7f8 100644 --- a/.bin/Scripts/functions/hw_diags.py +++ b/.bin/Scripts/functions/hw_diags.py @@ -1322,6 +1322,7 @@ def run_mprime_test(state, test): test.update_status() update_progress_pane(state) test.sensor_data = get_sensor_data() + test.thermal_abort = False # Update tmux layout tmux_update_pane( @@ -1363,6 +1364,7 @@ def run_mprime_test(state, test): command=['hw-diags-prime95', global_vars['TmpDir']], working_dir=global_vars['TmpDir']) time_limit = int(MPRIME_LIMIT) * 60 + thermal_limit = int(THERMAL_LIMIT) try: for i in range(time_limit): clear_screen() @@ -1379,15 +1381,19 @@ def run_mprime_test(state, test): # Not using print wrappers to avoid flooding the log print(_status_str) print('{YELLOW}{msg}{CLEAR}'.format(msg=test.abort_msg, **COLORS)) - update_sensor_data(test.sensor_data) + update_sensor_data(test.sensor_data, thermal_limit) # Wait sleep(1) - except KeyboardInterrupt: - # Catch CTRL+C + except (KeyboardInterrupt, ThermalLimitReachedError) as err: + # CTRL+c pressed or thermal limit reached test.aborted = True - test.update_status('Aborted') - print_warning('\nAborted.') + if isinstance(err, KeyboardInterrupt): + test.update_status('Aborted') + elif isinstance(err, ThermalLimitReachedError): + test.failed = True + test.thermal_abort = True + test.update_status('NS') update_progress_pane(state) # Restart live monitor @@ -1488,6 +1494,16 @@ def run_mprime_test(state, test): test.sensor_data, 'Idle', 'Max', 'Cooldown', core_only=True): test.report.append(' {}'.format(line)) + # Add abort message(s) + if test.aborted: + test.report.append( + ' {YELLOW}Aborted{CLEAR}'.format(**COLORS)) + if test.thermal_abort: + test.report.append( + ' {RED}CPU reached temperature limit of {temp}°C{CLEAR}'.format( + temp=THERMAL_LIMIT, + **COLORS)) + # Done update_progress_pane(state) diff --git a/.bin/Scripts/functions/sensors.py b/.bin/Scripts/functions/sensors.py index 7a470703..e2676fca 100644 --- a/.bin/Scripts/functions/sensors.py +++ b/.bin/Scripts/functions/sensors.py @@ -19,6 +19,11 @@ TEMP_LIMITS = { REGEX_COLORS = re.compile(r'\033\[\d+;?1?m') +# Error Classes +class ThermalLimitReachedError(Exception): + pass + + def clear_temps(sensor_data): """Clear saved temps but keep structure, returns dict.""" for _section, _adapters in sensor_data.items(): @@ -214,7 +219,7 @@ def save_average_temp(sensor_data, temp_label, seconds=10): _data[temp_label] = sum(_data['Temps']) / len(_data['Temps']) -def update_sensor_data(sensor_data): +def update_sensor_data(sensor_data, thermal_limit=None): """Read sensors and update existing sensor_data, returns dict.""" json_data = get_raw_sensor_data() for _section, _adapters in sensor_data.items(): @@ -230,6 +235,11 @@ def update_sensor_data(sensor_data): # Dumb workound for Dell sensors with changing source names pass + # Check if thermal limit reached + if thermal_limit and _section == 'CoreTemps': + if max(_data['Current'], _data['Max']) >= thermal_limit: + raise ThermalLimitReachedError('CoreTemps reached limit') + def join_columns(column1, column2, width=55): return '{:<{}}{}'.format( diff --git a/.bin/Scripts/settings/main.py b/.bin/Scripts/settings/main.py index 5869580b..20febc86 100644 --- a/.bin/Scripts/settings/main.py +++ b/.bin/Scripts/settings/main.py @@ -18,6 +18,7 @@ SUPPORT_MESSAGE='Please let support know by opening an issue on Gogs' IMGUR_CLIENT_ID='3d1ee1d38707b85' # Live Linux MPRIME_LIMIT='7' # of minutes to run Prime95 during hw-diags +THERMAL_LIMIT='95' # Prime95 abort temperature in Celsius ROOT_PASSWORD='1201 loves computers!' TECH_PASSWORD='Sorted1201' # Root Certificate Authority