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 +}