Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Sun, 04 Jul 2010 12:12:37 +0000
changeset 150 522da3b8cb1a
parent 146 d27bde956836
child 152 98187e7a08b2
permissions -rw-r--r--
Fixed Issue 66.
     1 /*
     2   
     3   Version: MPL 1.1/GPL 2.0/LGPL 2.1
     4 
     5   The contents of this file are subject to the Mozilla Public License Version
     6   1.1 (the "License"); you may not use this file except in compliance with
     7   the License. You may obtain a copy of the License at
     8  
     9   http://www.mozilla.org/MPL/
    10 
    11   Software distributed under the License is distributed on an "AS IS" basis,
    12   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    13   for the specific language governing rights and limitations under the License.
    14 
    15   The Original Code is the Open Hardware Monitor code.
    16 
    17   The Initial Developer of the Original Code is 
    18   Michael Möller <m.moeller@gmx.ch>.
    19   Portions created by the Initial Developer are Copyright (C) 2009-2010
    20   the Initial Developer. All Rights Reserved.
    21 
    22   Contributor(s):
    23 
    24   Alternatively, the contents of this file may be used under the terms of
    25   either the GNU General Public License Version 2 or later (the "GPL"), or
    26   the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
    27   in which case the provisions of the GPL or the LGPL are applicable instead
    28   of those above. If you wish to allow use of your version of this file only
    29   under the terms of either the GPL or the LGPL, and not to allow others to
    30   use your version of this file under the terms of the MPL, indicate your
    31   decision by deleting the provisions above and replace them with the notice
    32   and other provisions required by the GPL or the LGPL. If you do not delete
    33   the provisions above, a recipient may use your version of this file under
    34   the terms of any one of the MPL, the GPL or the LGPL.
    35  
    36 */
    37 
    38 using System;
    39 using System.Collections.Generic;
    40 using System.Drawing;
    41 using OpenHardwareMonitor.Hardware.LPC;
    42 
    43 namespace OpenHardwareMonitor.Hardware.Mainboard {
    44   public class SuperIOHardware : Hardware {
    45 
    46     private ISuperIO superIO;
    47     private Image icon;
    48     protected readonly string name;
    49 
    50     private List<Sensor> voltages = new List<Sensor>();
    51     private List<Sensor> temperatures = new List<Sensor>();
    52     private List<Sensor> fans = new List<Sensor>();  
    53 
    54     public SuperIOHardware(ISuperIO superIO, Manufacturer manufacturer, 
    55       Model model) 
    56     {
    57       this.superIO = superIO;
    58       this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
    59 
    60       switch (superIO.Chip) {
    61         case Chip.F71858: name = "Fintek F71858"; break;
    62         case Chip.F71862: name = "Fintek F71862"; break;
    63         case Chip.F71869: name = "Fintek F71869"; break;
    64         case Chip.F71882: name = "Fintek F71882"; break;
    65         case Chip.F71889ED: name = "Fintek F71889ED"; break;
    66         case Chip.F71889F: name = "Fintek F71889F"; break;
    67         case Chip.IT8712F: this.name = "ITE IT8712F"; break;
    68         case Chip.IT8716F: this.name = "ITE IT8716F"; break;
    69         case Chip.IT8718F: this.name = "ITE IT8718F"; break;
    70         case Chip.IT8720F: this.name = "ITE IT8720F"; break;
    71         case Chip.IT8726F: this.name = "ITE IT8726F"; break;
    72         case Chip.W83627DHG: this.name = "Winbond W83627DHG"; break;
    73         case Chip.W83627DHGP: this.name = "Winbond W83627DHG-P"; break;
    74         case Chip.W83627EHF: this.name = "Winbond W83627EHF"; break;
    75         case Chip.W83627HF: this.name = "Winbond W83627HF"; break;
    76         case Chip.W83627THF: this.name = "Winbond W83627THF"; break;
    77         case Chip.W83667HG: this.name = "Winbond W83667HG"; break;
    78         case Chip.W83667HGB: this.name = "Winbond W83667HG-B"; break;
    79         case Chip.W83687THF: this.name = "Winbond W83687THF"; break;
    80         case Chip.Unknown: this.name = "Unkown"; break;
    81       }
    82 
    83       List<Voltage> v = new List<Voltage>();
    84       List<Temperature> t = new List<Temperature>();
    85       List<Fan> f = new List<Fan>();
    86 
    87       switch (superIO.Chip) {
    88         case Chip.IT8712F:
    89         case Chip.IT8716F:
    90         case Chip.IT8718F:
    91         case Chip.IT8720F:
    92         case Chip.IT8726F:
    93           switch (manufacturer) {
    94             case Manufacturer.ASUS:
    95               switch (model) {
    96                 case Model.Crosshair_III_Formula:
    97                   v.Add(new Voltage("VBat", 8));
    98                   t.Add(new Temperature("CPU", 0));
    99                   for (int i = 0; i < superIO.Fans.Length; i++)
   100                     f.Add(new Fan("Fan #" + (i + 1), i));
   101                   break;
   102                 case Model.M2N_SLI_DELUXE:                
   103                   v.Add(new Voltage("CPU VCore", 0));
   104                   v.Add(new Voltage("+3.3V", 1));
   105                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   106                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   107                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   108                   v.Add(new Voltage("VBat", 8));
   109                   t.Add(new Temperature("CPU", 0));
   110                   t.Add(new Temperature("Motherboard", 1));
   111                   f.Add(new Fan("CPU Fan", 0));
   112                   f.Add(new Fan("Chassis Fan #1", 1));
   113                   f.Add(new Fan("Power Fan", 2));
   114                   break;
   115                 case Model.M4A79XTD_EVO:              
   116                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   117                   v.Add(new Voltage("VBat", 8));
   118                   t.Add(new Temperature("CPU", 0));
   119                   t.Add(new Temperature("Motherboard", 1));
   120                   f.Add(new Fan("CPU Fan", 0));
   121                   f.Add(new Fan("Chassis Fan #1", 1));
   122                   f.Add(new Fan("Chassis Fan #2", 2));
   123                   break;
   124                 default:
   125                   v.Add(new Voltage("CPU VCore", 0));
   126                   v.Add(new Voltage("Voltage #2", 1, true));
   127                   v.Add(new Voltage("Voltage #3", 2, true));
   128                   v.Add(new Voltage("Voltage #4", 3, true));
   129                   v.Add(new Voltage("Voltage #5", 4, true));
   130                   v.Add(new Voltage("Voltage #6", 5, true));
   131                   v.Add(new Voltage("Voltage #7", 6, true));
   132                   v.Add(new Voltage("Voltage #8", 7, true));
   133                   v.Add(new Voltage("VBat", 8));
   134                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   135                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   136                   for (int i = 0; i < superIO.Fans.Length; i++)
   137                     f.Add(new Fan("Fan #" + (i + 1), i));
   138                   break;
   139               }
   140               break;
   141             case Manufacturer.DFI:
   142               switch (model) {
   143                 case Model.LP_BI_P45_T2RS_Elite:
   144                   v.Add(new Voltage("CPU VCore", 0));
   145                   v.Add(new Voltage("FSB VTT", 1));
   146                   v.Add(new Voltage("+3.3V", 2));
   147                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   148                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   149                   v.Add(new Voltage("NB Core", 5));
   150                   v.Add(new Voltage("VDIMM", 6));
   151                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   152                   v.Add(new Voltage("VBat", 8));
   153                   t.Add(new Temperature("CPU", 0));
   154                   t.Add(new Temperature("System", 1));
   155                   t.Add(new Temperature("Chipset", 2));
   156                   f.Add(new Fan("Fan #1", 0));
   157                   f.Add(new Fan("Fan #2", 1));
   158                   f.Add(new Fan("Fan #3", 2));
   159                   break;
   160                 case Model.LP_DK_P55_T3eH9:
   161                   v.Add(new Voltage("CPU VCore", 0));
   162                   v.Add(new Voltage("VTT", 1));
   163                   v.Add(new Voltage("+3.3V", 2));
   164                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   165                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   166                   v.Add(new Voltage("CPU PLL", 5));
   167                   v.Add(new Voltage("DRAM", 6));
   168                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   169                   v.Add(new Voltage("VBat", 8));
   170                   t.Add(new Temperature("Chipset", 0));
   171                   t.Add(new Temperature("CPU PWM", 1));
   172                   t.Add(new Temperature("CPU", 2));
   173                   f.Add(new Fan("Fan #1", 0));
   174                   f.Add(new Fan("Fan #2", 1));
   175                   f.Add(new Fan("Fan #3", 2));
   176                   break;
   177                 default:
   178                   v.Add(new Voltage("CPU VCore", 0));
   179                   v.Add(new Voltage("VTT", 1, true));
   180                   v.Add(new Voltage("+3.3V", 2, true));
   181                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   182                   v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
   183                   v.Add(new Voltage("Voltage #6", 5, true));
   184                   v.Add(new Voltage("DRAM", 6, true));
   185                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
   186                   v.Add(new Voltage("VBat", 8));
   187                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   188                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   189                   for (int i = 0; i < superIO.Fans.Length; i++)
   190                     f.Add(new Fan("Fan #" + (i + 1), i));
   191                   break;
   192               }
   193               break;
   194 
   195             case Manufacturer.Gigabyte:
   196               switch (model) {
   197                 case Model._965P_S3:
   198                   v.Add(new Voltage("CPU VCore", 0));
   199                   v.Add(new Voltage("DRAM", 1));
   200                   v.Add(new Voltage("+3.3V", 2));
   201                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   202                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   203                   v.Add(new Voltage("VBat", 8));
   204                   t.Add(new Temperature("System", 0));
   205                   t.Add(new Temperature("CPU", 1));
   206                   f.Add(new Fan("CPU Fan", 0));
   207                   f.Add(new Fan("System Fan", 1));
   208                   break;
   209                 case Model.EP45_DS3R:
   210                 case Model.EP45_UD3R: 
   211                 case Model.X38_DS5:    
   212                   v.Add(new Voltage("CPU VCore", 0));
   213                   v.Add(new Voltage("DRAM", 1));
   214                   v.Add(new Voltage("+3.3V", 2));
   215                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   216                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   217                   v.Add(new Voltage("VBat", 8));
   218                   t.Add(new Temperature("System", 0));
   219                   t.Add(new Temperature("CPU", 1));
   220                   f.Add(new Fan("CPU Fan", 0));
   221                   f.Add(new Fan("System Fan #2", 1));
   222                   f.Add(new Fan("Power Fan", 2));
   223                   f.Add(new Fan("System Fan #1", 3));
   224                   break;
   225                 case Model.EX58_EXTREME:
   226                   v.Add(new Voltage("CPU VCore", 0));
   227                   v.Add(new Voltage("DRAM", 1));
   228                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   229                   v.Add(new Voltage("VBat", 8));
   230                   t.Add(new Temperature("System", 0));
   231                   t.Add(new Temperature("CPU", 1));
   232                   t.Add(new Temperature("Northbridge", 2));
   233                   f.Add(new Fan("CPU Fan", 0));
   234                   f.Add(new Fan("System Fan #2", 1));
   235                   f.Add(new Fan("Power Fan", 2));
   236                   f.Add(new Fan("System Fan #1", 3));
   237                   break;
   238                 case Model.P35_DS3:
   239                 case Model.P35_DS3L:                
   240                   v.Add(new Voltage("CPU VCore", 0));
   241                   v.Add(new Voltage("DRAM", 1));
   242                   v.Add(new Voltage("+3.3V", 2));
   243                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   244                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   245                   v.Add(new Voltage("VBat", 8));
   246                   t.Add(new Temperature("System", 0));
   247                   t.Add(new Temperature("CPU", 1));
   248                   f.Add(new Fan("CPU Fan", 0));
   249                   f.Add(new Fan("System Fan #1", 1));
   250                   f.Add(new Fan("System Fan #2", 2));
   251                   f.Add(new Fan("Power Fan", 3));
   252                   break;
   253                 case Model.P55_UD4:
   254                   v.Add(new Voltage("CPU VCore", 0));
   255                   v.Add(new Voltage("DRAM", 1));
   256                   v.Add(new Voltage("+3.3V", 2));
   257                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   258                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
   259                   v.Add(new Voltage("VBat", 8));
   260                   t.Add(new Temperature("System", 0));
   261                   t.Add(new Temperature("CPU", 2));
   262                   f.Add(new Fan("CPU Fan", 0));
   263                   f.Add(new Fan("System Fan #2", 1));
   264                   f.Add(new Fan("Power Fan", 2));
   265                   f.Add(new Fan("System Fan #1", 3));
   266                   break;
   267                 case Model.GA_MA785GMT_UD2H:
   268                   v.Add(new Voltage("CPU VCore", 0));
   269                   v.Add(new Voltage("DRAM", 1));
   270                   v.Add(new Voltage("+3.3V", 2));
   271                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   272                   v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
   273                   v.Add(new Voltage("VBat", 8));
   274                   t.Add(new Temperature("System", 0));
   275                   t.Add(new Temperature("CPU", 1));
   276                   f.Add(new Fan("CPU Fan", 0));
   277                   f.Add(new Fan("System Fan", 1));
   278                   f.Add(new Fan("NB Fan", 2));
   279                   break;
   280                 case Model.X58A_UD3R:
   281                   v.Add(new Voltage("CPU VCore", 0));
   282                   v.Add(new Voltage("DRAM", 1));
   283                   v.Add(new Voltage("+3.3V", 2));
   284                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   285                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
   286                   v.Add(new Voltage("VBat", 8));
   287                   t.Add(new Temperature("System", 0));
   288                   t.Add(new Temperature("CPU", 1));
   289                   t.Add(new Temperature("Northbridge", 2));
   290                   f.Add(new Fan("CPU Fan", 0));
   291                   f.Add(new Fan("System Fan #2", 1));
   292                   f.Add(new Fan("Power Fan", 2));
   293                   f.Add(new Fan("System Fan #1", 3));
   294                   break;
   295                 default:
   296                   v.Add(new Voltage("CPU VCore", 0));
   297                   v.Add(new Voltage("DRAM", 1, true));
   298                   v.Add(new Voltage("+3.3V", 2, true));
   299                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   300                   v.Add(new Voltage("Voltage #5", 4, true));
   301                   v.Add(new Voltage("Voltage #6", 5, true));
   302                   v.Add(new Voltage("Voltage #7", 6, true));
   303                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
   304                   v.Add(new Voltage("VBat", 8));
   305                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   306                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   307                   for (int i = 0; i < superIO.Fans.Length; i++)
   308                     f.Add(new Fan("Fan #" + (i + 1), i));
   309                   break;
   310               }
   311               break;
   312 
   313             default:
   314               v.Add(new Voltage("CPU VCore", 0));
   315               v.Add(new Voltage("Voltage #2", 1, true));
   316               v.Add(new Voltage("Voltage #3", 2, true));
   317               v.Add(new Voltage("Voltage #4", 3, true));
   318               v.Add(new Voltage("Voltage #5", 4, true));
   319               v.Add(new Voltage("Voltage #6", 5, true));
   320               v.Add(new Voltage("Voltage #7", 6, true));
   321               v.Add(new Voltage("Voltage #8", 7, true));
   322               v.Add(new Voltage("VBat", 8));
   323               for (int i = 0; i < superIO.Temperatures.Length; i++)
   324                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   325               for (int i = 0; i < superIO.Fans.Length; i++)
   326                 f.Add(new Fan("Fan #" + (i + 1), i));
   327               break;
   328           }
   329           break;
   330           
   331         case Chip.F71858:
   332           v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   333           v.Add(new Voltage("VSB3V", 1, 150, 150, 0));
   334           v.Add(new Voltage("Battery", 2, 150, 150, 0));
   335           for (int i = 0; i < superIO.Temperatures.Length; i++)
   336             t.Add(new Temperature("Temperature #" + (i + 1), i));
   337           for (int i = 0; i < superIO.Fans.Length; i++)
   338             f.Add(new Fan("Fan #" + (i + 1), i));
   339           break;
   340         case Chip.F71862: 
   341         case Chip.F71869: 
   342         case Chip.F71882:
   343         case Chip.F71889ED: 
   344         case Chip.F71889F:
   345           switch (manufacturer) {
   346             case Manufacturer.EVGA:
   347               switch (model) {
   348                 case Model.X58_SLI_Classified:
   349                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   350                   v.Add(new Voltage("CPU VCore", 1, 47, 100, 0));
   351                   v.Add(new Voltage("DIMM", 2, 47, 100, 0));
   352                   v.Add(new Voltage("CPU VTT", 3, 24, 100, 0));
   353                   v.Add(new Voltage("IOH Vcore", 4, 24, 100, 0));
   354                   v.Add(new Voltage("+5V", 5, 51, 12, 0));
   355                   v.Add(new Voltage("+12V", 6, 56, 6.8f, 0));
   356                   v.Add(new Voltage("3VSB", 7, 150, 150, 0));
   357                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   358                   t.Add(new Temperature("CPU", 0));
   359                   t.Add(new Temperature("VREG", 1));
   360                   t.Add(new Temperature("System", 2));
   361                   f.Add(new Fan("CPU Fan", 0));
   362                   f.Add(new Fan("Power Fan", 1));
   363                   f.Add(new Fan("Chassis Fan", 2));
   364                   break;
   365                 default:
   366                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   367                   v.Add(new Voltage("CPU VCore", 1));
   368                   v.Add(new Voltage("Voltage #3", 2, true));
   369                   v.Add(new Voltage("Voltage #4", 3, true));
   370                   v.Add(new Voltage("Voltage #5", 4, true));
   371                   v.Add(new Voltage("Voltage #6", 5, true));
   372                   v.Add(new Voltage("Voltage #7", 6, true));
   373                   v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   374                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   375                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   376                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   377                   for (int i = 0; i < superIO.Fans.Length; i++)
   378                     f.Add(new Fan("Fan #" + (i + 1), i));
   379                   break;
   380               }
   381               break;
   382             default:
   383               v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   384               v.Add(new Voltage("CPU VCore", 1));
   385               v.Add(new Voltage("Voltage #3", 2, true));
   386               v.Add(new Voltage("Voltage #4", 3, true));
   387               v.Add(new Voltage("Voltage #5", 4, true));
   388               v.Add(new Voltage("Voltage #6", 5, true));
   389               v.Add(new Voltage("Voltage #7", 6, true));
   390               v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   391               v.Add(new Voltage("VBat", 8, 150, 150, 0));
   392               for (int i = 0; i < superIO.Temperatures.Length; i++)
   393                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   394               for (int i = 0; i < superIO.Fans.Length; i++)
   395                 f.Add(new Fan("Fan #" + (i + 1), i));
   396               break;
   397           }
   398           break;
   399 
   400         case Chip.W83627EHF:          
   401           v.Add(new Voltage("CPU VCore", 0));
   402           v.Add(new Voltage("Voltage #2", 1, true));
   403           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   404           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   405           v.Add(new Voltage("Voltage #5", 4, true));
   406           v.Add(new Voltage("Voltage #6", 5, true));
   407           v.Add(new Voltage("Voltage #7", 6, true));
   408           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   409           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   410           v.Add(new Voltage("Voltage #10", 9, true));
   411           t.Add(new Temperature("CPU", 0));
   412           t.Add(new Temperature("Auxiliary", 1));
   413           t.Add(new Temperature("System", 2));
   414           f.Add(new Fan("System", 0));
   415           f.Add(new Fan("CPU", 1));
   416           f.Add(new Fan("Auxiliary", 2));
   417           f.Add(new Fan("CPU #2", 3));
   418           f.Add(new Fan("Auxiliary #2", 4));
   419           break;
   420         case Chip.W83627DHG: 
   421         case Chip.W83627DHGP:                      
   422         case Chip.W83667HG:
   423         case Chip.W83667HGB:
   424           v.Add(new Voltage("CPU VCore", 0));
   425           v.Add(new Voltage("Voltage #2", 1, true));
   426           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   427           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   428           v.Add(new Voltage("Voltage #5", 4, true));
   429           v.Add(new Voltage("Voltage #6", 5, true));
   430           v.Add(new Voltage("Voltage #7", 6, true));
   431           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   432           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   433           t.Add(new Temperature("CPU", 0));
   434           t.Add(new Temperature("Auxiliary", 1));
   435           t.Add(new Temperature("System", 2));
   436           f.Add(new Fan("System", 0));
   437           f.Add(new Fan("CPU", 1));
   438           f.Add(new Fan("Auxiliary", 2));
   439           f.Add(new Fan("CPU #2", 3));
   440           f.Add(new Fan("Auxiliary #2", 4));            
   441           break;
   442         case Chip.W83627HF: 
   443         case Chip.W83627THF: 
   444         case Chip.W83687THF:
   445           v.Add(new Voltage("CPU VCore", 0));
   446           v.Add(new Voltage("Voltage #2", 1, true));
   447           v.Add(new Voltage("Voltage #3", 2, true));
   448           v.Add(new Voltage("AVCC", 3, 34, 51, 0));
   449           v.Add(new Voltage("Voltage #5", 4, true));
   450           v.Add(new Voltage("5VSB", 5, 34, 51, 0));
   451           v.Add(new Voltage("VBAT", 6));
   452           t.Add(new Temperature("CPU", 0));
   453           t.Add(new Temperature("Auxiliary", 1));
   454           t.Add(new Temperature("System", 2));
   455           f.Add(new Fan("System", 0));
   456           f.Add(new Fan("CPU", 1));
   457           f.Add(new Fan("Auxiliary", 2));
   458           break;
   459         default:
   460           for (int i = 0; i < superIO.Voltages.Length; i++)
   461             v.Add(new Voltage("Voltage #" + (i + 1), i, true));
   462           for (int i = 0; i < superIO.Temperatures.Length; i++)
   463             t.Add(new Temperature("Temperature #" + (i + 1), i));
   464           for (int i = 0; i < superIO.Fans.Length; i++)
   465             f.Add(new Fan("Fan #" + (i + 1), i));
   466           break;
   467       }
   468 
   469       string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
   470       foreach (Voltage voltage in v) 
   471         if (voltage.Index < superIO.Voltages.Length) {
   472           Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
   473             voltage.Hidden, SensorType.Voltage, this, 
   474             new ParameterDescription[] {
   475             new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
   476               formula, voltage.Ri),
   477             new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
   478               formula, voltage.Rf),
   479             new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
   480               formula, voltage.Vf)
   481             });
   482           voltages.Add(sensor);
   483       }
   484 
   485       foreach (Temperature temperature in t) 
   486         if (temperature.Index < superIO.Temperatures.Length) {
   487         Sensor sensor = new Sensor(temperature.Name, temperature.Index,
   488           SensorType.Temperature, this, new ParameterDescription[] {
   489           new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
   490         });
   491         temperatures.Add(sensor);
   492       }
   493 
   494       foreach (Fan fan in f)
   495         if (fan.Index < superIO.Fans.Length) {
   496           Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
   497             this, null);
   498           fans.Add(sensor);
   499         }
   500     }
   501 
   502     public override Identifier Identifier {
   503       get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
   504     }
   505 
   506     public override Image Icon {
   507       get { return icon; }
   508     }
   509 
   510     public override string Name {
   511       get { return name; }
   512     }
   513 
   514     public override string GetReport() {
   515       return superIO.GetReport();
   516     }
   517 
   518     public override void Update() {
   519       superIO.Update();
   520 
   521       foreach (Sensor sensor in voltages) {
   522         float? value = superIO.Voltages[sensor.Index];
   523         if (value.HasValue) {
   524           sensor.Value = value + (value - sensor.Parameters[2].Value) *
   525             sensor.Parameters[0].Value / sensor.Parameters[1].Value;
   526           ActivateSensor(sensor);
   527         }
   528       }
   529 
   530       foreach (Sensor sensor in temperatures) {
   531         float? value = superIO.Temperatures[sensor.Index];
   532         if (value.HasValue) {
   533           sensor.Value = value + sensor.Parameters[0].Value;
   534           ActivateSensor(sensor);
   535         }
   536       }
   537 
   538       foreach (Sensor sensor in fans) {
   539         float? value = superIO.Fans[sensor.Index];
   540         if (value.HasValue) {
   541           sensor.Value = value;
   542           if (value.Value > 0)
   543             ActivateSensor(sensor);
   544         }
   545       }
   546     }
   547 
   548     private class Voltage {
   549       public readonly string Name;
   550       public readonly int Index;
   551       public readonly float Ri;
   552       public readonly float Rf;
   553       public readonly float Vf;
   554       public readonly bool Hidden;
   555 
   556       public Voltage(string name, int index) :
   557         this(name, index, 0, 1, 0, false) { }
   558 
   559       public Voltage(string name, int index, bool hidden) :
   560         this(name, index, 0, 1, 0, hidden) { }
   561 
   562       public Voltage(string name, int index, float ri, float rf, float vf) :
   563         this(name, index, ri, rf, vf, false) { }
   564 
   565       public Voltage(string name, int index, float ri, float rf, float vf,
   566         bool hidden) {
   567         this.Name = name;
   568         this.Index = index;
   569         this.Ri = ri;
   570         this.Rf = rf;
   571         this.Vf = vf;
   572         this.Hidden = hidden;
   573       }
   574     }
   575 
   576     private class Temperature {
   577       public readonly string Name;
   578       public readonly int Index;
   579 
   580       public Temperature(string name, int index) {
   581         this.Name = name;
   582         this.Index = index;
   583       }
   584     }
   585 
   586     private class Fan {
   587       public readonly string Name;
   588       public readonly int Index;
   589 
   590       public Fan(string name, int index) {
   591         this.Name = name;
   592         this.Index = index;
   593       }
   594     }
   595   }
   596 }