Added a first data logging implementation.
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/.
7 Copyright (C) 2013 Michael Möller <mmoeller@openhardwaremonitor.org>
12 using System.Collections.Generic;
13 using System.Globalization;
16 using OpenHardwareMonitor.Hardware;
18 namespace OpenHardwareMonitor.Utilities {
21 private const string fileNameFormat =
22 "OpenHardwareMonitorLog-{0:yyyy-MM-dd}.csv";
24 private readonly IComputer computer;
26 private DateTime day = DateTime.MinValue;
27 private string fileName;
28 private ISensor[] sensors;
30 public Logger(IComputer computer) {
31 this.computer = computer;
32 this.computer.HardwareAdded += HardwareAdded;
33 this.computer.HardwareRemoved += HardwareRemoved;
36 private void HardwareRemoved(IHardware hardware) {
37 hardware.SensorRemoved -= SensorRemoved;
38 foreach (ISensor sensor in hardware.Sensors)
39 SensorRemoved(sensor);
40 foreach (IHardware subHardware in hardware.SubHardware)
41 HardwareRemoved(subHardware);
44 private void HardwareAdded(IHardware hardware) {
45 hardware.SensorRemoved += SensorRemoved;
46 foreach (IHardware subHardware in hardware.SubHardware)
47 HardwareAdded(subHardware);
50 private void SensorRemoved(ISensor sensor) {
51 for (int i = 0; i < sensors.Length; i++) {
52 if (sensor == sensors[i])
57 private static string GetFileName(DateTime date) {
58 return AppDomain.CurrentDomain.BaseDirectory +
59 Path.DirectorySeparatorChar + string.Format(fileNameFormat, date);
62 private void AddSensorRemovedHandler() {
63 for (int i = 0; i < sensors.Length; i++) {
64 ISensor sensor = sensors[i];
66 SensorEventHandler handler = null;
71 sensors[index] = null;
72 sensor.Hardware.SensorRemoved -= handler;
74 sensor.Hardware.SensorRemoved += handler;
78 private bool OpenExistingLogFile() {
79 if (!File.Exists(fileName))
85 using (StreamReader reader = new StreamReader(fileName))
86 line = reader.ReadLine();
88 if (string.IsNullOrEmpty(line))
91 identifiers = line.Split(',').Skip(1).ToArray();
96 if (identifiers.Length == 0)
99 sensors = new ISensor[identifiers.Length];
100 SensorVisitor visitor = new SensorVisitor(sensor => {
101 for (int i = 0; i < identifiers.Length; i++)
102 if (sensor.Identifier.ToString() == identifiers[i])
105 visitor.VisitComputer(computer);
109 private void CreateNewLogFile() {
110 IList<ISensor> list = new List<ISensor>();
111 SensorVisitor visitor = new SensorVisitor(sensor => {
114 visitor.VisitComputer(computer);
115 sensors = list.ToArray();
117 using (StreamWriter writer = new StreamWriter(fileName, false)) {
119 for (int i = 0; i < sensors.Length; i++) {
120 writer.Write(sensors[i].Identifier);
121 if (i < sensors.Length - 1)
127 writer.Write("Time,");
128 for (int i = 0; i < sensors.Length; i++) {
130 writer.Write(sensors[i].Name);
132 if (i < sensors.Length - 1)
141 var now = DateTime.Now;
142 if (day != now.Date) {
144 fileName = GetFileName(day);
146 if (!OpenExistingLogFile())
150 using (StreamWriter writer = new StreamWriter(fileName, true)) {
151 writer.Write(now.ToString("G", CultureInfo.InvariantCulture));
153 for (int i = 0; i < sensors.Length; i++) {
154 if (sensors[i] != null) {
155 float? value = sensors[i].Value;
158 value.Value.ToString("R", CultureInfo.InvariantCulture));
160 if (i < sensors.Length - 1)