namespace Xylem.Common.Ui.GenesisToolBox.Infrastructure { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Timers; internal interface ITempMeterForm { void AddMessage(string message); void StartRecording(); bool StartLED(int Slot); bool StopLED(int Slot); void InvokeOnUIThread(Action action); IDictionary GetAverageTOFForeachMeter(int Slot); } internal partial class AutomaticTemperatureCalibration { private readonly ITempMeterForm tempMeterForm; private TemperatureSource temperatureSource; private readonly string outputFile; private Timer timer; private bool hasHeaders; public AutomaticTemperatureCalibration(ITempMeterForm tempMeterForm) { this.tempMeterForm = tempMeterForm; this.outputFile = Path.Combine(Appsettings.WorkingDirectory, $"{DateTime.Now:yyyy_MM_dd}_mesurements.txt"); Directory.CreateDirectory(Path.GetDirectoryName(this.outputFile)); File.AppendAllText(this.outputFile, default(string)); } public void StartMessuring() { this.temperatureSource = new TemperatureSource(); this.tempMeterForm.StartRecording(); //this.GetResults(null, null); this.timer = new Timer() { AutoReset = true, Interval = Appsettings.MessurementStep, }; this.timer.Elapsed += this.GetResults; this.timer.Start(); } private double currentCount = 0.5; private void GetResults(Object sender, ElapsedEventArgs args) { this.tempMeterForm.InvokeOnUIThread(() => { try { if (currentCount > -1) { var tmpCurrent = currentCount; currentCount = -1; try { if (tmpCurrent % 1 == 0) { // sleep this.tempMeterForm.StopLED((int)tmpCurrent); this.tempMeterForm.AddMessage($"Stop LED {((int)tmpCurrent).ToString()}"); if (((int)tmpCurrent) + 1 == 3) { this.tempMeterForm.StartLED(1); this.tempMeterForm.AddMessage($"Start LED 1"); } else { this.tempMeterForm.StartLED((int)tmpCurrent +1); this.tempMeterForm.AddMessage($"Stop LED {((int)tmpCurrent +1).ToString()}"); } } else { var temp = this.temperatureSource.GetTemperature(); var results = this.tempMeterForm.GetAverageTOFForeachMeter((int)tmpCurrent); //if (!this.hasHeaders) //{ // File.AppendAllText(this.outputFile, $"Timestamp;°C;{string.Join(";", results.Keys)}{Environment.NewLine}"); // this.hasHeaders = true; var messurement = $"{DateTime.Now};{temp:0.00};{string.Join(";", results.Keys.Select(x => $"{x}"))}; {string.Join(";", results.Values.Select(x => $"{x:0.0000000000}"))}"; File.AppendAllText(this.outputFile, $"{messurement}{Environment.NewLine}"); this.tempMeterForm.AddMessage(messurement); } } catch (Exception) { } finally { currentCount = tmpCurrent +0.5; } if (currentCount >= 3) { currentCount = 0.5; } } else { this.tempMeterForm.AddMessage($"Blocked{Environment.NewLine}"); } } catch (Exception e) { this.tempMeterForm.AddMessage(e.ToString()); } }); } public void StopMessuring() { try { this.timer.Stop(); this.timer.Dispose(); this.timer = null; } catch (Exception e) { this.tempMeterForm.AddMessage($"{e}"); } try { this.temperatureSource.Dispose(); } catch (Exception e) { this.tempMeterForm.AddMessage($"{e}"); } } } }