Hardware/HDD/HDD.cs
author moel.mich
Thu, 11 Nov 2010 21:22:24 +0000
changeset 241 52007c404f32
parent 231 30f5a06f5d8a
child 258 87ccb567fae7
permissions -rw-r--r--
Fixed a problem, where the MainForm location and size was lost when the application is started minimized and exited without ever showing the form. This caused MainForm_Load to be never called (location and size was not loaded), but the default size and location were still saved. The new implementation only saves the location and size when one of the two is changed.
moel@1
     1
/*
moel@1
     2
  
moel@1
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@1
     4
moel@1
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@1
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@1
     7
  the License. You may obtain a copy of the License at
moel@1
     8
 
moel@1
     9
  http://www.mozilla.org/MPL/
moel@1
    10
moel@1
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@1
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@1
    13
  for the specific language governing rights and limitations under the License.
moel@1
    14
moel@1
    15
  The Original Code is the Open Hardware Monitor code.
moel@1
    16
moel@1
    17
  The Initial Developer of the Original Code is 
moel@1
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@1
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@1
    20
  the Initial Developer. All Rights Reserved.
moel@1
    21
paulwerelds@218
    22
  Contributor(s): Paul Werelds
moel@1
    23
moel@1
    24
  Alternatively, the contents of this file may be used under the terms of
moel@1
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@1
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@1
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@1
    28
  of those above. If you wish to allow use of your version of this file only
moel@1
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@1
    30
  use your version of this file under the terms of the MPL, indicate your
moel@1
    31
  decision by deleting the provisions above and replace them with the notice
moel@1
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@1
    33
  the provisions above, a recipient may use your version of this file under
moel@1
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@1
    35
 
moel@1
    36
*/
moel@1
    37
moel@1
    38
using System;
paulwerelds@218
    39
using System.Collections.Generic;
moel@166
    40
using System.Globalization;
moel@1
    41
moel@1
    42
namespace OpenHardwareMonitor.Hardware.HDD {
moel@165
    43
  internal class HDD : IHardware {
moel@1
    44
moel@1
    45
    private const int UPDATE_DIVIDER = 30; // update only every 30s
moel@1
    46
moel@195
    47
    private readonly string name;
moel@195
    48
    private readonly IntPtr handle;
moel@195
    49
    private readonly int drive;
moel@1
    50
    private int count;
moel@1
    51
moel@231
    52
    private readonly SMART.AttributeID temperatureID = SMART.AttributeID.None;
moel@231
    53
    private readonly SMART.AttributeID lifeID = SMART.AttributeID.None;
paulwerelds@218
    54
paulwerelds@218
    55
    private readonly Sensor temperatureSensor;
paulwerelds@218
    56
    private readonly Sensor lifeSensor;
paulwerelds@218
    57
moel@231
    58
    public HDD(string name, IntPtr handle, int drive, 
moel@231
    59
      SMART.AttributeID temperatureID, SMART.AttributeID lifeID, 
paulwerelds@218
    60
      ISettings settings)
paulwerelds@218
    61
    {
paulwerelds@218
    62
      this.name = name;
paulwerelds@218
    63
      this.handle = handle;
paulwerelds@218
    64
      this.drive = drive;
paulwerelds@218
    65
      this.count = 0;
moel@231
    66
      if (temperatureID != SMART.AttributeID.None) {
moel@231
    67
        this.temperatureID = temperatureID;
moel@231
    68
        this.temperatureSensor = new Sensor("HDD", 0, SensorType.Temperature,
moel@231
    69
          this, settings);
moel@231
    70
      }
moel@231
    71
moel@231
    72
      if (lifeID != SMART.AttributeID.None) {
moel@231
    73
        this.lifeID = lifeID;
moel@231
    74
        this.lifeSensor = new Sensor("Remaining life", 0, SensorType.Level,
moel@231
    75
          this, settings);
moel@231
    76
      }
paulwerelds@218
    77
paulwerelds@218
    78
      Update();
paulwerelds@218
    79
    }
moel@1
    80
moel@1
    81
    public string Name {
moel@1
    82
      get { return name; }
moel@1
    83
    }
moel@1
    84
moel@109
    85
    public Identifier Identifier {
moel@166
    86
      get { 
moel@166
    87
        return new Identifier("hdd", 
moel@166
    88
          drive.ToString(CultureInfo.InvariantCulture)); 
moel@166
    89
      }
moel@1
    90
    }
moel@1
    91
moel@165
    92
    public HardwareType HardwareType {
moel@165
    93
      get { return HardwareType.HDD; }
moel@1
    94
    }
moel@1
    95
moel@64
    96
    public IHardware[] SubHardware {
moel@64
    97
      get { return new IHardware[0]; }
moel@64
    98
    }
moel@64
    99
moel@176
   100
    public virtual IHardware Parent {
moel@176
   101
      get { return null; }
moel@176
   102
    }
moel@176
   103
moel@1
   104
    public ISensor[] Sensors {
moel@1
   105
      get {
moel@231
   106
        if (lifeID != SMART.AttributeID.None)
paulwerelds@218
   107
          return new ISensor[] { lifeSensor };
paulwerelds@218
   108
moel@231
   109
        if (temperatureID != SMART.AttributeID.None)
paulwerelds@218
   110
          return new ISensor[] { temperatureSensor };
paulwerelds@218
   111
paulwerelds@218
   112
        return new ISensor[] {};
moel@1
   113
      }
moel@1
   114
    }
moel@1
   115
moel@1
   116
    public string GetReport() {
moel@1
   117
      return null;
moel@1
   118
    }
moel@1
   119
moel@1
   120
    public void Update() {
moel@1
   121
      if (count == 0) {
paulwerelds@233
   122
        SMART.DriveAttribute[] attributes = SMART.ReadSmart(handle, drive);
paulwerelds@233
   123
moel@231
   124
        if (temperatureID != SMART.AttributeID.None &&
paulwerelds@233
   125
          Array.Exists(attributes, attr => attr.ID == temperatureID))
paulwerelds@218
   126
        {
paulwerelds@233
   127
          temperatureSensor.Value = Array
paulwerelds@233
   128
            .Find(attributes, attr => attr.ID == temperatureID)
paulwerelds@218
   129
            .RawValue[0];
paulwerelds@218
   130
        }
paulwerelds@218
   131
moel@231
   132
        if (lifeID != SMART.AttributeID.None &&
paulwerelds@233
   133
          Array.Exists(attributes, attr => attr.ID == lifeID))
paulwerelds@218
   134
        {
paulwerelds@233
   135
          lifeSensor.Value = Array
paulwerelds@233
   136
            .Find(attributes, attr => attr.ID == lifeID)
paulwerelds@218
   137
            .AttrValue;
paulwerelds@218
   138
        }
moel@1
   139
      } else {
paulwerelds@233
   140
        if (temperatureID != SMART.AttributeID.None)
paulwerelds@218
   141
          temperatureSensor.Value = temperatureSensor.Value;
paulwerelds@218
   142
paulwerelds@233
   143
        if (lifeID != SMART.AttributeID.None)
paulwerelds@218
   144
          lifeSensor.Value = lifeSensor.Value;
moel@1
   145
      }
moel@1
   146
moel@1
   147
      count++; count %= UPDATE_DIVIDER; 
moel@1
   148
    }
moel@1
   149
moel@1
   150
    public void Close() {
moel@1
   151
      SMART.CloseHandle(handle);
moel@1
   152
    }
moel@1
   153
moel@1
   154
    #pragma warning disable 67
moel@1
   155
    public event SensorEventHandler SensorAdded;
moel@1
   156
    public event SensorEventHandler SensorRemoved;
moel@110
   157
    #pragma warning restore 67    
moel@110
   158
moel@110
   159
    public void Accept(IVisitor visitor) {
moel@167
   160
      if (visitor == null)
moel@167
   161
        throw new ArgumentNullException("visitor");
moel@167
   162
      visitor.VisitHardware(this);
moel@110
   163
    }
moel@110
   164
moel@110
   165
    public void Traverse(IVisitor visitor) { }
moel@1
   166
  }
moel@1
   167
}