diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs b/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs index 9334ab16..c111901d 100644 --- a/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs +++ b/Common/Ui/GenesisToolBox/FrmTempMeter.Designer.cs @@ -31,6 +31,7 @@ namespace Xylem.Common.Ui.GenesisToolBox private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.timer2 = new System.Windows.Forms.Timer(this.components); this.automaticCalibrationTabControl = new System.Windows.Forms.TabControl(); @@ -67,7 +68,17 @@ namespace Xylem.Common.Ui.GenesisToolBox this.label2 = new System.Windows.Forms.Label(); this.GMHPort = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); - this.tabPage4 = new System.Windows.Forms.TabPage(); + this.resultsTab = new System.Windows.Forms.TabPage(); + this.aggregationsGridView = new System.Windows.Forms.DataGridView(); + this.PcbId = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Avg_Nr = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Avg_T = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Avg_TOF = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Selected = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.resultsMenu = new System.Windows.Forms.MenuStrip(); + this.loadPcbToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.updateViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveSelectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.timer3 = new System.Windows.Forms.Timer(this.components); this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); this.automaticCalibrationTabControl.SuspendLayout(); @@ -77,6 +88,9 @@ namespace Xylem.Common.Ui.GenesisToolBox ((System.ComponentModel.ISupportInitialize)(this.nudRef)).BeginInit(); this.AutomaticCalibrationTab.SuspendLayout(); this.automaticControlsPanel.SuspendLayout(); + this.resultsTab.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.aggregationsGridView)).BeginInit(); + this.resultsMenu.SuspendLayout(); this.SuspendLayout(); // // timer1 @@ -94,7 +108,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.Controls.Add(this.resultsTab); 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); @@ -498,15 +512,115 @@ namespace Xylem.Common.Ui.GenesisToolBox this.label1.Text = "Messgerät (COM port)"; this.label1.TextAlign = System.Drawing.ContentAlignment.BottomLeft; // - // tabPage4 + // resultsTab // - 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; + this.resultsTab.Controls.Add(this.aggregationsGridView); + this.resultsTab.Controls.Add(this.resultsMenu); + this.resultsTab.Location = new System.Drawing.Point(4, 25); + this.resultsTab.Margin = new System.Windows.Forms.Padding(0); + this.resultsTab.Name = "resultsTab"; + this.resultsTab.Size = new System.Drawing.Size(1217, 647); + this.resultsTab.TabIndex = 4; + this.resultsTab.Text = "Results"; + this.resultsTab.UseVisualStyleBackColor = true; + // + // aggregationsGridView + // + this.aggregationsGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.aggregationsGridView.BackgroundColor = System.Drawing.Color.WhiteSmoke; + this.aggregationsGridView.BorderStyle = System.Windows.Forms.BorderStyle.None; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.aggregationsGridView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2; + this.aggregationsGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.aggregationsGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.PcbId, + this.Avg_Nr, + this.Avg_T, + this.Avg_TOF, + this.Selected}); + this.aggregationsGridView.Dock = System.Windows.Forms.DockStyle.Fill; + this.aggregationsGridView.Location = new System.Drawing.Point(0, 24); + this.aggregationsGridView.Margin = new System.Windows.Forms.Padding(0); + this.aggregationsGridView.Name = "aggregationsGridView"; + this.aggregationsGridView.Size = new System.Drawing.Size(1217, 623); + this.aggregationsGridView.TabIndex = 0; + // + // PcbId + // + this.PcbId.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.PcbId.HeaderText = "PcbId"; + this.PcbId.Name = "PcbId"; + this.PcbId.ReadOnly = true; + // + // Avg_Nr + // + this.Avg_Nr.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Avg_Nr.HeaderText = "Avg Nr"; + this.Avg_Nr.Name = "Avg_Nr"; + this.Avg_Nr.ReadOnly = true; + // + // Avg_T + // + this.Avg_T.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Avg_T.HeaderText = "Avg °C"; + this.Avg_T.Name = "Avg_T"; + this.Avg_T.ReadOnly = true; + // + // Avg_TOF + // + this.Avg_TOF.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Avg_TOF.HeaderText = "Avg TOF"; + this.Avg_TOF.Name = "Avg_TOF"; + this.Avg_TOF.ReadOnly = true; + // + // Selected + // + this.Selected.FalseValue = "false"; + this.Selected.HeaderText = "Selected"; + this.Selected.IndeterminateValue = "false"; + this.Selected.Name = "Selected"; + this.Selected.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.Selected.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.Selected.TrueValue = "true"; + // + // resultsMenu + // + this.resultsMenu.BackColor = System.Drawing.Color.WhiteSmoke; + this.resultsMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.loadPcbToolStripMenuItem, + this.updateViewToolStripMenuItem, + this.saveSelectedToolStripMenuItem}); + this.resultsMenu.Location = new System.Drawing.Point(0, 0); + this.resultsMenu.Name = "resultsMenu"; + this.resultsMenu.Size = new System.Drawing.Size(1217, 24); + this.resultsMenu.TabIndex = 1; + this.resultsMenu.Text = "menuStrip1"; + // + // loadPcbToolStripMenuItem + // + this.loadPcbToolStripMenuItem.Name = "loadPcbToolStripMenuItem"; + this.loadPcbToolStripMenuItem.Size = new System.Drawing.Size(68, 20); + this.loadPcbToolStripMenuItem.Text = "Load pcb"; + // + // updateViewToolStripMenuItem + // + this.updateViewToolStripMenuItem.Name = "updateViewToolStripMenuItem"; + this.updateViewToolStripMenuItem.Size = new System.Drawing.Size(84, 20); + this.updateViewToolStripMenuItem.Text = "Update view"; + this.updateViewToolStripMenuItem.Click += new System.EventHandler(this.UpdateViewToolStripMenuItem_Click); + // + // saveSelectedToolStripMenuItem + // + this.saveSelectedToolStripMenuItem.Name = "saveSelectedToolStripMenuItem"; + this.saveSelectedToolStripMenuItem.Size = new System.Drawing.Size(89, 20); + this.saveSelectedToolStripMenuItem.Text = "Save selected"; + this.saveSelectedToolStripMenuItem.Click += new System.EventHandler(this.SaveSelectedToolStripMenuItem_Click); // // timer3 // @@ -543,6 +657,11 @@ namespace Xylem.Common.Ui.GenesisToolBox this.AutomaticCalibrationTab.ResumeLayout(false); this.automaticControlsPanel.ResumeLayout(false); this.automaticControlsPanel.PerformLayout(); + this.resultsTab.ResumeLayout(false); + this.resultsTab.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.aggregationsGridView)).EndInit(); + this.resultsMenu.ResumeLayout(false); + this.resultsMenu.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -587,6 +706,16 @@ namespace Xylem.Common.Ui.GenesisToolBox private System.Windows.Forms.TextBox messurementDauerMS; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button saveSettingsBtn; - private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.TabPage resultsTab; + private System.Windows.Forms.DataGridView aggregationsGridView; + private System.Windows.Forms.MenuStrip resultsMenu; + private System.Windows.Forms.ToolStripMenuItem updateViewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveSelectedToolStripMenuItem; + private System.Windows.Forms.DataGridViewTextBoxColumn PcbId; + private System.Windows.Forms.DataGridViewTextBoxColumn Avg_Nr; + private System.Windows.Forms.DataGridViewTextBoxColumn Avg_T; + private System.Windows.Forms.DataGridViewTextBoxColumn Avg_TOF; + private System.Windows.Forms.DataGridViewCheckBoxColumn Selected; + private System.Windows.Forms.ToolStripMenuItem loadPcbToolStripMenuItem; } } \ No newline at end of file diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.cs b/Common/Ui/GenesisToolBox/FrmTempMeter.cs index 3e425c03..13f7f9de 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.Data; using System.Drawing; using System.IO; using System.IO.Pipes; @@ -39,6 +40,8 @@ private Boolean lutIsMissing; private List reftempRangeReq; private List cordonelTempLut; + private AutomaticTemperatureCalibration automaticCalibration; + private bool automatic = false; public FrmTempMeter() { @@ -554,6 +557,18 @@ private void InitializeContent() { + this.automaticCalibration = new AutomaticTemperatureCalibration(null, this); + + foreach (var pcbText in this.automaticCalibration.AvailablePcbs()) + { + var dropdownPcbId = new ToolStripMenuItem(pcbText); + dropdownPcbId.Click += DropdownPcbId_Click; + + this.loadPcbToolStripMenuItem.DropDownItems.Add(dropdownPcbId); + } + + this.aggregationsGridView.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke; + this.mainMenuStrip.Padding = new Padding(5); var menuFont = this.mainMenuStrip.Font; @@ -721,9 +736,6 @@ this.stopAutomaticBtn.Enabled = false; } - private bool automatic = false; - private AutomaticTemperatureCalibration automaticCalibration; - private void StartAutomaticBtn_Clicked(object sender, EventArgs args) { if (this.currentGenesis is null) @@ -741,7 +753,7 @@ this.automatic = true; this.start = DateTimeOffset.Now; - var pcbid = this.currentGenesis?.PcbId ?? "*********"; + var pcbid = this.currentGenesis?.PcbId; this.automaticCalibration = new AutomaticTemperatureCalibration(pcbid, this); this.automaticCalibration.StartMessuring(); @@ -786,18 +798,6 @@ })); } - private void SaveMessurement(double currentT, double meterTOF, DateTime timestamp) - { - // var pcbid = this.currentGenesis?.PcbId ?? "000000000"; - // var temperature = currentT.ToString().Substring(0, 2); - - // TODO: LocalWebRequest.PostRequestAsync( - // $"http://10.49.40.25/MeterProcessState/api/TempFlange/AddLut?PcbId={pcbid}&RefTempC={temperature}&AvgTof={meterTOF}&dt={timestamp}"); - // File.AppendAllLines("_temp_luts.txt", new[] { $"{pcbid}\t{temperature:F2}\t{meterTOF}\t{timestamp}" }); - - // File.AppendAllText($"./messuremensts/{pcbid}.txt", $"{pcbid}\t{currentT:F2}\t{meterTOF:F16}\t{timestamp}{Environment.NewLine}"); - } - protected override void OnClosed(EventArgs e) { base.OnClosed(e); @@ -860,5 +860,122 @@ Appsettings.SaveSettings(); } + + private Messurement[] aggregations; + private string selectedPcb; + + private void DropdownPcbId_Click(Object sender, EventArgs e) + { + if (this.automaticCalibration is null) + { + this.automaticCalibration = new AutomaticTemperatureCalibration(null, this); + } + + var pcb = string.Empty; + + if (sender is ToolStripMenuItem menuItem) + { + this.selectedPcb = menuItem.Text; + } + + this.LoadAggregations(this.selectedPcb); + } + + private void UpdateViewToolStripMenuItem_Click(Object sender, EventArgs e) + => this.LoadAggregations(this.selectedPcb); + + private void LoadAggregations(string pcb) + => this.BeginInvoke(new Action(() => + { + this.aggregations = this.automaticCalibration + .AggregationsFor(pcb) + .ToArray(); + + var rowsCount = this.aggregations.Length; + + this.aggregationsGridView.Rows.Clear(); + + if (rowsCount <= 0) + { + return; + } + + this.aggregationsGridView.Rows.Add(rowsCount); + + for (int i = 0; i < rowsCount; i++) + { + var aggregation = this.aggregations[i]; + var currentRow = this.aggregationsGridView.Rows[i]; + + currentRow.Cells[0].Value = aggregation.PcbId; + currentRow.Cells[1].Value = aggregation.Id; + currentRow.Cells[2].Value = aggregation.AvgT; + currentRow.Cells[3].Value = aggregation.AvgTOF; + currentRow.Cells[4].Value = aggregation.Selected; + currentRow.Cells[4].Tag = aggregation.PcbId; + currentRow.Cells[4].ValueType = typeof(bool); + + if (aggregation.Selected) + { + currentRow.DefaultCellStyle.BackColor = Color.WhiteSmoke; + } + } + + this.aggregationsGridView.CellContentClick += AggregationsGridView_CurrentCellChanged; + })); + + private void AggregationsGridView_CurrentCellChanged(Object sender, EventArgs e) + { + this.BeginInvoke(new Action(() => + { + this.aggregationsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); + + var rows = this.aggregationsGridView.Rows; + var rowsCount = this.aggregationsGridView.Rows.Count; + + for (int i = 0; i < rowsCount; i++) + { + var row = rows[i]; + var cell = row.Cells[4]; + + if (cell.Tag is null) + { + continue; + } + + row.DefaultCellStyle.BackColor = Color.White; + + if (bool.TryParse($"{cell.Value}", out bool value) && value) + { + row.DefaultCellStyle.BackColor = Color.WhiteSmoke; + } + } + })); + } + + private void SaveSelectedToolStripMenuItem_Click(Object sender, EventArgs e) + { + this.aggregationsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); + + var rows = this.aggregationsGridView.Rows; + var rowsCount = this.aggregationsGridView.Rows.Count; + + for (int i = 0; i < rowsCount; i++) + { + var cell = rows[i].Cells[4]; + + if (cell.Tag is null) + { + continue; + } + + if (bool.TryParse($"{cell.Value}", out bool value)) + { + this.aggregations[i].Selected = value; + } + } + + this.automaticCalibration?.UpdateAggregations(this.aggregations.Where(x => x.Selected)); + } } } diff --git a/Common/Ui/GenesisToolBox/FrmTempMeter.resx b/Common/Ui/GenesisToolBox/FrmTempMeter.resx index 5eae84c8..57c30f37 100644 --- a/Common/Ui/GenesisToolBox/FrmTempMeter.resx +++ b/Common/Ui/GenesisToolBox/FrmTempMeter.resx @@ -123,6 +123,27 @@ 104, 17 + + 413, 17 + + + True + + + True + + + True + + + True + + + True + + + 413, 17 + 191, 17 diff --git a/Common/Ui/GenesisToolBox/Infrastructure/Software.cs b/Common/Ui/GenesisToolBox/Infrastructure/Software.cs index 0d00e312..06e6ff7d 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/Software.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/Software.cs @@ -8,18 +8,19 @@ using CommonCore.Configuration; using Logic.SoftwareAccessHelper; + using System.Net.Http.Headers; /// /// Holds information over current software and logged in user. /// internal static class Software { - private static String bearer; + private static String Bearer; private static IEnumerable softwareFunctions = Array.Empty(); public static String UserName; - private static Boolean HasUser => !string.IsNullOrWhiteSpace(bearer); + private static Boolean HasUser => !string.IsNullOrWhiteSpace(Bearer); public static void Initialize() { @@ -51,7 +52,7 @@ url: $"{ServiceUrls.LaaProductionAPI}/LaaProductionWeb/API/Login/AD", json: model); - bearer = authenticationResponse.Content; + Bearer = authenticationResponse.Content; softwareFunctions = GetFunctions(); UserName = "Options"; @@ -83,7 +84,7 @@ BuildV = SoftwareVersion.Current.BuildV, }); - bearer = authenticationResponse.Content; + Bearer = authenticationResponse.Content; softwareFunctions = GetFunctions(); UserName = "Options"; @@ -95,7 +96,7 @@ .GetRequest( timeoutMs: 1200, url: $"{ServiceUrls.LaaProductionAPI}/LaaProductionWeb/API/Personalization/Login", - header: new Dictionary { { "Authorization", $"Bearer {bearer}" } }) + header: new Dictionary { { "Authorization", $"Bearer {Bearer}" } }) .Trim('"'); } catch (Exception ) @@ -114,7 +115,7 @@ public static IEnumerable GetFunctions() { - if (string.IsNullOrWhiteSpace(bearer)) + if (string.IsNullOrWhiteSpace(Bearer)) { return Array.Empty(); } @@ -124,7 +125,7 @@ var functionsResponse = LocalWebRequest.GetRequest( timeoutMs: 1200, url: $"{ServiceUrls.LaaProductionAPI}/LaaProductionWeb/API/Personalization/Software/Access", - header: new Dictionary { { "Authorization", $"Bearer {bearer}" } }); + header: new Dictionary { { "Authorization", $"Bearer {Bearer}" } }); return JsonConvert .DeserializeObject>(functionsResponse) @@ -145,10 +146,13 @@ public static void Logout() { UserName = "Options"; - bearer = default(String); + Bearer = default(String); softwareFunctions = Array.Empty(); Initialize(); } + + public static AuthenticationHeaderValue AuthorizationHeader + => new AuthenticationHeaderValue(nameof(Bearer), Bearer); } } diff --git a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs index 85ecb02f..55ef2121 100644 --- a/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs +++ b/Common/Ui/GenesisToolBox/Infrastructure/TempMeterModels.cs @@ -1,12 +1,18 @@ namespace Xylem.Common.Ui.GenesisToolBox.Infrastructure { + using Newtonsoft.Json; + using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; + using System.Net; + using System.Net.Http; + using System.Net.Http.Headers; using System.Runtime.InteropServices; using System.Timers; + using System.Windows; using SystemThreadingThread = System.Threading.Thread; @@ -97,8 +103,13 @@ { this.pcbId = pcbId; this.tempMeterForm = genesisMeter; - this.messurementsFile = this.GetOrCreateMessurementsFile(this.pcbId); - this.aggregationsFile = this.GetOrCreateAggregationsFile(this.pcbId); + + if (int.TryParse($"{this.pcbId}", out int pcb)) + { + 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"); @@ -239,6 +250,11 @@ { 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); + + if (!tParsed || !tofParsed) + { + continue; + } } catch { @@ -250,6 +266,249 @@ File.AppendAllLines(this.aggregationsFile, new[] { messurements.ToString() }); } + + internal IEnumerable AggregationsFor(string pcb) + { + var aggregations = new List(); + var aggregationsFile = $"{WORKING_DIR}\\{pcb}{AGGREGATIONS_FILE}"; + + var existingAggregations = this.GetAggregations(pcb); + var aggregationsLines = new List(); + + if (File.Exists(aggregationsFile)) + { + aggregationsLines = File + .ReadAllLines(aggregationsFile) + .Skip(1) + .ToList(); + } + + if (aggregationsLines.Count <= 0) + { + aggregations = existingAggregations.ToList(); + aggregations.ForEach(x => x.Selected = true); + } + + foreach (var line in aggregationsLines) + { + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + var tokens = line.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); + + if (tokens.Length != 10) + { + continue; + } + + var pcbString = tokens[0] ?? string.Empty; + var avgTString = tokens[3] ?? string.Empty; + var avgTOFString = tokens[4] ?? string.Empty; + + var pcbId = default(int); + var avgT = default(double); + var avgTOF = default(double); + + var pcbParsed = int.TryParse(pcbString, out pcbId); + var tParsed = double.TryParse(avgTString, ANY, this.en, out avgT) || double.TryParse(avgTString, ANY, this.de, out avgT); + var tofParsed = double.TryParse(avgTOFString, ANY, this.en, out avgTOF) || double.TryParse(avgTOFString, ANY, this.de, out avgTOF); + + if (!pcbParsed || !tParsed || !tofParsed) + { + continue; + } + + aggregations.Add(new Messurement + { + PcbId = pcbId, + AvgT = avgT, + AvgTOF = avgTOF, + Selected = existingAggregations.Any(x => x.AvgT == avgT) + }); + } + + return aggregations + .OrderBy(x => x.PcbId) + .ThenBy(x => x.AvgT) + .ThenBy(x => x.AvgTOF) + .Select((messurement, index) => + { + messurement.Id = index + 1; + + return messurement; + }) + .ToList(); + } + + internal IEnumerable GetAggregations(string pcb) + { + var aggregations = Array.Empty(); + + try + { + using (var httpClient = new HttpClient()) + { + using (var httpRequestMessage = new HttpRequestMessage()) + { + httpRequestMessage.Method = HttpMethod.Get; + httpRequestMessage.Headers.Authorization = Software.AuthorizationHeader; + httpRequestMessage.RequestUri = new Uri($"http://localhost:52822/LaaProductionWeb/API/Production/TempMeter/{pcb}"); + + using (var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result) + { + if (httpResponseMessage.StatusCode == HttpStatusCode.OK) + { + var content = httpResponseMessage + .Content + .ReadAsStringAsync() + .Result; + + aggregations = JsonConvert.DeserializeObject($"{content}"); + } + else + { + MessageBox.Show($"HTTP! {(int)httpResponseMessage.StatusCode} - {httpResponseMessage.ReasonPhrase}."); + } + } + } + } + } + catch (Exception e) + { + MessageBox.Show($"Failed! {e.Message}"); + } + + return aggregations; + } + + internal async void UpdateAggregations(IEnumerable messurements) + { + var message = "Succeeded!"; + + try + { + using (var httpClient = new HttpClient()) + { + using (var httpRequestMessage = new HttpRequestMessage()) + { + httpRequestMessage.Method = HttpMethod.Post; + httpRequestMessage.Headers.Authorization = Software.AuthorizationHeader; + httpRequestMessage.RequestUri = new Uri("http://localhost:52822/LaaProductionWeb/API/Production/TempMeter/Update"); + httpRequestMessage.Content = new StringContent(JsonConvert.SerializeObject(messurements)); + httpRequestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + + using (var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage)) + { + if (httpResponseMessage.StatusCode == HttpStatusCode.OK) + { + var added = await httpResponseMessage.Content.ReadAsStringAsync(); + + message = $"Succeeded! {added} records added."; + } + else if (httpResponseMessage.StatusCode == HttpStatusCode.NotModified) + { + message = $"Failed! No messurements to add."; + } + else if (httpResponseMessage.StatusCode == HttpStatusCode.Conflict) + { + message = $"Failed! More than 1 pcb's sent."; + } + else + { + message = $"HTTP! {(int)httpResponseMessage.StatusCode} - {httpResponseMessage.ReasonPhrase}."; + } + } + } + } + } + catch (Exception e) + { + message = $"Failed! {e.Message}"; + } + + MessageBox.Show(message); + } + + internal IEnumerable AvailablePcbs() + { + var existingPcbs = this.GetAllPcbs(); + var localPcbs = Directory + .CreateDirectory(WORKING_DIR) + .GetFiles("*_aggregations.txt") + .Select(x => x.Name + .Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries) + .FirstOrDefault()); + + return existingPcbs + .Union(localPcbs) + .OrderBy(x => x) + .ToHashSet(); + } + + private IEnumerable GetAllPcbs() + { + var pcbs = Array.Empty(); + + try + { + using (var httpClient = new HttpClient()) + { + using (var httpRequestMessage = new HttpRequestMessage()) + { + httpRequestMessage.Method = HttpMethod.Get; + httpRequestMessage.Headers.Authorization = Software.AuthorizationHeader; + httpRequestMessage.RequestUri = new Uri($"http://localhost:52822/LaaProductionWeb/API/Production/TempMeter/Pcbs"); + + using (var httpResponseMessage = httpClient.SendAsync(httpRequestMessage) + .ConfigureAwait(true) + .GetAwaiter() + .GetResult()) + { + if (httpResponseMessage.StatusCode == HttpStatusCode.OK) + { + var content = httpResponseMessage + .Content + .ReadAsStringAsync() + .ConfigureAwait(true) + .GetAwaiter() + .GetResult(); + + pcbs = JsonConvert + .DeserializeObject($"{content}") + ?.Select(x => x.ToString()) + ?.ToArray() + ?? pcbs; + } + else + { + MessageBox.Show($"HTTP! {(int)httpResponseMessage.StatusCode} - {httpResponseMessage.ReasonPhrase}."); + } + } + } + } + } + catch (Exception e) + { + MessageBox.Show($"Failed! {e.Message}"); + } + + return pcbs; + } + } + + class Messurement + { + public int PcbId { get; set; } + + public int Id { get; set; } + + public double AvgT { get; set; } + + public double AvgTOF { get; set; } + + public bool Selected { get; set; } } class Messurements diff --git a/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs b/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs index 1605c1d0..28d06ab2 100644 --- a/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs +++ b/LaaProductionWeb/LaaProductionWeb/API/Production/TempMeterController.cs @@ -1,20 +1,20 @@ namespace LaaProductionWeb.API.Production { + using LaaProductionDI; using LaaProductionSQL.Interfaces; + using LaaProductionWeb.App_Infrastructure; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web.Http; - [Authorize] - [RoutePrefix("API/Production/TempMeter")] + [AuthorizeBearer] + [RoutePrefix("api/production/tempmeter")] public class TempMeterController : ApiController { - private readonly ISQLConnection sqlConnection; - - public TempMeterController(ISQLConnection sqlConnection) - => this.sqlConnection = sqlConnection; + private readonly ISQLConnection sqlConnection + = LaaServiceProvider.GetService(); [HttpGet] [Route(nameof(All))] @@ -40,8 +40,21 @@ } [HttpGet] - [Route("{pcbId}")] - public IHttpActionResult Get(int pcbId) + [Route(nameof(Pcbs))] + public IHttpActionResult Pcbs() + { + var pcbs = this.sqlConnection + .CreateCommand(@"SELECT DISTINCT + [PcbId] + FROM [CordonelTempLuts] + ORDER BY [PcbId]") + .ExecuteReader(x => x.GetInt()); + + return this.Json(pcbs); + } + + [HttpGet] + public IHttpActionResult Get(string id) { var messurement = this.sqlConnection .CreateCommand($@"SELECT [Id] @@ -50,10 +63,10 @@ , [AvgTof] FROM [CordonelTempLuts] WHERE [Active] = 1 - AND [PcbId] = @{nameof(pcbId)} + AND [PcbId] = @{nameof(id)} ORDER BY [PcbId], [RefTempC]") - .SetParameter(nameof(pcbId), pcbId) - .FirstOrDefault(x => new Messurement + .SetParameter(nameof(id), id) + .ExecuteReader(x => new Messurement { Id = x.GetInt(), PcbId = x.GetInt(), @@ -64,8 +77,9 @@ return this.Json(messurement); } - [HttpGet] - public IHttpActionResult Post([FromBody] Messurement[] messurements) + [HttpPost] + [Route(nameof(Update))] + public IHttpActionResult Update([FromBody] Messurement[] messurements) { if (messurements?.Length <= 0) { @@ -88,20 +102,19 @@ .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}')"); + values.Add($"('{pcbId}', '{m.AvgT:0.00}', '{m.AvgTOF:0.0000000000}')"); } - + var recordsAdded = this.sqlConnection - .CreateCommand($@"INSERT INTO [CordonelTempLuts] - ( [PcbId] - , [Id] - , [RefTempC] - , [AvgTof]) - VALUES {string.Join(", ", values)}") + .CreateCommand($@" + INSERT INTO [CordonelTempLuts] + ( [PcbId] + , [RefTempC] + , [AvgTof]) + VALUES {string.Join(", ", values)}") .ExecuteNonQuery(); return this.Ok(recordsAdded); diff --git a/LaaProductionWeb/LaaProductionWeb/App_Start/WebApiConfig.cs b/LaaProductionWeb/LaaProductionWeb/App_Start/WebApiConfig.cs index cd55c1aa..d2edb706 100644 --- a/LaaProductionWeb/LaaProductionWeb/App_Start/WebApiConfig.cs +++ b/LaaProductionWeb/LaaProductionWeb/App_Start/WebApiConfig.cs @@ -8,6 +8,16 @@ { config.MapHttpAttributeRoutes(); + config.Routes.MapHttpRoute( + name: "ProductionAPI", + routeTemplate: "api/Production/{controller}/{id}", + defaults: new { id = RouteParameter.Optional }); + + config.Routes.MapHttpRoute( + name: "ProductionActionAPI", + routeTemplate: "api/Production/{controller}/{action}/{id}", + defaults: new { action = "Get", id = RouteParameter.Optional }); + config.Routes.MapHttpRoute( name: "PersonalizationAPI", routeTemplate: "api/Personalization/{controller}/{id}",