Hardware/LPC/LMSensors.cs
author moel.mich
Sun, 08 Jul 2012 15:24:44 +0000
changeset 358 7962499f9cd6
parent 344 3145aadca3d2
child 388 c25816e366bd
permissions -rwxr-xr-x
Added support for SSDs with a controller from Micron.
     1 /*
     2  
     3   This Source Code Form is subject to the terms of the Mozilla Public
     4   License, v. 2.0. If a copy of the MPL was not distributed with this
     5   file, You can obtain one at http://mozilla.org/MPL/2.0/.
     6  
     7   Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
     8 	
     9 */
    10 
    11 using System.Collections.Generic;
    12 using System.Globalization;
    13 using System.IO;
    14 using System.Text;
    15 
    16 namespace OpenHardwareMonitor.Hardware.LPC {
    17 
    18   internal class LMSensors {
    19 
    20     private readonly List<LMChip> lmChips = new List<LMChip>();
    21 
    22     public LMSensors() {
    23       string[] basePaths = Directory.GetDirectories("/sys/class/hwmon/");
    24       foreach (string basePath in basePaths) {
    25         foreach (string devicePath in new[] { "/device", "" }) {
    26           string path = basePath + devicePath;
    27 
    28           string name = null;
    29           try {
    30             using (StreamReader reader = new StreamReader(path + "/name"))
    31               name = reader.ReadLine();
    32           } catch (IOException) { }
    33 
    34           switch (name) {
    35             case "atk0110":
    36               lmChips.Add(new LMChip(Chip.ATK0110, path)); break;
    37 
    38             case "f71858fg":
    39               lmChips.Add(new LMChip(Chip.F71858, path)); break;
    40             case "f71862fg":
    41               lmChips.Add(new LMChip(Chip.F71862, path)); break;
    42             case "f71882fg":
    43               lmChips.Add(new LMChip(Chip.F71882, path)); break;
    44             case "f71889fg":
    45               lmChips.Add(new LMChip(Chip.F71889F, path)); break;
    46 
    47             case "it8705":
    48               lmChips.Add(new LMChip(Chip.IT8705F, path)); break;
    49             case "it8712":
    50               lmChips.Add(new LMChip(Chip.IT8712F, path)); break;
    51             case "it8716":
    52               lmChips.Add(new LMChip(Chip.IT8716F, path)); break;
    53             case "it8718":
    54               lmChips.Add(new LMChip(Chip.IT8718F, path)); break;
    55             case "it8720":
    56               lmChips.Add(new LMChip(Chip.IT8720F, path)); break;
    57 
    58             case "w83627ehf":
    59               lmChips.Add(new LMChip(Chip.W83627EHF, path)); break;
    60             case "w83627dhg":
    61               lmChips.Add(new LMChip(Chip.W83627DHG, path)); break;
    62             case "w83667hg":
    63               lmChips.Add(new LMChip(Chip.W83667HG, path)); break;
    64             case "w83627hf":
    65               lmChips.Add(new LMChip(Chip.W83627HF, path)); break;
    66             case "w83627thf":
    67               lmChips.Add(new LMChip(Chip.W83627THF, path)); break;
    68             case "w83687thf":
    69               lmChips.Add(new LMChip(Chip.W83687THF, path)); break;
    70           }
    71         }
    72       }
    73     }
    74 
    75     public void Close() {
    76       foreach (LMChip lmChip in lmChips)
    77         lmChip.Close();
    78     }
    79 
    80     public ISuperIO[] SuperIO {
    81       get {
    82         return lmChips.ToArray();
    83       }
    84     }
    85 
    86     private class LMChip : ISuperIO {
    87 
    88       private string path;
    89       private readonly Chip chip;
    90 
    91       private readonly float?[] voltages;
    92       private readonly float?[] temperatures;
    93       private readonly float?[] fans;
    94       private readonly float?[] controls;
    95 
    96       private readonly FileStream[] voltageStreams;
    97       private readonly FileStream[] temperatureStreams;
    98       private readonly FileStream[] fanStreams;
    99 
   100       public Chip Chip { get { return chip; } }
   101       public float?[] Voltages { get { return voltages; } }
   102       public float?[] Temperatures { get { return temperatures; } }
   103       public float?[] Fans { get { return fans; } }
   104       public float?[] Controls { get { return controls; } }
   105 
   106       public LMChip(Chip chip, string path) {
   107         this.path = path;
   108         this.chip = chip;
   109 
   110         string[] voltagePaths = Directory.GetFiles(path, "in*_input");
   111         this.voltages = new float?[voltagePaths.Length];
   112         this.voltageStreams = new FileStream[voltagePaths.Length];
   113         for (int i = 0; i < voltagePaths.Length; i++)
   114           voltageStreams[i] = new FileStream(voltagePaths[i],
   115             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   116 
   117         string[] temperaturePaths = Directory.GetFiles(path, "temp*_input");
   118         this.temperatures = new float?[temperaturePaths.Length];
   119         this.temperatureStreams = new FileStream[temperaturePaths.Length];
   120         for (int i = 0; i < temperaturePaths.Length; i++)
   121           temperatureStreams[i] = new FileStream(temperaturePaths[i],
   122             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   123 
   124         string[] fanPaths = Directory.GetFiles(path, "fan*_input");
   125         this.fans = new float?[fanPaths.Length];
   126         this.fanStreams = new FileStream[fanPaths.Length];
   127         for (int i = 0; i < fanPaths.Length; i++)
   128           fanStreams[i] = new FileStream(fanPaths[i],
   129             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   130 
   131         this.controls = new float?[0];
   132       }
   133 
   134       public byte? ReadGPIO(int index) {
   135         return null;
   136       }
   137 
   138       public void WriteGPIO(int index, byte value) { }
   139 
   140       public string GetReport() {
   141         return null;
   142       }
   143 
   144       public void SetControl(int index, byte? value) { }   
   145 
   146       private string ReadFirstLine(Stream stream) {
   147         StringBuilder sb = new StringBuilder();
   148         try {
   149           stream.Seek(0, SeekOrigin.Begin);
   150           int b = stream.ReadByte();
   151           while (b != -1 && b != 10) {
   152             sb.Append((char)b);
   153             b = stream.ReadByte();
   154           }
   155         } catch { }
   156         return sb.ToString();
   157       }
   158 
   159       public void Update() {
   160         for (int i = 0; i < voltages.Length; i++) {
   161           string s = ReadFirstLine(voltageStreams[i]);
   162           try {
   163             voltages[i] = 0.001f *
   164               long.Parse(s, CultureInfo.InvariantCulture);
   165           } catch {
   166             voltages[i] = null;
   167           }
   168         }
   169 
   170         for (int i = 0; i < temperatures.Length; i++) {
   171           string s = ReadFirstLine(temperatureStreams[i]);
   172           try {
   173             temperatures[i] = 0.001f *
   174               long.Parse(s, CultureInfo.InvariantCulture);
   175           } catch {
   176             temperatures[i] = null;
   177           }
   178         }
   179 
   180         for (int i = 0; i < fans.Length; i++) {
   181           string s = ReadFirstLine(fanStreams[i]);
   182           try {
   183             fans[i] = long.Parse(s, CultureInfo.InvariantCulture);
   184           } catch {
   185             fans[i] = null;
   186           }
   187         }
   188       }
   189 
   190       public void Close() {
   191         foreach (FileStream stream in voltageStreams)
   192           stream.Close();
   193         foreach (FileStream stream in temperatureStreams)
   194           stream.Close();
   195         foreach (FileStream stream in fanStreams)
   196           stream.Close();
   197       }
   198     }
   199   }
   200 }