mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
89 lines
2.6 KiB
C#
89 lines
2.6 KiB
C#
using System.Diagnostics;
|
|
using GHelper.Gpu;
|
|
|
|
public class HardwareMonitor
|
|
{
|
|
private static IGpuTemperatureProvider? GpuTemperatureProvider;
|
|
|
|
public static float? cpuTemp = -1;
|
|
public static float? batteryDischarge = -1;
|
|
public static int? gpuTemp = null;
|
|
|
|
public static void ReadSensors()
|
|
{
|
|
cpuTemp = -1;
|
|
batteryDischarge = -1;
|
|
|
|
try
|
|
{
|
|
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
|
|
cpuTemp = ct.NextValue() - 273;
|
|
ct.Dispose();
|
|
}
|
|
catch
|
|
{
|
|
Logger.WriteLine("Failed reading CPU temp");
|
|
}
|
|
|
|
try
|
|
{
|
|
var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
|
|
batteryDischarge = cb.NextValue() / 1000;
|
|
cb.Dispose();
|
|
|
|
}
|
|
catch
|
|
{
|
|
Logger.WriteLine("Failed reading Battery discharge");
|
|
}
|
|
|
|
try
|
|
{
|
|
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
|
|
} catch (Exception ex) {
|
|
gpuTemp = null;
|
|
Logger.WriteLine("Failed reading GPU temp");
|
|
Logger.WriteLine(ex.ToString());
|
|
}
|
|
|
|
}
|
|
|
|
public static void RecreateGpuTemperatureProviderWithRetry() {
|
|
RecreateGpuTemperatureProvider();
|
|
|
|
// Re-enabling the discrete GPU takes a bit of time,
|
|
// so a simple workaround is to refresh again after that happens
|
|
Task.Run(async () => {
|
|
await Task.Delay(TimeSpan.FromSeconds(3));
|
|
RecreateGpuTemperatureProvider();
|
|
});
|
|
}
|
|
|
|
public static void RecreateGpuTemperatureProvider() {
|
|
try {
|
|
GpuTemperatureProvider?.Dispose();
|
|
|
|
// Detect valid GPU temperature provider.
|
|
// We start with NVIDIA because there's always at least an integrated AMD GPU
|
|
IGpuTemperatureProvider gpuTemperatureProvider = new NvidiaGpuTemperatureProvider();
|
|
if (gpuTemperatureProvider.IsValid) {
|
|
GpuTemperatureProvider = gpuTemperatureProvider;
|
|
return;
|
|
}
|
|
|
|
gpuTemperatureProvider.Dispose();
|
|
gpuTemperatureProvider = new AmdGpuTemperatureProvider();
|
|
if (gpuTemperatureProvider.IsValid) {
|
|
GpuTemperatureProvider = gpuTemperatureProvider;
|
|
return;
|
|
}
|
|
|
|
gpuTemperatureProvider.Dispose();
|
|
|
|
GpuTemperatureProvider = null;
|
|
} finally {
|
|
Logger.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}");
|
|
}
|
|
}
|
|
}
|