Hardware/Sensor.cs
author moel.mich
Thu, 06 May 2010 19:20:38 +0000
changeset 109 70d0c3102424
parent 63 1a7c13ac7348
child 110 411b72b73d8f
permissions -rw-r--r--
Added an Identifier class for IHardware, ISensor and IParameter Identifier properties.
     1 /*
     2   
     3   Version: MPL 1.1/GPL 2.0/LGPL 2.1
     4 
     5   The contents of this file are subject to the Mozilla Public License Version
     6   1.1 (the "License"); you may not use this file except in compliance with
     7   the License. You may obtain a copy of the License at
     8  
     9   http://www.mozilla.org/MPL/
    10 
    11   Software distributed under the License is distributed on an "AS IS" basis,
    12   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    13   for the specific language governing rights and limitations under the License.
    14 
    15   The Original Code is the Open Hardware Monitor code.
    16 
    17   The Initial Developer of the Original Code is 
    18   Michael Möller <m.moeller@gmx.ch>.
    19   Portions created by the Initial Developer are Copyright (C) 2009-2010
    20   the Initial Developer. All Rights Reserved.
    21 
    22   Contributor(s):
    23 
    24   Alternatively, the contents of this file may be used under the terms of
    25   either the GNU General Public License Version 2 or later (the "GPL"), or
    26   the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
    27   in which case the provisions of the GPL or the LGPL are applicable instead
    28   of those above. If you wish to allow use of your version of this file only
    29   under the terms of either the GPL or the LGPL, and not to allow others to
    30   use your version of this file under the terms of the MPL, indicate your
    31   decision by deleting the provisions above and replace them with the notice
    32   and other provisions required by the GPL or the LGPL. If you do not delete
    33   the provisions above, a recipient may use your version of this file under
    34   the terms of any one of the MPL, the GPL or the LGPL.
    35  
    36 */
    37 
    38 using System;
    39 using System.Collections.Generic;
    40 using OpenHardwareMonitor.Utilities;
    41 
    42 namespace OpenHardwareMonitor.Hardware {
    43 
    44   public class Sensor : ISensor {
    45 
    46     private string defaultName;
    47     private string name;
    48     private int index;
    49     private bool defaultHidden;
    50     private SensorType sensorType;
    51     private IHardware hardware;
    52     private ReadOnlyArray<IParameter> parameters;
    53     private float? value;
    54     private float? min;
    55     private float? max;
    56     private float? limit;
    57     private float? defaultLimit;
    58     private Queue<ISensorEntry> entries = 
    59       new Queue<ISensorEntry>(MAX_MINUTES * 15);
    60     
    61     private float sum = 0;
    62     private int count = 0;
    63 
    64     private const int MAX_MINUTES = 120;
    65    
    66     public Sensor(string name, int index, SensorType sensorType,
    67       IHardware hardware) : this(name, index, null, sensorType, hardware, 
    68       null) { }
    69 
    70     public Sensor(string name, int index, float? limit, SensorType sensorType,
    71       IHardware hardware, ParameterDescription[] parameterDescriptions) :
    72       this(name, index, false, limit, sensorType, hardware,
    73         parameterDescriptions) { }
    74 
    75     public Sensor(string name, int index, bool defaultHidden, 
    76       float? limit, SensorType sensorType, IHardware hardware, 
    77       ParameterDescription[] parameterDescriptions) 
    78     {
    79       this.defaultName = name;      
    80       this.index = index;
    81       this.defaultHidden = defaultHidden;
    82       this.defaultLimit = limit;
    83       this.sensorType = sensorType;
    84       this.hardware = hardware;
    85       Parameter[] parameters = new Parameter[parameterDescriptions == null ?
    86         0 : parameterDescriptions.Length];
    87       for (int i = 0; i < parameters.Length; i++ ) 
    88         parameters[i] = new Parameter(parameterDescriptions[i], this);
    89       this.parameters = parameters;
    90 
    91       string configName = Config.Settings[
    92         new Identifier(Identifier, "name").ToString()];
    93       if (configName != null)
    94         this.name = configName;
    95       else
    96         this.name = name;
    97       string configLimit = Config.Settings[
    98         new Identifier(Identifier, "limit").ToString()];
    99       if (configLimit != null && configLimit != "")
   100         this.limit = float.Parse(configLimit);
   101       else
   102         this.limit = limit;
   103     }
   104 
   105     public IHardware Hardware {
   106       get { return hardware; }
   107     }
   108 
   109     public SensorType SensorType {
   110       get { return sensorType; }
   111     }
   112 
   113     public Identifier Identifier {
   114       get {
   115         return new Identifier(hardware.Identifier, 
   116           sensorType.ToString().ToLower(), index.ToString());
   117       }
   118     }
   119 
   120     public string Name {
   121       get { 
   122         return name; 
   123       }
   124       set {
   125         if (value != "") 
   126           name = value;          
   127         else 
   128           name = defaultName;
   129         Config.Settings[new Identifier(Identifier, "name").ToString()] = name;
   130       }
   131     }
   132 
   133     public int Index {
   134       get { return index; }
   135     }
   136 
   137     public bool IsDefaultHidden {
   138       get { return defaultHidden; }
   139     }
   140 
   141     public IReadOnlyArray<IParameter> Parameters {
   142       get { return parameters; }
   143     }
   144 
   145     public float? Value {
   146       get { 
   147         return value; 
   148       }
   149       set {
   150         while (entries.Count > 0 && 
   151           (DateTime.Now - entries.Peek().Time).TotalMinutes > MAX_MINUTES)
   152           entries.Dequeue();
   153 
   154         if (value.HasValue) {
   155           sum += value.Value;
   156           count++;
   157           if (count == 4) {
   158             entries.Enqueue(new Entry(sum / count, DateTime.Now));
   159             sum = 0;
   160             count = 0;
   161           }
   162         }
   163 
   164         this.value = value;
   165         if (min > value || !min.HasValue)
   166           min = value;
   167         if (max < value || !max.HasValue)
   168           max = value;
   169       }
   170     }
   171 
   172     public float? Min { get { return min; } }
   173     public float? Max { get { return max; } }
   174 
   175     public float? Limit {
   176       get {
   177         return limit;
   178       }
   179 
   180       set {
   181         if (value.HasValue) {
   182           limit = value;
   183           Config.Settings[new Identifier(Identifier, "limit").ToString()] =
   184             limit.ToString();
   185         } else {
   186           limit = defaultLimit;
   187           Config.Settings[new Identifier(Identifier, "limit").ToString()] = "";          
   188         }        
   189       }
   190     }
   191 
   192     public IEnumerable<ISensorEntry> Plot {
   193       get { return entries; }
   194     }
   195 
   196     public struct Entry : ISensorEntry {
   197       private float value;
   198       private DateTime time;
   199 
   200       public Entry(float value, DateTime time) {
   201         this.value = value;
   202         this.time = time;
   203       }
   204 
   205       public float Value { get { return value; } }
   206       public DateTime Time { get { return time; } }
   207     }
   208   }
   209 }