-
-
Notifications
You must be signed in to change notification settings - Fork 28
/
HWInfoPlugin.cs
114 lines (98 loc) · 3.3 KB
/
HWInfoPlugin.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.Linq;
using FanControl.Plugins;
namespace FanControl.HWInfo
{
public class HWInfoPlugin : IPlugin2
{
private readonly IPluginLogger _logger;
private readonly IPluginDialog _dialog;
public HWInfoPlugin(IPluginLogger logger, IPluginDialog dialog)
{
_logger = logger;
_dialog = dialog;
}
public string Name => "HWInfo";
public void Initialize()
{
_hwInfoRegistry = new HWInfoRegistry();
if (!_hwInfoRegistry.IsActive())
{
Close();
throw new Exception("HWInfo is not running or reporting to gadget is not enabled.");
}
}
public void Close()
{
_updateFailCount = 0;
foreach (var sensor in _sensors)
{
sensor.Invalidate();
sensor.Value = null;
}
_sensors = Array.Empty<HWInfoPluginSensor>();
_hwInfoRegistry?.Dispose();
if (_wentMissing.Any())
{
var missingSensors = string.Join(Environment.NewLine, _wentMissing);
_logger.Log($"HWInfo sensor failed momentarily during operation: {missingSensors}");
}
_wentMissing.Clear();
}
public void Load(IPluginSensorsContainer container)
{
if (!_hwInfoRegistry.IsActive()) return;
using (var hwinfo = new HWInfoRegistry())
{
_sensors = hwinfo.GetSensors();
foreach (var sensor in _sensors)
{
switch (sensor.Type)
{
case HwInfoSensorType.Temperature:
container.TempSensors.Add(sensor);
break;
case HwInfoSensorType.RPM:
container.FanSensors.Add(sensor);
break;
}
}
}
}
public void Update()
{
if (_sensors.Length == 0) return;
if (!_hwInfoRegistry.IsActive())
{
Close();
throw new Exception("HWInfo was closed during operation.");
}
HWInfoRegistryUpdateResult result = _hwInfoRegistry.UpdateValues(_sensors);
if (!result.IsSuccess)
{
var ids = String.Join(", ", result.MissingSensors.Select(x => x.Id));
if (++_updateFailCount >= 10)
{
Close();
throw new Exception($"HWInfo sensors failed: {ids}");
}
else
{
foreach (var sensor in result.MissingSensors)
{
_wentMissing.Add(sensor.ToString());
}
}
}
else
{
_updateFailCount = 0;
}
}
private HWInfoPluginSensor[] _sensors = Array.Empty<HWInfoPluginSensor>();
private HashSet<string> _wentMissing = new HashSet<string>();
private HWInfoRegistry _hwInfoRegistry;
private int _updateFailCount = 0;
}
}