Now fetching some of our Sound Graph DLL function pointers.
3 This Source Code Form is subject to the terms of the Mozilla Public
4 License, v. 2.0. If a copy of the MPL was not distributed with this
5 file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
11 using System.Collections.Generic;
12 using System.Globalization;
16 namespace OpenHardwareMonitor.Hardware.LPC {
18 internal class LMSensors {
20 private readonly List<LMChip> lmChips = new List<LMChip>();
23 string[] basePaths = Directory.GetDirectories("/sys/class/hwmon/");
24 foreach (string basePath in basePaths) {
25 foreach (string devicePath in new[] { "/device", "" }) {
26 string path = basePath + devicePath;
30 using (StreamReader reader = new StreamReader(path + "/name"))
31 name = reader.ReadLine();
32 } catch (IOException) { }
36 lmChips.Add(new LMChip(Chip.ATK0110, path)); break;
39 lmChips.Add(new LMChip(Chip.F71858, path)); break;
41 lmChips.Add(new LMChip(Chip.F71862, path)); break;
43 lmChips.Add(new LMChip(Chip.F71869, path)); break;
45 lmChips.Add(new LMChip(Chip.F71882, path)); break;
47 lmChips.Add(new LMChip(Chip.F71889AD, path)); break;
49 lmChips.Add(new LMChip(Chip.F71889ED, path)); break;
51 lmChips.Add(new LMChip(Chip.F71889F, path)); break;
53 lmChips.Add(new LMChip(Chip.F71808E, path)); break;
56 lmChips.Add(new LMChip(Chip.IT8705F, path)); break;
58 lmChips.Add(new LMChip(Chip.IT8712F, path)); break;
60 lmChips.Add(new LMChip(Chip.IT8716F, path)); break;
62 lmChips.Add(new LMChip(Chip.IT8718F, path)); break;
64 lmChips.Add(new LMChip(Chip.IT8720F, path)); break;
67 lmChips.Add(new LMChip(Chip.W83627EHF, path)); break;
69 lmChips.Add(new LMChip(Chip.W83627DHG, path)); break;
71 lmChips.Add(new LMChip(Chip.W83667HG, path)); break;
73 lmChips.Add(new LMChip(Chip.W83627HF, path)); break;
75 lmChips.Add(new LMChip(Chip.W83627THF, path)); break;
77 lmChips.Add(new LMChip(Chip.W83687THF, path)); break;
84 foreach (LMChip lmChip in lmChips)
88 public ISuperIO[] SuperIO {
90 return lmChips.ToArray();
94 private class LMChip : ISuperIO {
97 private readonly Chip chip;
99 private readonly float?[] voltages;
100 private readonly float?[] temperatures;
101 private readonly float?[] fans;
102 private readonly float?[] controls;
104 private readonly FileStream[] voltageStreams;
105 private readonly FileStream[] temperatureStreams;
106 private readonly FileStream[] fanStreams;
108 public Chip Chip { get { return chip; } }
109 public float?[] Voltages { get { return voltages; } }
110 public float?[] Temperatures { get { return temperatures; } }
111 public float?[] Fans { get { return fans; } }
112 public float?[] Controls { get { return controls; } }
114 public LMChip(Chip chip, string path) {
118 string[] voltagePaths = Directory.GetFiles(path, "in*_input");
119 this.voltages = new float?[voltagePaths.Length];
120 this.voltageStreams = new FileStream[voltagePaths.Length];
121 for (int i = 0; i < voltagePaths.Length; i++)
122 voltageStreams[i] = new FileStream(voltagePaths[i],
123 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
125 string[] temperaturePaths = Directory.GetFiles(path, "temp*_input");
126 this.temperatures = new float?[temperaturePaths.Length];
127 this.temperatureStreams = new FileStream[temperaturePaths.Length];
128 for (int i = 0; i < temperaturePaths.Length; i++)
129 temperatureStreams[i] = new FileStream(temperaturePaths[i],
130 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
132 string[] fanPaths = Directory.GetFiles(path, "fan*_input");
133 this.fans = new float?[fanPaths.Length];
134 this.fanStreams = new FileStream[fanPaths.Length];
135 for (int i = 0; i < fanPaths.Length; i++)
136 fanStreams[i] = new FileStream(fanPaths[i],
137 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
139 this.controls = new float?[0];
142 public byte? ReadGPIO(int index) {
146 public void WriteGPIO(int index, byte value) { }
148 public string GetReport() {
152 public void SetControl(int index, byte? value) { }
154 private string ReadFirstLine(Stream stream) {
155 StringBuilder sb = new StringBuilder();
157 stream.Seek(0, SeekOrigin.Begin);
158 int b = stream.ReadByte();
159 while (b != -1 && b != 10) {
161 b = stream.ReadByte();
164 return sb.ToString();
167 public void Update() {
168 for (int i = 0; i < voltages.Length; i++) {
169 string s = ReadFirstLine(voltageStreams[i]);
171 voltages[i] = 0.001f *
172 long.Parse(s, CultureInfo.InvariantCulture);
178 for (int i = 0; i < temperatures.Length; i++) {
179 string s = ReadFirstLine(temperatureStreams[i]);
181 temperatures[i] = 0.001f *
182 long.Parse(s, CultureInfo.InvariantCulture);
184 temperatures[i] = null;
188 for (int i = 0; i < fans.Length; i++) {
189 string s = ReadFirstLine(fanStreams[i]);
191 fans[i] = long.Parse(s, CultureInfo.InvariantCulture);
198 public void Close() {
199 foreach (FileStream stream in voltageStreams)
201 foreach (FileStream stream in temperatureStreams)
203 foreach (FileStream stream in fanStreams)