Utilities/Logger.cs
changeset 420 46c056e76130
child 421 055a9ec117d2
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/Utilities/Logger.cs	Sun Aug 11 21:26:56 2013 +0000
     1.3 @@ -0,0 +1,169 @@
     1.4 +/*
     1.5 + 
     1.6 +  This Source Code Form is subject to the terms of the Mozilla Public
     1.7 +  License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 +  file, You can obtain one at http://mozilla.org/MPL/2.0/.
     1.9 + 
    1.10 +	Copyright (C) 2013 Michael Möller <mmoeller@openhardwaremonitor.org>
    1.11 +
    1.12 +*/
    1.13 +
    1.14 +using System;
    1.15 +using System.Collections.Generic;
    1.16 +using System.Globalization;
    1.17 +using System.IO;
    1.18 +using System.Linq;
    1.19 +using OpenHardwareMonitor.Hardware;
    1.20 +
    1.21 +namespace OpenHardwareMonitor.Utilities {
    1.22 +  public class Logger {
    1.23 +
    1.24 +    private const string fileNameFormat = 
    1.25 +      "OpenHardwareMonitorLog-{0:yyyy-MM-dd}.csv";
    1.26 +
    1.27 +    private readonly IComputer computer;
    1.28 +
    1.29 +    private DateTime day = DateTime.MinValue;
    1.30 +    private string fileName;
    1.31 +    private ISensor[] sensors;
    1.32 +
    1.33 +    public Logger(IComputer computer) {
    1.34 +      this.computer = computer;
    1.35 +      this.computer.HardwareAdded += HardwareAdded;
    1.36 +      this.computer.HardwareRemoved += HardwareRemoved;    
    1.37 +    }
    1.38 +
    1.39 +    private void HardwareRemoved(IHardware hardware) {
    1.40 +      hardware.SensorRemoved -= SensorRemoved;
    1.41 +      foreach (ISensor sensor in hardware.Sensors)
    1.42 +        SensorRemoved(sensor);
    1.43 +      foreach (IHardware subHardware in hardware.SubHardware)
    1.44 +        HardwareRemoved(subHardware);
    1.45 +    }
    1.46 +
    1.47 +    private void HardwareAdded(IHardware hardware) {
    1.48 +      hardware.SensorRemoved += SensorRemoved;
    1.49 +      foreach (IHardware subHardware in hardware.SubHardware)
    1.50 +        HardwareAdded(subHardware);
    1.51 +    }
    1.52 +
    1.53 +    private void SensorRemoved(ISensor sensor) {
    1.54 +      for (int i = 0; i < sensors.Length; i++) {
    1.55 +        if (sensor == sensors[i])
    1.56 +          sensors[i] = null;
    1.57 +      }
    1.58 +    }
    1.59 +
    1.60 +    private static string GetFileName(DateTime date) {
    1.61 +      return AppDomain.CurrentDomain.BaseDirectory +
    1.62 +        Path.DirectorySeparatorChar + string.Format(fileNameFormat, date);
    1.63 +    }
    1.64 +
    1.65 +    private void AddSensorRemovedHandler() {
    1.66 +      for (int i = 0; i < sensors.Length; i++) {
    1.67 +        ISensor sensor = sensors[i];
    1.68 +        int index = i;
    1.69 +        SensorEventHandler handler = null;        
    1.70 +        handler = s => {
    1.71 +          if (s != sensor) 
    1.72 +            return;
    1.73 +
    1.74 +          sensors[index] = null;
    1.75 +          sensor.Hardware.SensorRemoved -= handler;          
    1.76 +        };
    1.77 +        sensor.Hardware.SensorRemoved += handler;
    1.78 +      }
    1.79 +    }
    1.80 +
    1.81 +    private bool OpenExistingLogFile() {
    1.82 +      if (!File.Exists(fileName))
    1.83 +        return false;
    1.84 +
    1.85 +      string[] identifiers;
    1.86 +      try {
    1.87 +        String line;
    1.88 +        using (StreamReader reader = new StreamReader(fileName)) 
    1.89 +          line = reader.ReadLine(); 
    1.90 +       
    1.91 +        if (string.IsNullOrEmpty(line))
    1.92 +          return false;
    1.93 +        
    1.94 +        identifiers = line.Split(',').Skip(1).ToArray();
    1.95 +      } catch {
    1.96 +        return false;
    1.97 +      }
    1.98 +
    1.99 +      if (identifiers.Length == 0)
   1.100 +        return false;
   1.101 +
   1.102 +      sensors = new ISensor[identifiers.Length];
   1.103 +      SensorVisitor visitor = new SensorVisitor(sensor => {
   1.104 +        for (int i = 0; i < identifiers.Length; i++)
   1.105 +          if (sensor.Identifier.ToString() == identifiers[i])
   1.106 +            sensors[i] = sensor;
   1.107 +      });
   1.108 +      visitor.VisitComputer(computer);
   1.109 +      return true;
   1.110 +    }
   1.111 +
   1.112 +    private void CreateNewLogFile() {
   1.113 +      IList<ISensor> list = new List<ISensor>();
   1.114 +      SensorVisitor visitor = new SensorVisitor(sensor => {
   1.115 +        list.Add(sensor);
   1.116 +      });
   1.117 +      visitor.VisitComputer(computer);
   1.118 +      sensors = list.ToArray();      
   1.119 +
   1.120 +      using (StreamWriter writer = new StreamWriter(fileName, false)) {
   1.121 +        writer.Write(",");
   1.122 +        for (int i = 0; i < sensors.Length; i++) {
   1.123 +          writer.Write(sensors[i].Identifier);
   1.124 +          if (i < sensors.Length - 1)
   1.125 +            writer.Write(",");
   1.126 +          else
   1.127 +            writer.WriteLine();
   1.128 +        }
   1.129 +
   1.130 +        writer.Write("Time,");
   1.131 +        for (int i = 0; i < sensors.Length; i++) {
   1.132 +          writer.Write('"');
   1.133 +          writer.Write(sensors[i].Name);
   1.134 +          writer.Write('"');
   1.135 +          if (i < sensors.Length - 1)
   1.136 +            writer.Write(",");
   1.137 +          else
   1.138 +            writer.WriteLine();
   1.139 +        }
   1.140 +      }
   1.141 +    }
   1.142 +
   1.143 +    public void Log() {
   1.144 +      var now = DateTime.Now;
   1.145 +      if (day != now.Date) {
   1.146 +        day = now.Date;
   1.147 +        fileName = GetFileName(day);
   1.148 +
   1.149 +        if (!OpenExistingLogFile())
   1.150 +          CreateNewLogFile();
   1.151 +      }
   1.152 +
   1.153 +      using (StreamWriter writer = new StreamWriter(fileName, true)) {
   1.154 +        writer.Write(now.ToString("G", CultureInfo.InvariantCulture));
   1.155 +        writer.Write(",");
   1.156 +        for (int i = 0; i < sensors.Length; i++) {
   1.157 +          if (sensors[i] != null) {
   1.158 +            float? value = sensors[i].Value;
   1.159 +            if (value.HasValue)
   1.160 +              writer.Write(
   1.161 +                value.Value.ToString("R", CultureInfo.InvariantCulture));
   1.162 +          }
   1.163 +          if (i < sensors.Length - 1)
   1.164 +            writer.Write(",");
   1.165 +          else
   1.166 +            writer.WriteLine();
   1.167 +        }
   1.168 +      }
   1.169 +
   1.170 +    }
   1.171 +  }
   1.172 +}