Hardware/LPC/LMSensors.cs
author sl
Sun, 03 Feb 2013 18:01:50 +0100
changeset 391 ca4c0e7ae75d
parent 353 b4e37f5b2669
permissions -rwxr-xr-x
Converted project to VisualStudio 2012.
Adding SoundGraphDisplay and SensorFrontView classes.
They were respectively based on SystemTray and SensorNotifyIcon.
SoundGraphDisplay is now able to load iMONDisplay.dll providing it lives on your PATH.
Adding option to sensor context menu for adding it into FrontView.
     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 "f71869":
    43               lmChips.Add(new LMChip(Chip.F71869, path)); break;
    44             case "f71882fg":
    45               lmChips.Add(new LMChip(Chip.F71882, path)); break;            
    46             case "f71889a":
    47               lmChips.Add(new LMChip(Chip.F71889AD, path)); break;
    48             case "f71889ed":
    49               lmChips.Add(new LMChip(Chip.F71889ED, path)); break;
    50             case "f71889fg":
    51               lmChips.Add(new LMChip(Chip.F71889F, path)); break;
    52             case "f71808e":
    53               lmChips.Add(new LMChip(Chip.F71808E, path)); break;
    54 
    55             case "it8705":
    56               lmChips.Add(new LMChip(Chip.IT8705F, path)); break;
    57             case "it8712":
    58               lmChips.Add(new LMChip(Chip.IT8712F, path)); break;
    59             case "it8716":
    60               lmChips.Add(new LMChip(Chip.IT8716F, path)); break;
    61             case "it8718":
    62               lmChips.Add(new LMChip(Chip.IT8718F, path)); break;
    63             case "it8720":
    64               lmChips.Add(new LMChip(Chip.IT8720F, path)); break;
    65 
    66             case "w83627ehf":
    67               lmChips.Add(new LMChip(Chip.W83627EHF, path)); break;
    68             case "w83627dhg":
    69               lmChips.Add(new LMChip(Chip.W83627DHG, path)); break;
    70             case "w83667hg":
    71               lmChips.Add(new LMChip(Chip.W83667HG, path)); break;
    72             case "w83627hf":
    73               lmChips.Add(new LMChip(Chip.W83627HF, path)); break;
    74             case "w83627thf":
    75               lmChips.Add(new LMChip(Chip.W83627THF, path)); break;
    76             case "w83687thf":
    77               lmChips.Add(new LMChip(Chip.W83687THF, path)); break;
    78           }
    79         }
    80       }
    81     }
    82 
    83     public void Close() {
    84       foreach (LMChip lmChip in lmChips)
    85         lmChip.Close();
    86     }
    87 
    88     public ISuperIO[] SuperIO {
    89       get {
    90         return lmChips.ToArray();
    91       }
    92     }
    93 
    94     private class LMChip : ISuperIO {
    95 
    96       private string path;
    97       private readonly Chip chip;
    98 
    99       private readonly float?[] voltages;
   100       private readonly float?[] temperatures;
   101       private readonly float?[] fans;
   102       private readonly float?[] controls;
   103 
   104       private readonly FileStream[] voltageStreams;
   105       private readonly FileStream[] temperatureStreams;
   106       private readonly FileStream[] fanStreams;
   107 
   108       public Chip Chip { get { return chip; } }
   109       public float?[] Voltages { get { return voltages; } }
   110       public float?[] Temperatures { get { return temperatures; } }
   111       public float?[] Fans { get { return fans; } }
   112       public float?[] Controls { get { return controls; } }
   113 
   114       public LMChip(Chip chip, string path) {
   115         this.path = path;
   116         this.chip = chip;
   117 
   118         string[] voltagePaths = Directory.GetFiles(path, "in*_input");
   119         this.voltages = new float?[voltagePaths.Length];
   120         this.voltageStreams = new FileStream[voltagePaths.Length];
   121         for (int i = 0; i < voltagePaths.Length; i++)
   122           voltageStreams[i] = new FileStream(voltagePaths[i],
   123             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   124 
   125         string[] temperaturePaths = Directory.GetFiles(path, "temp*_input");
   126         this.temperatures = new float?[temperaturePaths.Length];
   127         this.temperatureStreams = new FileStream[temperaturePaths.Length];
   128         for (int i = 0; i < temperaturePaths.Length; i++)
   129           temperatureStreams[i] = new FileStream(temperaturePaths[i],
   130             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   131 
   132         string[] fanPaths = Directory.GetFiles(path, "fan*_input");
   133         this.fans = new float?[fanPaths.Length];
   134         this.fanStreams = new FileStream[fanPaths.Length];
   135         for (int i = 0; i < fanPaths.Length; i++)
   136           fanStreams[i] = new FileStream(fanPaths[i],
   137             FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
   138 
   139         this.controls = new float?[0];
   140       }
   141 
   142       public byte? ReadGPIO(int index) {
   143         return null;
   144       }
   145 
   146       public void WriteGPIO(int index, byte value) { }
   147 
   148       public string GetReport() {
   149         return null;
   150       }
   151 
   152       public void SetControl(int index, byte? value) { }   
   153 
   154       private string ReadFirstLine(Stream stream) {
   155         StringBuilder sb = new StringBuilder();
   156         try {
   157           stream.Seek(0, SeekOrigin.Begin);
   158           int b = stream.ReadByte();
   159           while (b != -1 && b != 10) {
   160             sb.Append((char)b);
   161             b = stream.ReadByte();
   162           }
   163         } catch { }
   164         return sb.ToString();
   165       }
   166 
   167       public void Update() {
   168         for (int i = 0; i < voltages.Length; i++) {
   169           string s = ReadFirstLine(voltageStreams[i]);
   170           try {
   171             voltages[i] = 0.001f *
   172               long.Parse(s, CultureInfo.InvariantCulture);
   173           } catch {
   174             voltages[i] = null;
   175           }
   176         }
   177 
   178         for (int i = 0; i < temperatures.Length; i++) {
   179           string s = ReadFirstLine(temperatureStreams[i]);
   180           try {
   181             temperatures[i] = 0.001f *
   182               long.Parse(s, CultureInfo.InvariantCulture);
   183           } catch {
   184             temperatures[i] = null;
   185           }
   186         }
   187 
   188         for (int i = 0; i < fans.Length; i++) {
   189           string s = ReadFirstLine(fanStreams[i]);
   190           try {
   191             fans[i] = long.Parse(s, CultureInfo.InvariantCulture);
   192           } catch {
   193             fans[i] = null;
   194           }
   195         }
   196       }
   197 
   198       public void Close() {
   199         foreach (FileStream stream in voltageStreams)
   200           stream.Close();
   201         foreach (FileStream stream in temperatureStreams)
   202           stream.Close();
   203         foreach (FileStream stream in fanStreams)
   204           stream.Close();
   205       }
   206     }
   207   }
   208 }