diff --git a/Common/CommonConsole/Program.cs b/Common/CommonConsole/Program.cs index 8eb214ae..a9bbf5f7 100644 --- a/Common/CommonConsole/Program.cs +++ b/Common/CommonConsole/Program.cs @@ -4,90 +4,120 @@ using System.Collections.Generic; using System.Globalization; using System.IO; + using System.IO.Ports; using System.Linq; + using System.Runtime.InteropServices; + using System.Threading; public class Program { - public static void Main(string[] args) + [DllImport("GMH3x32E.dll")] + public static extern Int16 UniversalOpenCom(Int16 ini16COMPortNumber, UInt32 inui32BaudRate, Int16 inui16ConverterType, Int16 ini16Parity, Int16 ini16StoppBits); + [DllImport("GMH3x32E.dll")] + public static extern Int16 GMH_CloseCom(); + [DllImport("GMH3x32E.dll")] + unsafe public static extern Int16 GMH_Transmit(Int16 ini16DeviceAddress, Int16 ini16TransmitCode, Int16* refi16ptrPriority, double* refdblptrFloatValue, Int32* refi32ptrIntegerValue); + + public static void Main() { - var messurementLines = File.ReadLines(@".\messurements.txt"); - var messurements = new List(); + UniversalOpenCom(12, 4800, 8, 0, 0); - var parsedData = new List(); - var us = new CultureInfo("en-US"); - var de = new CultureInfo("de-DE"); - var any = NumberStyles.Any; - var skipNext = true; + Int16 i16Priority; + Double dblFloatValue; + Int32 i32IntergerValue; - foreach (var line in messurementLines) + unsafe { - if (string.IsNullOrWhiteSpace(line)) - { - if (parsedData.Count > 0) - { - messurements.Add(new Messurement - { - PcbId = parsedData.First().PcbId, - Start = parsedData.Min(x => x.Timestamp), - MinT = parsedData.Min(x => x.CurrentT), - MinTOF = parsedData.Min(x => x.CurrentTOF), - AvgT = parsedData.Average(x => x.CurrentT), - AvgTOF = parsedData.Average(x => x.CurrentTOF), - MaxT = parsedData.Max(x => x.CurrentT), - MaxTOF = parsedData.Max(x => x.CurrentTOF), - End = parsedData.Max(x => x.Timestamp), - }); - } - - parsedData = new List(); - skipNext = true; - - continue; - } - - if (skipNext) - { - skipNext = false; - - continue; - } - - var lineTokens = line.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); - - if (lineTokens.Length != 4) - { - continue; - } - - var dateString = lineTokens[0]; - var pcbId = lineTokens[1]; - var temperatureString = lineTokens[2]; - var tofString = lineTokens[3]; - - _ = DateTime.TryParse(dateString.Substring(1, dateString.Length - 2), out var timestamp); - _ = double.TryParse(temperatureString, any, us, out var currentT) || double.TryParse(temperatureString, any, de, out currentT); - _ = double.TryParse(tofString, any, us, out var currentTOF) || double.TryParse(tofString, any, de, out currentT); - - parsedData.Add(new MessurementData - { - PcbId = pcbId, - CurrentT = currentT, - CurrentTOF = currentTOF, - Timestamp = timestamp - }); + var i16ErrorCode = GMH_Transmit(1, 0, &i16Priority, &dblFloatValue, &i32IntergerValue); } - - File.WriteAllLines(@".\messurements.csv", messurements.Select(x - => $"{x.PcbId,10}\t" - + $"{x.AvgT,5:0.00}\t" - + $"{x.AvgTOF,12:0.0000000000}\t" - + $"{x.DifferenceT,5:00.00}\t" - + $"{x.DifferenceTOF,12:0.0000000000}")); - Console.WriteLine(Messurement.Header); - messurements.ForEach(Console.WriteLine); + Console.WriteLine(dblFloatValue); + + GMH_CloseCom(); } + + + //public static void Main(string[] args) + //{ + // var messurementLines = File.ReadLines(@".\messurements.txt"); + // var messurements = new List(); + + // var parsedData = new List(); + // var us = new CultureInfo("en-US"); + // var de = new CultureInfo("de-DE"); + // var any = NumberStyles.Any; + // var skipNext = true; + + // foreach (var line in messurementLines) + // { + // if (string.IsNullOrWhiteSpace(line)) + // { + // if (parsedData.Count > 0) + // { + // messurements.Add(new Messurement + // { + // PcbId = parsedData.First().PcbId, + // Start = parsedData.Min(x => x.Timestamp), + // MinT = parsedData.Min(x => x.CurrentT), + // MinTOF = parsedData.Min(x => x.CurrentTOF), + // AvgT = parsedData.Average(x => x.CurrentT), + // AvgTOF = parsedData.Average(x => x.CurrentTOF), + // MaxT = parsedData.Max(x => x.CurrentT), + // MaxTOF = parsedData.Max(x => x.CurrentTOF), + // End = parsedData.Max(x => x.Timestamp), + // }); + // } + + // parsedData = new List(); + // skipNext = true; + + // continue; + // } + + // if (skipNext) + // { + // skipNext = false; + + // continue; + // } + + // var lineTokens = line.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); + + // if (lineTokens.Length != 4) + // { + // continue; + // } + + // var dateString = lineTokens[0]; + // var pcbId = lineTokens[1]; + // var temperatureString = lineTokens[2]; + // var tofString = lineTokens[3]; + + // _ = DateTime.TryParse(dateString.Substring(1, dateString.Length - 2), out var timestamp); + // _ = double.TryParse(temperatureString, any, us, out var currentT) || double.TryParse(temperatureString, any, de, out currentT); + // _ = double.TryParse(tofString, any, us, out var currentTOF) || double.TryParse(tofString, any, de, out currentT); + + // parsedData.Add(new MessurementData + // { + // PcbId = pcbId, + // CurrentT = currentT, + // CurrentTOF = currentTOF, + // Timestamp = timestamp + // }); + // } + + // File.WriteAllLines(@".\messurements.csv", messurements.Select(x + // => $"{x.PcbId,10}\t" + // + $"{x.AvgT,5:0.00}\t" + // + $"{x.AvgTOF,12:0.0000000000}\t" + // + $"{x.DifferenceT,5:00.00}\t" + // + $"{x.DifferenceTOF,12:0.0000000000}")); + + // Console.WriteLine(Messurement.Header); + + // messurements.ForEach(Console.WriteLine); + //} } public class MessurementData diff --git a/Common/TempFlansh/App.config b/Common/TempFlansh/App.config index 56efbc7b..ecdcf8a5 100644 --- a/Common/TempFlansh/App.config +++ b/Common/TempFlansh/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/Common/TempFlansh/Properties/Resources.Designer.cs b/Common/TempFlansh/Properties/Resources.Designer.cs index 153cd8ab..302adfb3 100644 --- a/Common/TempFlansh/Properties/Resources.Designer.cs +++ b/Common/TempFlansh/Properties/Resources.Designer.cs @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace TempFlansh.Properties -{ - - +namespace TempFlansh.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,51 +19,43 @@ namespace TempFlansh.Properties // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TempFlansh.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/Common/TempFlansh/Properties/Settings.Designer.cs b/Common/TempFlansh/Properties/Settings.Designer.cs index 256217da..d65db5fc 100644 --- a/Common/TempFlansh/Properties/Settings.Designer.cs +++ b/Common/TempFlansh/Properties/Settings.Designer.cs @@ -8,21 +8,17 @@ // //------------------------------------------------------------------------------ -namespace TempFlansh.Properties -{ - - +namespace TempFlansh.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/Common/TempFlansh/TempFlansh.csproj b/Common/TempFlansh/TempFlansh.csproj index 82fb0385..b82110cd 100644 --- a/Common/TempFlansh/TempFlansh.csproj +++ b/Common/TempFlansh/TempFlansh.csproj @@ -13,6 +13,7 @@ true true false + C:\Users\SZLATEV\Desktop\TempFlansh\ true Disk @@ -134,6 +135,7 @@ True Resources.resx + True @@ -147,7 +149,9 @@ - + + Designer + diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs b/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs index 546b02f4..9334ab16 100644 --- a/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs @@ -58,12 +58,16 @@ namespace Xylem.Common.Ui.GenesisToolBox this.automaticContentBox = new System.Windows.Forms.RichTextBox(); this.autometicControlsSplitter = new System.Windows.Forms.Splitter(); this.automaticControlsPanel = new System.Windows.Forms.Panel(); + this.saveSettingsBtn = new System.Windows.Forms.Button(); + this.messurementDauerMS = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.stopAutomaticBtn = new System.Windows.Forms.Button(); this.startAutomaticBtn = new System.Windows.Forms.Button(); - this.temperatureCheckInC = new System.Windows.Forms.TextBox(); + this.messurementStepMS = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); - this.temperatureCheckInMs = new System.Windows.Forms.TextBox(); + this.GMHPort = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); + this.tabPage4 = new System.Windows.Forms.TabPage(); this.timer3 = new System.Windows.Forms.Timer(this.components); this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); this.automaticCalibrationTabControl.SuspendLayout(); @@ -90,6 +94,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.automaticCalibrationTabControl.Controls.Add(this.tabPage2); this.automaticCalibrationTabControl.Controls.Add(this.tabPage3); this.automaticCalibrationTabControl.Controls.Add(this.AutomaticCalibrationTab); + this.automaticCalibrationTabControl.Controls.Add(this.tabPage4); this.automaticCalibrationTabControl.Dock = System.Windows.Forms.DockStyle.Fill; this.automaticCalibrationTabControl.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.automaticCalibrationTabControl.Location = new System.Drawing.Point(0, 24); @@ -97,7 +102,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.automaticCalibrationTabControl.Name = "automaticCalibrationTabControl"; this.automaticCalibrationTabControl.Padding = new System.Drawing.Point(0, 0); this.automaticCalibrationTabControl.SelectedIndex = 0; - this.automaticCalibrationTabControl.Size = new System.Drawing.Size(1245, 724); + this.automaticCalibrationTabControl.Size = new System.Drawing.Size(1225, 676); this.automaticCalibrationTabControl.TabIndex = 55; this.automaticCalibrationTabControl.Tag = ""; // @@ -108,7 +113,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.tabPage1.Location = new System.Drawing.Point(4, 25); this.tabPage1.Name = "tabPage1"; this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(1237, 695); + this.tabPage1.Size = new System.Drawing.Size(1217, 647); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "Current entrys in LUT"; this.tabPage1.UseVisualStyleBackColor = true; @@ -139,7 +144,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.tabPage2.Location = new System.Drawing.Point(4, 25); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(1237, 695); + this.tabPage2.Size = new System.Drawing.Size(1217, 647); this.tabPage2.TabIndex = 1; this.tabPage2.Text = "Manual check temp"; this.tabPage2.UseVisualStyleBackColor = true; @@ -189,7 +194,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.tabPage3.Location = new System.Drawing.Point(4, 25); this.tabPage3.Name = "tabPage3"; this.tabPage3.Padding = new System.Windows.Forms.Padding(3); - this.tabPage3.Size = new System.Drawing.Size(1237, 695); + this.tabPage3.Size = new System.Drawing.Size(1217, 647); this.tabPage3.TabIndex = 2; this.tabPage3.Text = "Manual add LUT"; this.tabPage3.UseVisualStyleBackColor = true; @@ -328,7 +333,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.AutomaticCalibrationTab.Location = new System.Drawing.Point(4, 25); this.AutomaticCalibrationTab.Margin = new System.Windows.Forms.Padding(0); this.AutomaticCalibrationTab.Name = "AutomaticCalibrationTab"; - this.AutomaticCalibrationTab.Size = new System.Drawing.Size(1237, 695); + this.AutomaticCalibrationTab.Size = new System.Drawing.Size(1217, 647); this.AutomaticCalibrationTab.TabIndex = 3; this.AutomaticCalibrationTab.Text = "Automatic Calibration"; // @@ -339,7 +344,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.automaticContentBox.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.automaticContentBox.Location = new System.Drawing.Point(331, 0); this.automaticContentBox.Name = "automaticContentBox"; - this.automaticContentBox.Size = new System.Drawing.Size(906, 695); + this.automaticContentBox.Size = new System.Drawing.Size(886, 647); this.automaticContentBox.TabIndex = 2; this.automaticContentBox.Text = ""; // @@ -349,32 +354,75 @@ namespace Xylem.Common.Ui.GenesisToolBox this.autometicControlsSplitter.Cursor = System.Windows.Forms.Cursors.VSplit; this.autometicControlsSplitter.Location = new System.Drawing.Point(328, 0); this.autometicControlsSplitter.Name = "autometicControlsSplitter"; - this.autometicControlsSplitter.Size = new System.Drawing.Size(3, 695); + this.autometicControlsSplitter.Size = new System.Drawing.Size(3, 647); this.autometicControlsSplitter.TabIndex = 1; this.autometicControlsSplitter.TabStop = false; // // automaticControlsPanel // this.automaticControlsPanel.BackColor = System.Drawing.SystemColors.Menu; + this.automaticControlsPanel.Controls.Add(this.saveSettingsBtn); + this.automaticControlsPanel.Controls.Add(this.messurementDauerMS); + this.automaticControlsPanel.Controls.Add(this.label3); this.automaticControlsPanel.Controls.Add(this.stopAutomaticBtn); this.automaticControlsPanel.Controls.Add(this.startAutomaticBtn); - this.automaticControlsPanel.Controls.Add(this.temperatureCheckInC); + this.automaticControlsPanel.Controls.Add(this.messurementStepMS); this.automaticControlsPanel.Controls.Add(this.label2); - this.automaticControlsPanel.Controls.Add(this.temperatureCheckInMs); + this.automaticControlsPanel.Controls.Add(this.GMHPort); this.automaticControlsPanel.Controls.Add(this.label1); this.automaticControlsPanel.Dock = System.Windows.Forms.DockStyle.Left; this.automaticControlsPanel.Location = new System.Drawing.Point(0, 0); this.automaticControlsPanel.Name = "automaticControlsPanel"; this.automaticControlsPanel.Padding = new System.Windows.Forms.Padding(5); - this.automaticControlsPanel.Size = new System.Drawing.Size(328, 695); + this.automaticControlsPanel.Size = new System.Drawing.Size(328, 647); this.automaticControlsPanel.TabIndex = 0; // + // saveSettingsBtn + // + this.saveSettingsBtn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.saveSettingsBtn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.saveSettingsBtn.Location = new System.Drawing.Point(5, 149); + this.saveSettingsBtn.Margin = new System.Windows.Forms.Padding(5); + this.saveSettingsBtn.Name = "saveSettingsBtn"; + this.saveSettingsBtn.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); + this.saveSettingsBtn.Size = new System.Drawing.Size(318, 36); + this.saveSettingsBtn.TabIndex = 16; + this.saveSettingsBtn.Text = "Save settings"; + this.saveSettingsBtn.UseVisualStyleBackColor = true; + this.saveSettingsBtn.Click += new System.EventHandler(this.SaveSettingsBtn_Click); + // + // messurementDauerMS + // + this.messurementDauerMS.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.messurementDauerMS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.messurementDauerMS.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.messurementDauerMS.Location = new System.Drawing.Point(5, 114); + this.messurementDauerMS.Margin = new System.Windows.Forms.Padding(0); + this.messurementDauerMS.Name = "messurementDauerMS"; + this.messurementDauerMS.Size = new System.Drawing.Size(318, 24); + this.messurementDauerMS.TabIndex = 15; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(5, 97); + this.label3.Margin = new System.Windows.Forms.Padding(5); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(318, 18); + this.label3.TabIndex = 14; + this.label3.Text = "Messurement dauer (ms)"; + this.label3.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // // stopAutomaticBtn // this.stopAutomaticBtn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.stopAutomaticBtn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.stopAutomaticBtn.Location = new System.Drawing.Point(5, 153); + this.stopAutomaticBtn.Location = new System.Drawing.Point(5, 241); this.stopAutomaticBtn.Margin = new System.Windows.Forms.Padding(5); this.stopAutomaticBtn.Name = "stopAutomaticBtn"; this.stopAutomaticBtn.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); @@ -389,7 +437,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.startAutomaticBtn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.startAutomaticBtn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.startAutomaticBtn.Location = new System.Drawing.Point(5, 107); + this.startAutomaticBtn.Location = new System.Drawing.Point(5, 195); this.startAutomaticBtn.Margin = new System.Windows.Forms.Padding(5); this.startAutomaticBtn.Name = "startAutomaticBtn"; this.startAutomaticBtn.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); @@ -399,17 +447,17 @@ namespace Xylem.Common.Ui.GenesisToolBox this.startAutomaticBtn.UseVisualStyleBackColor = true; this.startAutomaticBtn.Click += new System.EventHandler(this.StartAutomaticBtn_Clicked); // - // temperatureCheckInC + // messurementStepMS // - this.temperatureCheckInC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.messurementStepMS.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.temperatureCheckInC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.temperatureCheckInC.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.temperatureCheckInC.Location = new System.Drawing.Point(5, 68); - this.temperatureCheckInC.Margin = new System.Windows.Forms.Padding(0); - this.temperatureCheckInC.Name = "temperatureCheckInC"; - this.temperatureCheckInC.Size = new System.Drawing.Size(318, 24); - this.temperatureCheckInC.TabIndex = 3; + this.messurementStepMS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.messurementStepMS.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.messurementStepMS.Location = new System.Drawing.Point(5, 68); + this.messurementStepMS.Margin = new System.Windows.Forms.Padding(0); + this.messurementStepMS.Name = "messurementStepMS"; + this.messurementStepMS.Size = new System.Drawing.Size(318, 24); + this.messurementStepMS.TabIndex = 3; // // label2 // @@ -421,21 +469,21 @@ namespace Xylem.Common.Ui.GenesisToolBox this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(318, 18); this.label2.TabIndex = 2; - this.label2.Text = "How long should messure (minutes)"; + this.label2.Text = "Messurement step (ms)"; this.label2.TextAlign = System.Drawing.ContentAlignment.BottomLeft; // - // temperatureCheckInMs + // GMHPort // - this.temperatureCheckInMs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.GMHPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.temperatureCheckInMs.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.temperatureCheckInMs.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.temperatureCheckInMs.Location = new System.Drawing.Point(5, 22); - this.temperatureCheckInMs.Margin = new System.Windows.Forms.Padding(0); - this.temperatureCheckInMs.MinimumSize = new System.Drawing.Size(2, 25); - this.temperatureCheckInMs.Name = "temperatureCheckInMs"; - this.temperatureCheckInMs.Size = new System.Drawing.Size(318, 24); - this.temperatureCheckInMs.TabIndex = 1; + this.GMHPort.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.GMHPort.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GMHPort.Location = new System.Drawing.Point(5, 22); + this.GMHPort.Margin = new System.Windows.Forms.Padding(0); + this.GMHPort.MinimumSize = new System.Drawing.Size(2, 25); + this.GMHPort.Name = "GMHPort"; + this.GMHPort.Size = new System.Drawing.Size(318, 24); + this.GMHPort.TabIndex = 1; // // label1 // @@ -447,9 +495,19 @@ namespace Xylem.Common.Ui.GenesisToolBox this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(318, 18); this.label1.TabIndex = 0; - this.label1.Text = "Time to wait before next messurement (minutes)"; + this.label1.Text = "Messgerät (COM port)"; this.label1.TextAlign = System.Drawing.ContentAlignment.BottomLeft; // + // tabPage4 + // + this.tabPage4.Location = new System.Drawing.Point(4, 25); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Padding = new System.Windows.Forms.Padding(3); + this.tabPage4.Size = new System.Drawing.Size(1217, 647); + this.tabPage4.TabIndex = 4; + this.tabPage4.Text = "tabPage4"; + this.tabPage4.UseVisualStyleBackColor = true; + // // timer3 // this.timer3.Interval = 10000; @@ -460,7 +518,7 @@ namespace Xylem.Common.Ui.GenesisToolBox this.mainMenuStrip.BackColor = System.Drawing.SystemColors.Control; this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); this.mainMenuStrip.Name = "mainMenuStrip"; - this.mainMenuStrip.Size = new System.Drawing.Size(1245, 24); + this.mainMenuStrip.Size = new System.Drawing.Size(1225, 24); this.mainMenuStrip.TabIndex = 57; this.mainMenuStrip.Text = "menuStrip1"; // @@ -468,7 +526,7 @@ namespace Xylem.Common.Ui.GenesisToolBox // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1245, 748); + this.ClientSize = new System.Drawing.Size(1225, 700); this.Controls.Add(this.automaticCalibrationTabControl); this.Controls.Add(this.mainMenuStrip); this.MainMenuStrip = this.mainMenuStrip; @@ -521,10 +579,14 @@ namespace Xylem.Common.Ui.GenesisToolBox private System.Windows.Forms.Splitter autometicControlsSplitter; private System.Windows.Forms.Panel automaticControlsPanel; private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox temperatureCheckInMs; - private System.Windows.Forms.TextBox temperatureCheckInC; + private System.Windows.Forms.TextBox GMHPort; + private System.Windows.Forms.TextBox messurementStepMS; private System.Windows.Forms.Label label2; private System.Windows.Forms.Button stopAutomaticBtn; private System.Windows.Forms.Button startAutomaticBtn; + private System.Windows.Forms.TextBox messurementDauerMS; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button saveSettingsBtn; + private System.Windows.Forms.TabPage tabPage4; } } \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.cs b/Common/Ui/GenesisToolBox/FrmTempMeter.cs index 17fc9bc7..3e425c03 100644 --- a/Common/Ui/GenesisToolBox/FrmTempMeter.cs +++ b/Common/Ui/GenesisToolBox/FrmTempMeter.cs @@ -23,13 +23,14 @@ using Xylem.Common.Logic.SoftwareAccessHelper; using Xylem.Common.Ui.GenesisToolBox.Infrastructure; - public partial class FrmTempMeter : Form + public partial class FrmTempMeter : Form, ITempMeterForm { private ToolStripLabel slotsLabel; private ToolStripComboBox slotsList; private ToolStripLabel pcbidLabel; private ToolStripTextBox pcbidTextBox; private ToolStripButton connectBtn; + private ToolStripButton disconnectBtn; private ToolStripButton testBtn; private ProgrammState programmState; @@ -529,14 +530,14 @@ while (needUp >= 0) { - var temp = rramp.NextDouble() / (needUp * 100);//+0 + var temp = rramp.NextDouble() / (needUp * 100); // +0 needUp = needUp - temp; refTemp = refTemp + temp; refTempss.Add(new TempTofCalc() { RefDate = sDate.AddSeconds(refTempss.Count), RefTemp = refTemp, Tof = generateTof(rtof, refTemp) }); } var ra = new Random(); - var tillI = ra.Next(150, 4000);//+0 + var tillI = ra.Next(150, 4000); // +0 var r = new Random(tillI); for (Int32 platI = 0; platI < tillI; platI++) { @@ -607,6 +608,18 @@ }; this.connectBtn.Click += this.BtnConnect_Click; + this.disconnectBtn = new ToolStripButton + { + Text = "Disconnect", + AutoSize = true, + Font = fontBold, + TextAlign = ContentAlignment.MiddleCenter, + Margin = new Padding(10, 0, 0, 0), + Padding = new Padding(10, 0, 10, 0), + BackColor = Color.LightGray + }; + this.disconnectBtn.Click += this.BtnDisconnect_Click; + this.testBtn = new ToolStripButton { Text = "Test", @@ -624,14 +637,44 @@ this.mainMenuStrip.Items.Add(this.pcbidLabel); this.mainMenuStrip.Items.Add(this.pcbidTextBox); this.mainMenuStrip.Items.Add(this.connectBtn); + this.mainMenuStrip.Items.Add(this.disconnectBtn); this.mainMenuStrip.Items.Add(this.testBtn); - this.AutomaticCalibrationTab.HandleCreated += this.AddTextBoxBindings; - this.AutomaticCalibrationTab.HandleDestroyed += this.RemoveTextBoxBindings; + this.automaticCalibrationTabControl.GotFocus += (Object sender, EventArgs e) => + { + this.GMHPort.Text = Appsettings.GMHPort.ToString(); + this.messurementStepMS.Text = Appsettings.MessurementStep.ToString(); + this.messurementDauerMS.Text = Appsettings.MessurementDauer.ToString(); + }; this.SetEnabled(ProgrammState.Start); } + private void BtnDisconnect_Click(Object sender, EventArgs args) + { + try + { + this.currentGenesis.DisposeMeter(); + } + catch (Exception e) + { + Console.WriteLine(e); + } + finally + { + this.currentGenesis = null; + } + + this.Invoke(new Action(() => + { + this.txtLuts.Text = string.Empty; + this.txtLuts.BackColor = Color.White; + this.pcbidTextBox.Text = "not connected"; + this.SetEnabled(ProgrammState.Start); + + })); + } + private void SetEnabled(ProgrammState state) { this.programmState = state; @@ -644,6 +687,8 @@ this.btnAddLut.Enabled = false; this.nudRef.Visible = false; this.btnRefreshLut.Enabled = false; + this.disconnectBtn.Visible = false; + this.connectBtn.Visible = true; break; case ProgrammState.Connected: this.btnStartRecord.Enabled = true; @@ -651,6 +696,8 @@ this.btnAddLut.Enabled = false; this.nudRef.Visible = false; this.btnRefreshLut.Enabled = true; + this.disconnectBtn.Visible = true; + this.connectBtn.Visible = false; break; case ProgrammState.RecordRuning: this.btnStartRecord.Enabled = false; @@ -674,22 +721,6 @@ this.stopAutomaticBtn.Enabled = false; } - private void AddTextBoxBindings(Object sender, EventArgs e) - { - var property = nameof(this.temperatureCheckInC.Text); - var source = Appsettings.Model; - var mode = DataSourceUpdateMode.OnPropertyChanged; - - this.temperatureCheckInMs.DataBindings.Add(property, source, nameof(source.WaitingTimeInMinutes), false, mode); - this.temperatureCheckInC.DataBindings.Add(property, source, nameof(source.MessuringTimeInMinutes), false, mode); - } - - private void RemoveTextBoxBindings(object sender, EventArgs e) - { - this.temperatureCheckInC.DataBindings.Clear(); - this.temperatureCheckInMs.DataBindings.Clear(); - } - private bool automatic = false; private AutomaticTemperatureCalibration automaticCalibration; @@ -702,17 +733,16 @@ return; } + this.currentGenesis?.WriteRegister(Register.Genesisflow.SampleRate, (byte)16, 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.automatic = true; this.start = DateTimeOffset.Now; - this.currentGenesis.StartRecordData(); - this.currentGenesis.WriteRegister(Register.Genesisflow.SampleRate, (byte)16, 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); - var pcbid = this.currentGenesis?.PcbId ?? "*********"; - this.automaticCalibration = new AutomaticTemperatureCalibration(pcbid, () => this.OutputAvgTof()); + this.automaticCalibration = new AutomaticTemperatureCalibration(pcbid, this); this.automaticCalibration.StartMessuring(); this.SetEnabled(ProgrammState.RecordRuning); @@ -729,28 +759,31 @@ this.MergeToAutoFile(); - 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.currentGenesis.StopRecordData(); - 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) - { - - } + const int TAKE_LINES = 50; - private void AddMessage(string message, Color color) + public void AddMessage(string message) { - + this.BeginInvoke(new Action(() => + { + this.automaticContentBox.AppendText($"{message}{Environment.NewLine}"); + + var skipLines = this.automaticContentBox.Lines.Length - TAKE_LINES; + + if (skipLines > 0) + { + this.automaticContentBox.Lines = this.automaticContentBox + .Lines + .Skip(skipLines) + .Take(TAKE_LINES) + .ToArray(); + } + })); } private void SaveMessurement(double currentT, double meterTOF, DateTime timestamp) @@ -785,5 +818,47 @@ // TODO: } } + + public void StartRecording() + => this.currentGenesis + ?.StartRecordData(); + + public Double AvgTOF() + { + if (this.currentGenesis is null) + { + this.automaticCalibration.StopMessuring(); + + return double.MinValue; + } + + return this.currentGenesis + .CurrentRecords + .Where(s => s.Channel == 2) + .Average(x => x.TotalTimeOfFlightS); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + => this.BtnDisconnect_Click(default(object), EventArgs.Empty); + + private void SaveSettingsBtn_Click(Object sender, EventArgs e) + { + if (short.TryParse($"{this.GMHPort.Text}", out short gmhPort)) + { + Appsettings.GMHPort = gmhPort; + } + + if (int.TryParse($"{this.messurementStepMS.Text}", out int msStep)) + { + Appsettings.MessurementStep = msStep; + } + + if (int.TryParse($"{this.messurementDauerMS.Text}", out int msDauer)) + { + Appsettings.MessurementDauer = msDauer; + } + + Appsettings.SaveSettings(); + } } } diff --git a/Common/Ui/GenesisToolBox/Infrastructure/Appsettings.cs b/Common/Ui/GenesisToolBox/Infrastructure/Appsettings.cs index 802f9898..beb66fe0 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/Appsettings.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/Appsettings.cs @@ -1,134 +1,82 @@ namespace Xylem.Common.Ui.GenesisToolBox.Infrastructure { using System; - using System.ComponentModel; using System.Configuration; + using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Forms; internal static class Appsettings { private const string EMPTY = ""; + private const string SETTINGS_SECTION = "appSettings"; + private static Configuration configuration + = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); + private static KeyValueConfigurationCollection settings + => configuration.AppSettings.Settings; - private static readonly Configuration configuration = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); - - private class DefaultValues + public static short GMHPort { - public const int WaitingTimeInMinutes = 2; - public const int MessuringTimeInMinutes = 2; + get => GetInt16(); + set => SetValue(value); } - public class AppsettingsModel : INotifyPropertyChanged + public static int MessurementStep { - public AppsettingsModel() + get => GetInt32(); + set => SetValue(value); + } + + public static int MessurementDauer + { + get => GetInt32(); + set => SetValue(value); + } + + private static short GetInt16([CallerMemberName] string property = EMPTY) + { + var value = settings[property]?.Value?.ToString() ?? string.Empty; + + if (short.TryParse(value, out short result)) { - this.WaitingTimeInMinutes = DefaultValues.WaitingTimeInMinutes.ToString(); - this.MessuringTimeInMinutes = DefaultValues.MessuringTimeInMinutes.ToString(); + return result; + } + + return default(short); + } + + private static int GetInt32([CallerMemberName] string property = EMPTY) + { + var value = settings[property]?.Value?.ToString() ?? string.Empty; + + if (int.TryParse(value, out int result)) + { + return result; + } + + return default(short); + } + + private static void SetValue(this T value, [CallerMemberName] string property = EMPTY) + { + var key = settings.AllKeys.FirstOrDefault(x => x.Equals(property, StringComparison.OrdinalIgnoreCase)); + + if (string.IsNullOrWhiteSpace(key)) + { + key = property; + + settings.Add(key, string.Empty); } - public string WaitingTimeInMinutes // { get; set; } - { - get => GetStringValue(DefaultValues.WaitingTimeInMinutes); - set => this.NotifyPropertyChanged(value, DefaultValues.WaitingTimeInMinutes); - } - - /// - /// The mark on whitch should be notified for temperature change. - /// By default +/-1°C. - /// - public string MessuringTimeInMinutes // { get; set; } - { - get => GetStringValue(DefaultValues.MessuringTimeInMinutes); - set => this.NotifyPropertyChanged(value, DefaultValues.MessuringTimeInMinutes); - } - - public event PropertyChangedEventHandler PropertyChanged; - - protected void NotifyPropertyChanged(object currentValue, T defaultValue, [CallerMemberName] string property = EMPTY) - { - try - { - currentValue = Convert.ChangeType(currentValue, typeof(T)); - } - catch - { - currentValue = defaultValue; - } - - currentValue.SetValue(defaultValue, property); - - this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); - } + settings[key].Value = value?.ToString() ?? EMPTY; } - public static AppsettingsModel Model { get; } = new AppsettingsModel(); - - /// - /// - /// - public static int WaitingTimeInMinutes => GetValue(DefaultValues.WaitingTimeInMinutes); - - /// - /// - /// - public static double MessuringTimeInMinutes => GetValue(DefaultValues.MessuringTimeInMinutes); - - public static void Refresh() + internal static void SaveSettings() { configuration.Save(ConfigurationSaveMode.Full); - ConfigurationManager.RefreshSection("appSettings"); - } + ConfigurationManager.RefreshSection(SETTINGS_SECTION); - private static int GetValue(int defaultValue, [CallerMemberName] string property = EMPTY) - { - var setting = configuration.AppSettings.Settings[property]?.Value; - - if (int.TryParse($"{setting}", out var value)) - { - return value; - } - - return defaultValue; - } - - private static double GetValue(double defaultValue, [CallerMemberName] string property = EMPTY) - { - var setting = configuration.AppSettings.Settings[property]?.Value; - - if (double.TryParse($"{setting}", out var value)) - { - return value; - } - - return defaultValue; - } - - private static string GetStringValue(object defaultValue, string format = EMPTY, [CallerMemberName] string property = EMPTY) - { - return configuration.AppSettings.Settings[property]?.Value ?? defaultValue?.ToString(); - } - - private static void SetValue(this object value, object @default, [CallerMemberName] string property = EMPTY) - { - if (value == null || value.Equals(default(T))) - { - value = @default; - } - - var saved = configuration.AppSettings.Settings[property]; - var currentValue = $"{value}"; - - if (saved is null) - { - configuration.AppSettings.Settings.Add(property, currentValue); - } - else - { - configuration.AppSettings.Settings[property].Value = currentValue; - } - - configuration.Save(ConfigurationSaveMode.Modified); - ConfigurationManager.RefreshSection("appSettings"); + configuration = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); } } } diff --git a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs index b4eb859b..85ecb02f 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs @@ -1,15 +1,27 @@ namespace Xylem.Common.Ui.GenesisToolBox.Infrastructure { using System; + using System.Collections.Generic; using System.Globalization; using System.IO; - using System.IO.Pipes; using System.Linq; + using System.Runtime.InteropServices; using System.Timers; - using static System.Globalization.NumberStyles; + using SystemThreadingThread = System.Threading.Thread; - public class CordonelTempLut + internal interface ITempMeterForm + { + void AddMessage(string message); + + double AvgTOF(); + + IAsyncResult BeginInvoke(Delegate @delegate); + + void StartRecording(); + } + + public class CordonelTempLut { public int Id { get; set; } @@ -31,162 +43,260 @@ public Double Max { get; set; } } - class TemperatureSource : IDisposable + public class TemperatureSource : IDisposable { - private readonly NamedPipeClientStream pipeStream; - private readonly StreamReader pipeReader; - private readonly CultureInfo de; - private readonly CultureInfo us; + [DllImport("GMH3x32E.dll")] + public static extern Int16 UniversalOpenCom(Int16 ini16COMPortNumber, UInt32 inui32BaudRate, Int16 inui16ConverterType, Int16 ini16Parity, Int16 ini16StoppBits); - public TemperatureSource() - { - try - { - this.pipeStream = new NamedPipeClientStream(".", "TempPipe", PipeDirection.In); - this.pipeStream.Connect(3000); - } - catch (Exception) - { - } + [DllImport("GMH3x32E.dll")] + public static extern Int16 GMH_CloseCom(); - if (this.pipeStream.IsConnected) - { - this.pipeReader = new StreamReader(this.pipeStream); - } - - this.de = new CultureInfo("de-DE"); - this.us = new CultureInfo("en-US"); - } + [DllImport("GMH3x32E.dll")] + unsafe public static extern Int16 GMH_Transmit(Int16 ini16DeviceAddress, Int16 ini16TransmitCode, Int16* refi16ptrPriority, double* refdblptrFloatValue, Int32* refi32ptrIntegerValue); + + public TemperatureSource() => UniversalOpenCom(Appsettings.GMHPort, 4800, 8, 0, 0); public double GetTemperature() { + var result = default(short); + var priority = default(short); var temperature = default(double); + var value = default(int); - try + unsafe { - lock (this.pipeReader) - { - var value = $"{this.pipeReader.ReadLine()}"; - - if (double.TryParse(value, Any, this.us, out temperature) || double.TryParse(value, Any, this.de, out temperature)) - { - - } - } - } - catch (Exception e) - { - Console.Error.WriteLine(e.Message); + result = GMH_Transmit(1, 0, &priority, &temperature, &value); } return temperature; } - public void Dispose() - { - this.pipeReader?.Dispose(); - this.pipeStream?.Dispose(); - } - - public void Flush() - { - this.pipeStream.Flush(); - this.pipeReader.BaseStream.Flush(); - } + public void Dispose() => GMH_CloseCom(); } partial class AutomaticTemperatureCalibration { + private const string WORKING_DIR = @".\temperature_calibrations"; + private const string MESSUREMENTS_FILE = @"_messurements.txt"; + private const string AGGREGATIONS_FILE = @"_aggregations.txt"; + private const NumberStyles ANY = NumberStyles.Any; + private readonly string pcbId; private readonly string messurementsFile; - private readonly Func sourceTOF; - private readonly TemperatureSource temperature; + private readonly string aggregationsFile; + private readonly ITempMeterForm tempMeterForm; + private readonly CultureInfo en; + private readonly CultureInfo de; + private TemperatureSource temperatureSource; private Timer longTimer; private Timer shortTimer; private bool messuring; - public AutomaticTemperatureCalibration(string pcbId, Func sourceTOF) + public AutomaticTemperatureCalibration(string pcbId, ITempMeterForm genesisMeter) { this.pcbId = pcbId; - this.sourceTOF = sourceTOF; - this.messurementsFile = this.GetNextFile(); - this.temperature = new TemperatureSource(); - this.shortTimer = new Timer(); - this.longTimer = new Timer(); + this.tempMeterForm = genesisMeter; + this.messurementsFile = this.GetOrCreateMessurementsFile(this.pcbId); + this.aggregationsFile = this.GetOrCreateAggregationsFile(this.pcbId); + this.temperatureSource = new TemperatureSource(); + this.en = new CultureInfo("en-US"); + this.de = new CultureInfo("de-DE"); } public void StartMessuring() { - this.shortTimer.Enabled = true; - this.shortTimer.AutoReset = true; - this.shortTimer.Interval = 1_000; + this.messuring = false; + this.temperatureSource = new TemperatureSource(); + + this.shortTimer = new Timer(Appsettings.MessurementStep) + { + Enabled = true, + AutoReset = true + }; this.shortTimer.Elapsed += this.ShortTimerElapsed; - - // this.shortTimer.Start(); - this.shortTimer.Stop(); - this.longTimer.Enabled = true; - this.longTimer.AutoReset = true; - this.longTimer.Interval = 300_000; + this.longTimer = new Timer(Appsettings.MessurementDauer) + { + Enabled = true, + AutoReset = true + }; this.longTimer.Elapsed += this.LongTimerElapsed; - + this.LongTimerElapsed(null, null); this.longTimer.Start(); + + File.AppendAllText(this.aggregationsFile, Environment.NewLine); } - private void LongTimerElapsed(Object sender, ElapsedEventArgs args) + public void StopMessuring() + { + this.shortTimer?.Stop(); + this.shortTimer?.Dispose(); + this.shortTimer = null; + + this.longTimer?.Stop(); + this.longTimer?.Dispose(); + this.longTimer = null; + + this.temperatureSource?.Dispose(); + this.temperatureSource = null; + } + + private void LongTimerElapsed(Object sender, ElapsedEventArgs _) { this.messuring = !this.messuring; + SystemThreadingThread.Sleep(1_000); + if (this.messuring) { - System.Threading.Thread.Sleep(1_000); - - this.shortTimer.Enabled = true; - this.shortTimer.AutoReset = true; - this.shortTimer.Interval = 1_000; + this.tempMeterForm.StartRecording(); this.shortTimer.Start(); } else { this.shortTimer.Stop(); - - System.Threading.Thread.Sleep(1_000); - File.AppendAllText(this.messurementsFile, Environment.NewLine); + this.ParseMessurements(); } } private void ShortTimerElapsed(Object sender, ElapsedEventArgs args) { - var currentTOF = this.sourceTOF(); - var currentT = this.temperature.GetTemperature(); + lock (this.shortTimer) + { + this.tempMeterForm.BeginInvoke(new Action(() => + { + var currentTOF = this.tempMeterForm.AvgTOF(); + var currentT = this.temperatureSource.GetTemperature(); + var messurement = $"[{args.SignalTime:yyyy-MM-dd hh:mm:ss}]\t{this.pcbId,9}\t{currentT,5:00.00}\t{currentTOF,14:0.000000000000}"; - File.AppendAllText( - path: this.messurementsFile, - contents: $"[{args.SignalTime:yyyy-MM-dd hh:mm:ss}]\t{this.pcbId,9}\t{currentT,5:00.00}\t{currentTOF,14:0.000000000000}{Environment.NewLine}"); + if (this.messuring) + { + this.tempMeterForm.AddMessage(messurement); + File.AppendAllLines(this.messurementsFile, new[] { messurement }); + } + })); + } } - public void StopMessuring() + private String GetOrCreateMessurementsFile(string pcbId) { - this.shortTimer.Stop(); - this.shortTimer.Dispose(); + Directory.CreateDirectory(WORKING_DIR); - this.longTimer.Stop(); - this.longTimer.Dispose(); + var filePath = $@"{WORKING_DIR}\{this.pcbId}{MESSUREMENTS_FILE}"; + + File.AppendAllText(filePath, Environment.NewLine); + + return filePath; } - private String GetNextFile() + private String GetOrCreateAggregationsFile(string pcbId) { - var filesCount = Directory - .CreateDirectory(@".\temperature_calibration") - .GetFiles("*_messurements.txt") - .Count(); - var nextFilePath = $@".\temperature_calibration\{filesCount + 1}_messurements.txt"; + Directory.CreateDirectory(WORKING_DIR); - File.WriteAllText(nextFilePath, string.Empty); + var filePath = $@"{WORKING_DIR}\{this.pcbId}{AGGREGATIONS_FILE}"; - return nextFilePath; + if (!File.Exists(filePath)) + { + File.WriteAllLines(filePath, new[] { Messurements.Header }); + } + + return filePath; + } + + private void ParseMessurements() + { + var messurementLines = File.ReadAllLines(this.messurementsFile); + var messurements = new Messurements(this.pcbId); + + File.WriteAllText(this.messurementsFile, string.Empty); + + foreach (var messurementLine in messurementLines) + { + if (string.IsNullOrWhiteSpace(messurementLine)) + { + continue; + } + + var tokens = messurementLine + .Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); + + if (tokens.Length != 4) + { + continue; + } + + var dateString = tokens[0]; + var pcbString = tokens[1]; + var tString = tokens[2]; + var tofString = tokens[3]; + + var currentT = default(double); + var currentTOF = default(double); + + try + { + var tParsed = double.TryParse(tString, ANY, this.en, out currentT) || double.TryParse(tString, ANY, this.de, out currentT); + var tofParsed = double.TryParse(tofString, ANY, this.en, out currentTOF) || double.TryParse(tofString, ANY, this.de, out currentTOF); + } + catch + { + continue; + } + + messurements.Add(currentT, currentTOF); + } + + File.AppendAllLines(this.aggregationsFile, new[] { messurements.ToString() }); } } + + class Messurements + { + private readonly string pcbId; + + // _______________________________ t _____ tof _________________ + private readonly ICollection> messurements + = new List>(); + + public Messurements(string pcbId) + => this.pcbId = pcbId; + + public double MinT => this.messurements.Min(x => x.Item1); + + public double MinTOF => this.messurements.Min(x => x.Item2); + + public double AvgT => this.messurements.Average(x => x.Item1); + + public double AvgTOF => this.messurements.Average(x => x.Item2); + + public double MaxT => this.messurements.Max(x => x.Item1); + + public double MaxTOF => this.messurements.Max(x => x.Item2); + + public double DifT => Math.Abs(this.MinT - this.MaxT); + + public double DifTOF => Math.Abs(this.MinTOF - this.MaxTOF); + + public int Count => this.messurements.Count; + + public override String ToString() + => $"{this.pcbId}" + + $"\t{this.MinT:0.00}" + + $"\t{this.MinTOF:0.0000000000}" + + $"\t{this.AvgT:0.00}" + + $"\t{this.AvgTOF:0.0000000000}" + + $"\t{this.MaxT:0.00}" + + $"\t{this.MaxTOF:0.0000000000}" + + $"\t{this.DifT:0.00}" + + $"\t{this.DifTOF:0.0000000000}" + + $"\t{this.Count}"; + + public void Add(double t, double tof) + => this.messurements.Add(new Tuple(t, tof)); + + public static string Header + => $"Pcb Id\tMin °C\tMin TOF\tAvg °C\tAvg TOF\tMax °C\tMax TOF\tDif °C\tDif TOF\tCount"; + } } \ No newline at end of file diff --git a/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs b/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs new file mode 100644 index 00000000..1605c1d0 --- /dev/null +++ b/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs @@ -0,0 +1,121 @@ +namespace LaaProductionWeb.API.Production +{ + using LaaProductionSQL.Interfaces; + + using System.Collections.Generic; + using System.Linq; + using System.Net; + using System.Web.Http; + + [Authorize] + [RoutePrefix("API/Production/TempMeter")] + public class TempMeterController : ApiController + { + private readonly ISQLConnection sqlConnection; + + public TempMeterController(ISQLConnection sqlConnection) + => this.sqlConnection = sqlConnection; + + [HttpGet] + [Route(nameof(All))] + public IHttpActionResult All() + { + var messurements = this.sqlConnection + .CreateCommand(@"SELECT [Id] + , [PcbId] + , [RefTempC] + , [AvgTof] + FROM [CordonelTempLuts] + WHERE [Active] = 1 + ORDER BY [PcbId], [RefTempC]") + .ExecuteReader(x => new Messurement + { + Id = x.GetInt(), + PcbId = x.GetInt(), + AvgT = x.GetValue(), + AvgTOF = x.GetValue() + }); + + return this.Json(messurements); + } + + [HttpGet] + [Route("{pcbId}")] + public IHttpActionResult Get(int pcbId) + { + var messurement = this.sqlConnection + .CreateCommand($@"SELECT [Id] + , [PcbId] + , [RefTempC] + , [AvgTof] + FROM [CordonelTempLuts] + WHERE [Active] = 1 + AND [PcbId] = @{nameof(pcbId)} + ORDER BY [PcbId], [RefTempC]") + .SetParameter(nameof(pcbId), pcbId) + .FirstOrDefault(x => new Messurement + { + Id = x.GetInt(), + PcbId = x.GetInt(), + AvgT = x.GetValue(), + AvgTOF = x.GetValue() + }); + + return this.Json(messurement); + } + + [HttpGet] + public IHttpActionResult Post([FromBody] Messurement[] messurements) + { + if (messurements?.Length <= 0) + { + return this.StatusCode(HttpStatusCode.NotModified); + } + + var pcbs = messurements + .Select(x => x.PcbId) + .Distinct(); + + if (pcbs.Count() > 1) + { + return this.StatusCode(HttpStatusCode.Conflict); + } + + var pcbId = pcbs.First(); + var recordsDeleted = this.sqlConnection + .CreateCommand($"DELETE FROM [CordonelTempLuts] WHERE [PcbId] = @{nameof(pcbId)}") + .SetParameter(nameof(pcbId), pcbId) + .ExecuteNonQuery(); + + var values = new List(); + var id = 1; + + foreach (var m in messurements.OrderBy(x => x.AvgT)) + { + values.Add($"('{pcbId}', '{id++}', '{m.AvgT:0.00}', '{m.AvgTOF:0.0000000000}')"); + } + + var recordsAdded = this.sqlConnection + .CreateCommand($@"INSERT INTO [CordonelTempLuts] + ( [PcbId] + , [Id] + , [RefTempC] + , [AvgTof]) + VALUES {string.Join(", ", values)}") + .ExecuteNonQuery(); + + return this.Ok(recordsAdded); + } + } + + public class Messurement + { + public int Id { get; set; } + + public int PcbId { get; set; } + + public double AvgT { get; set; } + + public double AvgTOF { get; set; } + } +} diff --git a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj index da01756a..7f46e95d 100644 --- a/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj +++ b/LaaProductionWeb/LaaProductionWeb/LaaProductionWeb.csproj @@ -179,6 +179,7 @@ +