Hardware/LPC/LMSensors.cs
author moel.mich
Sun, 23 Sep 2012 18:37:43 +0000
changeset 380 573f1fff48b2
parent 344 3145aadca3d2
child 388 c25816e366bd
permissions -rwxr-xr-x
Fixed Issue 387. The new implementation does not try to start a ring 0 driver that already exists, but could not be opened. It tries to delete the driver and install it new. The driver is now stored temporarily in the application folder. The driver is not correctly removed on system shutdown.
     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 }