diff -r 07d44b20bbd4 -r 46c056e76130 Utilities/Logger.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utilities/Logger.cs Sun Aug 11 21:26:56 2013 +0000 @@ -0,0 +1,169 @@ +/* + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + + Copyright (C) 2013 Michael Möller + +*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using OpenHardwareMonitor.Hardware; + +namespace OpenHardwareMonitor.Utilities { + public class Logger { + + private const string fileNameFormat = + "OpenHardwareMonitorLog-{0:yyyy-MM-dd}.csv"; + + private readonly IComputer computer; + + private DateTime day = DateTime.MinValue; + private string fileName; + private ISensor[] sensors; + + public Logger(IComputer computer) { + this.computer = computer; + this.computer.HardwareAdded += HardwareAdded; + this.computer.HardwareRemoved += HardwareRemoved; + } + + private void HardwareRemoved(IHardware hardware) { + hardware.SensorRemoved -= SensorRemoved; + foreach (ISensor sensor in hardware.Sensors) + SensorRemoved(sensor); + foreach (IHardware subHardware in hardware.SubHardware) + HardwareRemoved(subHardware); + } + + private void HardwareAdded(IHardware hardware) { + hardware.SensorRemoved += SensorRemoved; + foreach (IHardware subHardware in hardware.SubHardware) + HardwareAdded(subHardware); + } + + private void SensorRemoved(ISensor sensor) { + for (int i = 0; i < sensors.Length; i++) { + if (sensor == sensors[i]) + sensors[i] = null; + } + } + + private static string GetFileName(DateTime date) { + return AppDomain.CurrentDomain.BaseDirectory + + Path.DirectorySeparatorChar + string.Format(fileNameFormat, date); + } + + private void AddSensorRemovedHandler() { + for (int i = 0; i < sensors.Length; i++) { + ISensor sensor = sensors[i]; + int index = i; + SensorEventHandler handler = null; + handler = s => { + if (s != sensor) + return; + + sensors[index] = null; + sensor.Hardware.SensorRemoved -= handler; + }; + sensor.Hardware.SensorRemoved += handler; + } + } + + private bool OpenExistingLogFile() { + if (!File.Exists(fileName)) + return false; + + string[] identifiers; + try { + String line; + using (StreamReader reader = new StreamReader(fileName)) + line = reader.ReadLine(); + + if (string.IsNullOrEmpty(line)) + return false; + + identifiers = line.Split(',').Skip(1).ToArray(); + } catch { + return false; + } + + if (identifiers.Length == 0) + return false; + + sensors = new ISensor[identifiers.Length]; + SensorVisitor visitor = new SensorVisitor(sensor => { + for (int i = 0; i < identifiers.Length; i++) + if (sensor.Identifier.ToString() == identifiers[i]) + sensors[i] = sensor; + }); + visitor.VisitComputer(computer); + return true; + } + + private void CreateNewLogFile() { + IList list = new List(); + SensorVisitor visitor = new SensorVisitor(sensor => { + list.Add(sensor); + }); + visitor.VisitComputer(computer); + sensors = list.ToArray(); + + using (StreamWriter writer = new StreamWriter(fileName, false)) { + writer.Write(","); + for (int i = 0; i < sensors.Length; i++) { + writer.Write(sensors[i].Identifier); + if (i < sensors.Length - 1) + writer.Write(","); + else + writer.WriteLine(); + } + + writer.Write("Time,"); + for (int i = 0; i < sensors.Length; i++) { + writer.Write('"'); + writer.Write(sensors[i].Name); + writer.Write('"'); + if (i < sensors.Length - 1) + writer.Write(","); + else + writer.WriteLine(); + } + } + } + + public void Log() { + var now = DateTime.Now; + if (day != now.Date) { + day = now.Date; + fileName = GetFileName(day); + + if (!OpenExistingLogFile()) + CreateNewLogFile(); + } + + using (StreamWriter writer = new StreamWriter(fileName, true)) { + writer.Write(now.ToString("G", CultureInfo.InvariantCulture)); + writer.Write(","); + for (int i = 0; i < sensors.Length; i++) { + if (sensors[i] != null) { + float? value = sensors[i].Value; + if (value.HasValue) + writer.Write( + value.Value.ToString("R", CultureInfo.InvariantCulture)); + } + if (i < sensors.Length - 1) + writer.Write(","); + else + writer.WriteLine(); + } + } + + } + } +}