Added the ITE chip version to the report.
3 Version: MPL 1.1/GPL 2.0/LGPL 2.1
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
9 http://www.mozilla.org/MPL/
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.
15 The Original Code is the Open Hardware Monitor code.
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.
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.
39 using System.Collections.Generic;
41 using OpenHardwareMonitor.Hardware.LPC;
43 namespace OpenHardwareMonitor.Hardware.Mainboard {
44 public class SuperIOHardware : Hardware {
46 private ISuperIO superIO;
48 protected readonly string name;
50 private List<Sensor> voltages = new List<Sensor>();
51 private List<Sensor> temperatures = new List<Sensor>();
52 private List<Sensor> fans = new List<Sensor>();
54 public SuperIOHardware(ISuperIO superIO, Manufacturer manufacturer,
57 this.superIO = superIO;
58 this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
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;
83 List<Voltage> v = new List<Voltage>();
84 List<Temperature> t = new List<Temperature>();
85 List<Fan> f = new List<Fan>();
87 switch (superIO.Chip) {
93 switch (manufacturer) {
94 case Manufacturer.ASUS:
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));
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));
115 case Model.M4A79XTD_EVO:
116 v.Add(new Voltage("+3.3V", 1, 18, 16, 0));
117 v.Add(new Voltage("CPU VCore", 2, 12, 15, 0));
118 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
119 v.Add(new Voltage("+12V", 4, 5.6f, 2.7f, 0));
120 v.Add(new Voltage("VBat", 8));
121 t.Add(new Temperature("CPU", 0));
122 t.Add(new Temperature("Motherboard", 1));
123 f.Add(new Fan("CPU Fan", 0));
124 f.Add(new Fan("Chassis Fan #1", 1));
125 f.Add(new Fan("Chassis Fan #2", 2));
128 v.Add(new Voltage("CPU VCore", 0));
129 v.Add(new Voltage("Voltage #2", 1, true));
130 v.Add(new Voltage("Voltage #3", 2, true));
131 v.Add(new Voltage("Voltage #4", 3, true));
132 v.Add(new Voltage("Voltage #5", 4, true));
133 v.Add(new Voltage("Voltage #6", 5, true));
134 v.Add(new Voltage("Voltage #7", 6, true));
135 v.Add(new Voltage("Voltage #8", 7, true));
136 v.Add(new Voltage("VBat", 8));
137 for (int i = 0; i < superIO.Temperatures.Length; i++)
138 t.Add(new Temperature("Temperature #" + (i + 1), i));
139 for (int i = 0; i < superIO.Fans.Length; i++)
140 f.Add(new Fan("Fan #" + (i + 1), i));
144 case Manufacturer.DFI:
146 case Model.LP_BI_P45_T2RS_Elite:
147 v.Add(new Voltage("CPU VCore", 0));
148 v.Add(new Voltage("FSB VTT", 1));
149 v.Add(new Voltage("+3.3V", 2));
150 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
151 v.Add(new Voltage("+12V", 4, 30, 10, 0));
152 v.Add(new Voltage("NB Core", 5));
153 v.Add(new Voltage("VDIMM", 6));
154 v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
155 v.Add(new Voltage("VBat", 8));
156 t.Add(new Temperature("CPU", 0));
157 t.Add(new Temperature("System", 1));
158 t.Add(new Temperature("Chipset", 2));
159 f.Add(new Fan("Fan #1", 0));
160 f.Add(new Fan("Fan #2", 1));
161 f.Add(new Fan("Fan #3", 2));
163 case Model.LP_DK_P55_T3eH9:
164 v.Add(new Voltage("CPU VCore", 0));
165 v.Add(new Voltage("VTT", 1));
166 v.Add(new Voltage("+3.3V", 2));
167 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
168 v.Add(new Voltage("+12V", 4, 30, 10, 0));
169 v.Add(new Voltage("CPU PLL", 5));
170 v.Add(new Voltage("DRAM", 6));
171 v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
172 v.Add(new Voltage("VBat", 8));
173 t.Add(new Temperature("Chipset", 0));
174 t.Add(new Temperature("CPU PWM", 1));
175 t.Add(new Temperature("CPU", 2));
176 f.Add(new Fan("Fan #1", 0));
177 f.Add(new Fan("Fan #2", 1));
178 f.Add(new Fan("Fan #3", 2));
181 v.Add(new Voltage("CPU VCore", 0));
182 v.Add(new Voltage("VTT", 1, true));
183 v.Add(new Voltage("+3.3V", 2, true));
184 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
185 v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
186 v.Add(new Voltage("Voltage #6", 5, true));
187 v.Add(new Voltage("DRAM", 6, true));
188 v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
189 v.Add(new Voltage("VBat", 8));
190 for (int i = 0; i < superIO.Temperatures.Length; i++)
191 t.Add(new Temperature("Temperature #" + (i + 1), i));
192 for (int i = 0; i < superIO.Fans.Length; i++)
193 f.Add(new Fan("Fan #" + (i + 1), i));
198 case Manufacturer.Gigabyte:
201 v.Add(new Voltage("CPU VCore", 0));
202 v.Add(new Voltage("DRAM", 1));
203 v.Add(new Voltage("+3.3V", 2));
204 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
205 v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
206 v.Add(new Voltage("VBat", 8));
207 t.Add(new Temperature("System", 0));
208 t.Add(new Temperature("CPU", 1));
209 f.Add(new Fan("CPU Fan", 0));
210 f.Add(new Fan("System Fan", 1));
212 case Model.EP45_DS3R:
213 case Model.EP45_UD3R:
215 v.Add(new Voltage("CPU VCore", 0));
216 v.Add(new Voltage("DRAM", 1));
217 v.Add(new Voltage("+3.3V", 2));
218 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
219 v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
220 v.Add(new Voltage("VBat", 8));
221 t.Add(new Temperature("System", 0));
222 t.Add(new Temperature("CPU", 1));
223 f.Add(new Fan("CPU Fan", 0));
224 f.Add(new Fan("System Fan #2", 1));
225 f.Add(new Fan("Power Fan", 2));
226 f.Add(new Fan("System Fan #1", 3));
228 case Model.EX58_EXTREME:
229 v.Add(new Voltage("CPU VCore", 0));
230 v.Add(new Voltage("DRAM", 1));
231 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
232 v.Add(new Voltage("VBat", 8));
233 t.Add(new Temperature("System", 0));
234 t.Add(new Temperature("CPU", 1));
235 t.Add(new Temperature("Northbridge", 2));
236 f.Add(new Fan("CPU Fan", 0));
237 f.Add(new Fan("System Fan #2", 1));
238 f.Add(new Fan("Power Fan", 2));
239 f.Add(new Fan("System Fan #1", 3));
243 v.Add(new Voltage("CPU VCore", 0));
244 v.Add(new Voltage("DRAM", 1));
245 v.Add(new Voltage("+3.3V", 2));
246 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
247 v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
248 v.Add(new Voltage("VBat", 8));
249 t.Add(new Temperature("System", 0));
250 t.Add(new Temperature("CPU", 1));
251 f.Add(new Fan("CPU Fan", 0));
252 f.Add(new Fan("System Fan #1", 1));
253 f.Add(new Fan("System Fan #2", 2));
254 f.Add(new Fan("Power Fan", 3));
256 case Model.GA_MA785GMT_UD2H:
257 v.Add(new Voltage("CPU VCore", 0));
258 v.Add(new Voltage("DRAM", 1));
259 v.Add(new Voltage("+3.3V", 2));
260 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
261 v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
262 v.Add(new Voltage("VBat", 8));
263 t.Add(new Temperature("System", 0));
264 t.Add(new Temperature("CPU", 1));
265 f.Add(new Fan("CPU Fan", 0));
266 f.Add(new Fan("System Fan", 1));
267 f.Add(new Fan("NB Fan", 2));
269 case Model.X58A_UD3R:
270 v.Add(new Voltage("CPU VCore", 0));
271 v.Add(new Voltage("DRAM", 1));
272 v.Add(new Voltage("+3.3V", 2));
273 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
274 v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
275 v.Add(new Voltage("VBat", 8));
276 t.Add(new Temperature("System", 0));
277 t.Add(new Temperature("CPU", 1));
278 t.Add(new Temperature("Northbridge", 2));
279 f.Add(new Fan("CPU Fan", 0));
280 f.Add(new Fan("System Fan #2", 1));
281 f.Add(new Fan("Power Fan", 2));
282 f.Add(new Fan("System Fan #1", 3));
285 v.Add(new Voltage("CPU VCore", 0));
286 v.Add(new Voltage("DRAM", 1, true));
287 v.Add(new Voltage("+3.3V", 2, true));
288 v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
289 v.Add(new Voltage("Voltage #5", 4, true));
290 v.Add(new Voltage("Voltage #6", 5, true));
291 v.Add(new Voltage("Voltage #7", 6, true));
292 v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
293 v.Add(new Voltage("VBat", 8));
294 for (int i = 0; i < superIO.Temperatures.Length; i++)
295 t.Add(new Temperature("Temperature #" + (i + 1), i));
296 for (int i = 0; i < superIO.Fans.Length; i++)
297 f.Add(new Fan("Fan #" + (i + 1), i));
303 v.Add(new Voltage("CPU VCore", 0));
304 v.Add(new Voltage("Voltage #2", 1, true));
305 v.Add(new Voltage("Voltage #3", 2, true));
306 v.Add(new Voltage("Voltage #4", 3, true));
307 v.Add(new Voltage("Voltage #5", 4, true));
308 v.Add(new Voltage("Voltage #6", 5, true));
309 v.Add(new Voltage("Voltage #7", 6, true));
310 v.Add(new Voltage("Voltage #8", 7, true));
311 v.Add(new Voltage("VBat", 8));
312 for (int i = 0; i < superIO.Temperatures.Length; i++)
313 t.Add(new Temperature("Temperature #" + (i + 1), i));
314 for (int i = 0; i < superIO.Fans.Length; i++)
315 f.Add(new Fan("Fan #" + (i + 1), i));
321 v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
322 v.Add(new Voltage("VSB3V", 1, 150, 150, 0));
323 v.Add(new Voltage("Battery", 2, 150, 150, 0));
324 for (int i = 0; i < superIO.Temperatures.Length; i++)
325 t.Add(new Temperature("Temperature #" + (i + 1), i));
326 for (int i = 0; i < superIO.Fans.Length; i++)
327 f.Add(new Fan("Fan #" + (i + 1), i));
334 switch (manufacturer) {
335 case Manufacturer.EVGA:
337 case Model.X58_SLI_Classified:
338 v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
339 v.Add(new Voltage("CPU VCore", 1, 47, 100, 0));
340 v.Add(new Voltage("DIMM", 2, 47, 100, 0));
341 v.Add(new Voltage("CPU VTT", 3, 24, 100, 0));
342 v.Add(new Voltage("IOH Vcore", 4, 24, 100, 0));
343 v.Add(new Voltage("+5V", 5, 51, 12, 0));
344 v.Add(new Voltage("+12V", 6, 56, 6.8f, 0));
345 v.Add(new Voltage("3VSB", 7, 150, 150, 0));
346 v.Add(new Voltage("VBat", 8, 150, 150, 0));
347 t.Add(new Temperature("CPU", 0));
348 t.Add(new Temperature("VREG", 1));
349 t.Add(new Temperature("System", 2));
350 f.Add(new Fan("CPU Fan", 0));
351 f.Add(new Fan("Power Fan", 1));
352 f.Add(new Fan("Chassis Fan", 2));
355 v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
356 v.Add(new Voltage("CPU VCore", 1));
357 v.Add(new Voltage("Voltage #3", 2, true));
358 v.Add(new Voltage("Voltage #4", 3, true));
359 v.Add(new Voltage("Voltage #5", 4, true));
360 v.Add(new Voltage("Voltage #6", 5, true));
361 v.Add(new Voltage("Voltage #7", 6, true));
362 v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
363 v.Add(new Voltage("VBat", 8, 150, 150, 0));
364 for (int i = 0; i < superIO.Temperatures.Length; i++)
365 t.Add(new Temperature("Temperature #" + (i + 1), i));
366 for (int i = 0; i < superIO.Fans.Length; i++)
367 f.Add(new Fan("Fan #" + (i + 1), i));
372 v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
373 v.Add(new Voltage("CPU VCore", 1));
374 v.Add(new Voltage("Voltage #3", 2, true));
375 v.Add(new Voltage("Voltage #4", 3, true));
376 v.Add(new Voltage("Voltage #5", 4, true));
377 v.Add(new Voltage("Voltage #6", 5, true));
378 v.Add(new Voltage("Voltage #7", 6, true));
379 v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
380 v.Add(new Voltage("VBat", 8, 150, 150, 0));
381 for (int i = 0; i < superIO.Temperatures.Length; i++)
382 t.Add(new Temperature("Temperature #" + (i + 1), i));
383 for (int i = 0; i < superIO.Fans.Length; i++)
384 f.Add(new Fan("Fan #" + (i + 1), i));
390 v.Add(new Voltage("CPU VCore", 0));
391 v.Add(new Voltage("Voltage #2", 1, true));
392 v.Add(new Voltage("AVCC", 2, 34, 34, 0));
393 v.Add(new Voltage("3VCC", 3, 34, 34, 0));
394 v.Add(new Voltage("Voltage #5", 4, true));
395 v.Add(new Voltage("Voltage #6", 5, true));
396 v.Add(new Voltage("Voltage #7", 6, true));
397 v.Add(new Voltage("3VSB", 7, 34, 34, 0));
398 v.Add(new Voltage("VBAT", 8, 34, 34, 0));
399 v.Add(new Voltage("Voltage #10", 9, true));
400 t.Add(new Temperature("CPU", 0));
401 t.Add(new Temperature("Auxiliary", 1));
402 t.Add(new Temperature("System", 2));
403 f.Add(new Fan("System", 0));
404 f.Add(new Fan("CPU", 1));
405 f.Add(new Fan("Auxiliary", 2));
406 f.Add(new Fan("CPU #2", 3));
407 f.Add(new Fan("Auxiliary #2", 4));
410 case Chip.W83627DHGP:
413 v.Add(new Voltage("CPU VCore", 0));
414 v.Add(new Voltage("Voltage #2", 1, true));
415 v.Add(new Voltage("AVCC", 2, 34, 34, 0));
416 v.Add(new Voltage("3VCC", 3, 34, 34, 0));
417 v.Add(new Voltage("Voltage #5", 4, true));
418 v.Add(new Voltage("Voltage #6", 5, true));
419 v.Add(new Voltage("Voltage #7", 6, true));
420 v.Add(new Voltage("3VSB", 7, 34, 34, 0));
421 v.Add(new Voltage("VBAT", 8, 34, 34, 0));
422 t.Add(new Temperature("CPU", 0));
423 t.Add(new Temperature("Auxiliary", 1));
424 t.Add(new Temperature("System", 2));
425 f.Add(new Fan("System", 0));
426 f.Add(new Fan("CPU", 1));
427 f.Add(new Fan("Auxiliary", 2));
428 f.Add(new Fan("CPU #2", 3));
429 f.Add(new Fan("Auxiliary #2", 4));
434 v.Add(new Voltage("CPU VCore", 0));
435 v.Add(new Voltage("Voltage #2", 1, true));
436 v.Add(new Voltage("Voltage #3", 2, true));
437 v.Add(new Voltage("AVCC", 3, 34, 51, 0));
438 v.Add(new Voltage("Voltage #5", 4, true));
439 v.Add(new Voltage("5VSB", 5, 34, 51, 0));
440 v.Add(new Voltage("VBAT", 6));
441 t.Add(new Temperature("CPU", 0));
442 t.Add(new Temperature("Auxiliary", 1));
443 t.Add(new Temperature("System", 2));
444 f.Add(new Fan("System", 0));
445 f.Add(new Fan("CPU", 1));
446 f.Add(new Fan("Auxiliary", 2));
449 for (int i = 0; i < superIO.Voltages.Length; i++)
450 v.Add(new Voltage("Voltage #" + (i + 1), i, true));
451 for (int i = 0; i < superIO.Temperatures.Length; i++)
452 t.Add(new Temperature("Temperature #" + (i + 1), i));
453 for (int i = 0; i < superIO.Fans.Length; i++)
454 f.Add(new Fan("Fan #" + (i + 1), i));
458 string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
459 foreach (Voltage voltage in v)
460 if (voltage.Index < superIO.Voltages.Length) {
461 Sensor sensor = new Sensor(voltage.Name, voltage.Index,
462 voltage.Hidden, SensorType.Voltage, this,
463 new ParameterDescription[] {
464 new ParameterDescription("Ri [kΩ]", "Input resistance.\n" +
465 formula, voltage.Ri),
466 new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" +
467 formula, voltage.Rf),
468 new ParameterDescription("Vf [V]", "Reference voltage.\n" +
471 voltages.Add(sensor);
474 foreach (Temperature temperature in t)
475 if (temperature.Index < superIO.Temperatures.Length) {
476 Sensor sensor = new Sensor(temperature.Name, temperature.Index,
477 SensorType.Temperature, this, new ParameterDescription[] {
478 new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
480 temperatures.Add(sensor);
483 foreach (Fan fan in f)
484 if (fan.Index < superIO.Fans.Length) {
485 Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
491 public override Identifier Identifier {
492 get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
495 public override Image Icon {
499 public override string Name {
503 public override string GetReport() {
504 return superIO.GetReport();
507 public override void Update() {
510 foreach (Sensor sensor in voltages) {
511 float? value = superIO.Voltages[sensor.Index];
512 if (value.HasValue) {
513 sensor.Value = value + (value - sensor.Parameters[2].Value) *
514 sensor.Parameters[0].Value / sensor.Parameters[1].Value;
515 ActivateSensor(sensor);
519 foreach (Sensor sensor in temperatures) {
520 float? value = superIO.Temperatures[sensor.Index];
521 if (value.HasValue) {
522 sensor.Value = value + sensor.Parameters[0].Value;
523 ActivateSensor(sensor);
527 foreach (Sensor sensor in fans) {
528 float? value = superIO.Fans[sensor.Index];
529 if (value.HasValue) {
530 sensor.Value = value;
532 ActivateSensor(sensor);
537 private class Voltage {
538 public readonly string Name;
539 public readonly int Index;
540 public readonly float Ri;
541 public readonly float Rf;
542 public readonly float Vf;
543 public readonly bool Hidden;
545 public Voltage(string name, int index) :
546 this(name, index, 0, 1, 0, false) { }
548 public Voltage(string name, int index, bool hidden) :
549 this(name, index, 0, 1, 0, hidden) { }
551 public Voltage(string name, int index, float ri, float rf, float vf) :
552 this(name, index, ri, rf, vf, false) { }
554 public Voltage(string name, int index, float ri, float rf, float vf,
561 this.Hidden = hidden;
565 private class Temperature {
566 public readonly string Name;
567 public readonly int Index;
569 public Temperature(string name, int index) {
576 public readonly string Name;
577 public readonly int Index;
579 public Fan(string name, int index) {