/* 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(); } } } } }