Fixed a few stability issues in the logging implementation. Added support for logging sensors once the reappear.
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 string[] identifiers;
29 private ISensor[] sensors;
31 public Logger(IComputer computer) {
32 this.computer = computer;
33 this.computer.HardwareAdded += HardwareAdded;
34 this.computer.HardwareRemoved += HardwareRemoved;
37 private void HardwareRemoved(IHardware hardware) {
38 hardware.SensorAdded -= SensorAdded;
39 hardware.SensorRemoved -= SensorRemoved;
40 foreach (ISensor sensor in hardware.Sensors)
41 SensorRemoved(sensor);
42 foreach (IHardware subHardware in hardware.SubHardware)
43 HardwareRemoved(subHardware);
46 private void HardwareAdded(IHardware hardware) {
47 foreach (ISensor sensor in hardware.Sensors)
49 hardware.SensorAdded += SensorAdded;
50 hardware.SensorRemoved += SensorRemoved;
51 foreach (IHardware subHardware in hardware.SubHardware)
52 HardwareAdded(subHardware);
55 private void SensorAdded(ISensor sensor) {
59 for (int i = 0; i < sensors.Length; i++) {
60 if (sensor.Identifier.ToString() == identifiers[i])
65 private void SensorRemoved(ISensor sensor) {
69 for (int i = 0; i < sensors.Length; i++) {
70 if (sensor == sensors[i])
75 private static string GetFileName(DateTime date) {
76 return AppDomain.CurrentDomain.BaseDirectory +
77 Path.DirectorySeparatorChar + string.Format(fileNameFormat, date);
80 private bool OpenExistingLogFile() {
81 if (!File.Exists(fileName))
86 using (StreamReader reader = new StreamReader(fileName))
87 line = reader.ReadLine();
89 if (string.IsNullOrEmpty(line))
92 identifiers = line.Split(',').Skip(1).ToArray();
98 if (identifiers.Length == 0) {
103 sensors = new ISensor[identifiers.Length];
104 SensorVisitor visitor = new SensorVisitor(sensor => {
105 for (int i = 0; i < identifiers.Length; i++)
106 if (sensor.Identifier.ToString() == identifiers[i])
109 visitor.VisitComputer(computer);
113 private void CreateNewLogFile() {
114 IList<ISensor> list = new List<ISensor>();
115 SensorVisitor visitor = new SensorVisitor(sensor => {
118 visitor.VisitComputer(computer);
119 sensors = list.ToArray();
120 identifiers = sensors.Select(s => s.Identifier.ToString()).ToArray();
122 using (StreamWriter writer = new StreamWriter(fileName, false)) {
124 for (int i = 0; i < sensors.Length; i++) {
125 writer.Write(sensors[i].Identifier);
126 if (i < sensors.Length - 1)
132 writer.Write("Time,");
133 for (int i = 0; i < sensors.Length; i++) {
135 writer.Write(sensors[i].Name);
137 if (i < sensors.Length - 1)
146 var now = DateTime.Now;
147 if (day != now.Date || !File.Exists(fileName)) {
149 fileName = GetFileName(day);
151 if (!OpenExistingLogFile())
156 using (StreamWriter writer = new StreamWriter(new FileStream(fileName,
157 FileMode.Append, FileAccess.Write, FileShare.ReadWrite))) {
158 writer.Write(now.ToString("G", CultureInfo.InvariantCulture));
160 for (int i = 0; i < sensors.Length; i++) {
161 if (sensors[i] != null) {
162 float? value = sensors[i].Value;
165 value.Value.ToString("R", CultureInfo.InvariantCulture));
167 if (i < sensors.Length - 1)
173 } catch (IOException) { }