Hardware/Parameter.cs
author moel.mich
Sun, 08 May 2011 22:10:13 +0000
changeset 279 6bce967ba1b5
parent 182 4801e9eaf979
child 344 3145aadca3d2
permissions -rw-r--r--
Fixed the bus and core clock reading on AMD family 10h model Ah CPUs. The new "Core Performance Boost" feature of these CPUs resulted in very low accuracy of the bus speed (and as a consequence also an inaccurate TSC multiplier). This fixed Issue 205.
moel@63
     1
/*
moel@63
     2
  
moel@63
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@63
     4
moel@63
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@63
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@63
     7
  the License. You may obtain a copy of the License at
moel@63
     8
 
moel@63
     9
  http://www.mozilla.org/MPL/
moel@63
    10
moel@63
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@63
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@63
    13
  for the specific language governing rights and limitations under the License.
moel@63
    14
moel@63
    15
  The Original Code is the Open Hardware Monitor code.
moel@63
    16
moel@63
    17
  The Initial Developer of the Original Code is 
moel@63
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@63
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@63
    20
  the Initial Developer. All Rights Reserved.
moel@63
    21
moel@63
    22
  Contributor(s):
moel@63
    23
moel@63
    24
  Alternatively, the contents of this file may be used under the terms of
moel@63
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@63
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@63
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@63
    28
  of those above. If you wish to allow use of your version of this file only
moel@63
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@63
    30
  use your version of this file under the terms of the MPL, indicate your
moel@63
    31
  decision by deleting the provisions above and replace them with the notice
moel@63
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@63
    33
  the provisions above, a recipient may use your version of this file under
moel@63
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@63
    35
 
moel@63
    36
*/
moel@63
    37
moel@63
    38
using System;
moel@166
    39
using System.Globalization;
moel@63
    40
moel@63
    41
namespace OpenHardwareMonitor.Hardware {
moel@63
    42
moel@167
    43
  internal struct ParameterDescription {
moel@195
    44
    private readonly string name;
moel@195
    45
    private readonly string description;
moel@195
    46
    private readonly float defaultValue;    
moel@63
    47
moel@63
    48
    public ParameterDescription(string name, string description, 
moel@63
    49
      float defaultValue) {
moel@63
    50
      this.name = name;
moel@63
    51
      this.description = description;
moel@63
    52
      this.defaultValue = defaultValue;
moel@63
    53
    }
moel@63
    54
moel@63
    55
    public string Name { get { return name; } }
moel@63
    56
moel@63
    57
    public string Description { get { return description; } }
moel@63
    58
moel@63
    59
    public float DefaultValue { get { return defaultValue; } }
moel@63
    60
  }
moel@63
    61
moel@167
    62
  internal class Parameter : IParameter {
moel@195
    63
    private readonly ISensor sensor;
moel@63
    64
    private ParameterDescription description;
moel@63
    65
    private float value;
moel@63
    66
    private bool isDefault;
moel@195
    67
    private readonly ISettings settings;
moel@63
    68
moel@165
    69
    public Parameter(ParameterDescription description, ISensor sensor, 
moel@165
    70
      ISettings settings) 
moel@165
    71
    {
moel@63
    72
      this.sensor = sensor;
moel@63
    73
      this.description = description;
moel@165
    74
      this.settings = settings;
moel@165
    75
      this.isDefault = !settings.Contains(Identifier.ToString());
moel@165
    76
      this.value = description.DefaultValue;
moel@165
    77
      if (!this.isDefault) {
moel@166
    78
        if (!float.TryParse(settings.GetValue(Identifier.ToString(), "0"),
moel@166
    79
          NumberStyles.Float,
moel@166
    80
          CultureInfo.InvariantCulture,
moel@165
    81
          out this.value))
moel@165
    82
          this.value = description.DefaultValue;
moel@165
    83
      }
moel@63
    84
    }
moel@63
    85
moel@63
    86
    public ISensor Sensor {
moel@63
    87
      get {
moel@63
    88
        return sensor;
moel@63
    89
      }
moel@63
    90
    }
moel@63
    91
moel@109
    92
    public Identifier Identifier {
moel@63
    93
      get {
moel@166
    94
        return new Identifier(sensor.Identifier, "parameter",
moel@166
    95
          Name.Replace(" ", "").ToLowerInvariant());
moel@63
    96
      }
moel@63
    97
    }
moel@63
    98
moel@63
    99
    public string Name { get { return description.Name; } }
moel@63
   100
moel@63
   101
    public string Description { get { return description.Description; } }
moel@63
   102
moel@63
   103
    public float Value {
moel@63
   104
      get {
moel@63
   105
        return value;
moel@63
   106
      }
moel@63
   107
      set {
moel@63
   108
        this.isDefault = false;
moel@165
   109
        this.value = value;
moel@166
   110
        this.settings.SetValue(Identifier.ToString(), value.ToString(
moel@166
   111
          CultureInfo.InvariantCulture));
moel@63
   112
      }
moel@63
   113
    }
moel@63
   114
moel@63
   115
    public float DefaultValue { 
moel@63
   116
      get { return description.DefaultValue; } 
moel@63
   117
    }
moel@63
   118
moel@63
   119
    public bool IsDefault {
moel@63
   120
      get { return isDefault; }
moel@63
   121
      set {
moel@63
   122
        this.isDefault = value;
moel@63
   123
        if (value) {
moel@63
   124
          this.value = description.DefaultValue;
moel@165
   125
          this.settings.Remove(Identifier.ToString());
moel@63
   126
        }
moel@63
   127
      }
moel@110
   128
    }
moel@110
   129
moel@110
   130
    public void Accept(IVisitor visitor) {
moel@167
   131
      if (visitor == null)
moel@167
   132
        throw new ArgumentNullException("visitor");
moel@167
   133
      visitor.VisitParameter(this);
moel@110
   134
    }
moel@110
   135
moel@110
   136
    public void Traverse(IVisitor visitor) { }
moel@63
   137
  }
moel@63
   138
}