Added support for SSDs with a controller from Micron.
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 name = new Identifier(Identifier, "values").ToString();
92 string s = settings.GetValue(name, null);
95 byte[] 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);
112 // remove the value string from the settings to reduce memory usage
113 settings.Remove(name);
116 private void AppendValue(float value, DateTime time) {
117 if (values.Count >= 2 && values.Last.Value == value &&
118 values[values.Count - 2].Value == value) {
119 values.Last = new SensorValue(value, time);
123 values.Append(new SensorValue(value, time));
126 public IHardware Hardware {
127 get { return hardware; }
130 public SensorType SensorType {
131 get { return sensorType; }
134 public Identifier Identifier {
136 return new Identifier(hardware.Identifier,
137 sensorType.ToString().ToLowerInvariant(),
138 index.ToString(CultureInfo.InvariantCulture));
147 if (!string.IsNullOrEmpty(value))
151 settings.SetValue(new Identifier(Identifier, "name").ToString(), name);
156 get { return index; }
159 public bool IsDefaultHidden {
160 get { return defaultHidden; }
163 public IReadOnlyArray<IParameter> Parameters {
164 get { return parameters; }
167 public float? Value {
172 DateTime now = DateTime.UtcNow;
173 while (values.Count > 0 && (now - values.First.Time).TotalDays > 1)
176 if (value.HasValue) {
180 AppendValue(sum / count, now);
186 this.currentValue = value;
187 if (minValue > value || !minValue.HasValue)
189 if (maxValue < value || !maxValue.HasValue)
194 public float? Min { get { return minValue; } }
195 public float? Max { get { return maxValue; } }
197 public void ResetMin() {
201 public void ResetMax() {
205 public IEnumerable<SensorValue> Values {
206 get { return values; }
209 public void Accept(IVisitor visitor) {
211 throw new ArgumentNullException("visitor");
212 visitor.VisitSensor(this);
215 public void Traverse(IVisitor visitor) {
216 foreach (IParameter parameter in parameters)
217 parameter.Accept(visitor);
220 public IControl Control {
225 this.control = value;