Hardware/Computer.cs
author moel.mich
Sat, 20 Feb 2010 19:51:10 +0000
changeset 56 5cb7eb5bf628
parent 34 dc276daadb2c
child 63 1a7c13ac7348
permissions -rw-r--r--
Improved Winbond temperature reading. Temperatures create by adding PECI Agent values (delta to TCC Activation Temperature) to a (possibly uncalibrated) TBase are not read. Direct reading temperatures from sensor report register if available. Added lower bound for temperatures on Winbond chips. Nvidia GPUs are now displayed even if they do not have any sensors.
moel@28
     1
/*
moel@28
     2
  
moel@28
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@28
     4
moel@28
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@28
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@28
     7
  the License. You may obtain a copy of the License at
moel@28
     8
 
moel@28
     9
  http://www.mozilla.org/MPL/
moel@28
    10
moel@28
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@28
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@28
    13
  for the specific language governing rights and limitations under the License.
moel@28
    14
moel@28
    15
  The Original Code is the Open Hardware Monitor code.
moel@28
    16
moel@28
    17
  The Initial Developer of the Original Code is 
moel@28
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@28
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@28
    20
  the Initial Developer. All Rights Reserved.
moel@28
    21
moel@28
    22
  Contributor(s):
moel@28
    23
moel@28
    24
  Alternatively, the contents of this file may be used under the terms of
moel@28
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@28
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@28
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@28
    28
  of those above. If you wish to allow use of your version of this file only
moel@28
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@28
    30
  use your version of this file under the terms of the MPL, indicate your
moel@28
    31
  decision by deleting the provisions above and replace them with the notice
moel@28
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@28
    33
  the provisions above, a recipient may use your version of this file under
moel@28
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@28
    35
 
moel@28
    36
*/
moel@28
    37
moel@28
    38
using System;
moel@28
    39
using System.Collections.Generic;
moel@28
    40
using System.IO;
moel@34
    41
using System.Globalization;
moel@28
    42
using System.Text;
moel@28
    43
moel@28
    44
namespace OpenHardwareMonitor.Hardware {
moel@28
    45
moel@28
    46
  public delegate void HardwareEventHandler(IHardware hardware);
moel@28
    47
moel@28
    48
  public class Computer {
moel@28
    49
moel@28
    50
    private List<IGroup> groups = new List<IGroup>();
moel@28
    51
moel@28
    52
    private bool open = false;
moel@28
    53
    private bool hddEnabled = false;
moel@28
    54
moel@28
    55
    public Computer() { }
moel@28
    56
moel@28
    57
    private void Add(IGroup group) {
moel@28
    58
      if (groups.Contains(group))
moel@28
    59
        return;
moel@28
    60
moel@28
    61
      groups.Add(group);
moel@28
    62
moel@28
    63
      if (HardwareAdded != null)
moel@28
    64
        foreach (IHardware hardware in group.Hardware)
moel@28
    65
          HardwareAdded(hardware);
moel@28
    66
    }
moel@28
    67
moel@28
    68
    private void Remove(IGroup group) {
moel@28
    69
      if (!groups.Contains(group))
moel@28
    70
        return;
moel@28
    71
moel@28
    72
      groups.Remove(group);
moel@28
    73
moel@28
    74
      if (HardwareRemoved != null)
moel@28
    75
        foreach (IHardware hardware in group.Hardware)
moel@28
    76
          HardwareRemoved(hardware);
moel@28
    77
    }
moel@28
    78
moel@28
    79
    public void Open() {
moel@28
    80
      if (open)
moel@28
    81
        return;
moel@28
    82
moel@28
    83
      Add(new SMBIOS.SMBIOSGroup());
moel@28
    84
      Add(new LPC.LPCGroup());
moel@28
    85
      Add(new CPU.CPUGroup());
moel@28
    86
      Add(new ATI.ATIGroup());
moel@28
    87
      Add(new Nvidia.NvidiaGroup());
moel@28
    88
      Add(new TBalancer.TBalancerGroup());
moel@28
    89
moel@28
    90
      if (hddEnabled)        
moel@28
    91
        Add(new HDD.HDDGroup());
moel@28
    92
moel@28
    93
      open = true;
moel@28
    94
    }
moel@28
    95
moel@28
    96
    public void Update() {
moel@28
    97
      foreach (IGroup group in groups)
moel@28
    98
        foreach (IHardware hardware in group.Hardware)
moel@28
    99
          hardware.Update();
moel@28
   100
    }
moel@28
   101
moel@28
   102
    public bool HDDEnabled {
moel@28
   103
      get { return hddEnabled; }
moel@28
   104
      set {
moel@28
   105
        if (open && value && !hddEnabled) {
moel@28
   106
          Add(new HDD.HDDGroup());
moel@28
   107
        } else if (open && !value && hddEnabled) {
moel@28
   108
          List<IGroup> list = new List<IGroup>();
moel@28
   109
          foreach (IGroup group in groups)
moel@28
   110
            if (group is HDD.HDDGroup)
moel@28
   111
              list.Add(group);
moel@28
   112
          foreach (IGroup group in list)
moel@28
   113
            Remove(group);          
moel@28
   114
        }
moel@28
   115
        hddEnabled = value;
moel@28
   116
      }
moel@28
   117
    }
moel@28
   118
moel@28
   119
    public IEnumerable<IHardware> Hardware {
moel@28
   120
      get {       
moel@28
   121
        foreach (IGroup group in groups)
moel@28
   122
          foreach (IHardware hardware in group.Hardware)
moel@28
   123
            yield return hardware;
moel@28
   124
      }
moel@28
   125
    }
moel@28
   126
moel@28
   127
    private void NewSection(TextWriter writer) {
moel@28
   128
      for (int i = 0; i < 8; i++)
moel@28
   129
        writer.Write("----------");
moel@28
   130
      writer.WriteLine();
moel@28
   131
      writer.WriteLine();
moel@28
   132
    }
moel@28
   133
moel@28
   134
    public void SaveReport(Version version) {
moel@28
   135
moel@28
   136
      using (TextWriter w =
moel@34
   137
        new StreamWriter("OpenHardwareMonitor.Report.txt")) {        
moel@28
   138
moel@28
   139
        w.WriteLine();
moel@28
   140
        w.WriteLine("Open Hardware Monitor Report");
moel@28
   141
        w.WriteLine();
moel@28
   142
moel@28
   143
        NewSection(w);
moel@28
   144
        w.Write("Version: "); w.WriteLine(version.ToString());
moel@28
   145
        w.WriteLine();
moel@28
   146
moel@28
   147
        NewSection(w);
moel@28
   148
        foreach (IGroup group in groups) {
moel@28
   149
          foreach (IHardware hardware in group.Hardware) {
moel@28
   150
            w.WriteLine("|");
moel@28
   151
            w.WriteLine("+-+ {0} ({1})",
moel@28
   152
              new object[] { hardware.Name, hardware.Identifier });
moel@28
   153
            foreach (ISensor sensor in hardware.Sensors) {
moel@28
   154
              w.WriteLine("|   +- {0} : {1} : {2} : {3}",
moel@28
   155
                new object[] { sensor.SensorType, sensor.Index, sensor.Name, 
moel@34
   156
                  string.Format(CultureInfo.InvariantCulture, "{0}", 
moel@34
   157
                  sensor.Value) });
moel@28
   158
            }
moel@28
   159
          }
moel@28
   160
        }
moel@28
   161
        w.WriteLine();
moel@28
   162
moel@28
   163
        foreach (IGroup group in groups) {
moel@28
   164
          string report = group.GetReport();
moel@47
   165
          if (report != null && report != "") {
moel@28
   166
            NewSection(w);
moel@28
   167
            w.Write(report);
moel@28
   168
          }
moel@28
   169
moel@28
   170
          IHardware[] hardwareArray = group.Hardware;
moel@28
   171
          foreach (IHardware hardware in hardwareArray) {
moel@28
   172
            string hardwareReport = hardware.GetReport();
moel@47
   173
            if (hardwareReport != null && hardwareReport != "") {
moel@28
   174
              NewSection(w);
moel@28
   175
              w.Write(hardwareReport);
moel@28
   176
            }
moel@28
   177
          }
moel@28
   178
        }
moel@28
   179
      }
moel@28
   180
    }
moel@28
   181
moel@28
   182
    public void Close() {
moel@28
   183
      if (!open)
moel@28
   184
        return;
moel@28
   185
moel@28
   186
      foreach (IGroup group in groups)
moel@28
   187
        group.Close();
moel@28
   188
      groups.Clear();
moel@28
   189
moel@28
   190
      open = false;
moel@28
   191
    }
moel@28
   192
moel@28
   193
    public event HardwareEventHandler HardwareAdded;
moel@28
   194
    public event HardwareEventHandler HardwareRemoved;
moel@28
   195
moel@28
   196
moel@28
   197
moel@28
   198
  }
moel@28
   199
}