Hardware/HDD/DebugSmart.cs
author moel.mich
Tue, 14 Feb 2012 23:07:55 +0000
changeset 340 600962f8a298
parent 330 b2c6d350396d
child 344 3145aadca3d2
permissions -rw-r--r--
Added a new sensor type "Factor" for dimensionless values (and similar) that are not to be shown as percent ("Level" type). Changed the write amplification sensor to use the new "Factor" sensor type. Added the temperature SMART attribute for Sandforce SSDs as hidden sensor (as it may show fake results on some hardware).
moel@324
     1
/*
moel@324
     2
  
moel@324
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@324
     4
moel@324
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@324
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@324
     7
  the License. You may obtain a copy of the License at
moel@324
     8
 
moel@324
     9
  http://www.mozilla.org/MPL/
moel@324
    10
moel@324
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@324
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@324
    13
  for the specific language governing rights and limitations under the License.
moel@324
    14
moel@324
    15
  The Original Code is the Open Hardware Monitor code.
moel@324
    16
moel@324
    17
  The Initial Developer of the Original Code is 
moel@324
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@325
    19
  Portions created by the Initial Developer are Copyright (C) 2011-2012
moel@324
    20
  the Initial Developer. All Rights Reserved.
moel@324
    21
moel@324
    22
  Contributor(s):
moel@324
    23
moel@324
    24
  Alternatively, the contents of this file may be used under the terms of
moel@324
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@324
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@324
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@324
    28
  of those above. If you wish to allow use of your version of this file only
moel@324
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@324
    30
  use your version of this file under the terms of the MPL, indicate your
moel@324
    31
  decision by deleting the provisions above and replace them with the notice
moel@324
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@324
    33
  the provisions above, a recipient may use your version of this file under
moel@324
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@324
    35
 
moel@324
    36
*/
moel@324
    37
moel@324
    38
using System;
moel@324
    39
using System.Collections.Generic;
moel@324
    40
using System.Text;
moel@324
    41
moel@324
    42
namespace OpenHardwareMonitor.Hardware.HDD {
moel@324
    43
moel@324
    44
#if DEBUG
moel@324
    45
moel@324
    46
  internal class DebugSmart : ISmart {
moel@324
    47
moel@324
    48
    private Drive[] drives = {
moel@328
    49
      new Drive("KINGSTON SNV425S264GB", null, 16,
moel@324
    50
        @" 01 000000000000 100 100      
moel@324
    51
           02 000000000000 100 100      
moel@324
    52
           03 000000000000 100 100      
moel@324
    53
           05 000000000000 100 100      
moel@324
    54
           07 000000000000 100 100      
moel@324
    55
           08 000000000000 100 100      
moel@324
    56
           09 821E00000000 100 100      
moel@324
    57
           0A 000000000000 100 100      
moel@324
    58
           0C 950200000000 100 100      
moel@324
    59
           A8 000000000000 100 100      
moel@324
    60
           AF 000000000000 100 100      
moel@324
    61
           C0 000000000000 100 100      
moel@324
    62
           C2 290014002B00 100 41       
moel@324
    63
           C5 000000000000 100 100      
moel@324
    64
           F0 000000000000 100 100      
moel@324
    65
           AA 07007B000000 100 100      
moel@324
    66
           AD 0E1E71304919 100 100"),
moel@324
    67
moel@328
    68
      new Drive("PLEXTOR  PX-128M2S", "1.03", 16, 
moel@324
    69
        @" 01 000000000000 100 100 0   
moel@324
    70
           03 000000000000 100 100 0   
moel@324
    71
           04 000000000000 100 100 0   
moel@324
    72
           05 000000000000 100 100 0   
moel@324
    73
           09 250100000000 100 100 0   
moel@324
    74
           0A 000000000000 100 100 0   
moel@324
    75
           0C D10000000000 100 100 0   
moel@324
    76
           B2 000000000000 100 100 0   
moel@324
    77
           BB 000000000000 100 100 0   
moel@324
    78
           BE 000000000000 100 100 0   
moel@324
    79
           C0 000000000000 100 100 0   
moel@324
    80
           C1 000000000000 100 100 0   
moel@324
    81
           C2 000000000000 100 100 0   
moel@324
    82
           C3 000000000000 100 100 0   
moel@324
    83
           C5 000000000000 100 100 0   
moel@324
    84
           C6 000000000000 100 100 0   
moel@324
    85
           C7 000000000000 100 100 0"),
moel@324
    86
moel@328
    87
      new Drive("OCZ-VERTEX2", "1.25", 16, 
moel@324
    88
        @" 01 DADAD5000000 100 106 50
moel@324
    89
           05 000000000000 100 100 3 
moel@324
    90
           09 DF0900004A2F 100 100 0 
moel@324
    91
           0C FC0100000000 100 100 0 
moel@324
    92
           AB 000000000000 0   0   0 
moel@324
    93
           AC 000000000000 0   0   0 
moel@324
    94
           AE 1F0000000000 0   0   0 
moel@324
    95
           B1 000000000000 0   0   0 
moel@324
    96
           B5 000000000000 0   0   0 
moel@324
    97
           B6 000000000000 0   0   0 
moel@324
    98
           BB 000000000000 100 100 0 
moel@324
    99
           C2 010081007F00 129 1   0 
moel@324
   100
           C3 DADAD5000000 100 106 0 
moel@324
   101
           C4 000000000000 100 100 0 
moel@324
   102
           E7 000000000000 100 100 10
moel@324
   103
           E9 800400000000 0   0   0 
moel@324
   104
           EA 000600000000 0   0   0 
moel@324
   105
           F1 000600000000 0   0   0 
moel@324
   106
           F2 801200000000 0   0   0"),
moel@324
   107
      
moel@328
   108
      new Drive("WDC WD5000AADS-00S9B0", null, 10, 
moel@324
   109
        @" 1   000000000000 200 200         
moel@324
   110
           3   820D00000000 149 150         
moel@324
   111
           4   610800000000 98  98          
moel@324
   112
           5   000000000000 200 200         
moel@324
   113
           7   000000000000 253 100         
moel@324
   114
           9   0F1F00000000 90  90          
moel@324
   115
           10  000000000000 100 100         
moel@324
   116
           11  000000000000 100 100         
moel@324
   117
           12  880200000000 100 100         
moel@324
   118
           192 6B0000000000 200 200         
moel@324
   119
           193 E9CB03000000 118 118         
moel@324
   120
           194 280000000000 94  103         
moel@324
   121
           196 000000000000 200 200         
moel@324
   122
           197 000000000000 200 200         
moel@324
   123
           198 000000000000 200 200         
moel@324
   124
           199 000000000000 200 200         
moel@324
   125
           200 000000000000 200 200         
moel@324
   126
           130 7B0300010002 1   41          
moel@324
   127
           5   000000000000 0   0           
moel@324
   128
           1   000000000000 0   0"),
moel@324
   129
moel@328
   130
      new Drive("INTEL SSDSA2M080G2GC", null, 10, 
moel@324
   131
        @" 3   000000000000 100 100         
moel@324
   132
           4   000000000000 100 100         
moel@324
   133
           5   010000000000 100 100         
moel@324
   134
           9   B10B00000000 100 100         
moel@324
   135
           12  DD0300000000 100 100         
moel@324
   136
           192 480000000000 100 100         
moel@324
   137
           225 89DB00000000 200 200         
moel@324
   138
           226 3D1B00000000 100 100         
moel@324
   139
           227 030000000000 100 100         
moel@324
   140
           228 7F85703C0000 100 100         
moel@324
   141
           232 000000000000 99  99          
moel@324
   142
           233 000000000000 98  98          
moel@324
   143
           184 000000000000 100 100         
moel@324
   144
           1   000000000000 0   0"),
moel@324
   145
moel@328
   146
      new Drive("OCZ-VERTEX", null, 10, 
moel@324
   147
        @" 1   000000000000 0   8   
moel@324
   148
           9   000000000000 30  99  
moel@324
   149
           12  000000000000 0   15  
moel@324
   150
           184 000000000000 0   7   
moel@324
   151
           195 000000000000 0   0   
moel@324
   152
           196 000000000000 0   2   
moel@324
   153
           197 000000000000 0   0   
moel@324
   154
           198 B9ED00000000 214 176 
moel@324
   155
           199 352701000000 143 185 
moel@324
   156
           200 B10500000000 105 55  
moel@324
   157
           201 F40A00000000 238 194 
moel@324
   158
           202 020000000000 137 35  
moel@324
   159
           203 020000000000 125 63  
moel@324
   160
           204 000000000000 0   0   
moel@324
   161
           205 000000000000 19  136 
moel@324
   162
           206 000000000000 22  54  
moel@324
   163
           207 010000000000 113 226 
moel@324
   164
           208 000000000000 49  232 
moel@324
   165
           209 000000000000 0   98  
moel@324
   166
           211 000000000000 0   0   
moel@324
   167
           212 000000000000 0   0   
moel@324
   168
           213 000000000000 0   0"),
moel@324
   169
 
moel@328
   170
      new Drive("INTEL SSDSA2CW120G3", null, 16,
moel@324
   171
        @"03 000000000000 100 100 0
moel@324
   172
          04 000000000000 100 100 0
moel@324
   173
          05 000000000000 100 100 0
moel@324
   174
          09 830200000000 100 100 0
moel@324
   175
          0C 900100000000 100 100 0
moel@324
   176
          AA 000000000000 100 100 0
moel@324
   177
          AB 000000000000 100 100 0
moel@324
   178
          AC 000000000000 100 100 0
moel@324
   179
          B8 000000000000 100 100 0
moel@324
   180
          BB 000000000000 100 100 0
moel@324
   181
          C0 040000000000 100 100 0
moel@324
   182
          E1 FF4300000000 100 100 0
moel@324
   183
          E2 E57D14000000 100 100 0
moel@324
   184
          E3 000000000000 100 100 0
moel@324
   185
          E4 E39600000000 100 100 0
moel@324
   186
          E8 000000000000 100 100 0
moel@324
   187
          E9 000000000000 100 100 0
moel@324
   188
          F1 FF4300000000 100 100 0
moel@328
   189
          F2 264F00000000 100 100 0"),
moel@328
   190
moel@328
   191
     new Drive("CORSAIR CMFSSD-128GBG2D", "VBM19C1Q", 16, 
moel@328
   192
       @"09 100900000000 99  99  0 
moel@328
   193
         0C 560200000000 99  99  0 
moel@328
   194
         AF 000000000000 100 100 10
moel@328
   195
         B0 000000000000 100 100 10
moel@328
   196
         B1 2A0000000000 99  99  17
moel@328
   197
         B2 180000000000 60  60  10
moel@328
   198
         B3 4B0000000000 98  98  10
moel@328
   199
         B4 B50E00000000 98  98  10
moel@328
   200
         B5 000000000000 100 100 10
moel@328
   201
         B6 000000000000 100 100 10
moel@328
   202
         B7 000000000000 100 100 10
moel@328
   203
         BB 000000000000 100 100 0 
moel@328
   204
         C3 000000000000 200 200 0 
moel@328
   205
         C6 000000000000 100 100 0 
moel@328
   206
         C7 810100000000 253 253 0 
moel@328
   207
         E8 240000000000 60  60  10
moel@330
   208
         E9 630594120000 92  92  0"),
moel@330
   209
moel@330
   210
      new Drive("Maxtor 6L300R0", null, 10,    
moel@330
   211
        @"3   9E5500000000 183 193         
moel@330
   212
          4   0A0D00000000 252 252         
moel@330
   213
          5   010000000000 253 253         
moel@330
   214
          6   000000000000 253 253         
moel@330
   215
          7   000000000000 252 253         
moel@330
   216
          8   DFA700000000 224 245         
moel@330
   217
          9   CE5700000000 155 155         
moel@330
   218
          10  000000000000 252 253         
moel@330
   219
          11  000000000000 252 253         
moel@330
   220
          12  BA0400000000 250 250         
moel@330
   221
          192 000000000000 253 253         
moel@330
   222
          193 000000000000 253 253         
moel@330
   223
          194 3D0000000000 253 42          
moel@330
   224
          195 5D1F00000000 252 253         
moel@330
   225
          196 000000000000 253 253         
moel@330
   226
          197 010000000000 253 253         
moel@330
   227
          198 000000000000 253 253         
moel@330
   228
          199 030000000000 196 199         
moel@330
   229
          200 000000000000 252 253         
moel@330
   230
          201 000000000000 252 253         
moel@330
   231
          202 000000000000 252 253         
moel@330
   232
          203 000000000000 252 253         
moel@330
   233
          204 000000000000 252 253         
moel@330
   234
          205 000000000000 252 253         
moel@330
   235
          207 000000000000 252 253         
moel@330
   236
          208 000000000000 252 253         
moel@330
   237
          209 EA0000000000 234 234         
moel@330
   238
          210 000000000000 252 253         
moel@330
   239
          211 000000000000 252 253         
moel@330
   240
          212 000000000000 252 253         
moel@330
   241
          130 5B0300010002 1   9           
moel@330
   242
          59  FC3203030100 205 0           
moel@330
   243
          1   000000000000 0   0           
moel@338
   244
          144 000000000000 0   34 "),
moel@338
   245
moel@338
   246
        new Drive("M4-CT256M4SSD2", "0309", 16, 
moel@338
   247
          @"01 000000000000 100 100 50     
moel@338
   248
            05 000000000000 100 100 10     
moel@338
   249
            09 AB0100000000 100 100 1      
moel@338
   250
            0C 6E0000000000 100 100 1      
moel@338
   251
            AA 000000000000 100 100 10     
moel@338
   252
            AB 000000000000 100 100 1      
moel@338
   253
            AC 000000000000 100 100 1      
moel@338
   254
            AD 060000000000 100 100 10     
moel@338
   255
            AE 000000000000 100 100 1      
moel@338
   256
            B5 79003D00B700 100 100 1      
moel@338
   257
            B7 000000000000 100 100 1      
moel@338
   258
            B8 000000000000 100 100 50     
moel@338
   259
            BB 000000000000 100 100 1      
moel@338
   260
            BC 000000000000 100 100 1      
moel@338
   261
            BD 5B0000000000 100 100 1      
moel@338
   262
            C2 000000000000 100 100 0      
moel@338
   263
            C3 000000000000 100 100 1      
moel@338
   264
            C4 000000000000 100 100 1      
moel@338
   265
            C5 000000000000 100 100 1      
moel@338
   266
            C6 000000000000 100 100 1      
moel@338
   267
            C7 000000000000 100 100 1      
moel@338
   268
            CA 000000000000 100 100 1      
moel@338
   269
            CE 000000000000 100 100 1 "),
moel@338
   270
moel@338
   271
        new Drive("C300-CTFDDAC256MAG", "0007", 16, 
moel@338
   272
          @"01 000000000000 100 100 0  
moel@338
   273
            05 000000000000 100 100 0  
moel@338
   274
            09 4C0A00000000 100 100 0  
moel@338
   275
            0C 0F0100000000 100 100 0  
moel@338
   276
            AA 000000000000 100 100 0  
moel@338
   277
            AB 000000000000 100 100 0  
moel@338
   278
            AC 000000000000 100 100 0  
moel@338
   279
            AD 1B0000000000 100 100 0  
moel@338
   280
            AE 000000000000 100 100 0  
moel@338
   281
            B5 D30357012B05 100 100 0  
moel@338
   282
            B7 000000000000 100 100 0  
moel@338
   283
            B8 000000000000 100 100 0  
moel@338
   284
            BB 000000000000 100 100 0  
moel@338
   285
            BC 000000000000 100 100 0  
moel@338
   286
            BD C60100000000 100 100 0  
moel@338
   287
            C3 000000000000 100 100 0  
moel@338
   288
            C4 000000000000 100 100 0  
moel@338
   289
            C5 000000000000 100 100 0  
moel@338
   290
            C6 000000000000 100 100 0  
moel@338
   291
            C7 000000000000 100 100 0  
moel@338
   292
            CA 000000000000 100 100 0  
moel@338
   293
            CE 000000000000 100 100 0")
moel@324
   294
      };
moel@324
   295
moel@324
   296
    public IntPtr OpenDrive(int driveNumber) {
moel@324
   297
      if (driveNumber < drives.Length)
moel@324
   298
        return (IntPtr)driveNumber;
moel@324
   299
      else
moel@324
   300
        return InvalidHandle;
moel@324
   301
    }
moel@324
   302
moel@324
   303
    public bool EnableSmart(IntPtr handle, int driveNumber) {
moel@324
   304
      if (handle != (IntPtr)driveNumber)
moel@324
   305
        throw new ArgumentOutOfRangeException();
moel@324
   306
moel@324
   307
      return true;
moel@324
   308
    }
moel@324
   309
moel@324
   310
    public DriveAttributeValue[] ReadSmartData(IntPtr handle, int driveNumber) {
moel@324
   311
      if (handle != (IntPtr)driveNumber)
moel@324
   312
        throw new ArgumentOutOfRangeException();
moel@324
   313
moel@324
   314
      return drives[driveNumber].DriveAttributeValues;
moel@324
   315
    }
moel@324
   316
moel@324
   317
    public DriveThresholdValue[] ReadSmartThresholds(IntPtr handle, 
moel@324
   318
      int driveNumber) 
moel@324
   319
    {
moel@324
   320
      if (handle != (IntPtr)driveNumber)
moel@324
   321
        throw new ArgumentOutOfRangeException();
moel@324
   322
moel@324
   323
      return drives[driveNumber].DriveThresholdValues;
moel@324
   324
    }
moel@324
   325
moel@325
   326
    public bool ReadNameAndFirmwareRevision(IntPtr handle, int driveNumber, 
moel@325
   327
      out string name, out string firmwareRevision) {
moel@324
   328
      if (handle != (IntPtr)driveNumber)
moel@324
   329
        throw new ArgumentOutOfRangeException();
moel@324
   330
moel@325
   331
      name = drives[driveNumber].Name;
moel@328
   332
      firmwareRevision = drives[driveNumber].FirmwareVersion;
moel@325
   333
      return true;
moel@324
   334
    }
moel@324
   335
moel@324
   336
    public void CloseHandle(IntPtr handle) { }
moel@324
   337
moel@324
   338
moel@324
   339
    private class Drive {
moel@324
   340
moel@328
   341
      public Drive(string name, string firmware, int idBase, string value) {
moel@324
   342
        this.Name = name;
moel@328
   343
        this.FirmwareVersion = firmware;
moel@324
   344
moel@324
   345
        string[] lines = value.Split(new[] { '\r', '\n' }, 
moel@324
   346
          StringSplitOptions.RemoveEmptyEntries);
moel@324
   347
moel@324
   348
        DriveAttributeValues = new DriveAttributeValue[lines.Length];
moel@324
   349
        List<DriveThresholdValue> thresholds = new List<DriveThresholdValue>();
moel@324
   350
moel@324
   351
        for (int i = 0; i < lines.Length; i++) {
moel@324
   352
moel@324
   353
          string[] array = lines[i].Split(new[] { ' ' },
moel@324
   354
            StringSplitOptions.RemoveEmptyEntries);
moel@324
   355
moel@324
   356
          if (array.Length != 4 && array.Length != 5)
moel@324
   357
            throw new Exception();
moel@324
   358
moel@324
   359
          DriveAttributeValue v = new DriveAttributeValue();
moel@324
   360
          v.Identifier = Convert.ToByte(array[0], idBase);
moel@324
   361
moel@324
   362
          v.RawValue = new byte[6];
moel@324
   363
          for (int j = 0; j < 6; j++) {
moel@324
   364
            v.RawValue[j] = Convert.ToByte(array[1].Substring(2 * j, 2), 16);
moel@324
   365
          }
moel@324
   366
moel@324
   367
          v.WorstValue = Convert.ToByte(array[2], 10);
moel@324
   368
          v.AttrValue = Convert.ToByte(array[3], 10);
moel@324
   369
moel@324
   370
          DriveAttributeValues[i] = v;
moel@324
   371
moel@324
   372
          if (array.Length == 5) {
moel@324
   373
            DriveThresholdValue t = new DriveThresholdValue();
moel@324
   374
            t.Identifier = v.Identifier;
moel@324
   375
            t.Threshold = Convert.ToByte(array[4], 10);
moel@324
   376
            thresholds.Add(t);
moel@324
   377
          }
moel@324
   378
        }
moel@324
   379
moel@324
   380
        DriveThresholdValues = thresholds.ToArray();
moel@324
   381
      }
moel@324
   382
moel@324
   383
      public DriveAttributeValue[] DriveAttributeValues { get; private set; }
moel@324
   384
moel@324
   385
      public DriveThresholdValue[] DriveThresholdValues { get; private set; }
moel@324
   386
moel@324
   387
      public string Name { get; private set; }
moel@328
   388
moel@328
   389
      public string FirmwareVersion { get; private set; }
moel@324
   390
    }
moel@324
   391
moel@324
   392
    public IntPtr InvalidHandle { get { return (IntPtr)(-1); } }
moel@324
   393
  }
moel@324
   394
moel@324
   395
#endif
moel@324
   396
moel@324
   397
}