Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Tue, 14 Feb 2012 23:07:55 +0000
changeset 340 600962f8a298
parent 336 1966500884bc
child 341 5172a92c5c20
permissions -rw-r--r--
Added a new sensor type "Factor" for dimensionless values (and similar) that are not to be shown as percent ("Level" type). Changed the write amplification sensor to use the new "Factor" sensor type. Added the temperature SMART attribute for Sandforce SSDs as hidden sensor (as it may show fake results on some hardware).
moel@135
     1
/*
moel@130
     2
  
moel@130
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@130
     4
moel@130
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@130
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@130
     7
  the License. You may obtain a copy of the License at
moel@130
     8
 
moel@130
     9
  http://www.mozilla.org/MPL/
moel@130
    10
moel@130
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@130
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@130
    13
  for the specific language governing rights and limitations under the License.
moel@130
    14
moel@130
    15
  The Original Code is the Open Hardware Monitor code.
moel@130
    16
moel@130
    17
  The Initial Developer of the Original Code is 
moel@130
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@332
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2012
moel@130
    20
  the Initial Developer. All Rights Reserved.
moel@130
    21
moel@130
    22
  Contributor(s):
moel@130
    23
moel@130
    24
  Alternatively, the contents of this file may be used under the terms of
moel@130
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@130
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@130
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@130
    28
  of those above. If you wish to allow use of your version of this file only
moel@130
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@130
    30
  use your version of this file under the terms of the MPL, indicate your
moel@130
    31
  decision by deleting the provisions above and replace them with the notice
moel@130
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@130
    33
  the provisions above, a recipient may use your version of this file under
moel@130
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@130
    35
 
moel@130
    36
*/
moel@130
    37
moel@228
    38
using System;
moel@130
    39
using System.Collections.Generic;
moel@166
    40
using System.Globalization;
moel@228
    41
using System.Threading;
moel@130
    42
using OpenHardwareMonitor.Hardware.LPC;
moel@130
    43
moel@130
    44
namespace OpenHardwareMonitor.Hardware.Mainboard {
moel@165
    45
  internal class SuperIOHardware : Hardware {
moel@130
    46
moel@195
    47
    private readonly Mainboard mainboard;
moel@195
    48
    private readonly ISuperIO superIO;
moel@130
    49
moel@195
    50
    private readonly List<Sensor> voltages = new List<Sensor>();
moel@195
    51
    private readonly List<Sensor> temperatures = new List<Sensor>();
moel@195
    52
    private readonly List<Sensor> fans = new List<Sensor>();
moel@323
    53
    private readonly List<Sensor> controls = new List<Sensor>();
moel@167
    54
moel@228
    55
    private delegate float? ReadValueDelegate(int index);
moel@228
    56
    private delegate void UpdateDelegate();
moel@228
    57
moel@228
    58
    // delegates for mainboard specific sensor reading code
moel@228
    59
    private readonly ReadValueDelegate readVoltage;
moel@228
    60
    private readonly ReadValueDelegate readTemperature;
moel@228
    61
    private readonly ReadValueDelegate readFan;
moel@323
    62
    private readonly ReadValueDelegate readControl;
moel@228
    63
moel@228
    64
    // delegate for post update mainboard specific code
moel@228
    65
    private readonly UpdateDelegate postUpdate;
moel@228
    66
moel@228
    67
    // mainboard specific mutex
moel@228
    68
    private readonly Mutex mutex;
moel@228
    69
moel@176
    70
    public SuperIOHardware(Mainboard mainboard, ISuperIO superIO, 
moel@176
    71
      Manufacturer manufacturer, Model model, ISettings settings) 
moel@275
    72
      : base(ChipName.GetName(superIO.Chip), new Identifier("lpc", 
moel@275
    73
        superIO.Chip.ToString().ToLower(CultureInfo.InvariantCulture)), 
moel@275
    74
        settings)
moel@130
    75
    {
moel@176
    76
      this.mainboard = mainboard;
moel@130
    77
      this.superIO = superIO;
moel@130
    78
moel@228
    79
      this.readVoltage = (index) => superIO.Voltages[index];
moel@228
    80
      this.readTemperature = (index) => superIO.Temperatures[index];
moel@228
    81
      this.readFan = (index) => superIO.Fans[index];
moel@323
    82
      this.readControl = (index) => superIO.Controls[index];
moel@228
    83
moel@228
    84
      this.postUpdate = () => { };
moel@228
    85
moel@130
    86
      List<Voltage> v = new List<Voltage>();
moel@130
    87
      List<Temperature> t = new List<Temperature>();
moel@130
    88
      List<Fan> f = new List<Fan>();
moel@323
    89
      List<Ctrl> c = new List<Ctrl>();
moel@130
    90
moel@130
    91
      switch (superIO.Chip) {
moel@130
    92
        case Chip.IT8712F:
moel@130
    93
        case Chip.IT8716F:
moel@130
    94
        case Chip.IT8718F:
moel@177
    95
        case Chip.IT8720F: 
moel@319
    96
        case Chip.IT8726F:        
moel@130
    97
          switch (manufacturer) {
moel@133
    98
            case Manufacturer.ASUS:
moel@133
    99
              switch (model) {
moel@168
   100
                case Model.Crosshair_III_Formula: // IT8720F
moel@133
   101
                  v.Add(new Voltage("VBat", 8));
moel@133
   102
                  t.Add(new Temperature("CPU", 0));
moel@133
   103
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@133
   104
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@133
   105
                  break;
moel@144
   106
                case Model.M2N_SLI_DELUXE:                
moel@133
   107
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   108
                  v.Add(new Voltage("+3.3V", 1));
moel@195
   109
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   110
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@195
   111
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@133
   112
                  v.Add(new Voltage("VBat", 8));
moel@133
   113
                  t.Add(new Temperature("CPU", 0));
moel@133
   114
                  t.Add(new Temperature("Motherboard", 1));
moel@133
   115
                  f.Add(new Fan("CPU Fan", 0));
moel@133
   116
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@133
   117
                  f.Add(new Fan("Power Fan", 2));
moel@133
   118
                  break;
moel@168
   119
                case Model.M4A79XTD_EVO: // IT8720F           
moel@195
   120
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@144
   121
                  v.Add(new Voltage("VBat", 8));
moel@144
   122
                  t.Add(new Temperature("CPU", 0));
moel@144
   123
                  t.Add(new Temperature("Motherboard", 1));
moel@144
   124
                  f.Add(new Fan("CPU Fan", 0));
moel@144
   125
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@144
   126
                  f.Add(new Fan("Chassis Fan #2", 2));
moel@144
   127
                  break;
moel@133
   128
                default:
moel@133
   129
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   130
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@133
   131
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@133
   132
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@133
   133
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@133
   134
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@133
   135
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@133
   136
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@133
   137
                  v.Add(new Voltage("VBat", 8));
moel@133
   138
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@133
   139
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@133
   140
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@133
   141
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@133
   142
                  break;
moel@133
   143
              }
moel@133
   144
              break;
moel@221
   145
moel@221
   146
            case Manufacturer.ASRock:
moel@221
   147
              switch (model) {
moel@221
   148
                case Model.P55_Deluxe: // IT8720F
moel@228
   149
                  
moel@221
   150
                  v.Add(new Voltage("CPU VCore", 0));
moel@221
   151
                  v.Add(new Voltage("+3.3V", 2));
moel@221
   152
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@221
   153
                  v.Add(new Voltage("+5V", 5, 6.8f, 10));
moel@221
   154
                  v.Add(new Voltage("VBat", 8));                  
moel@221
   155
                  t.Add(new Temperature("CPU", 0));
moel@221
   156
                  t.Add(new Temperature("Motherboard", 1));
moel@221
   157
                  f.Add(new Fan("CPU Fan", 0));
moel@221
   158
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@228
   159
moel@228
   160
                  // this mutex is also used by the official ASRock tool
moel@228
   161
                  mutex = new Mutex(false, "ASRockOCMark");
moel@228
   162
                  
moel@228
   163
                  bool exclusiveAccess = false;
moel@228
   164
                  try {
moel@228
   165
                    exclusiveAccess = mutex.WaitOne(10, false);
moel@228
   166
                  } catch (AbandonedMutexException) { } 
moel@228
   167
                    catch (InvalidOperationException) { }  
moel@228
   168
moel@228
   169
                  // only read additional fans if we get exclusive access
moel@228
   170
                  if (exclusiveAccess) {
moel@228
   171
moel@228
   172
                    f.Add(new Fan("Chassis Fan #2", 2));
moel@228
   173
                    f.Add(new Fan("Chassis Fan #3", 3));
moel@228
   174
                    f.Add(new Fan("Power Fan", 4));
moel@228
   175
moel@228
   176
                    readFan = (index) => {
moel@228
   177
                      if (index < 2) {
moel@228
   178
                        return superIO.Fans[index];
moel@228
   179
                      } else {
moel@228
   180
                        // get GPIO 80-87
moel@228
   181
                        byte? gpio = superIO.ReadGPIO(7);
moel@228
   182
                        if (!gpio.HasValue)
moel@228
   183
                          return null;
moel@228
   184
moel@228
   185
                        // read the last 3 fans based on GPIO 83-85
moel@228
   186
                        int[] masks = { 0x05, 0x03, 0x06 };
moel@228
   187
                        return (((gpio.Value >> 3) & 0x07) ==
moel@228
   188
                          masks[index - 2]) ? superIO.Fans[2] : null;
moel@228
   189
                      }
moel@228
   190
                    };
moel@228
   191
moel@228
   192
                    int fanIndex = 0;
moel@228
   193
                    postUpdate = () => {
moel@228
   194
                      // get GPIO 80-87
moel@228
   195
                      byte? gpio = superIO.ReadGPIO(7);
moel@228
   196
                      if (!gpio.HasValue)
moel@228
   197
                        return;
moel@228
   198
moel@228
   199
                      // prepare the GPIO 83-85 for the next update
moel@228
   200
                      int[] masks = { 0x05, 0x03, 0x06 };
moel@228
   201
                      superIO.WriteGPIO(7,
moel@228
   202
                        (byte)((gpio.Value & 0xC7) | (masks[fanIndex] << 3)));
moel@228
   203
                      fanIndex = (fanIndex + 1) % 3;
moel@228
   204
                    };
moel@228
   205
                  }
moel@228
   206
moel@221
   207
                  break;
moel@221
   208
                default:
moel@221
   209
                  v.Add(new Voltage("CPU VCore", 0));
moel@221
   210
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@221
   211
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@221
   212
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@221
   213
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@221
   214
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@221
   215
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@221
   216
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@221
   217
                  v.Add(new Voltage("VBat", 8));
moel@221
   218
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@221
   219
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@221
   220
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@221
   221
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@221
   222
                  break;
moel@221
   223
              };
moel@221
   224
              break;
moel@221
   225
moel@130
   226
            case Manufacturer.DFI:
moel@130
   227
              switch (model) {
moel@168
   228
                case Model.LP_BI_P45_T2RS_Elite: // IT8718F
moel@130
   229
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   230
                  v.Add(new Voltage("FSB VTT", 1));
moel@130
   231
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   232
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   233
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@130
   234
                  v.Add(new Voltage("NB Core", 5));
moel@130
   235
                  v.Add(new Voltage("VDIMM", 6));
moel@195
   236
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@130
   237
                  v.Add(new Voltage("VBat", 8));
moel@130
   238
                  t.Add(new Temperature("CPU", 0));
moel@130
   239
                  t.Add(new Temperature("System", 1));
moel@130
   240
                  t.Add(new Temperature("Chipset", 2));
moel@130
   241
                  f.Add(new Fan("Fan #1", 0));
moel@130
   242
                  f.Add(new Fan("Fan #2", 1));
moel@130
   243
                  f.Add(new Fan("Fan #3", 2));
moel@130
   244
                  break;
moel@168
   245
                case Model.LP_DK_P55_T3eH9: // IT8720F
moel@130
   246
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   247
                  v.Add(new Voltage("VTT", 1));
moel@130
   248
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   249
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   250
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@130
   251
                  v.Add(new Voltage("CPU PLL", 5));
moel@130
   252
                  v.Add(new Voltage("DRAM", 6));
moel@195
   253
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@130
   254
                  v.Add(new Voltage("VBat", 8));
moel@130
   255
                  t.Add(new Temperature("Chipset", 0));
moel@130
   256
                  t.Add(new Temperature("CPU PWM", 1));
moel@130
   257
                  t.Add(new Temperature("CPU", 2));
moel@130
   258
                  f.Add(new Fan("Fan #1", 0));
moel@130
   259
                  f.Add(new Fan("Fan #2", 1));
moel@130
   260
                  f.Add(new Fan("Fan #3", 2));
moel@130
   261
                  break;
moel@130
   262
                default:
moel@130
   263
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   264
                  v.Add(new Voltage("VTT", 1, true));
moel@130
   265
                  v.Add(new Voltage("+3.3V", 2, true));
moel@130
   266
                  v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130
   267
                  v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
moel@130
   268
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   269
                  v.Add(new Voltage("DRAM", 6, true));
moel@130
   270
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
moel@130
   271
                  v.Add(new Voltage("VBat", 8));
moel@130
   272
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   273
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   274
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   275
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   276
                  break;
moel@130
   277
              }
moel@130
   278
              break;
moel@130
   279
moel@130
   280
            case Manufacturer.Gigabyte:
moel@130
   281
              switch (model) {
moel@168
   282
                case Model._965P_S3: // IT8718F
moel@130
   283
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   284
                  v.Add(new Voltage("DRAM", 1));
moel@130
   285
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   286
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   287
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   288
                  v.Add(new Voltage("VBat", 8));
moel@130
   289
                  t.Add(new Temperature("System", 0));
moel@130
   290
                  t.Add(new Temperature("CPU", 1));
moel@130
   291
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   292
                  f.Add(new Fan("System Fan", 1));
moel@130
   293
                  break;
moel@168
   294
                case Model.EP45_DS3R: // IT8718F
moel@130
   295
                case Model.EP45_UD3R: 
moel@138
   296
                case Model.X38_DS5:    
moel@130
   297
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   298
                  v.Add(new Voltage("DRAM", 1));
moel@130
   299
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   300
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   301
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   302
                  v.Add(new Voltage("VBat", 8));
moel@130
   303
                  t.Add(new Temperature("System", 0));
moel@130
   304
                  t.Add(new Temperature("CPU", 1));
moel@130
   305
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   306
                  f.Add(new Fan("System Fan #2", 1));
moel@130
   307
                  f.Add(new Fan("Power Fan", 2));
moel@130
   308
                  f.Add(new Fan("System Fan #1", 3));
moel@130
   309
                  break;
moel@168
   310
                case Model.EX58_EXTREME: // IT8720F 
moel@133
   311
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   312
                  v.Add(new Voltage("DRAM", 1));
moel@195
   313
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@133
   314
                  v.Add(new Voltage("VBat", 8));
moel@133
   315
                  t.Add(new Temperature("System", 0));
moel@133
   316
                  t.Add(new Temperature("CPU", 1));
moel@138
   317
                  t.Add(new Temperature("Northbridge", 2));
moel@133
   318
                  f.Add(new Fan("CPU Fan", 0));
moel@133
   319
                  f.Add(new Fan("System Fan #2", 1));
moel@133
   320
                  f.Add(new Fan("Power Fan", 2));
moel@133
   321
                  f.Add(new Fan("System Fan #1", 3));
moel@133
   322
                  break;
moel@168
   323
                case Model.P35_DS3: // IT8718F 
moel@168
   324
                case Model.P35_DS3L: // IT8718F
moel@130
   325
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   326
                  v.Add(new Voltage("DRAM", 1));
moel@130
   327
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   328
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   329
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   330
                  v.Add(new Voltage("VBat", 8));
moel@130
   331
                  t.Add(new Temperature("System", 0));
moel@130
   332
                  t.Add(new Temperature("CPU", 1));
moel@130
   333
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   334
                  f.Add(new Fan("System Fan #1", 1));
moel@130
   335
                  f.Add(new Fan("System Fan #2", 2));
moel@130
   336
                  f.Add(new Fan("Power Fan", 3));
moel@130
   337
                  break;
moel@168
   338
                case Model.P55_UD4: // IT8720F
moel@168
   339
                case Model.P55M_UD4: // IT8720F
moel@148
   340
                  v.Add(new Voltage("CPU VCore", 0));
moel@148
   341
                  v.Add(new Voltage("DRAM", 1));
moel@148
   342
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   343
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   344
                  v.Add(new Voltage("+12V", 5, 27, 9.1f));
moel@148
   345
                  v.Add(new Voltage("VBat", 8));
moel@148
   346
                  t.Add(new Temperature("System", 0));
moel@148
   347
                  t.Add(new Temperature("CPU", 2));
moel@148
   348
                  f.Add(new Fan("CPU Fan", 0));
moel@148
   349
                  f.Add(new Fan("System Fan #2", 1));
moel@148
   350
                  f.Add(new Fan("Power Fan", 2));
moel@148
   351
                  f.Add(new Fan("System Fan #1", 3));
moel@148
   352
                  break;
moel@168
   353
                case Model.GA_MA770T_UD3: // IT8720F
moel@154
   354
                  v.Add(new Voltage("CPU VCore", 0));
moel@154
   355
                  v.Add(new Voltage("DRAM", 1));
moel@154
   356
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   357
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   358
                  v.Add(new Voltage("+12V", 4, 27, 9.1f));
moel@154
   359
                  v.Add(new Voltage("VBat", 8));
moel@154
   360
                  t.Add(new Temperature("System", 0));
moel@154
   361
                  t.Add(new Temperature("CPU", 1));
moel@154
   362
                  f.Add(new Fan("CPU Fan", 0));
moel@154
   363
                  f.Add(new Fan("System Fan #1", 1));
moel@154
   364
                  f.Add(new Fan("System Fan #2", 2));
moel@154
   365
                  f.Add(new Fan("Power Fan", 3));
moel@154
   366
                  break;
moel@168
   367
                case Model.GA_MA785GMT_UD2H: // IT8718F
moel@130
   368
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   369
                  v.Add(new Voltage("DRAM", 1));
moel@130
   370
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   371
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   372
                  v.Add(new Voltage("+12V", 4, 27, 9.1f));
moel@130
   373
                  v.Add(new Voltage("VBat", 8));
moel@130
   374
                  t.Add(new Temperature("System", 0));
moel@130
   375
                  t.Add(new Temperature("CPU", 1));
moel@130
   376
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   377
                  f.Add(new Fan("System Fan", 1));
moel@130
   378
                  f.Add(new Fan("NB Fan", 2));
moel@130
   379
                  break;
moel@168
   380
                case Model.X58A_UD3R: // IT8720F 
moel@138
   381
                  v.Add(new Voltage("CPU VCore", 0));
moel@138
   382
                  v.Add(new Voltage("DRAM", 1));
moel@138
   383
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   384
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   385
                  v.Add(new Voltage("+12V", 5, 27, 9.1f));
moel@138
   386
                  v.Add(new Voltage("VBat", 8));
moel@138
   387
                  t.Add(new Temperature("System", 0));
moel@138
   388
                  t.Add(new Temperature("CPU", 1));
moel@138
   389
                  t.Add(new Temperature("Northbridge", 2));
moel@138
   390
                  f.Add(new Fan("CPU Fan", 0));
moel@138
   391
                  f.Add(new Fan("System Fan #2", 1));
moel@138
   392
                  f.Add(new Fan("Power Fan", 2));
moel@138
   393
                  f.Add(new Fan("System Fan #1", 3));
moel@138
   394
                  break;
moel@130
   395
                default:
moel@130
   396
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   397
                  v.Add(new Voltage("DRAM", 1, true));
moel@130
   398
                  v.Add(new Voltage("+3.3V", 2, true));
moel@130
   399
                  v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130
   400
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@130
   401
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   402
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@257
   403
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@130
   404
                  v.Add(new Voltage("VBat", 8));
moel@130
   405
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   406
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   407
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   408
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   409
                  break;
moel@130
   410
              }
moel@130
   411
              break;
moel@130
   412
moel@130
   413
            default:
moel@130
   414
              v.Add(new Voltage("CPU VCore", 0));
moel@130
   415
              v.Add(new Voltage("Voltage #2", 1, true));
moel@130
   416
              v.Add(new Voltage("Voltage #3", 2, true));
moel@130
   417
              v.Add(new Voltage("Voltage #4", 3, true));
moel@130
   418
              v.Add(new Voltage("Voltage #5", 4, true));
moel@130
   419
              v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   420
              v.Add(new Voltage("Voltage #7", 6, true));
moel@130
   421
              v.Add(new Voltage("Voltage #8", 7, true));
moel@130
   422
              v.Add(new Voltage("VBat", 8));
moel@130
   423
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   424
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   425
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   426
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   427
              break;
moel@130
   428
          }
moel@130
   429
          break;
moel@170
   430
moel@170
   431
        case Chip.IT8721F:
moel@277
   432
        case Chip.IT8728F:
moel@319
   433
        case Chip.IT8772E:
moel@177
   434
          switch (manufacturer) {
moel@177
   435
            case Manufacturer.ECS:
moel@177
   436
              switch (model) {
moel@177
   437
                case Model.A890GXM_A: // IT8721F
moel@177
   438
                  v.Add(new Voltage("CPU VCore", 0));
moel@177
   439
                  v.Add(new Voltage("VDIMM", 1));
moel@177
   440
                  v.Add(new Voltage("NB Voltage", 2));
moel@195
   441
                  v.Add(new Voltage("Analog +3.3V", 3, 10, 10));
moel@177
   442
                  // v.Add(new Voltage("VDIMM", 6, true));
moel@195
   443
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@195
   444
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   445
                  t.Add(new Temperature("CPU", 0));
moel@177
   446
                  t.Add(new Temperature("System", 1));
moel@177
   447
                  t.Add(new Temperature("Northbridge", 2));
moel@177
   448
                  f.Add(new Fan("CPU Fan", 0));
moel@177
   449
                  f.Add(new Fan("System Fan", 1));
moel@177
   450
                  f.Add(new Fan("Power Fan", 2));
moel@177
   451
                  break;
moel@177
   452
                default:
moel@177
   453
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@177
   454
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@177
   455
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@177
   456
                  v.Add(new Voltage("Analog +3.3V", 3, 10, 10, 0, true));
moel@177
   457
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@177
   458
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@177
   459
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@177
   460
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@195
   461
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   462
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@177
   463
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@177
   464
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@177
   465
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@177
   466
                  break;
moel@177
   467
              }
moel@177
   468
              break;
moel@278
   469
            case Manufacturer.Gigabyte:
moel@278
   470
              switch (model) {
moel@290
   471
                case Model.P67A_UD4_B3: // IT8728F
moel@278
   472
                  v.Add(new Voltage("+12V", 0, 100, 10));
moel@278
   473
                  v.Add(new Voltage("+5V", 1, 15, 10));
moel@278
   474
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@278
   475
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@278
   476
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@278
   477
                  v.Add(new Voltage("CPU VCore", 5));
moel@278
   478
                  v.Add(new Voltage("DRAM", 6));
moel@278
   479
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@278
   480
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@278
   481
                  t.Add(new Temperature("System", 0));
moel@278
   482
                  t.Add(new Temperature("CPU", 2));
moel@278
   483
                  f.Add(new Fan("CPU Fan", 0));
moel@278
   484
                  f.Add(new Fan("System Fan #2", 1));
moel@278
   485
                  f.Add(new Fan("Power Fan", 2));
moel@278
   486
                  f.Add(new Fan("System Fan #1", 3));
moel@278
   487
                  break;
moel@290
   488
                case Model.H67A_UD3H_B3: // IT8728F
moel@290
   489
                  v.Add(new Voltage("VTT", 0));
moel@290
   490
                  v.Add(new Voltage("+5V", 1, 15, 10));
moel@290
   491
                  v.Add(new Voltage("+12V", 2, 68, 22));
moel@290
   492
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@290
   493
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@290
   494
                  v.Add(new Voltage("CPU VCore", 5));
moel@290
   495
                  v.Add(new Voltage("DRAM", 6));
moel@290
   496
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@290
   497
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@290
   498
                  t.Add(new Temperature("System", 0));
moel@290
   499
                  t.Add(new Temperature("CPU", 2));
moel@290
   500
                  f.Add(new Fan("CPU Fan", 0));
moel@290
   501
                  f.Add(new Fan("System Fan #1", 1));
moel@290
   502
                  f.Add(new Fan("Power Fan", 2));
moel@290
   503
                  f.Add(new Fan("System Fan #2", 3));
moel@290
   504
                  break;
moel@305
   505
                case Model.Z68X_UD7_B3: // IT8728F
moel@305
   506
                  v.Add(new Voltage("VTT", 0));
moel@307
   507
                  v.Add(new Voltage("+3.3V", 1, 13.3f, 20.5f));
moel@305
   508
                  v.Add(new Voltage("+12V", 2, 68, 22));
moel@307
   509
                  v.Add(new Voltage("+5V", 3, 14.3f, 20));
moel@305
   510
                  v.Add(new Voltage("CPU VCore", 5));
moel@305
   511
                  v.Add(new Voltage("DRAM", 6));
moel@305
   512
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@305
   513
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@305
   514
                  t.Add(new Temperature("System", 0));
moel@305
   515
                  t.Add(new Temperature("CPU", 1));
moel@305
   516
                  t.Add(new Temperature("System 3", 2));
moel@305
   517
                  f.Add(new Fan("CPU Fan", 0));
moel@305
   518
                  f.Add(new Fan("Power Fan", 1));
moel@305
   519
                  f.Add(new Fan("System Fan #1", 2));
moel@305
   520
                  f.Add(new Fan("System Fan #2", 3));
moel@305
   521
                  f.Add(new Fan("System Fan #3", 4));
moel@305
   522
                  break;
moel@278
   523
                default:
moel@278
   524
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@278
   525
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@278
   526
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@278
   527
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@278
   528
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@278
   529
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@278
   530
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@278
   531
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@278
   532
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@278
   533
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@278
   534
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@278
   535
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@278
   536
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@278
   537
                  break;
moel@278
   538
              }
moel@278
   539
              break;
moel@320
   540
            case Manufacturer.Shuttle:
moel@320
   541
              switch (model) {
moel@320
   542
                case Model.FH67: // IT8772E 
moel@320
   543
                  v.Add(new Voltage("CPU VCore", 0));
moel@320
   544
                  v.Add(new Voltage("DRAM", 1));
moel@320
   545
                  v.Add(new Voltage("PCH VCCIO", 2));
moel@320
   546
                  v.Add(new Voltage("CPU VCCIO", 3));
moel@320
   547
                  v.Add(new Voltage("Graphic Voltage", 4));
moel@320
   548
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@320
   549
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@320
   550
                  t.Add(new Temperature("System", 0));
moel@320
   551
                  t.Add(new Temperature("CPU", 1));                  
moel@320
   552
                  f.Add(new Fan("Fan #1", 0));
moel@320
   553
                  f.Add(new Fan("CPU Fan", 1));
moel@320
   554
                  break;
moel@320
   555
                default:
moel@320
   556
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@320
   557
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@320
   558
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@320
   559
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@320
   560
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@320
   561
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@320
   562
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@320
   563
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@320
   564
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@320
   565
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@320
   566
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@320
   567
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@320
   568
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@320
   569
                  break;
moel@320
   570
              }
moel@320
   571
              break;
moel@177
   572
            default:
moel@177
   573
              v.Add(new Voltage("Voltage #1", 0, true));
moel@177
   574
              v.Add(new Voltage("Voltage #2", 1, true));
moel@177
   575
              v.Add(new Voltage("Voltage #3", 2, true));
moel@277
   576
              v.Add(new Voltage("Voltage #4", 3, true));
moel@177
   577
              v.Add(new Voltage("Voltage #5", 4, true));
moel@177
   578
              v.Add(new Voltage("Voltage #6", 5, true));
moel@177
   579
              v.Add(new Voltage("Voltage #7", 6, true));
moel@177
   580
              v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@195
   581
              v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   582
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@177
   583
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@177
   584
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@177
   585
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@177
   586
              break;
moel@177
   587
          }
moel@170
   588
          break;
moel@130
   589
          
moel@130
   590
        case Chip.F71858:
moel@195
   591
          v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   592
          v.Add(new Voltage("VSB3V", 1, 150, 150));
moel@195
   593
          v.Add(new Voltage("Battery", 2, 150, 150));
moel@130
   594
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   595
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   596
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   597
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   598
          break;
moel@130
   599
        case Chip.F71862: 
moel@130
   600
        case Chip.F71869: 
moel@130
   601
        case Chip.F71882:
moel@296
   602
        case Chip.F71889AD: 
moel@130
   603
        case Chip.F71889ED: 
moel@130
   604
        case Chip.F71889F:
moel@132
   605
          switch (manufacturer) {
moel@132
   606
            case Manufacturer.EVGA:
moel@132
   607
              switch (model) {
moel@168
   608
                case Model.X58_SLI_Classified: // F71882 
moel@195
   609
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   610
                  v.Add(new Voltage("CPU VCore", 1, 47, 100));
moel@195
   611
                  v.Add(new Voltage("DIMM", 2, 47, 100));
moel@195
   612
                  v.Add(new Voltage("CPU VTT", 3, 24, 100));
moel@195
   613
                  v.Add(new Voltage("IOH Vcore", 4, 24, 100));
moel@195
   614
                  v.Add(new Voltage("+5V", 5, 51, 12));
moel@195
   615
                  v.Add(new Voltage("+12V", 6, 56, 6.8f));
moel@195
   616
                  v.Add(new Voltage("3VSB", 7, 150, 150));
moel@195
   617
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   618
                  t.Add(new Temperature("CPU", 0));
moel@132
   619
                  t.Add(new Temperature("VREG", 1));
moel@132
   620
                  t.Add(new Temperature("System", 2));
moel@132
   621
                  f.Add(new Fan("CPU Fan", 0));
moel@132
   622
                  f.Add(new Fan("Power Fan", 1));
moel@132
   623
                  f.Add(new Fan("Chassis Fan", 2));
moel@132
   624
                  break;
moel@132
   625
                default:
moel@195
   626
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   627
                  v.Add(new Voltage("CPU VCore", 1));
moel@132
   628
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   629
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   630
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   631
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   632
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   633
                  v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   634
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   635
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   636
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   637
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   638
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   639
                  break;
moel@132
   640
              }
moel@132
   641
              break;
moel@132
   642
            default:
moel@195
   643
              v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   644
              v.Add(new Voltage("CPU VCore", 1));
moel@132
   645
              v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   646
              v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   647
              v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   648
              v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   649
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   650
              v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   651
              v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   652
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   653
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   654
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   655
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   656
              break;
moel@132
   657
          }
moel@130
   658
          break;
moel@130
   659
moel@220
   660
        case Chip.W83627EHF:
moel@220
   661
          switch (manufacturer) {
moel@220
   662
            case Manufacturer.ASRock:
moel@220
   663
              switch (model) {
moel@220
   664
                case Model.AOD790GX_128M: // W83627EHF
moel@220
   665
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   666
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@220
   667
                  v.Add(new Voltage("+3.3V", 4, 10, 10));
moel@220
   668
                  v.Add(new Voltage("+5V", 5, 20, 10));
moel@220
   669
                  v.Add(new Voltage("+12V", 6, 28, 5));
moel@220
   670
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@220
   671
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   672
                  t.Add(new Temperature("CPU", 0));
moel@220
   673
                  t.Add(new Temperature("Motherboard", 2));
moel@221
   674
                  f.Add(new Fan("CPU Fan", 0));
moel@221
   675
                  f.Add(new Fan("Chassis Fan", 1));                 
moel@220
   676
                  break;
moel@220
   677
                default:
moel@220
   678
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   679
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   680
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   681
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   682
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   683
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   684
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   685
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   686
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   687
                  v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   688
                  t.Add(new Temperature("CPU", 0));
moel@220
   689
                  t.Add(new Temperature("Auxiliary", 1));
moel@220
   690
                  t.Add(new Temperature("System", 2));
moel@220
   691
                  f.Add(new Fan("System Fan", 0));
moel@220
   692
                  f.Add(new Fan("CPU Fan", 1));
moel@220
   693
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   694
                  f.Add(new Fan("CPU Fan #2", 3));
moel@220
   695
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   696
                  break;
moel@220
   697
              } break;
moel@220
   698
            default:
moel@220
   699
              v.Add(new Voltage("CPU VCore", 0));
moel@220
   700
              v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   701
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   702
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   703
              v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   704
              v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   705
              v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   706
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   707
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   708
              v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   709
              t.Add(new Temperature("CPU", 0));
moel@220
   710
              t.Add(new Temperature("Auxiliary", 1));
moel@220
   711
              t.Add(new Temperature("System", 2));
moel@220
   712
              f.Add(new Fan("System Fan", 0));
moel@220
   713
              f.Add(new Fan("CPU Fan", 1));
moel@220
   714
              f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   715
              f.Add(new Fan("CPU Fan #2", 3));
moel@220
   716
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   717
              break;
moel@220
   718
          }
moel@130
   719
          break;
moel@130
   720
        case Chip.W83627DHG: 
moel@130
   721
        case Chip.W83627DHGP:                      
moel@130
   722
        case Chip.W83667HG:
moel@130
   723
        case Chip.W83667HGB:
moel@152
   724
          switch (manufacturer) {
moel@153
   725
            case Manufacturer.ASRock:
moel@153
   726
              switch (model) {
moel@168
   727
                case Model._880GMH_USB3: // W83627DHG-P
moel@153
   728
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   729
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   730
                  v.Add(new Voltage("+5V", 5, 15, 7.5f));
moel@195
   731
                  v.Add(new Voltage("+12V", 6, 56, 10));
moel@195
   732
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   733
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   734
                  t.Add(new Temperature("CPU", 0));
moel@153
   735
                  t.Add(new Temperature("Motherboard", 2));
moel@153
   736
                  f.Add(new Fan("Chassis Fan", 0));
moel@153
   737
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   738
                  f.Add(new Fan("Power Fan", 2));
moel@153
   739
                  break;
moel@153
   740
                default:
moel@153
   741
                  v.Add(new Voltage("CPU VCore", 0));
moel@153
   742
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   743
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   744
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@153
   745
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@153
   746
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@153
   747
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   748
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   749
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   750
                  t.Add(new Temperature("CPU", 0));
moel@153
   751
                  t.Add(new Temperature("Auxiliary", 1));
moel@153
   752
                  t.Add(new Temperature("System", 2));
moel@153
   753
                  f.Add(new Fan("System Fan", 0));
moel@153
   754
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   755
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   756
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   757
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@153
   758
                  break;
moel@153
   759
              }
moel@153
   760
              break;
moel@152
   761
            case Manufacturer.ASUS:
moel@152
   762
              switch (model) {
moel@336
   763
                case Model.P6T: // W83667HG
moel@174
   764
                case Model.P6X58D_E: // W83667HG                 
moel@174
   765
                case Model.Rampage_II_GENE: // W83667HG 
moel@152
   766
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   767
                  v.Add(new Voltage("+12V", 1, 11.5f, 1.91f));
moel@195
   768
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   769
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   770
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   771
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   772
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@174
   773
                  t.Add(new Temperature("CPU", 0));
moel@174
   774
                  t.Add(new Temperature("Motherboard", 2));
moel@174
   775
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@174
   776
                  f.Add(new Fan("CPU Fan", 1));
moel@174
   777
                  f.Add(new Fan("Power Fan", 2));
moel@174
   778
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@174
   779
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@174
   780
                  break;
moel@174
   781
                case Model.Rampage_Extreme: // W83667HG 
moel@174
   782
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   783
                  v.Add(new Voltage("+12V", 1, 12, 2));
moel@195
   784
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   785
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   786
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   787
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   788
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   789
                  t.Add(new Temperature("CPU", 0));
moel@152
   790
                  t.Add(new Temperature("Motherboard", 2));
moel@152
   791
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@153
   792
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   793
                  f.Add(new Fan("Power Fan", 2));
moel@152
   794
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@152
   795
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@152
   796
                  break;
moel@152
   797
                default:
moel@152
   798
                  v.Add(new Voltage("CPU VCore", 0));
moel@152
   799
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   800
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   801
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   802
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   803
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   804
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   805
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   806
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   807
                  t.Add(new Temperature("CPU", 0));
moel@152
   808
                  t.Add(new Temperature("Auxiliary", 1));
moel@152
   809
                  t.Add(new Temperature("System", 2));
moel@153
   810
                  f.Add(new Fan("System Fan", 0));
moel@153
   811
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   812
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   813
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   814
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   815
                  break;
moel@152
   816
              }
moel@152
   817
              break;
moel@152
   818
            default:
moel@152
   819
              v.Add(new Voltage("CPU VCore", 0));
moel@152
   820
              v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   821
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   822
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   823
              v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   824
              v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   825
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   826
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   827
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   828
              t.Add(new Temperature("CPU", 0));
moel@152
   829
              t.Add(new Temperature("Auxiliary", 1));
moel@152
   830
              t.Add(new Temperature("System", 2));
moel@153
   831
              f.Add(new Fan("System Fan", 0));
moel@153
   832
              f.Add(new Fan("CPU Fan", 1));
moel@153
   833
              f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   834
              f.Add(new Fan("CPU Fan #2", 3));
moel@153
   835
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   836
              break;
moel@152
   837
          } 
moel@130
   838
          break;
moel@130
   839
        case Chip.W83627HF: 
moel@130
   840
        case Chip.W83627THF: 
moel@130
   841
        case Chip.W83687THF:
moel@130
   842
          v.Add(new Voltage("CPU VCore", 0));
moel@130
   843
          v.Add(new Voltage("Voltage #2", 1, true));
moel@130
   844
          v.Add(new Voltage("Voltage #3", 2, true));
moel@195
   845
          v.Add(new Voltage("AVCC", 3, 34, 51));
moel@130
   846
          v.Add(new Voltage("Voltage #5", 4, true));
moel@195
   847
          v.Add(new Voltage("5VSB", 5, 34, 51));
moel@130
   848
          v.Add(new Voltage("VBAT", 6));
moel@130
   849
          t.Add(new Temperature("CPU", 0));
moel@130
   850
          t.Add(new Temperature("Auxiliary", 1));
moel@130
   851
          t.Add(new Temperature("System", 2));
moel@153
   852
          f.Add(new Fan("System Fan", 0));
moel@153
   853
          f.Add(new Fan("CPU Fan", 1));
moel@153
   854
          f.Add(new Fan("Auxiliary Fan", 2));
moel@130
   855
          break;
moel@245
   856
        case Chip.NCT6771F:
moel@265
   857
        case Chip.NCT6776F:
moel@265
   858
          switch (manufacturer) {
moel@265
   859
            case Manufacturer.ASUS:
moel@265
   860
              switch (model) {
moel@312
   861
                case Model.P8P67: // NCT6776F
moel@311
   862
                case Model.P8P67_EVO: // NCT6776F
moel@265
   863
                case Model.P8P67_PRO: // NCT6776F
moel@265
   864
                  v.Add(new Voltage("CPU VCore", 0));
moel@310
   865
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@310
   866
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@310
   867
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@310
   868
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@310
   869
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@265
   870
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@310
   871
                  t.Add(new Temperature("CPU", 0));
moel@276
   872
                  t.Add(new Temperature("Auxiliary", 2));
moel@310
   873
                  t.Add(new Temperature("Motherboard", 3));
moel@310
   874
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@265
   875
                  f.Add(new Fan("CPU Fan", 1));
moel@310
   876
                  f.Add(new Fan("Power Fan", 2));
moel@310
   877
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@323
   878
                  c.Add(new Ctrl("Chassis Fan #2", 0));
moel@323
   879
                  c.Add(new Ctrl("CPU Fan", 1));
moel@323
   880
                  c.Add(new Ctrl("Chassis Fan #1", 2));
moel@265
   881
                  break;
moel@276
   882
                case Model.P8P67_M_PRO: // NCT6776F
moel@276
   883
                  v.Add(new Voltage("CPU VCore", 0));
moel@276
   884
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@276
   885
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@310
   886
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@276
   887
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@276
   888
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@276
   889
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@276
   890
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@276
   891
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@276
   892
                  t.Add(new Temperature("CPU", 0));
moel@276
   893
                  t.Add(new Temperature("Motherboard", 3));
moel@276
   894
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@276
   895
                  f.Add(new Fan("CPU Fan", 1));
moel@276
   896
                  f.Add(new Fan("Chassis Fan #2", 2));
moel@276
   897
                  f.Add(new Fan("Power Fan", 3));
moel@276
   898
                  f.Add(new Fan("Auxiliary Fan", 4));
moel@276
   899
                  break;
moel@337
   900
                case Model.P8Z68_V_PRO: // NCT6776F
moel@337
   901
                  v.Add(new Voltage("CPU VCore", 0));
moel@337
   902
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@337
   903
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@337
   904
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@337
   905
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@337
   906
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@337
   907
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@337
   908
                  t.Add(new Temperature("CPU", 0));
moel@337
   909
                  t.Add(new Temperature("Auxiliary", 2));
moel@337
   910
                  t.Add(new Temperature("Motherboard", 3));
moel@337
   911
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@337
   912
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@337
   913
                  for (int i = 0; i < superIO.Controls.Length; i++)
moel@337
   914
                    c.Add(new Ctrl("Fan #" + (i + 1), i));
moel@337
   915
                  break;
moel@332
   916
                case Model.P9X79: // NCT6776F
moel@332
   917
                  v.Add(new Voltage("CPU VCore", 0));
moel@332
   918
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@332
   919
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@332
   920
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@332
   921
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@332
   922
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@332
   923
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@332
   924
                  t.Add(new Temperature("CPU", 0));
moel@332
   925
                  t.Add(new Temperature("Motherboard", 3));
moel@332
   926
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@332
   927
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@332
   928
                  break;
moel@265
   929
                default:
moel@265
   930
                  v.Add(new Voltage("CPU VCore", 0));
moel@265
   931
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   932
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   933
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   934
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   935
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   936
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   937
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   938
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   939
                  t.Add(new Temperature("CPU", 0));
moel@276
   940
                  t.Add(new Temperature("CPU", 1));
moel@276
   941
                  t.Add(new Temperature("Auxiliary", 2));
moel@276
   942
                  t.Add(new Temperature("System", 3));
moel@265
   943
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   944
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   945
                  break;
moel@265
   946
              }
moel@265
   947
              break;
moel@265
   948
            default:
moel@265
   949
              v.Add(new Voltage("CPU VCore", 0));
moel@265
   950
              v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   951
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   952
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   953
              v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   954
              v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   955
              v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   956
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   957
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   958
              t.Add(new Temperature("CPU", 0));
moel@276
   959
              t.Add(new Temperature("CPU", 1));
moel@276
   960
              t.Add(new Temperature("Auxiliary", 2));
moel@276
   961
              t.Add(new Temperature("System", 3));
moel@265
   962
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   963
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   964
              break;
moel@265
   965
          }
moel@245
   966
          break;
moel@130
   967
        default:
moel@130
   968
          for (int i = 0; i < superIO.Voltages.Length; i++)
moel@130
   969
            v.Add(new Voltage("Voltage #" + (i + 1), i, true));
moel@130
   970
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   971
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   972
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   973
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@323
   974
          for (int i = 0; i < superIO.Controls.Length; i++)
moel@323
   975
            c.Add(new Ctrl("Fan Control #" + (i + 1), i));
moel@130
   976
          break;
moel@130
   977
      }
moel@130
   978
moel@195
   979
      const string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
moel@130
   980
      foreach (Voltage voltage in v) 
moel@130
   981
        if (voltage.Index < superIO.Voltages.Length) {
moel@130
   982
          Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
moel@195
   983
            voltage.Hidden, SensorType.Voltage, this, new [] {
moel@130
   984
            new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
moel@130
   985
              formula, voltage.Ri),
moel@130
   986
            new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
moel@130
   987
              formula, voltage.Rf),
moel@130
   988
            new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
moel@130
   989
              formula, voltage.Vf)
moel@165
   990
            }, settings);
moel@130
   991
          voltages.Add(sensor);
moel@130
   992
      }
moel@130
   993
moel@130
   994
      foreach (Temperature temperature in t) 
moel@130
   995
        if (temperature.Index < superIO.Temperatures.Length) {
moel@134
   996
        Sensor sensor = new Sensor(temperature.Name, temperature.Index,
moel@195
   997
          SensorType.Temperature, this, new [] {
moel@130
   998
          new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
moel@165
   999
        }, settings);
moel@130
  1000
        temperatures.Add(sensor);
moel@130
  1001
      }
moel@130
  1002
moel@130
  1003
      foreach (Fan fan in f)
moel@130
  1004
        if (fan.Index < superIO.Fans.Length) {
moel@134
  1005
          Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
moel@165
  1006
            this, settings);
moel@130
  1007
          fans.Add(sensor);
moel@130
  1008
        }
moel@323
  1009
moel@323
  1010
      foreach (Ctrl ctrl in c) {
moel@323
  1011
        int index = ctrl.Index;
moel@323
  1012
        if (index < superIO.Controls.Length) {
moel@323
  1013
          Sensor sensor = new Sensor(ctrl.Name, index, SensorType.Control,
moel@323
  1014
            this, settings);
moel@323
  1015
          Control control = new Control(sensor, settings, 0, 100);
moel@323
  1016
          control.ControlModeChanged += (cc) => {
moel@323
  1017
            if (cc.ControlMode == ControlMode.Default) {
moel@323
  1018
              superIO.SetControl(index, null);
moel@323
  1019
            } else {
moel@323
  1020
              superIO.SetControl(index, (byte)(cc.SoftwareValue * 2.55));
moel@323
  1021
            }
moel@323
  1022
          };
moel@323
  1023
          control.SoftwareControlValueChanged += (cc) => {
moel@323
  1024
            if (cc.ControlMode == ControlMode.Software) 
moel@323
  1025
              superIO.SetControl(index, (byte)(cc.SoftwareValue * 2.55));
moel@323
  1026
          };
moel@323
  1027
          if (control.ControlMode == ControlMode.Software) 
moel@323
  1028
            superIO.SetControl(index, (byte)(control.SoftwareValue * 2.55));
moel@323
  1029
          sensor.Control = control;
moel@323
  1030
          controls.Add(sensor);
moel@323
  1031
        }
moel@323
  1032
      }
moel@130
  1033
    }
moel@130
  1034
moel@165
  1035
    public override HardwareType HardwareType {
moel@165
  1036
      get { return HardwareType.SuperIO; }
moel@130
  1037
    }
moel@130
  1038
moel@176
  1039
    public override IHardware Parent {
moel@176
  1040
      get { return mainboard; }
moel@176
  1041
    }
moel@176
  1042
moel@130
  1043
moel@130
  1044
    public override string GetReport() {
moel@130
  1045
      return superIO.GetReport();
moel@130
  1046
    }
moel@130
  1047
moel@130
  1048
    public override void Update() {
moel@130
  1049
      superIO.Update();
moel@130
  1050
moel@130
  1051
      foreach (Sensor sensor in voltages) {
moel@228
  1052
        float? value = readVoltage(sensor.Index);
moel@130
  1053
        if (value.HasValue) {
moel@130
  1054
          sensor.Value = value + (value - sensor.Parameters[2].Value) *
moel@130
  1055
            sensor.Parameters[0].Value / sensor.Parameters[1].Value;
moel@130
  1056
          ActivateSensor(sensor);
moel@130
  1057
        }
moel@130
  1058
      }
moel@130
  1059
moel@130
  1060
      foreach (Sensor sensor in temperatures) {
moel@228
  1061
        float? value = readTemperature(sensor.Index);
moel@130
  1062
        if (value.HasValue) {
moel@130
  1063
          sensor.Value = value + sensor.Parameters[0].Value;
moel@130
  1064
          ActivateSensor(sensor);
moel@130
  1065
        }
moel@130
  1066
      }
moel@130
  1067
moel@130
  1068
      foreach (Sensor sensor in fans) {
moel@228
  1069
        float? value = readFan(sensor.Index);
moel@130
  1070
        if (value.HasValue) {
moel@130
  1071
          sensor.Value = value;
moel@130
  1072
          if (value.Value > 0)
moel@130
  1073
            ActivateSensor(sensor);
moel@130
  1074
        }
moel@130
  1075
      }
moel@228
  1076
moel@323
  1077
      foreach (Sensor sensor in controls) {
moel@323
  1078
        float? value = readControl(sensor.Index);
moel@323
  1079
        if (value.HasValue) {
moel@323
  1080
          sensor.Value = value;
moel@323
  1081
          ActivateSensor(sensor);
moel@323
  1082
        }
moel@323
  1083
      }
moel@323
  1084
moel@228
  1085
      postUpdate();
moel@130
  1086
    }
moel@130
  1087
moel@323
  1088
    public override void Close() {
moel@323
  1089
      foreach (Sensor sensor in controls) {
moel@323
  1090
        // restore all controls back to default
moel@323
  1091
        superIO.SetControl(sensor.Index, null);
moel@323
  1092
      }
moel@323
  1093
      base.Close();
moel@323
  1094
    }
moel@323
  1095
moel@130
  1096
    private class Voltage {
moel@130
  1097
      public readonly string Name;
moel@130
  1098
      public readonly int Index;
moel@130
  1099
      public readonly float Ri;
moel@130
  1100
      public readonly float Rf;
moel@130
  1101
      public readonly float Vf;
moel@130
  1102
      public readonly bool Hidden;
moel@130
  1103
moel@202
  1104
      public Voltage(string name, int index) :
moel@202
  1105
        this(name, index, false) { }
moel@202
  1106
      
moel@130
  1107
      public Voltage(string name, int index, bool hidden) :
moel@130
  1108
        this(name, index, 0, 1, 0, hidden) { }
moel@202
  1109
      
moel@202
  1110
      public Voltage(string name, int index, float ri, float rf) :
moel@202
  1111
        this(name, index, ri, rf, 0, false) { }
moel@202
  1112
      
moel@202
  1113
      // float ri = 0, float rf = 1, float vf = 0, bool hidden = false) 
moel@202
  1114
      
moel@195
  1115
      public Voltage(string name, int index, 
moel@202
  1116
        float ri, float rf, float vf, bool hidden) 
moel@195
  1117
      {
moel@130
  1118
        this.Name = name;
moel@130
  1119
        this.Index = index;
moel@130
  1120
        this.Ri = ri;
moel@130
  1121
        this.Rf = rf;
moel@130
  1122
        this.Vf = vf;
moel@130
  1123
        this.Hidden = hidden;
moel@130
  1124
      }
moel@130
  1125
    }
moel@130
  1126
moel@130
  1127
    private class Temperature {
moel@130
  1128
      public readonly string Name;
moel@130
  1129
      public readonly int Index;
moel@130
  1130
moel@167
  1131
      public Temperature(string name, int index) {
moel@130
  1132
        this.Name = name;
moel@130
  1133
        this.Index = index;
moel@130
  1134
      }
moel@130
  1135
    }
moel@130
  1136
moel@130
  1137
    private class Fan {
moel@130
  1138
      public readonly string Name;
moel@130
  1139
      public readonly int Index;
moel@130
  1140
moel@130
  1141
      public Fan(string name, int index) {
moel@130
  1142
        this.Name = name;
moel@130
  1143
        this.Index = index;
moel@130
  1144
      }
moel@130
  1145
    }
moel@323
  1146
moel@323
  1147
    private class Ctrl {
moel@323
  1148
      public readonly string Name;
moel@323
  1149
      public readonly int Index;
moel@323
  1150
moel@323
  1151
      public Ctrl(string name, int index) {
moel@323
  1152
        this.Name = name;
moel@323
  1153
        this.Index = index;
moel@323
  1154
      }
moel@323
  1155
    }
moel@130
  1156
  }
moel@130
  1157
}