forked from TBSniller/cmpinf
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHardwareReader.cs
More file actions
104 lines (97 loc) · 3.36 KB
/
HardwareReader.cs
File metadata and controls
104 lines (97 loc) · 3.36 KB
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
using System;
using System.Collections.Generic;
using System.IO;
using LibreHardwareMonitor.Hardware;
using Newtonsoft.Json;
public class HardwareReader
{
private readonly Computer _computer;
public List<(string Name, string Hardware, string Type)> AllSensors { get; } = new();
public HardwareReader()
{
_computer = new Computer
{
IsCpuEnabled = true,
IsGpuEnabled = true,
IsMotherboardEnabled = true,
IsMemoryEnabled = true,
IsControllerEnabled = true,
IsNetworkEnabled = true,
IsStorageEnabled = true
};
_computer.Open();
ScanAllSensors();
}
private void ScanAllSensors()
{
AllSensors.Clear();
foreach (var hardware in _computer.Hardware)
{
hardware.Update();
foreach (var sensor in hardware.Sensors)
{
AllSensors.Add((sensor.Name, hardware.HardwareType.ToString(), sensor.SensorType.ToString()));
}
}
}
public void ExportSensors(string path)
{
var export = AllSensors.Select(s => new { Name = s.Name, Hardware = s.Hardware, Type = s.Type }).ToList();
File.WriteAllText(path, JsonConvert.SerializeObject(export, Formatting.Indented));
}
public Dictionary<string, float> GetSensorValues(List<SensorSelection> selected)
{
var result = new Dictionary<string, float>(StringComparer.OrdinalIgnoreCase);
// Update hardware only once per tick
foreach (var hardware in _computer.Hardware)
{
UpdateRecursive(hardware);
}
// Only search for relevant sensors for performance
foreach (var sel in selected)
{
foreach (var hardware in _computer.Hardware)
{
var key = sel.GetContextFrameKey();
if (result.ContainsKey(key)) continue;
try
{
FindSensorRecursive(hardware, sel, result);
}
catch (Exception ex)
{
Log.Warn($"Sensor '{sel.Name}' could not be read. The program may need to be run as administrator. Error: {ex.Message}");
}
}
}
return result;
}
private void UpdateRecursive(IHardware hardware)
{
hardware.Update();
foreach (var sub in hardware.SubHardware)
UpdateRecursive(sub);
}
private void FindSensorRecursive(IHardware hardware, SensorSelection sel, Dictionary<string, float> result)
{
var key = sel.GetContextFrameKey();
if (result.ContainsKey(key))
return;
foreach (var sensor in hardware.Sensors)
{
if (string.Equals(sensor.Name, sel.Name, StringComparison.OrdinalIgnoreCase)
&& string.Equals(hardware.HardwareType.ToString(), sel.Hardware, StringComparison.OrdinalIgnoreCase)
&& string.Equals(sensor.SensorType.ToString(), sel.Type, StringComparison.OrdinalIgnoreCase)
&& sensor.Value.HasValue)
{
result[key] = sensor.Value.Value;
return;
}
}
foreach (var sub in hardware.SubHardware)
{
if (result.ContainsKey(key)) return;
FindSensorRecursive(sub, sel, result);
}
}
}