Files
chromebox-fan-control-win/ChromeboxFanControl/CpuTempReader.cs
2026-04-02 18:32:43 +08:00

103 lines
2.7 KiB
C#

using LibreHardwareMonitor.Hardware;
namespace ChromeboxFanControl;
public enum CpuTempAggregation
{
AverageCore,
MaxCore
}
/// <summary>
/// CPU temperature via LibreHardwareMonitor only (no fan sensors).
/// </summary>
public sealed class CpuTempReader : IDisposable
{
private readonly Computer _computer = new()
{
IsCpuEnabled = true,
IsMotherboardEnabled = true
};
private bool _open;
public CpuTempReader()
{
_computer.Open();
_open = true;
}
public void Dispose()
{
if (!_open)
return;
_computer.Close();
_open = false;
}
/// <summary>Returns null if no reading available.</summary>
public double? ReadCpuTemp(CpuTempAggregation mode)
{
foreach (var hw in _computer.Hardware)
{
hw.Update();
foreach (var sh in hw.SubHardware)
sh.Update();
}
var coreTemps = new List<double>();
foreach (var hw in _computer.Hardware)
{
CollectCoreTemps(hw, coreTemps);
foreach (var sh in hw.SubHardware)
CollectCoreTemps(sh, coreTemps);
}
if (coreTemps.Count > 0)
{
return mode == CpuTempAggregation.MaxCore
? coreTemps.Max()
: coreTemps.Average();
}
// Fallback: any CPU temperature sensor
var any = new List<double>();
foreach (var hw in _computer.Hardware)
{
CollectAnyCpuTemp(hw, any);
foreach (var sh in hw.SubHardware)
CollectAnyCpuTemp(sh, any);
}
if (any.Count == 0)
return null;
return mode == CpuTempAggregation.MaxCore ? any.Max() : any.Average();
}
private static readonly string[] CoreTempPatterns =
[
"Core", "Package", "Tctl", "Tdie", "CCD", "CPU Package",
"Core Average", "Core Max", "Core #"
];
private static void CollectCoreTemps(IHardware hw, List<double> list)
{
foreach (var s in hw.Sensors)
{
if (s.SensorType != SensorType.Temperature || !s.Value.HasValue)
continue;
var name = s.Name;
if (CoreTempPatterns.Any(p => name.Contains(p, StringComparison.OrdinalIgnoreCase)))
list.Add(s.Value.Value);
}
}
private static void CollectAnyCpuTemp(IHardware hw, List<double> list)
{
foreach (var s in hw.Sensors)
{
if (s.SensorType == SensorType.Temperature && s.Value.HasValue)
list.Add(s.Value.Value);
}
}
}