Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Sun, 15 May 2011 16:44:14 +0000
changeset 284 075a1822ef34
parent 277 5c80f37c0330
child 290 22214a7e85a9
permissions -rw-r--r--
Fixed Issue 219.
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@265
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2011
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@167
    53
moel@228
    54
    private delegate float? ReadValueDelegate(int index);
moel@228
    55
    private delegate void UpdateDelegate();
moel@228
    56
moel@228
    57
    // delegates for mainboard specific sensor reading code
moel@228
    58
    private readonly ReadValueDelegate readVoltage;
moel@228
    59
    private readonly ReadValueDelegate readTemperature;
moel@228
    60
    private readonly ReadValueDelegate readFan;
moel@228
    61
moel@228
    62
    // delegate for post update mainboard specific code
moel@228
    63
    private readonly UpdateDelegate postUpdate;
moel@228
    64
moel@228
    65
    // mainboard specific mutex
moel@228
    66
    private readonly Mutex mutex;
moel@228
    67
moel@176
    68
    public SuperIOHardware(Mainboard mainboard, ISuperIO superIO, 
moel@176
    69
      Manufacturer manufacturer, Model model, ISettings settings) 
moel@275
    70
      : base(ChipName.GetName(superIO.Chip), new Identifier("lpc", 
moel@275
    71
        superIO.Chip.ToString().ToLower(CultureInfo.InvariantCulture)), 
moel@275
    72
        settings)
moel@130
    73
    {
moel@176
    74
      this.mainboard = mainboard;
moel@130
    75
      this.superIO = superIO;
moel@130
    76
moel@228
    77
      this.readVoltage = (index) => superIO.Voltages[index];
moel@228
    78
      this.readTemperature = (index) => superIO.Temperatures[index];
moel@228
    79
      this.readFan = (index) => superIO.Fans[index];
moel@228
    80
moel@228
    81
      this.postUpdate = () => { };
moel@228
    82
moel@130
    83
      List<Voltage> v = new List<Voltage>();
moel@130
    84
      List<Temperature> t = new List<Temperature>();
moel@130
    85
      List<Fan> f = new List<Fan>();
moel@130
    86
moel@130
    87
      switch (superIO.Chip) {
moel@130
    88
        case Chip.IT8712F:
moel@130
    89
        case Chip.IT8716F:
moel@130
    90
        case Chip.IT8718F:
moel@177
    91
        case Chip.IT8720F: 
moel@130
    92
        case Chip.IT8726F:
moel@130
    93
          switch (manufacturer) {
moel@133
    94
            case Manufacturer.ASUS:
moel@133
    95
              switch (model) {
moel@168
    96
                case Model.Crosshair_III_Formula: // IT8720F
moel@133
    97
                  v.Add(new Voltage("VBat", 8));
moel@133
    98
                  t.Add(new Temperature("CPU", 0));
moel@133
    99
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@133
   100
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@133
   101
                  break;
moel@144
   102
                case Model.M2N_SLI_DELUXE:                
moel@133
   103
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   104
                  v.Add(new Voltage("+3.3V", 1));
moel@195
   105
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   106
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@195
   107
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@133
   108
                  v.Add(new Voltage("VBat", 8));
moel@133
   109
                  t.Add(new Temperature("CPU", 0));
moel@133
   110
                  t.Add(new Temperature("Motherboard", 1));
moel@133
   111
                  f.Add(new Fan("CPU Fan", 0));
moel@133
   112
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@133
   113
                  f.Add(new Fan("Power Fan", 2));
moel@133
   114
                  break;
moel@168
   115
                case Model.M4A79XTD_EVO: // IT8720F           
moel@195
   116
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@144
   117
                  v.Add(new Voltage("VBat", 8));
moel@144
   118
                  t.Add(new Temperature("CPU", 0));
moel@144
   119
                  t.Add(new Temperature("Motherboard", 1));
moel@144
   120
                  f.Add(new Fan("CPU Fan", 0));
moel@144
   121
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@144
   122
                  f.Add(new Fan("Chassis Fan #2", 2));
moel@144
   123
                  break;
moel@133
   124
                default:
moel@133
   125
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   126
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@133
   127
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@133
   128
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@133
   129
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@133
   130
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@133
   131
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@133
   132
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@133
   133
                  v.Add(new Voltage("VBat", 8));
moel@133
   134
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@133
   135
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@133
   136
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@133
   137
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@133
   138
                  break;
moel@133
   139
              }
moel@133
   140
              break;
moel@221
   141
moel@221
   142
            case Manufacturer.ASRock:
moel@221
   143
              switch (model) {
moel@221
   144
                case Model.P55_Deluxe: // IT8720F
moel@228
   145
                  
moel@221
   146
                  v.Add(new Voltage("CPU VCore", 0));
moel@221
   147
                  v.Add(new Voltage("+3.3V", 2));
moel@221
   148
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@221
   149
                  v.Add(new Voltage("+5V", 5, 6.8f, 10));
moel@221
   150
                  v.Add(new Voltage("VBat", 8));                  
moel@221
   151
                  t.Add(new Temperature("CPU", 0));
moel@221
   152
                  t.Add(new Temperature("Motherboard", 1));
moel@221
   153
                  f.Add(new Fan("CPU Fan", 0));
moel@221
   154
                  f.Add(new Fan("Chassis Fan #1", 1));
moel@228
   155
moel@228
   156
                  // this mutex is also used by the official ASRock tool
moel@228
   157
                  mutex = new Mutex(false, "ASRockOCMark");
moel@228
   158
                  
moel@228
   159
                  bool exclusiveAccess = false;
moel@228
   160
                  try {
moel@228
   161
                    exclusiveAccess = mutex.WaitOne(10, false);
moel@228
   162
                  } catch (AbandonedMutexException) { } 
moel@228
   163
                    catch (InvalidOperationException) { }  
moel@228
   164
moel@228
   165
                  // only read additional fans if we get exclusive access
moel@228
   166
                  if (exclusiveAccess) {
moel@228
   167
moel@228
   168
                    f.Add(new Fan("Chassis Fan #2", 2));
moel@228
   169
                    f.Add(new Fan("Chassis Fan #3", 3));
moel@228
   170
                    f.Add(new Fan("Power Fan", 4));
moel@228
   171
moel@228
   172
                    readFan = (index) => {
moel@228
   173
                      if (index < 2) {
moel@228
   174
                        return superIO.Fans[index];
moel@228
   175
                      } else {
moel@228
   176
                        // get GPIO 80-87
moel@228
   177
                        byte? gpio = superIO.ReadGPIO(7);
moel@228
   178
                        if (!gpio.HasValue)
moel@228
   179
                          return null;
moel@228
   180
moel@228
   181
                        // read the last 3 fans based on GPIO 83-85
moel@228
   182
                        int[] masks = { 0x05, 0x03, 0x06 };
moel@228
   183
                        return (((gpio.Value >> 3) & 0x07) ==
moel@228
   184
                          masks[index - 2]) ? superIO.Fans[2] : null;
moel@228
   185
                      }
moel@228
   186
                    };
moel@228
   187
moel@228
   188
                    int fanIndex = 0;
moel@228
   189
                    postUpdate = () => {
moel@228
   190
                      // get GPIO 80-87
moel@228
   191
                      byte? gpio = superIO.ReadGPIO(7);
moel@228
   192
                      if (!gpio.HasValue)
moel@228
   193
                        return;
moel@228
   194
moel@228
   195
                      // prepare the GPIO 83-85 for the next update
moel@228
   196
                      int[] masks = { 0x05, 0x03, 0x06 };
moel@228
   197
                      superIO.WriteGPIO(7,
moel@228
   198
                        (byte)((gpio.Value & 0xC7) | (masks[fanIndex] << 3)));
moel@228
   199
                      fanIndex = (fanIndex + 1) % 3;
moel@228
   200
                    };
moel@228
   201
                  }
moel@228
   202
moel@221
   203
                  break;
moel@221
   204
                default:
moel@221
   205
                  v.Add(new Voltage("CPU VCore", 0));
moel@221
   206
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@221
   207
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@221
   208
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@221
   209
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@221
   210
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@221
   211
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@221
   212
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@221
   213
                  v.Add(new Voltage("VBat", 8));
moel@221
   214
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@221
   215
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@221
   216
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@221
   217
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@221
   218
                  break;
moel@221
   219
              };
moel@221
   220
              break;
moel@221
   221
moel@130
   222
            case Manufacturer.DFI:
moel@130
   223
              switch (model) {
moel@168
   224
                case Model.LP_BI_P45_T2RS_Elite: // IT8718F
moel@130
   225
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   226
                  v.Add(new Voltage("FSB VTT", 1));
moel@130
   227
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   228
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   229
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@130
   230
                  v.Add(new Voltage("NB Core", 5));
moel@130
   231
                  v.Add(new Voltage("VDIMM", 6));
moel@195
   232
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@130
   233
                  v.Add(new Voltage("VBat", 8));
moel@130
   234
                  t.Add(new Temperature("CPU", 0));
moel@130
   235
                  t.Add(new Temperature("System", 1));
moel@130
   236
                  t.Add(new Temperature("Chipset", 2));
moel@130
   237
                  f.Add(new Fan("Fan #1", 0));
moel@130
   238
                  f.Add(new Fan("Fan #2", 1));
moel@130
   239
                  f.Add(new Fan("Fan #3", 2));
moel@130
   240
                  break;
moel@168
   241
                case Model.LP_DK_P55_T3eH9: // IT8720F
moel@130
   242
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   243
                  v.Add(new Voltage("VTT", 1));
moel@130
   244
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   245
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   246
                  v.Add(new Voltage("+12V", 4, 30, 10));
moel@130
   247
                  v.Add(new Voltage("CPU PLL", 5));
moel@130
   248
                  v.Add(new Voltage("DRAM", 6));
moel@195
   249
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
moel@130
   250
                  v.Add(new Voltage("VBat", 8));
moel@130
   251
                  t.Add(new Temperature("Chipset", 0));
moel@130
   252
                  t.Add(new Temperature("CPU PWM", 1));
moel@130
   253
                  t.Add(new Temperature("CPU", 2));
moel@130
   254
                  f.Add(new Fan("Fan #1", 0));
moel@130
   255
                  f.Add(new Fan("Fan #2", 1));
moel@130
   256
                  f.Add(new Fan("Fan #3", 2));
moel@130
   257
                  break;
moel@130
   258
                default:
moel@130
   259
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   260
                  v.Add(new Voltage("VTT", 1, true));
moel@130
   261
                  v.Add(new Voltage("+3.3V", 2, true));
moel@130
   262
                  v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130
   263
                  v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
moel@130
   264
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   265
                  v.Add(new Voltage("DRAM", 6, true));
moel@130
   266
                  v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
moel@130
   267
                  v.Add(new Voltage("VBat", 8));
moel@130
   268
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   269
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   270
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   271
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   272
                  break;
moel@130
   273
              }
moel@130
   274
              break;
moel@130
   275
moel@130
   276
            case Manufacturer.Gigabyte:
moel@130
   277
              switch (model) {
moel@168
   278
                case Model._965P_S3: // IT8718F
moel@130
   279
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   280
                  v.Add(new Voltage("DRAM", 1));
moel@130
   281
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   282
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   283
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   284
                  v.Add(new Voltage("VBat", 8));
moel@130
   285
                  t.Add(new Temperature("System", 0));
moel@130
   286
                  t.Add(new Temperature("CPU", 1));
moel@130
   287
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   288
                  f.Add(new Fan("System Fan", 1));
moel@130
   289
                  break;
moel@168
   290
                case Model.EP45_DS3R: // IT8718F
moel@130
   291
                case Model.EP45_UD3R: 
moel@138
   292
                case Model.X38_DS5:    
moel@130
   293
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   294
                  v.Add(new Voltage("DRAM", 1));
moel@130
   295
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   296
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   297
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   298
                  v.Add(new Voltage("VBat", 8));
moel@130
   299
                  t.Add(new Temperature("System", 0));
moel@130
   300
                  t.Add(new Temperature("CPU", 1));
moel@130
   301
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   302
                  f.Add(new Fan("System Fan #2", 1));
moel@130
   303
                  f.Add(new Fan("Power Fan", 2));
moel@130
   304
                  f.Add(new Fan("System Fan #1", 3));
moel@130
   305
                  break;
moel@168
   306
                case Model.EX58_EXTREME: // IT8720F 
moel@133
   307
                  v.Add(new Voltage("CPU VCore", 0));
moel@133
   308
                  v.Add(new Voltage("DRAM", 1));
moel@195
   309
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@133
   310
                  v.Add(new Voltage("VBat", 8));
moel@133
   311
                  t.Add(new Temperature("System", 0));
moel@133
   312
                  t.Add(new Temperature("CPU", 1));
moel@138
   313
                  t.Add(new Temperature("Northbridge", 2));
moel@133
   314
                  f.Add(new Fan("CPU Fan", 0));
moel@133
   315
                  f.Add(new Fan("System Fan #2", 1));
moel@133
   316
                  f.Add(new Fan("Power Fan", 2));
moel@133
   317
                  f.Add(new Fan("System Fan #1", 3));
moel@133
   318
                  break;
moel@168
   319
                case Model.P35_DS3: // IT8718F 
moel@168
   320
                case Model.P35_DS3L: // IT8718F
moel@130
   321
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   322
                  v.Add(new Voltage("DRAM", 1));
moel@130
   323
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   324
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   325
                  v.Add(new Voltage("+12V", 7, 27, 9.1f));
moel@130
   326
                  v.Add(new Voltage("VBat", 8));
moel@130
   327
                  t.Add(new Temperature("System", 0));
moel@130
   328
                  t.Add(new Temperature("CPU", 1));
moel@130
   329
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   330
                  f.Add(new Fan("System Fan #1", 1));
moel@130
   331
                  f.Add(new Fan("System Fan #2", 2));
moel@130
   332
                  f.Add(new Fan("Power Fan", 3));
moel@130
   333
                  break;
moel@168
   334
                case Model.P55_UD4: // IT8720F
moel@168
   335
                case Model.P55M_UD4: // IT8720F
moel@148
   336
                  v.Add(new Voltage("CPU VCore", 0));
moel@148
   337
                  v.Add(new Voltage("DRAM", 1));
moel@148
   338
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   339
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   340
                  v.Add(new Voltage("+12V", 5, 27, 9.1f));
moel@148
   341
                  v.Add(new Voltage("VBat", 8));
moel@148
   342
                  t.Add(new Temperature("System", 0));
moel@148
   343
                  t.Add(new Temperature("CPU", 2));
moel@148
   344
                  f.Add(new Fan("CPU Fan", 0));
moel@148
   345
                  f.Add(new Fan("System Fan #2", 1));
moel@148
   346
                  f.Add(new Fan("Power Fan", 2));
moel@148
   347
                  f.Add(new Fan("System Fan #1", 3));
moel@148
   348
                  break;
moel@168
   349
                case Model.GA_MA770T_UD3: // IT8720F
moel@154
   350
                  v.Add(new Voltage("CPU VCore", 0));
moel@154
   351
                  v.Add(new Voltage("DRAM", 1));
moel@154
   352
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   353
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   354
                  v.Add(new Voltage("+12V", 4, 27, 9.1f));
moel@154
   355
                  v.Add(new Voltage("VBat", 8));
moel@154
   356
                  t.Add(new Temperature("System", 0));
moel@154
   357
                  t.Add(new Temperature("CPU", 1));
moel@154
   358
                  f.Add(new Fan("CPU Fan", 0));
moel@154
   359
                  f.Add(new Fan("System Fan #1", 1));
moel@154
   360
                  f.Add(new Fan("System Fan #2", 2));
moel@154
   361
                  f.Add(new Fan("Power Fan", 3));
moel@154
   362
                  break;
moel@168
   363
                case Model.GA_MA785GMT_UD2H: // IT8718F
moel@130
   364
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   365
                  v.Add(new Voltage("DRAM", 1));
moel@130
   366
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   367
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   368
                  v.Add(new Voltage("+12V", 4, 27, 9.1f));
moel@130
   369
                  v.Add(new Voltage("VBat", 8));
moel@130
   370
                  t.Add(new Temperature("System", 0));
moel@130
   371
                  t.Add(new Temperature("CPU", 1));
moel@130
   372
                  f.Add(new Fan("CPU Fan", 0));
moel@130
   373
                  f.Add(new Fan("System Fan", 1));
moel@130
   374
                  f.Add(new Fan("NB Fan", 2));
moel@130
   375
                  break;
moel@168
   376
                case Model.X58A_UD3R: // IT8720F 
moel@138
   377
                  v.Add(new Voltage("CPU VCore", 0));
moel@138
   378
                  v.Add(new Voltage("DRAM", 1));
moel@138
   379
                  v.Add(new Voltage("+3.3V", 2));
moel@195
   380
                  v.Add(new Voltage("+5V", 3, 6.8f, 10));
moel@195
   381
                  v.Add(new Voltage("+12V", 5, 27, 9.1f));
moel@138
   382
                  v.Add(new Voltage("VBat", 8));
moel@138
   383
                  t.Add(new Temperature("System", 0));
moel@138
   384
                  t.Add(new Temperature("CPU", 1));
moel@138
   385
                  t.Add(new Temperature("Northbridge", 2));
moel@138
   386
                  f.Add(new Fan("CPU Fan", 0));
moel@138
   387
                  f.Add(new Fan("System Fan #2", 1));
moel@138
   388
                  f.Add(new Fan("Power Fan", 2));
moel@138
   389
                  f.Add(new Fan("System Fan #1", 3));
moel@138
   390
                  break;
moel@130
   391
                default:
moel@130
   392
                  v.Add(new Voltage("CPU VCore", 0));
moel@130
   393
                  v.Add(new Voltage("DRAM", 1, true));
moel@130
   394
                  v.Add(new Voltage("+3.3V", 2, true));
moel@130
   395
                  v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130
   396
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@130
   397
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   398
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@257
   399
                  v.Add(new Voltage("Voltage #8", 7, true));
moel@130
   400
                  v.Add(new Voltage("VBat", 8));
moel@130
   401
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   402
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   403
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   404
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   405
                  break;
moel@130
   406
              }
moel@130
   407
              break;
moel@130
   408
moel@130
   409
            default:
moel@130
   410
              v.Add(new Voltage("CPU VCore", 0));
moel@130
   411
              v.Add(new Voltage("Voltage #2", 1, true));
moel@130
   412
              v.Add(new Voltage("Voltage #3", 2, true));
moel@130
   413
              v.Add(new Voltage("Voltage #4", 3, true));
moel@130
   414
              v.Add(new Voltage("Voltage #5", 4, true));
moel@130
   415
              v.Add(new Voltage("Voltage #6", 5, true));
moel@130
   416
              v.Add(new Voltage("Voltage #7", 6, true));
moel@130
   417
              v.Add(new Voltage("Voltage #8", 7, true));
moel@130
   418
              v.Add(new Voltage("VBat", 8));
moel@130
   419
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   420
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   421
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   422
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   423
              break;
moel@130
   424
          }
moel@130
   425
          break;
moel@170
   426
moel@170
   427
        case Chip.IT8721F:
moel@277
   428
        case Chip.IT8728F:
moel@177
   429
          switch (manufacturer) {
moel@177
   430
            case Manufacturer.ECS:
moel@177
   431
              switch (model) {
moel@177
   432
                case Model.A890GXM_A: // IT8721F
moel@177
   433
                  v.Add(new Voltage("CPU VCore", 0));
moel@177
   434
                  v.Add(new Voltage("VDIMM", 1));
moel@177
   435
                  v.Add(new Voltage("NB Voltage", 2));
moel@195
   436
                  v.Add(new Voltage("Analog +3.3V", 3, 10, 10));
moel@177
   437
                  // v.Add(new Voltage("VDIMM", 6, true));
moel@195
   438
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@195
   439
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   440
                  t.Add(new Temperature("CPU", 0));
moel@177
   441
                  t.Add(new Temperature("System", 1));
moel@177
   442
                  t.Add(new Temperature("Northbridge", 2));
moel@177
   443
                  f.Add(new Fan("CPU Fan", 0));
moel@177
   444
                  f.Add(new Fan("System Fan", 1));
moel@177
   445
                  f.Add(new Fan("Power Fan", 2));
moel@177
   446
                  break;
moel@177
   447
                default:
moel@177
   448
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@177
   449
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@177
   450
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@177
   451
                  v.Add(new Voltage("Analog +3.3V", 3, 10, 10, 0, true));
moel@177
   452
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@177
   453
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@177
   454
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@177
   455
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@195
   456
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   457
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@177
   458
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@177
   459
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@177
   460
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@177
   461
                  break;
moel@177
   462
              }
moel@177
   463
              break;
moel@278
   464
            case Manufacturer.Gigabyte:
moel@278
   465
              switch (model) {
moel@278
   466
                case Model.P67A_UD4_B3:
moel@278
   467
                  v.Add(new Voltage("+12V", 0, 100, 10));
moel@278
   468
                  v.Add(new Voltage("+5V", 1, 15, 10));
moel@278
   469
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@278
   470
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@278
   471
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@278
   472
                  v.Add(new Voltage("CPU VCore", 5));
moel@278
   473
                  v.Add(new Voltage("DRAM", 6));
moel@278
   474
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@278
   475
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@278
   476
                  t.Add(new Temperature("System", 0));
moel@278
   477
                  t.Add(new Temperature("CPU", 2));
moel@278
   478
                  f.Add(new Fan("CPU Fan", 0));
moel@278
   479
                  f.Add(new Fan("System Fan #2", 1));
moel@278
   480
                  f.Add(new Fan("Power Fan", 2));
moel@278
   481
                  f.Add(new Fan("System Fan #1", 3));
moel@278
   482
                  break;
moel@278
   483
                default:
moel@278
   484
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@278
   485
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@278
   486
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@278
   487
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@278
   488
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@278
   489
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@278
   490
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@278
   491
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@278
   492
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@278
   493
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@278
   494
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@278
   495
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@278
   496
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@278
   497
                  break;
moel@278
   498
              }
moel@278
   499
              break;
moel@177
   500
            default:
moel@177
   501
              v.Add(new Voltage("Voltage #1", 0, true));
moel@177
   502
              v.Add(new Voltage("Voltage #2", 1, true));
moel@177
   503
              v.Add(new Voltage("Voltage #3", 2, true));
moel@277
   504
              v.Add(new Voltage("Voltage #4", 3, true));
moel@177
   505
              v.Add(new Voltage("Voltage #5", 4, true));
moel@177
   506
              v.Add(new Voltage("Voltage #6", 5, true));
moel@177
   507
              v.Add(new Voltage("Voltage #7", 6, true));
moel@177
   508
              v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@195
   509
              v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   510
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@177
   511
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@177
   512
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@177
   513
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@177
   514
              break;
moel@177
   515
          }
moel@170
   516
          break;
moel@130
   517
          
moel@130
   518
        case Chip.F71858:
moel@195
   519
          v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   520
          v.Add(new Voltage("VSB3V", 1, 150, 150));
moel@195
   521
          v.Add(new Voltage("Battery", 2, 150, 150));
moel@130
   522
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   523
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   524
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   525
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   526
          break;
moel@130
   527
        case Chip.F71862: 
moel@130
   528
        case Chip.F71869: 
moel@130
   529
        case Chip.F71882:
moel@130
   530
        case Chip.F71889ED: 
moel@130
   531
        case Chip.F71889F:
moel@132
   532
          switch (manufacturer) {
moel@132
   533
            case Manufacturer.EVGA:
moel@132
   534
              switch (model) {
moel@168
   535
                case Model.X58_SLI_Classified: // F71882 
moel@195
   536
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   537
                  v.Add(new Voltage("CPU VCore", 1, 47, 100));
moel@195
   538
                  v.Add(new Voltage("DIMM", 2, 47, 100));
moel@195
   539
                  v.Add(new Voltage("CPU VTT", 3, 24, 100));
moel@195
   540
                  v.Add(new Voltage("IOH Vcore", 4, 24, 100));
moel@195
   541
                  v.Add(new Voltage("+5V", 5, 51, 12));
moel@195
   542
                  v.Add(new Voltage("+12V", 6, 56, 6.8f));
moel@195
   543
                  v.Add(new Voltage("3VSB", 7, 150, 150));
moel@195
   544
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   545
                  t.Add(new Temperature("CPU", 0));
moel@132
   546
                  t.Add(new Temperature("VREG", 1));
moel@132
   547
                  t.Add(new Temperature("System", 2));
moel@132
   548
                  f.Add(new Fan("CPU Fan", 0));
moel@132
   549
                  f.Add(new Fan("Power Fan", 1));
moel@132
   550
                  f.Add(new Fan("Chassis Fan", 2));
moel@132
   551
                  break;
moel@132
   552
                default:
moel@195
   553
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   554
                  v.Add(new Voltage("CPU VCore", 1));
moel@132
   555
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   556
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   557
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   558
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   559
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   560
                  v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   561
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   562
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   563
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   564
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   565
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   566
                  break;
moel@132
   567
              }
moel@132
   568
              break;
moel@132
   569
            default:
moel@195
   570
              v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   571
              v.Add(new Voltage("CPU VCore", 1));
moel@132
   572
              v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   573
              v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   574
              v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   575
              v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   576
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   577
              v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   578
              v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   579
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   580
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   581
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   582
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   583
              break;
moel@132
   584
          }
moel@130
   585
          break;
moel@130
   586
moel@220
   587
        case Chip.W83627EHF:
moel@220
   588
          switch (manufacturer) {
moel@220
   589
            case Manufacturer.ASRock:
moel@220
   590
              switch (model) {
moel@220
   591
                case Model.AOD790GX_128M: // W83627EHF
moel@220
   592
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   593
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@220
   594
                  v.Add(new Voltage("+3.3V", 4, 10, 10));
moel@220
   595
                  v.Add(new Voltage("+5V", 5, 20, 10));
moel@220
   596
                  v.Add(new Voltage("+12V", 6, 28, 5));
moel@220
   597
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@220
   598
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   599
                  t.Add(new Temperature("CPU", 0));
moel@220
   600
                  t.Add(new Temperature("Motherboard", 2));
moel@221
   601
                  f.Add(new Fan("CPU Fan", 0));
moel@221
   602
                  f.Add(new Fan("Chassis Fan", 1));                 
moel@220
   603
                  break;
moel@220
   604
                default:
moel@220
   605
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   606
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   607
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   608
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   609
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   610
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   611
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   612
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   613
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   614
                  v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   615
                  t.Add(new Temperature("CPU", 0));
moel@220
   616
                  t.Add(new Temperature("Auxiliary", 1));
moel@220
   617
                  t.Add(new Temperature("System", 2));
moel@220
   618
                  f.Add(new Fan("System Fan", 0));
moel@220
   619
                  f.Add(new Fan("CPU Fan", 1));
moel@220
   620
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   621
                  f.Add(new Fan("CPU Fan #2", 3));
moel@220
   622
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   623
                  break;
moel@220
   624
              } break;
moel@220
   625
            default:
moel@220
   626
              v.Add(new Voltage("CPU VCore", 0));
moel@220
   627
              v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   628
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   629
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   630
              v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   631
              v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   632
              v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   633
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   634
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   635
              v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   636
              t.Add(new Temperature("CPU", 0));
moel@220
   637
              t.Add(new Temperature("Auxiliary", 1));
moel@220
   638
              t.Add(new Temperature("System", 2));
moel@220
   639
              f.Add(new Fan("System Fan", 0));
moel@220
   640
              f.Add(new Fan("CPU Fan", 1));
moel@220
   641
              f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   642
              f.Add(new Fan("CPU Fan #2", 3));
moel@220
   643
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   644
              break;
moel@220
   645
          }
moel@130
   646
          break;
moel@130
   647
        case Chip.W83627DHG: 
moel@130
   648
        case Chip.W83627DHGP:                      
moel@130
   649
        case Chip.W83667HG:
moel@130
   650
        case Chip.W83667HGB:
moel@152
   651
          switch (manufacturer) {
moel@153
   652
            case Manufacturer.ASRock:
moel@153
   653
              switch (model) {
moel@168
   654
                case Model._880GMH_USB3: // W83627DHG-P
moel@153
   655
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   656
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   657
                  v.Add(new Voltage("+5V", 5, 15, 7.5f));
moel@195
   658
                  v.Add(new Voltage("+12V", 6, 56, 10));
moel@195
   659
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   660
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   661
                  t.Add(new Temperature("CPU", 0));
moel@153
   662
                  t.Add(new Temperature("Motherboard", 2));
moel@153
   663
                  f.Add(new Fan("Chassis Fan", 0));
moel@153
   664
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   665
                  f.Add(new Fan("Power Fan", 2));
moel@153
   666
                  break;
moel@153
   667
                default:
moel@153
   668
                  v.Add(new Voltage("CPU VCore", 0));
moel@153
   669
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   670
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   671
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@153
   672
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@153
   673
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@153
   674
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   675
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   676
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   677
                  t.Add(new Temperature("CPU", 0));
moel@153
   678
                  t.Add(new Temperature("Auxiliary", 1));
moel@153
   679
                  t.Add(new Temperature("System", 2));
moel@153
   680
                  f.Add(new Fan("System Fan", 0));
moel@153
   681
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   682
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   683
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   684
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@153
   685
                  break;
moel@153
   686
              }
moel@153
   687
              break;
moel@152
   688
            case Manufacturer.ASUS:
moel@152
   689
              switch (model) {
moel@174
   690
                case Model.P6X58D_E: // W83667HG                 
moel@174
   691
                case Model.Rampage_II_GENE: // W83667HG 
moel@152
   692
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   693
                  v.Add(new Voltage("+12V", 1, 11.5f, 1.91f));
moel@195
   694
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   695
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   696
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   697
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   698
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@174
   699
                  t.Add(new Temperature("CPU", 0));
moel@174
   700
                  t.Add(new Temperature("Motherboard", 2));
moel@174
   701
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@174
   702
                  f.Add(new Fan("CPU Fan", 1));
moel@174
   703
                  f.Add(new Fan("Power Fan", 2));
moel@174
   704
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@174
   705
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@174
   706
                  break;
moel@174
   707
                case Model.Rampage_Extreme: // W83667HG 
moel@174
   708
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   709
                  v.Add(new Voltage("+12V", 1, 12, 2));
moel@195
   710
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   711
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   712
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   713
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   714
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   715
                  t.Add(new Temperature("CPU", 0));
moel@152
   716
                  t.Add(new Temperature("Motherboard", 2));
moel@152
   717
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@153
   718
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   719
                  f.Add(new Fan("Power Fan", 2));
moel@152
   720
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@152
   721
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@152
   722
                  break;
moel@152
   723
                default:
moel@152
   724
                  v.Add(new Voltage("CPU VCore", 0));
moel@152
   725
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   726
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   727
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   728
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   729
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   730
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   731
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   732
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   733
                  t.Add(new Temperature("CPU", 0));
moel@152
   734
                  t.Add(new Temperature("Auxiliary", 1));
moel@152
   735
                  t.Add(new Temperature("System", 2));
moel@153
   736
                  f.Add(new Fan("System Fan", 0));
moel@153
   737
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   738
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   739
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   740
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   741
                  break;
moel@152
   742
              }
moel@152
   743
              break;
moel@152
   744
            default:
moel@152
   745
              v.Add(new Voltage("CPU VCore", 0));
moel@152
   746
              v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   747
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   748
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   749
              v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   750
              v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   751
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   752
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   753
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   754
              t.Add(new Temperature("CPU", 0));
moel@152
   755
              t.Add(new Temperature("Auxiliary", 1));
moel@152
   756
              t.Add(new Temperature("System", 2));
moel@153
   757
              f.Add(new Fan("System Fan", 0));
moel@153
   758
              f.Add(new Fan("CPU Fan", 1));
moel@153
   759
              f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   760
              f.Add(new Fan("CPU Fan #2", 3));
moel@153
   761
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   762
              break;
moel@152
   763
          } 
moel@130
   764
          break;
moel@130
   765
        case Chip.W83627HF: 
moel@130
   766
        case Chip.W83627THF: 
moel@130
   767
        case Chip.W83687THF:
moel@130
   768
          v.Add(new Voltage("CPU VCore", 0));
moel@130
   769
          v.Add(new Voltage("Voltage #2", 1, true));
moel@130
   770
          v.Add(new Voltage("Voltage #3", 2, true));
moel@195
   771
          v.Add(new Voltage("AVCC", 3, 34, 51));
moel@130
   772
          v.Add(new Voltage("Voltage #5", 4, true));
moel@195
   773
          v.Add(new Voltage("5VSB", 5, 34, 51));
moel@130
   774
          v.Add(new Voltage("VBAT", 6));
moel@130
   775
          t.Add(new Temperature("CPU", 0));
moel@130
   776
          t.Add(new Temperature("Auxiliary", 1));
moel@130
   777
          t.Add(new Temperature("System", 2));
moel@153
   778
          f.Add(new Fan("System Fan", 0));
moel@153
   779
          f.Add(new Fan("CPU Fan", 1));
moel@153
   780
          f.Add(new Fan("Auxiliary Fan", 2));
moel@130
   781
          break;
moel@245
   782
        case Chip.NCT6771F:
moel@265
   783
        case Chip.NCT6776F:
moel@265
   784
          switch (manufacturer) {
moel@265
   785
            case Manufacturer.ASUS:
moel@265
   786
              switch (model) {
moel@265
   787
                case Model.P8P67_PRO: // NCT6776F
moel@265
   788
                  v.Add(new Voltage("CPU VCore", 0));
moel@265
   789
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   790
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   791
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   792
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   793
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   794
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   795
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   796
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@276
   797
                  t.Add(new Temperature("CPU", 1));
moel@276
   798
                  t.Add(new Temperature("Auxiliary", 2));
moel@276
   799
                  t.Add(new Temperature("System", 3));
moel@265
   800
                  f.Add(new Fan("System Fan", 0));
moel@265
   801
                  f.Add(new Fan("CPU Fan", 1));
moel@265
   802
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@265
   803
                  f.Add(new Fan("Auxiliary Fan #2", 3));
moel@265
   804
                  f.Add(new Fan("Auxiliary Fan #3", 4));
moel@265
   805
                  break;
moel@276
   806
                case Model.P8P67_M_PRO: // NCT6776F
moel@276
   807
                  v.Add(new Voltage("CPU VCore", 0));
moel@276
   808
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@276
   809
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@276
   810
                  v.Add(new Voltage("+3V", 3, 34, 34));
moel@276
   811
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@276
   812
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@276
   813
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@276
   814
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@276
   815
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@276
   816
                  t.Add(new Temperature("CPU", 0));
moel@276
   817
                  t.Add(new Temperature("Motherboard", 3));
moel@276
   818
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@276
   819
                  f.Add(new Fan("CPU Fan", 1));
moel@276
   820
                  f.Add(new Fan("Chassis Fan #2", 2));
moel@276
   821
                  f.Add(new Fan("Power Fan", 3));
moel@276
   822
                  f.Add(new Fan("Auxiliary Fan", 4));
moel@276
   823
                  break;
moel@265
   824
                default:
moel@265
   825
                  v.Add(new Voltage("CPU VCore", 0));
moel@265
   826
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   827
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   828
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   829
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   830
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   831
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   832
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   833
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   834
                  t.Add(new Temperature("CPU", 0));
moel@276
   835
                  t.Add(new Temperature("CPU", 1));
moel@276
   836
                  t.Add(new Temperature("Auxiliary", 2));
moel@276
   837
                  t.Add(new Temperature("System", 3));
moel@265
   838
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   839
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   840
                  break;
moel@265
   841
              }
moel@265
   842
              break;
moel@265
   843
            default:
moel@265
   844
              v.Add(new Voltage("CPU VCore", 0));
moel@265
   845
              v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   846
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   847
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   848
              v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   849
              v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   850
              v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   851
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   852
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   853
              t.Add(new Temperature("CPU", 0));
moel@276
   854
              t.Add(new Temperature("CPU", 1));
moel@276
   855
              t.Add(new Temperature("Auxiliary", 2));
moel@276
   856
              t.Add(new Temperature("System", 3));
moel@265
   857
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   858
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   859
              break;
moel@265
   860
          }
moel@245
   861
          break;
moel@130
   862
        default:
moel@130
   863
          for (int i = 0; i < superIO.Voltages.Length; i++)
moel@130
   864
            v.Add(new Voltage("Voltage #" + (i + 1), i, true));
moel@130
   865
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   866
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   867
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   868
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   869
          break;
moel@130
   870
      }
moel@130
   871
moel@195
   872
      const string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
moel@130
   873
      foreach (Voltage voltage in v) 
moel@130
   874
        if (voltage.Index < superIO.Voltages.Length) {
moel@130
   875
          Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
moel@195
   876
            voltage.Hidden, SensorType.Voltage, this, new [] {
moel@130
   877
            new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
moel@130
   878
              formula, voltage.Ri),
moel@130
   879
            new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
moel@130
   880
              formula, voltage.Rf),
moel@130
   881
            new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
moel@130
   882
              formula, voltage.Vf)
moel@165
   883
            }, settings);
moel@130
   884
          voltages.Add(sensor);
moel@130
   885
      }
moel@130
   886
moel@130
   887
      foreach (Temperature temperature in t) 
moel@130
   888
        if (temperature.Index < superIO.Temperatures.Length) {
moel@134
   889
        Sensor sensor = new Sensor(temperature.Name, temperature.Index,
moel@195
   890
          SensorType.Temperature, this, new [] {
moel@130
   891
          new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
moel@165
   892
        }, settings);
moel@130
   893
        temperatures.Add(sensor);
moel@130
   894
      }
moel@130
   895
moel@130
   896
      foreach (Fan fan in f)
moel@130
   897
        if (fan.Index < superIO.Fans.Length) {
moel@134
   898
          Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
moel@165
   899
            this, settings);
moel@130
   900
          fans.Add(sensor);
moel@130
   901
        }
moel@130
   902
    }
moel@130
   903
moel@165
   904
    public override HardwareType HardwareType {
moel@165
   905
      get { return HardwareType.SuperIO; }
moel@130
   906
    }
moel@130
   907
moel@176
   908
    public override IHardware Parent {
moel@176
   909
      get { return mainboard; }
moel@176
   910
    }
moel@176
   911
moel@130
   912
moel@130
   913
    public override string GetReport() {
moel@130
   914
      return superIO.GetReport();
moel@130
   915
    }
moel@130
   916
moel@130
   917
    public override void Update() {
moel@130
   918
      superIO.Update();
moel@130
   919
moel@130
   920
      foreach (Sensor sensor in voltages) {
moel@228
   921
        float? value = readVoltage(sensor.Index);
moel@130
   922
        if (value.HasValue) {
moel@130
   923
          sensor.Value = value + (value - sensor.Parameters[2].Value) *
moel@130
   924
            sensor.Parameters[0].Value / sensor.Parameters[1].Value;
moel@130
   925
          ActivateSensor(sensor);
moel@130
   926
        }
moel@130
   927
      }
moel@130
   928
moel@130
   929
      foreach (Sensor sensor in temperatures) {
moel@228
   930
        float? value = readTemperature(sensor.Index);
moel@130
   931
        if (value.HasValue) {
moel@130
   932
          sensor.Value = value + sensor.Parameters[0].Value;
moel@130
   933
          ActivateSensor(sensor);
moel@130
   934
        }
moel@130
   935
      }
moel@130
   936
moel@130
   937
      foreach (Sensor sensor in fans) {
moel@228
   938
        float? value = readFan(sensor.Index);
moel@130
   939
        if (value.HasValue) {
moel@130
   940
          sensor.Value = value;
moel@130
   941
          if (value.Value > 0)
moel@130
   942
            ActivateSensor(sensor);
moel@130
   943
        }
moel@130
   944
      }
moel@228
   945
moel@228
   946
      postUpdate();
moel@130
   947
    }
moel@130
   948
moel@130
   949
    private class Voltage {
moel@130
   950
      public readonly string Name;
moel@130
   951
      public readonly int Index;
moel@130
   952
      public readonly float Ri;
moel@130
   953
      public readonly float Rf;
moel@130
   954
      public readonly float Vf;
moel@130
   955
      public readonly bool Hidden;
moel@130
   956
moel@202
   957
      public Voltage(string name, int index) :
moel@202
   958
        this(name, index, false) { }
moel@202
   959
      
moel@130
   960
      public Voltage(string name, int index, bool hidden) :
moel@130
   961
        this(name, index, 0, 1, 0, hidden) { }
moel@202
   962
      
moel@202
   963
      public Voltage(string name, int index, float ri, float rf) :
moel@202
   964
        this(name, index, ri, rf, 0, false) { }
moel@202
   965
      
moel@202
   966
      // float ri = 0, float rf = 1, float vf = 0, bool hidden = false) 
moel@202
   967
      
moel@195
   968
      public Voltage(string name, int index, 
moel@202
   969
        float ri, float rf, float vf, bool hidden) 
moel@195
   970
      {
moel@130
   971
        this.Name = name;
moel@130
   972
        this.Index = index;
moel@130
   973
        this.Ri = ri;
moel@130
   974
        this.Rf = rf;
moel@130
   975
        this.Vf = vf;
moel@130
   976
        this.Hidden = hidden;
moel@130
   977
      }
moel@130
   978
    }
moel@130
   979
moel@130
   980
    private class Temperature {
moel@130
   981
      public readonly string Name;
moel@130
   982
      public readonly int Index;
moel@130
   983
moel@167
   984
      public Temperature(string name, int index) {
moel@130
   985
        this.Name = name;
moel@130
   986
        this.Index = index;
moel@130
   987
      }
moel@130
   988
    }
moel@130
   989
moel@130
   990
    private class Fan {
moel@130
   991
      public readonly string Name;
moel@130
   992
      public readonly int Index;
moel@130
   993
moel@130
   994
      public Fan(string name, int index) {
moel@130
   995
        this.Name = name;
moel@130
   996
        this.Index = index;
moel@130
   997
      }
moel@130
   998
    }
moel@130
   999
  }
moel@130
  1000
}