diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.cs b/Common/Ui/GenesisToolBox/FrmTempMeter.cs index e5fb33f3..0f1cd44e 100644 --- a/Common/Ui/GenesisToolBox/FrmTempMeter.cs +++ b/Common/Ui/GenesisToolBox/FrmTempMeter.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; + using System.ComponentModel; using System.Drawing; using System.Globalization; using System.IO; @@ -645,8 +646,8 @@ this.btnAddLut.Enabled = false; this.nudRef.Visible = false; this.btnRefreshLut.Enabled = false; - this.startAutomaticBtn.Enabled = false; - this.stopAutomaticBtn.Enabled = false; + //this.startAutomaticBtn.Enabled = false; + //this.stopAutomaticBtn.Enabled = false; break; case ProgrammState.Connected: this.btnStartRecord.Enabled = true; @@ -654,8 +655,8 @@ this.btnAddLut.Enabled = false; this.nudRef.Visible = false; this.btnRefreshLut.Enabled = true; - this.startAutomaticBtn.Enabled = true; - this.stopAutomaticBtn.Enabled = false; + //this.startAutomaticBtn.Enabled = true; + //this.stopAutomaticBtn.Enabled = false; break; case ProgrammState.RecordRuning: this.btnStartRecord.Enabled = false; @@ -663,8 +664,8 @@ this.btnAddLut.Enabled = false; this.nudRef.Visible = false; this.btnRefreshLut.Enabled = true; - this.startAutomaticBtn.Enabled = false; - this.stopAutomaticBtn.Enabled = true; + //this.startAutomaticBtn.Enabled = false; + //this.stopAutomaticBtn.Enabled = true; break; case ProgrammState.RecordStoped: this.btnStartRecord.Enabled = true; @@ -672,12 +673,15 @@ this.btnAddLut.Enabled = true; this.nudRef.Visible = true; this.btnRefreshLut.Enabled = true; - this.startAutomaticBtn.Enabled = true; - this.stopAutomaticBtn.Enabled = false; + //this.startAutomaticBtn.Enabled = true; + //this.stopAutomaticBtn.Enabled = false; break; default: break; } + + this.startAutomaticBtn.Enabled = true; + this.stopAutomaticBtn.Enabled = false; } private void AddTextBoxBindings(Object sender, EventArgs e) @@ -709,7 +713,6 @@ private bool automatic = false; private string messurementsFile; private AutomaticTemperatureCalibration automaticCalibration; - private CultureInfo previousCulture; private void StartAutomaticBtn_Clicked(object sender, EventArgs args) { @@ -718,15 +721,9 @@ return; } - //this.previousCulture = Thread.CurrentThread.CurrentCulture; - //var cultureInfo = new CultureInfo("en-US"); - //cultureInfo.DateTimeFormat.DateSeparator = "-"; - //Thread.CurrentThread.CurrentCulture = cultureInfo; - //Thread.CurrentThread.CurrentUICulture = cultureInfo; - this.automatic = true; this.start = DateTimeOffset.Now; - this.messurementsFile = $"{this.start:yyyy-MM-dd}.messurements"; + this.messurementsFile = $"messurements.txt"; this.currentGenesis.StartRecordData(); this.currentGenesis.WriteRegister(Register.Genesisflow.SampleRate, (byte)16, checkRegister: true); @@ -739,27 +736,18 @@ this.automaticCalibration.InfoMessage += message => this.AddMessage(message, Color.Black); this.automaticCalibration.ErrorMessage += message => this.AddMessage(message, Color.Red); this.automaticCalibration.WarningMessage += message => this.AddMessage(message, Color.Orange); - this.automaticCalibration.Start += () => - { - this.startAutomaticBtn.Enabled = false; - this.stopAutomaticBtn.Enabled = true; - }; - this.automaticCalibration.Stop += () => - { - this.startAutomaticBtn.Enabled = true; - this.stopAutomaticBtn.Enabled = false; - }; + + this.AddMessage("Automatic temperature calibration started.", Color.Black); this.automaticCalibration.StartMessuring(); this.SetEnabled(ProgrammState.RecordRuning); + + this.startAutomaticBtn.Enabled = false; + this.stopAutomaticBtn.Enabled = true; } private void StopAutomaticBtn_Clicked(object sender, EventArgs args) { - //Thread.CurrentThread.CurrentCulture = this.previousCulture; - //Thread.CurrentThread.CurrentUICulture = this.previousCulture; - //this.previousCulture = default(CultureInfo); - this.automatic = false; this.automaticCalibration.TemperatureMesured -= this.SaveMessurement; this.automaticCalibration.InfoMessage -= message => this.AddMessage(message, Color.Black); @@ -768,8 +756,16 @@ this.MergeToAutoFile(); this.automaticCalibration.StopMessuring(); - this.currentGenesis?.WriteRegister(Register.Genesisflow.SampleRate, 0, checkRegister: true); + this.currentGenesis.WriteRegister(Register.Genesisflow.SampleRate, (byte)0, checkRegister: true); + this.currentGenesis.WriteRegister("GENESISFLOW_MaxValidDeltaToF", 4294967295, checkRegister: true); + this.currentGenesis.WriteRegister("GENESISFLOW_MaxValidToF", 4294967295, checkRegister: true); + this.currentGenesis.WriteRegister("GENESISFLOW_MinValidToF", (uint)0, checkRegister: true); this.SetEnabled(ProgrammState.RecordStoped); + + this.startAutomaticBtn.Enabled = true; + this.stopAutomaticBtn.Enabled = false; + + this.AddMessage("Automatic temperature calibration stoped.", Color.Black); } private void UpdateAutomaticBtn_Clicked(object sender, EventArgs args) @@ -804,15 +800,13 @@ private void SaveMessurement(double meterTOF, double temperature, DateTime timestamp) { - var pcbid = this.currentGenesis?.PcbId ?? "200000000"; - var tmp = temperature.ToString("en-US"); - var tof = meterTOF.ToString("en-US"); + var pcbid = this.currentGenesis?.PcbId ?? "000000000"; - File.AppendAllLines(this.messurementsFile, new[] { $"{pcbid}\t{tmp}\t{tof}\t{timestamp}" }); + File.AppendAllLines(this.messurementsFile, new[] { $"{pcbid}\t{temperature}\t{meterTOF}\t{timestamp}" }); // Note: the MeterProcessState should be also updated. // To the endpoint was added new property: dt <=> Timestamp -> this is the timestamp provided from the automatic temperature calibration. - File.AppendAllLines("temp_luts.txt", new[] { $"{pcbid}\t{tmp}\t{tof}\t{timestamp}" }); - // LocalWebRequest.PostRequestAsync($"http://10.49.40.25/MeterProcessState/api/TempFlange/AddLut?PcbId={pcbid}&RefTempC={tmp}&AvgTof={tof}&dt={timestamp}"); + File.AppendAllLines("temp_luts.txt", new[] { $"{pcbid}\t{temperature}\t{meterTOF}\t{timestamp}" }); + // LocalWebRequest.PostRequestAsync($"http://10.49.40.25/MeterProcessState/api/TempFlange/AddLut?PcbId={pcbid}&RefTempC={temperature}&AvgTof={meterTOF}&dt={timestamp}"); } } } diff --git a/Common/Ui/GenesisToolBox/GenesisToolBox.csproj.user b/Common/Ui/GenesisToolBox/GenesisToolBox.csproj.user index 888ca413..ea750310 100644 --- a/Common/Ui/GenesisToolBox/GenesisToolBox.csproj.user +++ b/Common/Ui/GenesisToolBox/GenesisToolBox.csproj.user @@ -10,6 +10,6 @@ de-DE false - ProjectFiles + ShowAllFiles \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs index 24d707b1..ef4f7933 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs @@ -70,24 +70,7 @@ private readonly StreamReader pipeReader; private readonly CultureInfo de; private readonly CultureInfo us; -#if false - private readonly TestValues values; - public TemperatureSource() - => this.values = new TestValues(); - - public bool TryGetTemperature(out double temperature) - { - temperature = this.values.Temperature.Dequeue(); - - this.values.Temperature.Enqueue(temperature); - - return true; - } - - public double GetTOF(double temperature) - => this.values.GetTOF(temperature); -#else public TemperatureSource() { try @@ -131,7 +114,7 @@ return false; } -#endif + public void Dispose() { this.pipeReader?.Dispose(); @@ -141,37 +124,27 @@ partial class AutomaticTemperatureCalibration { - private readonly int messurementsCount; + private readonly Timer timer; private readonly Func sourceTOF; - private readonly Timer temperatureWatcher; - private readonly Timer messurementWatcher; private readonly TemperatureSource temperature; - private ICollection messurements; + private ICollection timesOfFliights; + private ICollection temperatures; private int temperatureChecks; + private int messurementsCount; private int messurementsN; private double previousT; + private bool waiting; public AutomaticTemperatureCalibration(Func sourceTOF) { -#if false - this.sourceTOF = () => this.temperature.GetTOF(this.previousT); -#else this.sourceTOF = sourceTOF; -#endif this.temperature = new TemperatureSource(); - this.messurements = new List(); - this.messurementsCount = Appsettings.MessurementDauerInMs / Appsettings.MessurementStep; - - this.temperatureWatcher = new Timer(Math.Max(Appsettings.TemperatureCheckInMs, 1000)); - this.temperatureWatcher.Elapsed += this.CheckTemperature; - - this.messurementWatcher = new Timer(Math.Max(Appsettings.MessurementStep, 1000)); - this.messurementWatcher.Elapsed += this.Messure; + this.timesOfFliights = new List(); + this.temperatures = new List(); + this.timer = new Timer(); } - - public event Action Start; - public event Action Stop; + public event Action InfoMessage; public event Action ErrorMessage; public event Action WarningMessage; @@ -179,63 +152,68 @@ public void StartMessuring() { - Appsettings.Refresh(); + this.timer.Stop(); - if (this.sourceTOF is null) - { - this.StopTemperatureWatcher(); - this.StopMessurementWatcher(); - this.Stop?.Invoke(); - } - else - { - this.StopMessurementWatcher(); - this.StartTemperatureWatcher(); - this.Start?.Invoke(); - } + Appsettings.Refresh(); + + this.waiting = true; + this.temperatureChecks = 0; + + this.timer.Interval = Appsettings.TemperatureCheckInMs; + this.timer.Elapsed += this.CheckTemperature; + this.timer.Elapsed -= this.Messure; + this.timer.AutoReset = true; + this.timer.Enabled = true; + + this.timer.Start(); + + this.InfoMessage?.Invoke(string.Empty); + this.InfoMessage?.Invoke($"\t Nr\tPrevious\tCurrent\tDifference"); } public void StopMessuring() { - if (this.sourceTOF != null) - { - this.temperature.Dispose(); - } - - this.StopMessurementWatcher(); - this.StopTemperatureWatcher(); - this.Stop?.Invoke(); + this.previousT = 0; + this.timer?.Stop(); + this.timer?.Dispose(); + this.temperature?.Dispose(); } private void CheckTemperature(object sender, ElapsedEventArgs args) { - this.temperatureChecks++; - if (this.temperature.TryGetTemperature(out var currentT)) { var differenceT = Math.Abs(this.previousT - currentT); - if (differenceT <= Appsettings.MessurementToleranceInC) + if (this.waiting && differenceT >= Appsettings.TemperatureCheckInC) { - if (this.temperatureChecks > Appsettings.TemperatureChecksCount) - { - this.previousT = currentT; - this.temperatureChecks = 0; - - this.StopTemperatureWatcher(); - this.StartMessurementWatcher(); - - return; - } + this.waiting = false; + this.previousT = currentT; } - else - { - this.temperatureChecks = 1; - if (this.previousT != 0) + if (!this.waiting && differenceT <= Appsettings.TemperatureCheckInC) + { + if (this.temperatureChecks >= Appsettings.TemperatureChecksCount) { - this.WarningMessage?.Invoke("\t... temperature difference is not in the tolerance span, restarting counter!"); + this.timer.Stop(); + + this.waiting = true; + this.messurementsN = 0; + this.messurementsCount = Appsettings.MessurementDauerInMs / Appsettings.MessurementStep; + + this.timer.Interval = Appsettings.MessurementStep; + this.timer.Elapsed -= this.CheckTemperature; + this.timer.Elapsed += this.Messure; + this.timer.AutoReset = true; + this.timer.Enabled = true; + + this.timer.Start(); + + this.InfoMessage?.Invoke(string.Empty); + this.InfoMessage?.Invoke($"\t Nr\tTimestamp\t TOF\tTemperature"); } + + this.temperatureChecks++; } this.InfoMessage?.Invoke($"\t{this.temperatureChecks,3}\t{this.previousT,8:F2}\t{currentT,7:F2}\t{differenceT,10:F2}"); @@ -244,18 +222,17 @@ { this.temperatureChecks = 0; - this.InfoMessage?.Invoke($"\t{this.temperatureChecks,3}\t{this.previousT,8:F2}\t.......\t.........."); + this.InfoMessage?.Invoke($"\t 1\t{this.previousT,8:F2}\t.......\t.........."); } - - this.previousT = currentT; } private void Messure(object sender, ElapsedEventArgs args) { - this.messurementsN++; - if (!this.temperature.TryGetTemperature(out var currentT)) { + this.WarningMessage?.Invoke("\t ... temperature could not be read."); + this.StartMessuring(); + return; } @@ -263,171 +240,81 @@ if (differenceT > Appsettings.MessurementToleranceInC) { - if (this.messurements.Count >= this.messurementsCount / 2) + if (this.messurementsN >= this.messurementsCount / 2) { - this.StopMessurementWatcher(); - this.StartTemperatureWatcher(); - - if (this.messurements.Any()) - { - var avgT = this.messurements.Average(x => x.T); - var avgTOF = this.messurements.Average(x => x.TOF); - this.TemperatureMesured?.Invoke(avgT, avgTOF, args.SignalTime); - } - - this.messurements = new List(); - - this.ErrorMessage?.Invoke("\t ... temperature difference is not in the tolerance span!"); - this.WarningMessage?.Invoke("\t ... messurement saved, start looking new temperature change!"); + this.NotifyTemperatureMessured(args.SignalTime); + this.InfoMessage?.Invoke("\t ... messurement saved, start looking new temperature change!"); } + else + { + this.ErrorMessage?.Invoke("\t ... not enough messurements!"); + } + + this.ErrorMessage?.Invoke($"\t ... temperature difference '{differenceT:F2}' is not in the tolerance span!"); + this.StartMessuring(); return; } - var currentTOF = this.sourceTOF(); + var currentTOF = this.sourceTOF?.Invoke() ?? 0; var minTOF = currentTOF; var maxTOF = currentTOF; - if (this.messurements.Any()) + if (this.timesOfFliights.Any()) { var tolerance = Appsettings.MessurementTOFTolerance / 100; - minTOF = this.messurements.Min(x => x.TOF) * (1.00 - tolerance); - maxTOF = this.messurements.Max(x => x.TOF) * (1.00 + tolerance); + minTOF = this.timesOfFliights.Min() * (1.00 - tolerance); + maxTOF = this.timesOfFliights.Max() * (1.00 + tolerance); } if (currentTOF < minTOF || currentTOF > maxTOF) { - if (this.messurements.Count >= this.messurementsCount / 2) + if (this.messurementsN >= this.messurementsCount / 2) { - this.StopMessurementWatcher(); - this.StartTemperatureWatcher(); - - if (this.messurements.Any()) - { - var avgT = this.messurements.Average(x => x.T); - var avgTOF = this.messurements.Average(x => x.TOF); - this.TemperatureMesured?.Invoke(avgT, avgTOF, args.SignalTime); - } - - this.messurements = new List(); - - this.ErrorMessage?.Invoke("\t ... TOF is not in a tolerance span!"); + this.NotifyTemperatureMessured(args.SignalTime); this.WarningMessage?.Invoke("\t ... messurement saved, start looking new temperature change!"); } + else + { + this.ErrorMessage?.Invoke("\t ... not enough messurements!"); + } + + this.ErrorMessage?.Invoke($"\t ... TOF is not in a tolerance span - {minTOF} <= {currentTOF} <= {maxTOF}!"); + this.StartMessuring(); return; } - else - { - this.messurements.Add(new Messurement - { - T = currentT, - TOF = currentTOF, - DTS = args.SignalTime - }); - this.InfoMessage?.Invoke($"\t{this.messurementsN,4}\t{args.SignalTime,8:hh:mm:ss}\t{currentTOF,17:F15}\t {currentT,5:F2}"); - } + this.temperatures.Add(currentT); + this.timesOfFliights.Add(currentTOF); + + this.InfoMessage?.Invoke($"\t{this.messurementsN,4}\t {args.SignalTime,8:hh:mm:ss}\t{currentTOF,17:F15}\t {currentT,5:F2}"); if (this.messurementsN >= this.messurementsCount) { - this.StopMessurementWatcher(); - this.StartTemperatureWatcher(); - - if (this.messurements.Any()) - { - var avgT = this.messurements.Average(x => x.T); - var avgTOF = this.messurements.Average(x => x.TOF); - this.TemperatureMesured?.Invoke(avgT, avgTOF, args.SignalTime); - } - - this.messurements = new List(); + this.NotifyTemperatureMessured(args.SignalTime); + this.InfoMessage?.Invoke("\t ... messurement done!"); + this.StartMessuring(); return; } + + this.messurementsN++; } - private void StartTemperatureWatcher() + private void NotifyTemperatureMessured(DateTime timestamp) { - this.temperatureChecks = 0; - this.temperatureWatcher.AutoReset = true; - this.temperatureWatcher.Enabled = true; - this.temperatureWatcher.Start(); - - this.InfoMessage?.Invoke("\t\t\t\t "); - this.InfoMessage?.Invoke("\t Nr\tPrevious\tCurrent\tDifference - temperature changes in °C."); - } - - private void StopTemperatureWatcher() - { - this.temperatureChecks = 0; - this.temperatureWatcher.Stop(); - this.temperatureWatcher.Enabled = false; - this.temperatureWatcher.AutoReset = false; - - this.InfoMessage?.Invoke("\t\t\t\t "); - } - - private void StartMessurementWatcher() - { - this.messurementsN = 0; - this.messurementWatcher.AutoReset = true; - this.messurementWatcher.Enabled = true; - this.messurementWatcher.Start(); - - this.InfoMessage?.Invoke("\t\t\t\t "); - this.InfoMessage?.Invoke("\t Nr\tTimestamp\t TOF\tTemperature\t"); - } - - private void StopMessurementWatcher() - { - this.messurementsN = 0; - this.messurementWatcher.Stop(); - this.messurementWatcher.Enabled = false; - this.messurementWatcher.AutoReset = false; - } - } - - class TestValues - { - private readonly Random random; - - public TestValues() - { - this.random = new Random(); - this.Temperature = new Queue(); - - for (int c = 15; c < 25; c++) + if (this.timesOfFliights.Any() && this.temperatures.Any()) { - var countInvalidT = 2; + var avgT = this.temperatures.Average(); + var avgTOF = this.timesOfFliights.Average(); - for (int i = 0; i < countInvalidT; i++) - { - var t = random.Next(c - 2, c) / 0.99; - - this.Temperature.Enqueue(t); - } - - var countSameT = Appsettings.TemperatureChecksCount + Appsettings.MessurementDauerInMs / Appsettings.MessurementStep + 3; - - for (int i = 0; i < countSameT; i++) - { - var p = 1 - random.Next(96, 99) / 100; - var t = c * p; - - this.Temperature.Enqueue(t); - } + this.TemperatureMesured?.Invoke(avgT, avgTOF, timestamp); } - } - public Queue Temperature { get; } - - public double GetTOF(double temperature) - { - var tmp = this.random.Next(1, 5); - var retrn = temperature / 9000 - Math.Pow(temperature, 1.6) / 100_000; - - return retrn - (retrn * tmp / 100 + Math.Pow(tmp, 1.6) / 100_000); + this.messurementsN = 0; + this.temperatures = new List(); + this.timesOfFliights = new List(); } } } \ No newline at end of file