Added experimental support for Nuvoton NCT6779D super I/O chips.
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-2011 Michael Möller <mmoeller@openhardwaremonitor.org>
12 using System.Collections.Generic;
13 using System.Globalization;
15 using System.IO.Compression;
16 using OpenHardwareMonitor.Collections;
18 namespace OpenHardwareMonitor.Hardware {
20 internal class Sensor : ISensor {
22 private readonly string defaultName;
24 private readonly int index;
25 private readonly bool defaultHidden;
26 private readonly SensorType sensorType;
27 private readonly Hardware hardware;
28 private readonly ReadOnlyArray<IParameter> parameters;
29 private float? currentValue;
30 private float? minValue;
31 private float? maxValue;
32 private readonly RingCollection<SensorValue>
33 values = new RingCollection<SensorValue>();
34 private readonly ISettings settings;
35 private IControl control;
40 public Sensor(string name, int index, SensorType sensorType,
41 Hardware hardware, ISettings settings) :
42 this(name, index, sensorType, hardware, null, settings) { }
44 public Sensor(string name, int index, SensorType sensorType,
45 Hardware hardware, ParameterDescription[] parameterDescriptions,
47 this(name, index, false, sensorType, hardware,
48 parameterDescriptions, settings) { }
50 public Sensor(string name, int index, bool defaultHidden,
51 SensorType sensorType, Hardware hardware,
52 ParameterDescription[] parameterDescriptions, ISettings settings)
55 this.defaultHidden = defaultHidden;
56 this.sensorType = sensorType;
57 this.hardware = hardware;
58 Parameter[] parameters = new Parameter[parameterDescriptions == null ?
59 0 : parameterDescriptions.Length];
60 for (int i = 0; i < parameters.Length; i++ )
61 parameters[i] = new Parameter(parameterDescriptions[i], this, settings);
62 this.parameters = parameters;
64 this.settings = settings;
65 this.defaultName = name;
66 this.name = settings.GetValue(
67 new Identifier(Identifier, "name").ToString(), name);
69 GetSensorValuesFromSettings();
71 hardware.Closing += delegate(IHardware h) {
72 SetSensorValuesToSettings();
76 private void SetSensorValuesToSettings() {
77 using (MemoryStream m = new MemoryStream()) {
78 using (GZipStream c = new GZipStream(m, CompressionMode.Compress))
79 using (BinaryWriter writer = new BinaryWriter(c)) {
80 foreach (SensorValue sensorValue in values) {
81 writer.Write(sensorValue.Time.ToBinary());
82 writer.Write(sensorValue.Value);
85 settings.SetValue(new Identifier(Identifier, "values").ToString(),
86 Convert.ToBase64String(m.ToArray()));
90 private void GetSensorValuesFromSettings() {
91 string s = settings.GetValue(
92 new Identifier(Identifier, "values").ToString(), null);
96 array = Convert.FromBase64String(s);
97 using (MemoryStream m = new MemoryStream(array))
98 using (GZipStream c = new GZipStream(m, CompressionMode.Decompress))
99 using (BinaryReader reader = new BinaryReader(c)) {
102 DateTime time = DateTime.FromBinary(reader.ReadInt64());
103 float value = reader.ReadSingle();
104 AppendValue(value, time);
106 } catch (EndOfStreamException) { }
109 if (values.Count > 0)
110 AppendValue(float.NaN, DateTime.UtcNow);
113 private void AppendValue(float value, DateTime time) {
114 if (values.Count >= 2 && values.Last.Value == value &&
115 values[values.Count - 2].Value == value) {
116 values.Last = new SensorValue(value, time);
120 values.Append(new SensorValue(value, time));
123 public IHardware Hardware {
124 get { return hardware; }
127 public SensorType SensorType {
128 get { return sensorType; }
131 public Identifier Identifier {
133 return new Identifier(hardware.Identifier,
134 sensorType.ToString().ToLowerInvariant(),
135 index.ToString(CultureInfo.InvariantCulture));
144 if (!string.IsNullOrEmpty(value))
148 settings.SetValue(new Identifier(Identifier, "name").ToString(), name);
153 get { return index; }
156 public bool IsDefaultHidden {
157 get { return defaultHidden; }
160 public IReadOnlyArray<IParameter> Parameters {
161 get { return parameters; }
164 public float? Value {
169 DateTime now = DateTime.UtcNow;
170 while (values.Count > 0 && (now - values.First.Time).TotalDays > 1)
173 if (value.HasValue) {
177 AppendValue(sum / count, now);
183 this.currentValue = value;
184 if (minValue > value || !minValue.HasValue)
186 if (maxValue < value || !maxValue.HasValue)
191 public float? Min { get { return minValue; } }
192 public float? Max { get { return maxValue; } }
194 public void ResetMin() {
198 public void ResetMax() {
202 public IEnumerable<SensorValue> Values {
203 get { return values; }
206 public void Accept(IVisitor visitor) {
208 throw new ArgumentNullException("visitor");
209 visitor.VisitSensor(this);
212 public void Traverse(IVisitor visitor) {
213 foreach (IParameter parameter in parameters)
214 parameter.Accept(visitor);
217 public IControl Control {
222 this.control = value;