From 705f7760af3a07ceae5d63274d11fe2efe00a47c Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Mon, 7 Oct 2024 10:54:04 +0200 Subject: [PATCH] update by Michal requirements, manual setting dialog events changed, camera dialog both behaviour prepared, reload previous results copy image solved,rest API, rest API additional values added, added ShowTestCollectFormOp, added lang string --- TBF/Properties/AssemblyInfo.cs | 4 +- TBF/Resources/Strings.Designer.cs | 9 + TBF/Resources/Strings.cs.resx | 3 + TBF/Resources/Strings.de.resx | 3 + TBF/Resources/Strings.es.resx | 3 + TBF/Resources/Strings.fr.resx | 3 + TBF/Resources/Strings.it.resx | 3 + TBF/Resources/Strings.pl.resx | 3 + TBF/Resources/Strings.resx | 3 + TBF/Resources/Strings.ro.resx | 3 + TBF/Resources/Strings.ru.resx | 3 + TBF/Resources/Strings.sk.resx | 3 + TBF/Rig/DataEntry/Combined/EntryForm.cs | 1 + TBF/Rig/DataEntry/DEItem.cs | 1 + TBF/Rig/DataEntry/HeatMeters12/EntryForm.cs | 1 + TBF/Rig/DataEntry/HeatMeters6/EntryForm.cs | 1 + TBF/Rig/DataEntry/S620/EntryForm.cs | 1 + .../DataEntry/Single/EntryFormNoStartEnd.cs | 1 + .../Standard12/EntryFormNoStartEnd.cs | 1 + .../Standard24/EntryFormNoStartEnd.cs | 2 + .../Standard48/EntryFormNoStartEnd.cs | 1 + .../Standard6/EntryFormNoStartEnd.cs | 1 + TBF/Rig/DataEntry/StandardCamera/EntryForm.cs | 1 + .../CycleBeginningForm.cs | 125 ++++++++-- .../CycleBeginningForm.designer.cs | 4 + .../StandartCameraPurchaseOrder/EntryForm.cs | 77 +++++- .../TestStartEndForm.cs | 225 +++++++++++++++++- .../TestStartEndForm.designer.cs | 15 +- TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs | 1 + TBF/Rig/DataEntry/iPerl/EntryForm.cs | 1 + TBF/Rig/GenericDevices/IHasWMStatesForm.cs | 6 + TBF/Rig/GenericDevices/IRestAPIAdapter.cs | 7 + TBF/Rig/Network/RestAPI/ApiMessageOp.cs | 99 ++++++++ TBF/Rig/Network/RestAPI/Factory.cs | 23 ++ TBF/Rig/Network/RestAPI/RestAPIAdapter.cs | 35 +++ TBF/Rig/Network/RestAPI/RestAPIadapterCfg.cs | 44 ++++ TBF/Rig/Network/RestAPI/RestApiCfgCtrl.cs | 107 +++++++++ .../RestAPI/RestApiCfgCtrl.designer.cs | 122 ++++++++++ TBF/Rig/Network/RestAPI/RestApiCfgCtrl.resx | 123 ++++++++++ TBF/Rig/Network/RestAPI/facade/ApiDataLoad.cs | 198 +++++++++++++++ TBF/Rig/Network/RestAPI/facade/Batch.cs | 36 +++ TBF/Rig/Network/RestAPI/facade/TestResults.cs | 95 ++++++++ TBF/Rig/Network/RestAPI/facade/WaterMeter.cs | 38 +++ .../Network/RestAPI/facade/WaterMeterData.cs | 41 ++++ .../KPackE/DataEntryForRadio/EntryForm.cs | 1 + TBF/Rig/Sequences/MainSeq.cs | 41 +++- TBF/Rig/Sequences/MainSeqUtils.cs | 98 ++++++++ TBF/Rig/TbfComponents.cs | 24 +- .../StandingStartMassCollectionAdvanceSeq.cs | 29 ++- ...ingStartMassCollectionAdvanceCollectSeq.cs | 4 +- TBF/TBF.csproj | 23 ++ TBF/packages.config | 1 + 52 files changed, 1636 insertions(+), 62 deletions(-) create mode 100644 TBF/Rig/GenericDevices/IRestAPIAdapter.cs create mode 100644 TBF/Rig/Network/RestAPI/ApiMessageOp.cs create mode 100644 TBF/Rig/Network/RestAPI/Factory.cs create mode 100644 TBF/Rig/Network/RestAPI/RestAPIAdapter.cs create mode 100644 TBF/Rig/Network/RestAPI/RestAPIadapterCfg.cs create mode 100644 TBF/Rig/Network/RestAPI/RestApiCfgCtrl.cs create mode 100644 TBF/Rig/Network/RestAPI/RestApiCfgCtrl.designer.cs create mode 100644 TBF/Rig/Network/RestAPI/RestApiCfgCtrl.resx create mode 100644 TBF/Rig/Network/RestAPI/facade/ApiDataLoad.cs create mode 100644 TBF/Rig/Network/RestAPI/facade/Batch.cs create mode 100644 TBF/Rig/Network/RestAPI/facade/TestResults.cs create mode 100644 TBF/Rig/Network/RestAPI/facade/WaterMeter.cs create mode 100644 TBF/Rig/Network/RestAPI/facade/WaterMeterData.cs diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 11a8ac88c..44cc42bb6 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("3.9.2142.13")] -[assembly: AssemblyFileVersion("3.9.2142.13")] +[assembly: AssemblyVersion("3.9.2142.19")] +[assembly: AssemblyFileVersion("3.9.2142.19")] diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs index 0715fe51c..2fb34f8b2 100644 --- a/TBF/Resources/Strings.Designer.cs +++ b/TBF/Resources/Strings.Designer.cs @@ -4307,6 +4307,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Project number. + /// + internal static string Project_number { + get { + return ResourceManager.GetString("Project_number", resourceCulture); + } + } + /// /// Looks up a localized string similar to Prompt. /// diff --git a/TBF/Resources/Strings.cs.resx b/TBF/Resources/Strings.cs.resx index 08532570d..295ec3d55 100644 --- a/TBF/Resources/Strings.cs.resx +++ b/TBF/Resources/Strings.cs.resx @@ -1752,4 +1752,7 @@ Napětí + + Projtové číslo + \ No newline at end of file diff --git a/TBF/Resources/Strings.de.resx b/TBF/Resources/Strings.de.resx index 0b7dc0842..588038bb6 100644 --- a/TBF/Resources/Strings.de.resx +++ b/TBF/Resources/Strings.de.resx @@ -2217,4 +2217,7 @@ Spannung + + Projektnummer + \ No newline at end of file diff --git a/TBF/Resources/Strings.es.resx b/TBF/Resources/Strings.es.resx index 067be8ac8..c036312c9 100644 --- a/TBF/Resources/Strings.es.resx +++ b/TBF/Resources/Strings.es.resx @@ -120,4 +120,7 @@ Activity in Spanish + + Número de proyecto + \ No newline at end of file diff --git a/TBF/Resources/Strings.fr.resx b/TBF/Resources/Strings.fr.resx index 5c9376790..d4fa5769c 100644 --- a/TBF/Resources/Strings.fr.resx +++ b/TBF/Resources/Strings.fr.resx @@ -2016,4 +2016,7 @@ Tension + + Numéro de projet + \ No newline at end of file diff --git a/TBF/Resources/Strings.it.resx b/TBF/Resources/Strings.it.resx index 5f8df07f1..4fdac482d 100644 --- a/TBF/Resources/Strings.it.resx +++ b/TBF/Resources/Strings.it.resx @@ -1785,4 +1785,7 @@ Voltaggio + + Numero del progetto + \ No newline at end of file diff --git a/TBF/Resources/Strings.pl.resx b/TBF/Resources/Strings.pl.resx index 11f889945..5a351ca4b 100644 --- a/TBF/Resources/Strings.pl.resx +++ b/TBF/Resources/Strings.pl.resx @@ -1692,4 +1692,7 @@ Napięcie + + Numer projektu + \ No newline at end of file diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx index acd994b62..ecbc4fb1f 100644 --- a/TBF/Resources/Strings.resx +++ b/TBF/Resources/Strings.resx @@ -949,6 +949,9 @@ Purchase order + + Project number + Ambient humidity diff --git a/TBF/Resources/Strings.ro.resx b/TBF/Resources/Strings.ro.resx index 70267a5dd..69c5fd0ea 100644 --- a/TBF/Resources/Strings.ro.resx +++ b/TBF/Resources/Strings.ro.resx @@ -837,4 +837,7 @@ Voltage + + Numărul proiectului + \ No newline at end of file diff --git a/TBF/Resources/Strings.ru.resx b/TBF/Resources/Strings.ru.resx index 005d5a1fc..c823348c7 100644 --- a/TBF/Resources/Strings.ru.resx +++ b/TBF/Resources/Strings.ru.resx @@ -1605,4 +1605,7 @@ Voltage + + Номер проекта + \ No newline at end of file diff --git a/TBF/Resources/Strings.sk.resx b/TBF/Resources/Strings.sk.resx index 4fc61a8a2..257d50212 100644 --- a/TBF/Resources/Strings.sk.resx +++ b/TBF/Resources/Strings.sk.resx @@ -241,4 +241,7 @@ Cesty + + Číslo projektu + \ No newline at end of file diff --git a/TBF/Rig/DataEntry/Combined/EntryForm.cs b/TBF/Rig/DataEntry/Combined/EntryForm.cs index 7f3860fd5..eb4a64af8 100644 --- a/TBF/Rig/DataEntry/Combined/EntryForm.cs +++ b/TBF/Rig/DataEntry/Combined/EntryForm.cs @@ -109,6 +109,7 @@ namespace TBF.Rig.DataEntry.Combined /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/DEItem.cs b/TBF/Rig/DataEntry/DEItem.cs index a338c9130..a07e26c37 100644 --- a/TBF/Rig/DataEntry/DEItem.cs +++ b/TBF/Rig/DataEntry/DEItem.cs @@ -66,6 +66,7 @@ namespace TBF.Rig.DataEntry Start, End, Both, + Collect, } /// diff --git a/TBF/Rig/DataEntry/HeatMeters12/EntryForm.cs b/TBF/Rig/DataEntry/HeatMeters12/EntryForm.cs index 52830370c..572280835 100644 --- a/TBF/Rig/DataEntry/HeatMeters12/EntryForm.cs +++ b/TBF/Rig/DataEntry/HeatMeters12/EntryForm.cs @@ -124,6 +124,7 @@ namespace TBF.Rig.DataEntry.HeatMeters12 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/HeatMeters6/EntryForm.cs b/TBF/Rig/DataEntry/HeatMeters6/EntryForm.cs index 13d9a6d62..97965e1f4 100644 --- a/TBF/Rig/DataEntry/HeatMeters6/EntryForm.cs +++ b/TBF/Rig/DataEntry/HeatMeters6/EntryForm.cs @@ -123,6 +123,7 @@ namespace TBF.Rig.DataEntry.HeatMeters6 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/S620/EntryForm.cs b/TBF/Rig/DataEntry/S620/EntryForm.cs index 7fd06bf80..d3d562f4d 100644 --- a/TBF/Rig/DataEntry/S620/EntryForm.cs +++ b/TBF/Rig/DataEntry/S620/EntryForm.cs @@ -117,6 +117,7 @@ namespace TBF.Rig.DataEntry.S620 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/Single/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Single/EntryFormNoStartEnd.cs index b4ea70111..7aba67818 100644 --- a/TBF/Rig/DataEntry/Single/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Single/EntryFormNoStartEnd.cs @@ -109,6 +109,7 @@ namespace TBF.Rig.DataEntry.Single /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/Standard12/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Standard12/EntryFormNoStartEnd.cs index 9bb357c07..fa208c85a 100644 --- a/TBF/Rig/DataEntry/Standard12/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Standard12/EntryFormNoStartEnd.cs @@ -109,6 +109,7 @@ namespace TBF.Rig.DataEntry.Standard12 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/Standard24/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Standard24/EntryFormNoStartEnd.cs index d351d98c6..d7a0d5572 100644 --- a/TBF/Rig/DataEntry/Standard24/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Standard24/EntryFormNoStartEnd.cs @@ -122,6 +122,8 @@ namespace TBF.Rig.DataEntry.Standard24 this.waterMeters = waterMeters; return this; } + + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/Standard48/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Standard48/EntryFormNoStartEnd.cs index 5b57d3949..1a784a1d6 100644 --- a/TBF/Rig/DataEntry/Standard48/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Standard48/EntryFormNoStartEnd.cs @@ -109,6 +109,7 @@ namespace TBF.Rig.DataEntry.Standard48 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/Standard6/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Standard6/EntryFormNoStartEnd.cs index a05b7c7b1..642c64b9a 100644 --- a/TBF/Rig/DataEntry/Standard6/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Standard6/EntryFormNoStartEnd.cs @@ -105,6 +105,7 @@ namespace TBF.Rig.DataEntry.Standard6 /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/StandardCamera/EntryForm.cs b/TBF/Rig/DataEntry/StandardCamera/EntryForm.cs index 56f82b663..4a714b4ff 100644 --- a/TBF/Rig/DataEntry/StandardCamera/EntryForm.cs +++ b/TBF/Rig/DataEntry/StandardCamera/EntryForm.cs @@ -186,6 +186,7 @@ namespace TBF.Rig.DataEntry.StandardCamera /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.cs index b269c63b9..fe93ee1c8 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.cs @@ -108,8 +108,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder }; enabledComboBoxesN = new List(); - - + completed = false; StartForceCloseHandler(); } @@ -169,6 +168,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void CycleBeginningForm_Load(object sender, EventArgs e) { Localize(); + CreateTooltipToInfoAboutLock(); if (orderGroupBox.Visible) { @@ -191,6 +191,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder enabledComboBoxes.Add(comboBoxes[i]); enabledComboBoxesN.Add(comboNumbers[i]); } + foreach (ComboBox cbxN in enabledComboBoxesN) { cbxN.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboBoxNX_KeyPress); @@ -214,7 +215,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder void Localize() { Text = Strings.Data; - orderGroupBox.Text = Strings.Purchase_order; + orderGroupBox.Text = Strings.Project_number; for (int i = 0; i < textBoxesCount; i++) { labels[i].Text = Strings.Serial_number + " " + (i + 1).ToString(); @@ -290,6 +291,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } lastComboBoxSerialNo = 0; + EnableOrderCheckBox(true); } @@ -1349,6 +1351,22 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void buttonChooseBox_Click(object sender, EventArgs e) { Choose(); + EnableOrderCheckBox(false); + } + + private void EnableOrderCheckBox(bool enable) + { + if (orderComboBox.Text != null && !orderComboBox.Text.IsEmpty()) + { + orderComboBox.Enabled = enable; + //set Tooltip on + toolTip.Active = !enable; + } + else if (orderComboBox.Text != null && orderComboBox.Text.IsEmpty()) + { + orderComboBox.Enabled = true; + toolTip.Active = false; + } } @@ -1522,9 +1540,10 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder //enable behaviour type bool addOnEndOnly = false; - int countOfFreeBoxes = addOnEndOnly ? (enabledComboBoxes.Count - (LastOccupiedBox()+1)) : CountFreeBoxes(); + int countOfFreeBoxes = + addOnEndOnly ? (enabledComboBoxes.Count - (LastOccupiedBox() + 1)) : CountFreeBoxes(); - if (countOfFreeBoxes /// Process all KeyPress included in list of enabledComboBoxesN /// @@ -2356,16 +2375,17 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder e.Handled = true; // Mark the event as handled (optional) //Jump focus on Box purchaseBoxComboBox.Focus(); - }else if (e.KeyChar == '-') + } + else if (e.KeyChar == '-') { e.Handled = true; // Mark the event as handled (optional) //Do nothing - highest element } } - + private void ProcessKeyPressBox(object sender, KeyPressEventArgs e) { - if (e.KeyChar == '+' ) + if (e.KeyChar == '+') { e.Handled = true; // Mark the event as handled (optional) //Jump focus on Firs comboBoxN1 / buttonChooseBox if is visible @@ -2377,30 +2397,31 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder { comboBoxN1.Focus(); } - - }else if (e.KeyChar == '-') + } + else if (e.KeyChar == '-') { e.Handled = true; // Mark the event as handled (optional) //Jump focus on Firs comboBoxN1 orderComboBox.Focus(); } } - + private void ProcessKeyPressButton(object sender, KeyPressEventArgs e) { - if (e.KeyChar == '+' ) + if (e.KeyChar == '+') { e.Handled = true; // Mark the event as handled (optional) //Jump focus on Firs comboBoxN1 comboBoxN1.Focus(); - }else if (e.KeyChar == '-') + } + else if (e.KeyChar == '-') { e.Handled = true; // Mark the event as handled (optional) //Jump focus on Firs comboBoxN1 purchaseBoxComboBox.Focus(); } } - + private void orderComboBox_KeyPress(object sender, KeyPressEventArgs e) { ProcessKeyPressOrder(sender, e); @@ -2416,6 +2437,64 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder ProcessKeyPressButton(sender, e); } - + // Create a ToolTip object (this can also be done via the designer) + private ToolTip toolTip = new ToolTip(); + + private void CreateTooltipToInfoAboutLock() + { + // Set the ToolTip for the disabled CheckBox + toolTip.SetToolTip(orderComboBox, " If is Locked by Order items! To unlock use button Clear, please!"); + + toolTip.AutoPopDelay = 5000; // The time (in milliseconds) the tooltip stays visible + toolTip.InitialDelay = 500; // The time (in milliseconds) before the tooltip appears + toolTip.ReshowDelay = 500; // The time (in milliseconds) before subsequent tooltips appear + toolTip.ShowAlways = true; // Ensures the tooltip shows even when the control is disabled + toolTip.Active = true; + } + + private void orderComboBox_Click(object sender, EventArgs e) + { + if (orderComboBox.Enabled == false && orderGroupBox.Enabled == true) + { + MessageBox.Show(this, + "To unlock use button Clear, please!", + "Locked by Order items!", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void orderComboBox_MouseMove(object sender, MouseEventArgs e) + { + /*ComboBox comboBox = sender as ComboBox; + if (comboBox != null && comboBox.Enabled == false) + { + toolTip.Show("To unlock use button Clear, please!", comboBox, 0, comboBox.Height); + }*/ + } + + private void orderComboBox_MouseLeave(object sender, EventArgs e) + { + /* ComboBox comboBox = sender as ComboBox; + if (comboBox != null && comboBox.Enabled == false) + { + toolTip.Hide(comboBox); + }*/ + } + + private void orderGroupBox_MouseHover(object sender, EventArgs e) + { + /* // Get the mouse position in screen coordinates + Point mousePositionInScreen = Cursor.Position; + // Check if the mouse is over the disabled ComboBox + if (mousePositionInScreen != null && orderComboBox.Enabled == false && + orderComboBox.Bounds.Contains(mousePositionInScreen)) + { + toolTip.Show("To unlock use button Clear, please!", orderComboBox, 0, orderComboBox.Height); + //toolTip.Hide(comboBox); + } + else if (orderComboBox.Enabled == false) + { + toolTip.Hide(orderComboBox); + }*/ + } } } \ No newline at end of file diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.designer.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.designer.cs index 66686d173..4849bf31c 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.designer.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/CycleBeginningForm.designer.cs @@ -250,6 +250,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder this.orderGroupBox.ForeColor = System.Drawing.Color.Black; this.orderGroupBox.Name = "orderGroupBox"; this.orderGroupBox.TabStop = false; + this.orderGroupBox.MouseHover += new System.EventHandler(this.orderGroupBox_MouseHover); // // buttonChooseBox // @@ -273,7 +274,10 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder resources.ApplyResources(this.orderComboBox, "orderComboBox"); this.orderComboBox.Name = "orderComboBox"; this.orderComboBox.SelectedIndexChanged += new System.EventHandler(this.orderComboBox_SelectedIndexChanged); + this.orderComboBox.Click += new System.EventHandler(this.orderComboBox_Click); this.orderComboBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.orderComboBox_KeyPress); + this.orderComboBox.MouseLeave += new System.EventHandler(this.orderComboBox_MouseLeave); + this.orderComboBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.orderComboBox_MouseMove); // // clearButton // diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/EntryForm.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/EntryForm.cs index 830e64f38..d91447a33 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/EntryForm.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/EntryForm.cs @@ -113,14 +113,20 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder public string TestStartImgName(int wmNr0, string testName) { - if (waterMeters == null || wmNr0 < 0 || wmNr0 >= waterMeters.Count) return string.Empty; + if (waterMeters == null || wmNr0 < 0 || wmNr0 >= waterMeters.Count) + { + return string.Format("{0}-start.bmp", testName).Replace(' ','_'); + } return string.Format("{0}-start.bmp", testName).Replace(' ','_'); } public string TestEndImgName(int wmNr0, string testName) { - if (waterMeters == null || wmNr0 < 0 || wmNr0 >= waterMeters.Count) return string.Empty; + if (waterMeters == null || wmNr0 < 0 || wmNr0 >= waterMeters.Count) + { + return string.Format("{0}-end.bmp", testName).Replace(' ','_'); + } return string.Format("{0}-end.bmp", testName).Replace(' ','_'); } @@ -133,6 +139,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder TestStartStates, TestEndStates, DeferredTestEval, + TestBothStates, } CurrentOp currentOp; @@ -187,6 +194,25 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + /// + /// this will be used for collect data on the end = no working as START/END but as both + /// + /// + /// + /// + /// + /// + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, + double errLimHi) + { + currentOp = CurrentOp.TestBothStates; + this.regReaders = regReaders; + this.refVolume = refVolume; + this.errLimLo = errLimLo; + this.errLimHi = errLimHi; + return this; + } + /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) { @@ -245,6 +271,17 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder refVolume, errLimLo, errLimHi); modelessDlg.Show(); } + + void OpenTestBothStatesDlg(EntryForm myRef) + { + log.Debug("-- OpenTestBothStatesDlg --"); + string ocrMessage; + var ocr = GetOcr(myRef.OcrWorkspace, out ocrMessage); + myRef.modelessDlg = new TestStartEndForm(TBF.Data.WMsCount, myRef.regReaders, ocr, ocrMessage, myRef.OcrStream, + startImages, wmStartState, wmStartStateStr, endImages, disabled, + refVolume, errLimLo, errLimHi, true); + modelessDlg.Show(); + } /// void OpenDeferredTestEvalDlg(EntryForm myRef) { @@ -323,17 +360,21 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } break; - case CurrentOp.TestStartStates: - Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); - break; + case CurrentOp.TestStartStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); + break; - case CurrentOp.TestEndStates: - Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); - break; + case CurrentOp.TestEndStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); + break; - case CurrentOp.DeferredTestEval: - Program.MainWnd.Invoke(new EntryFormDlgt(OpenDeferredTestEvalDlg), this); - break; + case CurrentOp.TestBothStates: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestBothStatesDlg), this); + break; + + case CurrentOp.DeferredTestEval: + Program.MainWnd.Invoke(new EntryFormDlgt(OpenDeferredTestEvalDlg), this); + break; } } @@ -409,6 +450,20 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder wmEndState[i] = dlg.WMEndState[i]; } } + } + else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.TestBothStates) + { + /// Fixed start/stop: test end + TestStartEndForm dlg = (modelessDlg as TestStartEndForm); + if (dlg != null) + { + for (int i = 0; i < dlg.WaterMetersCount; i++) + { + wmStartState[i] = dlg.WMStartState[i]; + wmStartStateStr[i] = dlg.WMStartStateStr[i]; + wmEndState[i] = dlg.WMEndState[i]; + } + } } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.DeferredTestEval) { diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs index c4de19515..e1edd16a4 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs @@ -222,6 +222,30 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder ConstructorCommon(regReaders); } + + /// + /// Constructor to fill in end states + /// + /// Number of water meters + /// Array with register reader components + /// Cognex wrapper object performing OCR or null + /// Array with paths to end images + /// Array with start states in default volume units (liters) + /// Information entered on test start + /// Information from CycleBeginningForm about availability of water meters + /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary + /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary + public TestStartEndForm(int waterMetersCount, IRegReader[] regReaders, OcrVidi ocrVidi, string ocrMessage, string streamName, + string[] startImages, double[] wmStartState, string[] wmStartStateStr, string[] endImages, + bool[] disabled, double refVolume, double errLimLo, double errLimHi, Boolean both) + : this(waterMetersCount, regReaders, ocrVidi, ocrMessage, + streamName, + startImages, endImages, disabled, + refVolume, errLimLo, errLimHi) + { + mode = both? Tst.Both : Tst.Collect; + } /// /// Constructor for deferred evaluation, to fill in both start- and end-states @@ -338,6 +362,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder switch (mode) { case Tst.Start: + checkBoxEnableStartBox.Visible = false; if ((disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) || (regReaders != null && wmPos <= regReaders.Length && regReaders[wmPos - 1] == null)) { @@ -346,11 +371,15 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder else { startTextBoxes[i].Enabled = true; + + StartTextBox_EnableHanders(i); + enabledTextBoxes.Add(startTextBoxes[i]); } break; case Tst.End: + checkBoxEnableStartBox.Visible = true; if ((disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) || (regReaders != null && wmPos <= regReaders.Length && regReaders[wmPos - 1] == null)) { @@ -359,15 +388,23 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } else { - startTextBoxes[i].Enabled = true; + startTextBoxes[i].Enabled = false; startTextBoxes[i].Text = WMStartStateStr[wmPos - 1]; + StartTextBox_EnableHanders(i); endTextBoxes[i].Enabled = true; enabledTextBoxes.Add(startTextBoxes[i]); enabledTextBoxes.Add(endTextBoxes[i]); + EndTextBox_EnableHanders(i); + UpdateStartTextBoxesByChecker(checkBoxEnableStartBox.Checked); } break; + case Tst.Collect: + checkBoxEnableStartBox.Visible = false; + // Fall-through to the next case by explicitly calling Tst.Both logic + goto case Tst.Both; case Tst.Both: + checkBoxEnableStartBox.Visible = false; if ((disabled != null && wmPos <= disabled.Length && disabled[wmPos - 1]) || (regReaders != null && wmPos <= regReaders.Length && regReaders[wmPos - 1] == null)) { @@ -380,9 +417,12 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder endTextBoxes[i].Enabled = true; enabledTextBoxes.Add(startTextBoxes[i]); enabledTextBoxes.Add(endTextBoxes[i]); + StartTextBox_EnableHanders(i); + EndTextBox_EnableHanders(i); } break; } + } } @@ -414,7 +454,27 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } } - private void TestStartEndForm_FormClosed(object sender, FormClosedEventArgs e) + /// + /// Enables the event handlers for the StartTextBox control. + /// + /// The index of the StartTextBox control. + private void StartTextBox_EnableHanders(int i) + { + startTextBoxes[i].AcceptsTabChanged += new System.EventHandler(this.startTextBoxX_AcceptsTabChanged); + startTextBoxes[i].TextChanged += new System.EventHandler(this.startTextBoxX_TextChanged); + startTextBoxes[i].KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBoxX_KeyPress); + startTextBoxes[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBoxX_MouseDown); + } + + private void EndTextBox_EnableHanders(int i) + { + endTextBoxes[i].AcceptsTabChanged += new System.EventHandler(this.endTextBoxX_AcceptsTabChanged); + endTextBoxes[i].TextChanged += new System.EventHandler(this.endTextBoxX_TextChanged); + endTextBoxes[i].KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBoxX_KeyPress); + endTextBoxes[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBoxX_AcceptsTabChanged); + } + + private void TestStartEndForm_FormClosed(object sender, FormClosedEventArgs e) { if (imageProcessingThread != null && imageProcessingThread.IsAlive) { @@ -635,6 +695,24 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder /// Make an exclamation mark visible if out of range. /// Similar event handler is implemented for all endTextBoxes (1..24). /// + + private void startTextBoxX_TextChanged(object sender, EventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + var physPos = PhysPos(clickedTextBox, startTextBoxes); + + if (physPos < 0) + { + return; + } + + UpdateExclamation(physPos); + } + } + private void startTextBox1_TextChanged(object sender, EventArgs e) { UpdateExclamation(0); } private void startTextBox2_TextChanged(object sender, EventArgs e) { UpdateExclamation(1); } private void startTextBox3_TextChanged(object sender, EventArgs e) { UpdateExclamation(2); } @@ -660,6 +738,23 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void startTextBox23_TextChanged(object sender, EventArgs e) { UpdateExclamation(22); } private void startTextBox24_TextChanged(object sender, EventArgs e) { UpdateExclamation(23); } + private void endTextBoxX_TextChanged(object sender, EventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + var physPos = PhysPos(clickedTextBox, startTextBoxes); + + if (physPos < 0) + { + return; + } + + UpdateExclamation(physPos); + } + } + private void endTextBox1_TextChanged(object sender, EventArgs e) { UpdateExclamation(0); } private void endTextBox2_TextChanged(object sender, EventArgs e) { UpdateExclamation(1); } private void endTextBox3_TextChanged(object sender, EventArgs e) { UpdateExclamation(2); } @@ -687,7 +782,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder /// void UpdateExclamation(int uiCtrlPos) /// uiCtrlPos = 0 .. TextBoxesCount-1 { - exclamations[uiCtrlPos].Visible = false; + //exclamations[uiCtrlPos].Visible = false; /*if ((mode == Tst.End) || (mode == Tst.Both)) { @@ -718,6 +813,16 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } + private void startTextBoxX_KeyPress(object sender, KeyPressEventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + ProcKeyPress(sender, e, clickedTextBox); + } + } + private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } @@ -743,6 +848,16 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void startTextBox23_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox23); } private void startTextBox24_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox24); } + + private void endTextBoxX_KeyPress(object sender, KeyPressEventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + ProcKeyPress(sender, e, clickedTextBox); + } + } private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } @@ -791,7 +906,13 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder if (enabledTextBoxes[i] == currentFocusOwner) { /// Change focus to the next enabled text box - var currentTextBox = enabledTextBoxes[(i + 1) % enabledTextBoxes.Count]; + int nextItem = i + 1; + var currentTextBox = enabledTextBoxes[(nextItem) % enabledTextBoxes.Count]; + if (currentTextBox.Enabled == false) // Try get next - new behaviour - disable start boxes + { + + currentTextBox = enabledTextBoxes[(nextItem + 1) % enabledTextBoxes.Count]; + } currentTextBox.Focus(); /// Load the respective image @@ -821,6 +942,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder } + private void startTextBox1_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 0); } private void startTextBox2_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 1); } private void startTextBox3_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 2); } @@ -845,6 +967,57 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void startTextBox22_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 21); } private void startTextBox23_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 22); } private void startTextBox24_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.Start, 23); } + + private void startTextBoxX_AcceptsTabChanged(object sender, EventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + var physPos = PhysPos(clickedTextBox, startTextBoxes); + + if (physPos < 0) + { + return; + } + + LoadImage(sender, Tst.Start, physPos); + } + } + + private void startTextBoxX_MouseDown(object sender, MouseEventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + var physPos = PhysPos(clickedTextBox, startTextBoxes); + + if (physPos < 0) + { + return; + } + + LoadImage(sender, Tst.Start, physPos); + } + } + + private int PhysPos(TextBox clickedTextBox, TextBox[] textBoxes) + { + int physPos = -1; + for (int i =0; i< textBoxes.Length; i++) + { + + if (textBoxes[i].Equals(clickedTextBox)) + { + physPos = i; + } + } + + return physPos; + } + + private void startTextBox1_MouseDown(object sender, MouseEventArgs e) { LoadImage(sender, Tst.Start, 0); } private void startTextBox2_MouseDown(object sender, MouseEventArgs e) { LoadImage(sender, Tst.Start, 1); } private void startTextBox3_MouseDown(object sender, MouseEventArgs e) { LoadImage(sender, Tst.Start, 2); } @@ -870,6 +1043,23 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder private void startTextBox23_MouseDown(object sender, MouseEventArgs e) { LoadImage(sender, Tst.Start, 22); } private void startTextBox24_MouseDown(object sender, MouseEventArgs e) { LoadImage(sender, Tst.Start, 23); } + + private void endTextBoxX_AcceptsTabChanged(object sender, EventArgs e) + { + // Cast the sender object to TextBox + TextBox clickedTextBox = sender as TextBox; + if (clickedTextBox != null) + { + var physPos = PhysPos(clickedTextBox, startTextBoxes); + + if (physPos < 0) + { + return; + } + + LoadImage(sender, Tst.End, physPos); + } + } private void endTextBox1_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.End, 0); } private void endTextBox2_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.End, 1); } private void endTextBox3_AcceptsTabChanged(object sender, EventArgs e) { LoadImage(sender, Tst.End, 2); } @@ -1108,6 +1298,33 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder pictureBox1.Image = tempBmp; } + + private void checkBoxEnableStartBox_CheckStateChanged(object sender, EventArgs e) + { + CheckBox checkBox = sender as CheckBox; + bool EnableStartBox = false; + if (checkBox != null) + { + if (checkBox.Visible == false) + { + return; + } + + EnableStartBox = checkBox.Checked; + UpdateStartTextBoxesByChecker(EnableStartBox); + } + } + + private void UpdateStartTextBoxesByChecker(bool EnableStartBox) + { + foreach(TextBox startTextBox in startTextBoxes) + { + if (startTextBox.Visible && enabledTextBoxes.Contains(startTextBox)) + { + startTextBox.Enabled = EnableStartBox; + } + } + } } } diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.designer.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.designer.cs index 3dca08f43..5c8c28ae7 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.designer.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.designer.cs @@ -232,6 +232,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder this.startTextBox25 = new System.Windows.Forms.TextBox(); this.endTextBox25 = new System.Windows.Forms.TextBox(); this.label25 = new System.Windows.Forms.Label(); + this.checkBoxEnableStartBox = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // @@ -2784,6 +2785,17 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder this.label25.Text = "25"; this.label25.Visible = false; // + // checkBoxEnableStartBox + // + this.checkBoxEnableStartBox.Font = new System.Drawing.Font("Verdana", 12F); + this.checkBoxEnableStartBox.Location = new System.Drawing.Point(1351, 45); + this.checkBoxEnableStartBox.Name = "checkBoxEnableStartBox"; + this.checkBoxEnableStartBox.Size = new System.Drawing.Size(409, 67); + this.checkBoxEnableStartBox.TabIndex = 204; + this.checkBoxEnableStartBox.Text = "Enable Start Boxes"; + this.checkBoxEnableStartBox.UseVisualStyleBackColor = true; + this.checkBoxEnableStartBox.CheckStateChanged += new System.EventHandler(this.checkBoxEnableStartBox_CheckStateChanged); + // // TestStartEndForm // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); @@ -2791,6 +2803,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder this.AutoScroll = true; this.BackColor = System.Drawing.Color.DarkGray; this.ClientSize = new System.Drawing.Size(2061, 1295); + this.Controls.Add(this.checkBoxEnableStartBox); this.Controls.Add(this.exclamation48); this.Controls.Add(this.startTextBox48); this.Controls.Add(this.endTextBox48); @@ -3005,8 +3018,8 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder this.PerformLayout(); } + private System.Windows.Forms.CheckBox checkBoxEnableStartBox; - private System.Windows.Forms.TextBox startTextBox35; diff --git a/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs b/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs index 7775ffb26..008af64fa 100644 --- a/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs +++ b/TBF/Rig/DataEntry/Uni/EntryFormNoStartEnd.cs @@ -195,6 +195,7 @@ namespace TBF.Rig.DataEntry.Uni { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowDeferredTestEvalFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/DataEntry/iPerl/EntryForm.cs b/TBF/Rig/DataEntry/iPerl/EntryForm.cs index 7f918e8b4..51f3dbd92 100644 --- a/TBF/Rig/DataEntry/iPerl/EntryForm.cs +++ b/TBF/Rig/DataEntry/iPerl/EntryForm.cs @@ -100,6 +100,7 @@ namespace TBF.Rig.DataEntry.iPerl /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/GenericDevices/IHasWMStatesForm.cs b/TBF/Rig/GenericDevices/IHasWMStatesForm.cs index 1f9fb5956..057b33d0e 100644 --- a/TBF/Rig/GenericDevices/IHasWMStatesForm.cs +++ b/TBF/Rig/GenericDevices/IHasWMStatesForm.cs @@ -40,5 +40,11 @@ namespace TBF.Rig.GenericDevices /// /// Operation to be used in the sequence IOperation ShowTestEndFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi); + + /// + /// Displays form at the end of all tests the test to enter water meter start start. + /// + /// Operation to be used in the sequence + IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi); } } diff --git a/TBF/Rig/GenericDevices/IRestAPIAdapter.cs b/TBF/Rig/GenericDevices/IRestAPIAdapter.cs new file mode 100644 index 000000000..9f2e61619 --- /dev/null +++ b/TBF/Rig/GenericDevices/IRestAPIAdapter.cs @@ -0,0 +1,7 @@ +namespace TBF.Rig.GenericDevices +{ + public interface IRestAPIAdapter : TBF.Rig.Generic.IComponent + { + string Path { get; } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/ApiMessageOp.cs b/TBF/Rig/Network/RestAPI/ApiMessageOp.cs new file mode 100644 index 000000000..5a6210802 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/ApiMessageOp.cs @@ -0,0 +1,99 @@ +using System; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using TBF.Rig.GenericDevices; +using TBF.Rig.Network.RestAPI.facade; + +namespace TBF.Rig.Network.RestAPI +{ + public class ApiMessageOp : IOperation + { + private static readonly HttpClient httpClient = new HttpClient(); + private HttpRequestMessage httpRequest; + private bool isFinished = false; + private int timeoutCounter = 0; + private Event holdEvent = Event.Starting; + + private IRestAPIAdapter restApiAdapter; + private ApiDataLoad apiDataLoad; + + public ApiMessageOp(IRestAPIAdapter restApiAdapter, ApiDataLoad apiDataLoad) + { + this.restApiAdapter = restApiAdapter; + this.apiDataLoad = apiDataLoad; + } + + + public void Start() + { + httpRequest = new HttpRequestMessage(HttpMethod.Post, restApiAdapter.Path); // An exemplar URL is used here + holdEvent = Event.Starting; + } + + public Event Run() + { + if (isFinished) + { + return Event.Done; + } + + if (timeoutCounter >= 3000) + { + return Event.Abort; + } + + /** + * send asynchro request only one time and wait to result or timeout + */ + if (holdEvent != Event.Starting) + { + return holdEvent; + } + + //I must have what to send and where to send + if (!(restApiAdapter == null || apiDataLoad == null)) + { + httpRequest.Content = new StringContent(apiDataLoad.getJsonRequestBody(), Encoding.UTF8, "application/json"); + + _ = SendRequestAsync(); + + holdEvent = Event.Busy; + return holdEvent; + } + + holdEvent = Event.Error; + return holdEvent; + } + + private async Task SendRequestAsync() + { + try + { + var response = await httpClient.SendAsync(httpRequest); + if (response.IsSuccessStatusCode) + { + isFinished = true; + holdEvent = Event.Done; + } + else + { + timeoutCounter += 1000; + await Task.Delay(1000); // Counting timeout + } + } + catch (Exception) + { + timeoutCounter += 1000; + await Task.Delay(1000); // Counting timeout + holdEvent = Event.Error; + } + } + + public void Stop() + { + httpClient.Dispose(); + holdEvent = Event.Done; + } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/Factory.cs b/TBF/Rig/Network/RestAPI/Factory.cs new file mode 100644 index 000000000..93cb6fba7 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/Factory.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Config.Entities; +using TBF.Rig.Generic; + +namespace TBF.Rig.Network.RestAPI +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return this.GetType().Namespace.Substring(8); } } + public override string ToString() { return ClassName; } + + public IComponent DummyComponent() { return new RestAPIAdapter(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new RestAPIAdapter(cfg); } + + public IComponentCfg DefaultConfig() { return new RestAPIadapterCfg(this.GetType().Namespace.Substring(8), this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RestAPIadapterCfg.Serializer, component, this); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/RestAPIAdapter.cs b/TBF/Rig/Network/RestAPI/RestAPIAdapter.cs new file mode 100644 index 000000000..ad5f81fce --- /dev/null +++ b/TBF/Rig/Network/RestAPI/RestAPIAdapter.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System.Net; +using log4net; +using TBF.Rig.GenericDevices; + +namespace TBF.Rig.Network.RestAPI +{ + public class RestAPIAdapter : ComponentBase, GenericDevices.IRestAPIAdapter + { + private static readonly ILog log = LogManager.GetLogger(typeof(RestAPIAdapter)); + public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } + + readonly RestAPIadapterCfg restApIadapterCfg; + + private string path; + public string Path { get => path; } + + + public RestAPIAdapter() { } + + public RestAPIAdapter(Generic.IComponentCfg cfg) + : base(cfg) + { + restApIadapterCfg = cfg as RestAPIadapterCfg; + log.Warn(this.ToString()); + } + + public override void Initialize() + { + path = restApIadapterCfg.Path; + } + } +} diff --git a/TBF/Rig/Network/RestAPI/RestAPIadapterCfg.cs b/TBF/Rig/Network/RestAPI/RestAPIadapterCfg.cs new file mode 100644 index 000000000..801fd48a9 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/RestAPIadapterCfg.cs @@ -0,0 +1,44 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.Rig.GenericDevices; + +namespace TBF.Rig.Network.RestAPI +{ + public class RestAPIadapterCfg : ComponentCfgBase, Generic.IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RestAPIadapterCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl(IList cmpntEntities) { return new RestApiCfgCtrl(); } + + + public string Description; /// Description string of the selected network adapter + public string Path; // path to Ftp + public string Trigger; + + /// Private parameterless constructor invoked by all other (public) constructors NetFtpadapterCfg() {} + + public RestAPIadapterCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = string.Empty; + } + + protected RestAPIadapterCfg() + { + } + + public string ToString(int i) + { + return string.Format("Name={0}, Description={1}", Name, Description); + } + } +} diff --git a/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.cs b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.cs new file mode 100644 index 000000000..a26579f10 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.cs @@ -0,0 +1,107 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Common; +using Config.Entities; +using TBF.Rig.Generic; + +namespace TBF.Rig.Network.RestAPI +{ + public partial class RestApiCfgCtrl : UserControl, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + RestAPIadapterCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as RestAPIadapterCfg; + Redraw(); + } + } + + public RestApiCfgCtrl() + { + InitializeComponent(); + nameTextBox.Enabled = false; + textBoxFtpDir.Enabled = false; + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + if (ParentForm == null) return; /// Return is executed when tab page is open in Designer + if (config == null) return; /// Control was not loaded, settings were not changed + + Localize(); + + Redraw(); + } + + void Redraw() + { + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + textBoxFtpDir.Text = config.Path; + } + + void Localize() + { + } + + public void Closing() + { + } + + public void Unlock() + { + nameTextBox.Enabled = true; + textBoxFtpDir.Enabled = true; + } + + // Define the regex pattern for HTTP or HTTPS URLs + private static string urlPattern = @"^(http|https):\/\/([a-zA-Z0-9\.-]+)(:[0-9]+)?(\/[a-zA-Z0-9\._\-~]+)*\/?$"; + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + // Create regex object + Regex regex = new Regex(urlPattern); + + if (!regex.IsMatch(textBoxFtpDir.Text)) + { + flags = CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'URL'"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + + /// Network adapter + string strAdapter = textBoxFtpDir.Text; + int iDash = strAdapter.IndexOf(" - "); + config.Description = iDash < 0 ? "" : strAdapter.Substring(iDash + 3); + + config.Path = textBoxFtpDir.Text; + + return flags; + } + + } +} diff --git a/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.designer.cs b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.designer.cs new file mode 100644 index 000000000..7e9ce2237 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.designer.cs @@ -0,0 +1,122 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +namespace TBF.Rig.Network.RestAPI +{ + partial class RestApiCfgCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.adapterLabel = new System.Windows.Forms.Label(); + this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components); + this.textBoxFtpDir = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(152, 77); + this.nameTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(169, 26); + this.nameTextBox.TabIndex = 5; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(14, 82); + this.nameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(51, 20); + this.nameLabel.TabIndex = 4; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(147, 37); + this.classNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(125, 20); + this.classNameLabel.TabIndex = 3; + this.classNameLabel.Text = "ComonentName"; + // + // adapterLabel + // + this.adapterLabel.AutoSize = true; + this.adapterLabel.Location = new System.Drawing.Point(14, 123); + this.adapterLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.adapterLabel.Name = "adapterLabel"; + this.adapterLabel.Size = new System.Drawing.Size(66, 20); + this.adapterLabel.TabIndex = 6; + this.adapterLabel.Text = "Adapter"; + // + // errorProvider1 + // + this.errorProvider1.ContainerControl = this; + // + // textBoxFtpDir + // + this.textBoxFtpDir.Location = new System.Drawing.Point(151, 120); + this.textBoxFtpDir.Name = "textBoxFtpDir"; + this.textBoxFtpDir.Size = new System.Drawing.Size(373, 26); + this.textBoxFtpDir.TabIndex = 7; + // + // RestApiCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.textBoxFtpDir); + this.Controls.Add(this.adapterLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Name = "RestApiCfgCtrl"; + this.Size = new System.Drawing.Size(675, 462); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.ErrorProvider errorProvider1; + private System.Windows.Forms.TextBox textBoxFtpDir; + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.Label adapterLabel; + } +} diff --git a/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.resx b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.resx new file mode 100644 index 000000000..3ee7035cb --- /dev/null +++ b/TBF/Rig/Network/RestAPI/RestApiCfgCtrl.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/facade/ApiDataLoad.cs b/TBF/Rig/Network/RestAPI/facade/ApiDataLoad.cs new file mode 100644 index 000000000..26e50a474 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/facade/ApiDataLoad.cs @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using log4net; +using Newtonsoft.Json; +using Results.Entities; + +namespace TBF.Rig.Network.RestAPI.facade +{ + public class ApiDataLoad + { + [JsonIgnore] private Results.BatchResults batchResults; + [JsonIgnore] private static readonly ILog log = LogManager.GetLogger(typeof(RestAPIAdapter)); + + public ApiDataLoad(Results.BatchResults batchResults) + { + this.batchResults = batchResults; + } + + public String getJsonRequestBody() + { + try + { + List watermeterList = new List(); + if (batchResults.Batch != null && batchResults.Batch.WaterMeters != null) + { + for (int i = 0; i < batchResults.Batch.WaterMeters.Count; i++) + { + if (batchResults.Batch.WaterMeters[i] != null && !batchResults.Batch.WaterMeters[i].Disabled) + { + watermeterList.Add(toFacaseWaterMeter(batchResults.Batch.WaterMeters[i])); + } + } + } + + //do json from results + string jsonRequestBody = JsonConvert.SerializeObject(watermeterList, Formatting.Indented); + log.Debug("JSON to send in API: " + jsonRequestBody); + return jsonRequestBody; + } + catch (Exception ex) + { + log.Error("getJsonRequestBody()", ex); + Console.WriteLine(ex); + } + + return ""; + } + + // Assuming toFacaseWaterMeter method exists + private WaterMeter toFacaseWaterMeter(Results.Entities.WaterMeter meter) + { + try + { + WaterMeter waterMeter = new WaterMeter(); + // logic to convert WaterMeter data to facase class + waterMeter.WaterMeterID = meter.Id; + waterMeter.Passed = meter.Passed; + waterMeter.Remark = meter.Remark; + waterMeter.ArchivePath = meter.ArchivePath; + waterMeter.EndState = meter.EndState; + waterMeter.OrderName = meter.PurchaseOrder; + waterMeter.QFall = meter.QFall; + waterMeter.QRise = meter.QRise; + waterMeter.RadioAddress = meter.RadioAddress; + waterMeter.ResultCode = meter.ResultCode; + waterMeter.SerialNo = meter.SerialNr; + waterMeter.WmPosition = meter.WMPosition; + waterMeter.EndStateAux = meter.EndStateAux; + waterMeter.SerialNrAux = meter.SerialNrAux; + waterMeter.YearOfProduction = meter.YearOfProduction; + + //TODO BUMI implemet - Data from purchase + waterMeter.OrderID = null; + waterMeter.BoxId = ""; + + //convert next objects + waterMeter.WaterMeterData = toFacaseWaterMeterData(meter.WaterMeterData); + waterMeter.Batch = toFacadeBatch(meter.Batch); + + waterMeter.TestResultsList = toFacasetoFacaseWaterMeterData(meter); + + + return waterMeter; // Update this line as per implementation + } + catch (Exception e) + { + log.Error("toFacaseWaterMeter()", e); + return null; + } + } + + private Batch toFacadeBatch(Results.Entities.Batch meterBatch) + { + try + { + Batch facadeBatch = null; + if (meterBatch != null) + { + facadeBatch = new Batch(); + + facadeBatch.Id = meterBatch.Id; + facadeBatch.BatchNr = meterBatch.BatchNr; + facadeBatch.TestBenchId = meterBatch.TestBenchId; + facadeBatch.ProgramVersion = meterBatch.ProgramVersion; + facadeBatch.UserName = meterBatch.UserName; + facadeBatch.UserNumber = meterBatch.UserNumber; + facadeBatch.ProcedureName = meterBatch.ProcedureName; + facadeBatch.ProcedureRevision = meterBatch.ProcedureRevision; + facadeBatch.Remark = meterBatch.Remark; + facadeBatch.Counter6 = meterBatch.Counter6; + facadeBatch.Counter7 = meterBatch.Counter7; + facadeBatch.Counter8 = meterBatch.Counter8; + facadeBatch.Counter9 = meterBatch.Counter9; + facadeBatch.Counter10 = meterBatch.Counter10; + facadeBatch.StartTime = meterBatch.StartTime; + facadeBatch.EndTime = meterBatch.EndTime; + facadeBatch.Dirty = meterBatch.Dirty; + facadeBatch.RsltsSent = meterBatch.RsltsSent; + facadeBatch.RsltsPrinted = meterBatch.RsltsPrinted; + } + + return facadeBatch; + } + catch (Exception ex) + { + log.Error("toFacadeBatch()", ex); + return null; + } + } + + private WaterMeterData toFacaseWaterMeterData(Results.Entities.WaterMeterData meterWaterMeterData) + { + try + { + WaterMeterData waterMeterData = null; + + if (meterWaterMeterData != null) + { + waterMeterData = new WaterMeterData(); + + waterMeterData.Id = meterWaterMeterData.Id; + waterMeterData.ProductName = meterWaterMeterData.ProductName; + waterMeterData.Producer = meterWaterMeterData.Producer; + waterMeterData.Dn = meterWaterMeterData.DN; + waterMeterData.L = meterWaterMeterData.L; + waterMeterData.Mounting = + meterWaterMeterData.Mounting + .ToString(); // Assuming Mounting is an enum or has a valid ToString implementation + waterMeterData.Q4Qmax = meterWaterMeterData.Q4_Qmax; + waterMeterData.Q3Qn = meterWaterMeterData.Q3_Qn; + waterMeterData.Q2Qt = meterWaterMeterData.Q2_Qt; + waterMeterData.Q1Qmin = meterWaterMeterData.Q1_Qmin; + waterMeterData.MetrologicalClass = meterWaterMeterData.MetrologicalClass; + waterMeterData.Certificate = meterWaterMeterData.Certificate; + waterMeterData.Compound = meterWaterMeterData.Compound; + waterMeterData.Medium = meterWaterMeterData.Medium.ToString(); + waterMeterData.ApprovalInfo = meterWaterMeterData.ApprovalInfo; + waterMeterData.MaxAdmissiblePressure = + meterWaterMeterData.MaxAdmissiblePressure + .ToString(); // Assuming Register is an enum or has a valid ToString implementation + waterMeterData.TemperatureClass = meterWaterMeterData.TemperatureClass.ToString(); + waterMeterData.ApprovalInfoAux = meterWaterMeterData.ApprovalInfoAux; + waterMeterData.PulsesPerLtr = meterWaterMeterData.PulsesPerLtr; + waterMeterData.ProducerAux = meterWaterMeterData.ProducerAux; + waterMeterData.Q3QnAux = meterWaterMeterData.Q3_Qn_Aux; + waterMeterData.MetrologicalClassAux = meterWaterMeterData.MetrologicalClassAux; + waterMeterData.PressureLossClass = meterWaterMeterData.PressureLossClass.ToString(); + waterMeterData.FlowProfileSensitivityClass = + meterWaterMeterData.FlowProfileSensitivityClass.ToString(); + } + + return waterMeterData; + } + catch (Exception ex) + { + log.Error("toFacaseWaterMeterData()", ex); + return null; + } + } + + private List toFacasetoFacaseWaterMeterData(Results.Entities.WaterMeter meter) + { + List testResultsList = new List(); + + IList regularMeterTestRslts = meter.RegularMeterTestRslts(); + foreach (MeterTestRslt meterTestRslt in regularMeterTestRslts) + { + if (meterTestRslt != null && meterTestRslt.TestDone) + { + TestResults testResults = new TestResults(meterTestRslt); + testResultsList.Add(testResults); + } + } + + return testResultsList; + } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/facade/Batch.cs b/TBF/Rig/Network/RestAPI/facade/Batch.cs new file mode 100644 index 000000000..07786867b --- /dev/null +++ b/TBF/Rig/Network/RestAPI/facade/Batch.cs @@ -0,0 +1,36 @@ +using System; + +namespace TBF.Rig.Network.RestAPI.facade +{ + /// + /// Represents the information transfer between a Water Meter and the Server side. This class contains the batch-related information. + /// + public class Batch + { + public int Id { get; set; } + public int? BatchNr { get; set; } + public int? TestBenchId { get; set; } + public string ProgramVersion { get; set; } + public string UserName { get; set; } + public int? UserNumber { get; set; } + public string ProcedureName { get; set; } + public int? ProcedureRevision { get; set; } + public string ProtocolTitle { get; set; } + public string Remark { get; set; } + public double? Custom1 { get; set; } + public double? Custom2 { get; set; } + public double? Custom3 { get; set; } + public int? Counter6 { get; set; } + public int? Counter7 { get; set; } + public int? Counter8 { get; set; } + public int? Counter9 { get; set; } + public int? Counter10 { get; set; } + public DateTime? StartTime { get; set; } + public DateTime? EndTime { get; set; } + public bool? Dirty { get; set; } + public bool? RsltsSent { get; set; } + public bool? RsltsPrinted { get; set; } + + public Batch() { } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/facade/TestResults.cs b/TBF/Rig/Network/RestAPI/facade/TestResults.cs new file mode 100644 index 000000000..b3bd40fc7 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/facade/TestResults.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Results.Entities; + +namespace TBF.Rig.Network.RestAPI.facade +{ + /// + /// Results information transfer - Representing results output based on Water Meter to Server side. + /// + public class TestResults + { + public float? Temp_LN_ME { get; set; } // Calculated + + public double? Mass { get; set; } // Calculated + + // in Sec + public double? TestTime { get; set; } + public double? Q_v_r { get; set; } + + public double? Vol_Rm { get; set; } + + public float? Press_UP_ME { get; set; } + + public DateTime? TimestampEnd { get; set; } + + public DateTime? TimestampStart { get; set; } + public double? Start_volume { get; set; } + public double? End_volume { get; set; } + + public double? ErrorRel { get; set; } + + public string TestName { get; set; } // Collapsed 3 parameters + + public TestResults() + { + } + + public TestResults(MeterTestRslt meterTestRslt) + { + if (meterTestRslt == null) + { + return; + } + + Results.Entities.TestData testData = meterTestRslt.TestData(); + Results.Entities.TestRslt testRslt = meterTestRslt.TestRslt; + + if (testRslt != null) + { + SetTemp_LN_ME_DB(testRslt.TempUpMean, testRslt.TempDownMean); + SetMass_DB(testRslt.MassEnd, testRslt.MassStart); + TestTime = testRslt.TestTime; + SetQ_v_r_DB(testRslt.Flow); // in m3/hr => l/hr + Press_UP_ME = testRslt.PressUpMean; + + if (testData != null) + { + TestName = Results.Utils.GetTestName(testData.Name, testData.Repeats, testRslt.RepetitionNr); + } + } + + Vol_Rm = meterTestRslt.VolumeRef; + Start_volume = meterTestRslt.VolumeStart; + End_volume = meterTestRslt.VolumeEnd; + ErrorRel = meterTestRslt.Error; + + + if (meterTestRslt.Batch() != null) + { + TimestampEnd = meterTestRslt.Batch().EndTime; + TimestampStart = meterTestRslt.Batch().StartTime; + } + } + + + public void SetTemp_LN_ME_DB(float tempUpMean, float tempDownMean) + { + Temp_LN_ME = (tempUpMean + tempDownMean) / 2; + } + + + public void SetMass_DB(double massEnd, double massStart) + { + Mass = massEnd - massStart; + } + + + public void SetQ_v_r_DB(double q_v_r) + { + Q_v_r = q_v_r * 1000; // m3/hr => l/hr + } + + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/facade/WaterMeter.cs b/TBF/Rig/Network/RestAPI/facade/WaterMeter.cs new file mode 100644 index 000000000..e5d558ce3 --- /dev/null +++ b/TBF/Rig/Network/RestAPI/facade/WaterMeter.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; + +namespace TBF.Rig.Network.RestAPI.facade +{ + /// + /// WaterMeter class represents a water meter output to the server side. It contains various properties related to the water meter. + /// This class serves as a model object for the water meter. + /// + public class WaterMeter + { + public int? OrderID { get; set; } + public string OrderName { get; set; } + public string BoxId { get; set; } + public string SerialNo { get; set; } + + public int? WaterMeterID { get; set; } + public bool? Passed { get; set; } + public string SerialNrAux { get; set; } + public string RadioAddress { get; set; } + public int? YearOfProduction { get; set; } + public int? WmPosition { get; set; } + + public string EndState { get; set; } + public string EndStateAux { get; set; } + public double? QRise { get; set; } + public double? QFall { get; set; } + public int? ResultCode { get; set; } + public string ArchivePath { get; set; } + public string Remark { get; set; } + + public WaterMeterData WaterMeterData { get; set; } + public Batch Batch { get; set; } + + public List TestResultsList { get; set; } + + public WaterMeter() { } + } +} \ No newline at end of file diff --git a/TBF/Rig/Network/RestAPI/facade/WaterMeterData.cs b/TBF/Rig/Network/RestAPI/facade/WaterMeterData.cs new file mode 100644 index 000000000..3a4c4ed3d --- /dev/null +++ b/TBF/Rig/Network/RestAPI/facade/WaterMeterData.cs @@ -0,0 +1,41 @@ +namespace TBF.Rig.Network.RestAPI.facade +{ + /// + /// The WaterMeterData class represents the server-side data representation for a Water Meter Data. + /// It contains various attributes and their corresponding getter and setter methods. + /// + public class WaterMeterData + { + public int Id { get; set; } + public string ProductName { get; set; } + public string Producer { get; set; } + public double? Dn { get; set; } + public double? L { get; set; } + public string Mounting { get; set; } + public double? Q4Qmax { get; set; } + public double? Q3Qn { get; set; } + public double? Q2Qt { get; set; } + public double? Q1Qmin { get; set; } + public string MetrologicalClass { get; set; } + public string TemperatureClass { get; set; } + public string PressureLossClass { get; set; } + public string MaxAdmissiblePressure { get; set; } + public string FlowProfileSensitivityClass { get; set; } + public string ApprovalInfo { get; set; } + public string Certificate { get; set; } + public double? PulsesPerLtr { get; set; } + public string ProducerAux { get; set; } + public double? Q3QnAux { get; set; } + public string MetrologicalClassAux { get; set; } + public string ApprovalInfoAux { get; set; } + public string Medium { get; set; } + public string Text1 { get; set; } + public string Text2 { get; set; } + public string Text3 { get; set; } + public string Text4 { get; set; } + public string Text5 { get; set; } + public bool? Compound { get; set; } + + public WaterMeterData() { } + } +} \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/KPackE/DataEntryForRadio/EntryForm.cs b/TBF/Rig/RegisterReaders/KPackE/DataEntryForRadio/EntryForm.cs index 7c260ecf0..b88f90518 100644 --- a/TBF/Rig/RegisterReaders/KPackE/DataEntryForRadio/EntryForm.cs +++ b/TBF/Rig/RegisterReaders/KPackE/DataEntryForRadio/EntryForm.cs @@ -108,6 +108,7 @@ namespace TBF.Rig.RegisterReaders.KPackE.DataEntryForRadio /// null (not implemented) public IOperation ShowAdvancedTestStartFormOp(IRegReader[] regReaders, IList waterMeters, bool isCondOp) { return null; } + public IOperation ShowTestCollectFormOp(IRegReader[] regReaders, double volumeRef, double errLimLo, double errLimHi) { return null; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegReader[] regReaders, double refVolume, double errLimLo, double errLimHi) diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs index 374f6581c..b0e80bae6 100644 --- a/TBF/Rig/Sequences/MainSeq.cs +++ b/TBF/Rig/Sequences/MainSeq.cs @@ -13,6 +13,8 @@ using TBF.Rig.Operations; using TBF.Rig.GenericDevices; using TBF.Resources; using TBF.Rig.Generic; +using TBF.Rig.Network.RestAPI; +using TBF.Rig.Network.RestAPI.facade; using TBF.Rig.Output.Printers.GroupPrinting.Single; using TBF.UiBridge; @@ -157,9 +159,12 @@ namespace TBF.Rig.Sequences } /// - /// Main sequence execution + /// Executes the main sequence. /// - public void Execute() + /// + /// This method is used to execute the main sequence. + /// + public void Execute() { IList e = new List(); Selection selection; @@ -871,7 +876,7 @@ namespace TBF.Rig.Sequences * Data Collector AFTER ? if exist, then check collector and test */ bool collectDataAfterTests = false; - TBF.Rig.Generic.IComponent collector = TbfComponents.FindFirstComponentImpl(); + TBF.Rig.Generic.IComponent collector = TbfComponents.FindFirstSequenceComponentImpl(); int currentTestIx = selsctedTestIx; while (currentTestIx < StateMachine.TestInstances.Length - simultWithEvacuationCount) @@ -1180,7 +1185,7 @@ namespace TBF.Rig.Sequences * Data Collector AFTER ? if exist, then check collector and test */ bool collectDataAfterTests = false; - TBF.Rig.Generic.IComponent collector = TbfComponents.FindFirstComponentImpl(); + TBF.Rig.Generic.IComponent collector = TbfComponents.FindFirstSequenceComponentImpl(); ITestMethod testMethod = TbfComponents.FindComponent(test.Method) as ITestMethod; if (testMethod != null && testMethod.CanTest(StateMachine.Procedure.MetersKind)) @@ -1428,6 +1433,34 @@ namespace TBF.Rig.Sequences goto error; } if (e.Contains(Event.Error)) goto error; + + /// --- REST API via Operation + try + { + //send REST API via Operation + IRestAPIAdapter adapter = TbfComponents.FindFirstComponentImpl() as IRestAPIAdapter; + if (adapter != null) + { + State st = State.Create("MainSeq : Send data via REST API"); + //ProcessData.BatchRslts.Batch + st.AddOperation(new ApiMessageOp(adapter, new ApiDataLoad(ProcessData.BatchRslts))); + st.EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) break; + if (e.Contains(Event.Error)) break; + } while (e.Contains(Event.Busy) && e.Contains(Event.Starting)); + } + } + catch (Exception x) + { + Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, "API REST")); + log.FatalFormat("API call crashed: {1}", x.Message); + e.Add(Event.ErrorProcessingResults); // operation unsuccessful + } + + /// if (!e.Contains(Event.ErrorProcessingResults)) { diff --git a/TBF/Rig/Sequences/MainSeqUtils.cs b/TBF/Rig/Sequences/MainSeqUtils.cs index 9b41fa856..68720e837 100644 --- a/TBF/Rig/Sequences/MainSeqUtils.cs +++ b/TBF/Rig/Sequences/MainSeqUtils.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading; using Common; using Config.Entities; +using Results; using TBF.Rig.GenericDevices; using TBF.Rig.Operations; using TBF.Boxes; @@ -684,6 +685,103 @@ namespace TBF.Rig.Sequences } } } + + CopyImagesToNewPath(oriBatch,batchResults); + } + + private void CopyImagesToNewPath(Batch oriBatch, BatchResults batchResults) + { + string ImagesPath = "C:\\TBF\\Images"; + string pathToOriginBatchImagesDir = Path.Combine(ImagesPath, oriBatch.BatchNr.ToString()); + string pathToNewBatchImagesDir = Path.Combine(ImagesPath, batchResults.Batch.BatchNr.ToString()); + string pathToNewBatchImagesTempDir = + Path.Combine(ImagesPath, "Temp\\" + batchResults.Batch.BatchNr.ToString()); + + try + { + CopyDirectory(pathToOriginBatchImagesDir, pathToNewBatchImagesDir); + } + catch (Exception e) + { + log.Error("Restore - Image To New Path Failed! Details:", e); + } + + + try + { + CopyDirectory(pathToOriginBatchImagesDir, pathToNewBatchImagesTempDir); + } + catch (Exception e) + { + log.Error("Restore - Image To New TEMP Path Failed! Details:", e); + } + } + private void CopyImagesToNewPath(Batch oriBatch, BatchResults batchResults, int WMPosition) + { + string ImagesPath = "C:\\TBF\\Images"; + string pathToOriginBatchImagesDir = Path.Combine(ImagesPath, oriBatch.BatchNr.ToString() + "\\" + WMPosition); + string pathToNewBatchImagesTempDir = Path.Combine(ImagesPath, "Temp\\" + batchResults.Batch.BatchNr.ToString() + "\\" + WMPosition); + try + { + CopyDirectory(pathToOriginBatchImagesDir, pathToNewBatchImagesTempDir); + } + catch (Exception e) + { + log.Error("Restore - Image To New Path Failed! Details:", e); + } + } + + public static void CopyDirectory(string sourceDir, string destinationDir, bool overwrite = true) + { + // Check if the source directory exists + if (!Directory.Exists(sourceDir)) + { + log.WarnFormat($"Restore Batch - Source directory not found: {sourceDir}"); + return; + } + + try + { + // If the destination directory doesn't exist, create it + if (!Directory.Exists(destinationDir)) + { + Directory.CreateDirectory(destinationDir); + } + + // Get all the files in the source directory + string[] files = Directory.GetFiles(sourceDir); + + // Copy each file to the destination directory + foreach (string file in files) + { + string fileName = Path.GetFileName(file); + string destFile = Path.Combine(destinationDir, fileName); + + // Copy the file to the destination + File.Copy(file, destFile, overwrite); + } + } + catch (Exception e) + { + log.Error("Copy of dir and Files is no succesfull!",e); + } + + try + { + // Optionally, handle subdirectories + string[] directories = Directory.GetDirectories(sourceDir); + foreach (string subDir in directories) + { + string subDirName = Path.GetFileName(subDir); + string destSubDir = Path.Combine(destinationDir, subDirName); + + // Recursively copy subdirectory + CopyDirectory(subDir, destSubDir, overwrite); + } + }catch (Exception e) + { + log.Error("Copy of sub dirs no successful!",e); + } } void CollectSimultSteps() diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs index a367b0ebe..4ef66b2d9 100644 --- a/TBF/Rig/TbfComponents.cs +++ b/TBF/Rig/TbfComponents.cs @@ -83,6 +83,7 @@ namespace TBF.Rig new Network.Camera.RoiForFixedStart.Factory(), new Network.Camera.RoiForFixedStartKeyence.Factory(), new Network.Comet.Ambient.Factory(), + new Network.RestAPI.Factory(), new Output.DB.ProductionTracing.Factory(), new Output.DB.SaveDiverterCorrections.Factory(), new Output.DB.SaveFlowmeterCorrections.Factory(), @@ -342,7 +343,7 @@ namespace TBF.Rig return FindComponent(name, StateMachine.Components); } - public static IComponent FindFirstComponentImpl(IList components) where T : class, ISequence + public static IComponent FindFirstSequenceComponentImpl(IList components) where T : class, ISequence { foreach (var component in components) { @@ -354,12 +355,29 @@ namespace TBF.Rig return null; } - public static IComponent FindFirstComponentImpl() where T : class, ISequence + public static IComponent FindFirstSequenceComponentImpl() where T : class, ISequence + { + return FindFirstSequenceComponentImpl(StateMachine.Components); + } + + public static IComponent FindFirstComponentImpl(IList components) where T : class, IComponent + { + foreach (var component in components) + { + if (component is T) + { + return component; + } + } + return null; + } + + public static IComponent FindFirstComponentImpl() where T : class, IComponent { return FindFirstComponentImpl(StateMachine.Components); } - public static IComponent FindFirstComponentImpl() + public static IComponent FindFirstSequenceComponentImpl() { foreach (var component in StateMachine.Components) { diff --git a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvance/StandingStartMassCollectionAdvanceSeq.cs b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvance/StandingStartMassCollectionAdvanceSeq.cs index 271d4d81c..8744b9349 100644 --- a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvance/StandingStartMassCollectionAdvanceSeq.cs +++ b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvance/StandingStartMassCollectionAdvanceSeq.cs @@ -8,10 +8,13 @@ using System.Threading; using log4net; using Common; using Config.Entities; +using FluentNHibernate.Conventions; using TBF.Boxes; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.GenericDevices; +using TBF.Rig.Network.RestAPI; +using TBF.Rig.Operations; using TBF.Rig.Sequences; using TBF.UiBridge; @@ -1076,9 +1079,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance { meterRslt.RegReaderType = (int)regReader.RegisterReaderType; meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; - meterRslt.VolumeStart = regReader.BeginWMState; /// [l] - meterRslt.VolumeEnd = regReader.EndWMState; /// [l] - meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); /// [l] + meterRslt.VolumeStart = 0.0d;//regReader.BeginWMState; /// [l] + meterRslt.VolumeEnd = 0.0d;//regReader.EndWMState; /// [l] + meterRslt.VolumeMeter = 0.0d;//Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); /// [l] meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] meterRslt.PulsesMeter = meterRslt.VolumeMeter; meterRslt.PulsesMaster = tstRslt.PulsesMaster; @@ -1139,15 +1142,15 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance if (volumeRslt != null && volumeRegReader != null) { volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; - volumeRslt.VolumeStart = volumeRegReader.BeginWMState; - volumeRslt.VolumeEnd = volumeRegReader.EndWMState; + volumeRslt.VolumeStart = 0.0d;//volumeRegReader.BeginWMState; + volumeRslt.VolumeEnd = 0.0d;//volumeRegReader.EndWMState; volumeRslt.VolumeMeter = volumeRslt.VolumeEnd - volumeRslt.VolumeStart; volumeRslt.VolumeRef = tstRslt.VolumeCTV; volumeRslt.PulsesMeter = volumeRslt.VolumeMeter; volumeRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? volumeRslt.TestTime = tstRslt.TestTime; - volumeRslt.Error = Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); + volumeRslt.Error = 100.0d;//Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && (volumeRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && @@ -1159,14 +1162,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance if (energyRslt != null && energyRegReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) { volumeRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; - energyRslt.VolumeStart = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); - energyRslt.VolumeEnd = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); + energyRslt.VolumeStart = 0.0d;//(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); + energyRslt.VolumeEnd = 0.0d;//(dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); energyRslt.VolumeMeter = energyRslt.VolumeEnd - energyRslt.VolumeStart; energyRslt.VolumeRef = tstRslt.RefEnergy; energyRslt.PulsesMeter = energyRslt.VolumeMeter; energyRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? - energyRslt.Error = Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); + energyRslt.Error = 100.0d;//Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) && (tstRslt.ErrorFlags == 0); @@ -1191,14 +1194,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvance { meterRslt.RegReaderType = (int)regReader.RegisterReaderType; meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; - meterRslt.VolumeStart = regReader.BeginWMState; - meterRslt.VolumeEnd = regReader.EndWMState; - meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); + meterRslt.VolumeStart = 0.0d;//regReader.BeginWMState; + meterRslt.VolumeEnd = 0.0d;//regReader.EndWMState; + meterRslt.VolumeMeter = 0.0d;//Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter meterRslt.PulsesMeter = meterRslt.VolumeMeter; meterRslt.PulsesMaster = tstRslt.PulsesMaster; meterRslt.TestTime = tstRslt.TestTime; - meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Error = 100.0d;//Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && (tstRslt.ErrorFlags == 0); diff --git a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs index 92bd2e471..a555d2210 100644 --- a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs +++ b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs @@ -10,6 +10,7 @@ using Config.Entities; using TBF.Boxes; using TBF.Resources; using TBF.Rig.GenericDevices; +using TBF.Rig.Network.RestAPI; using TBF.Rig.Sequences; using TBF.UiBridge; @@ -115,7 +116,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvanceCollect State state = State.Create(string.Format("{0}({1}) : Entering the end-state", test.Method, test.Name)); { - state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, + state.AddOperation(dataEntryCmpnt.ShowTestCollectFormOp(sensPath.RegisterReaders, 0, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); } state.AddOperation(checkUiOp) @@ -195,6 +196,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvanceCollect meterRslt.VolumeStart = regReader.BeginWMState; meterRslt.VolumeEnd = regReader.EndWMState; meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); + meterRslt.PulsesMeter = meterRslt.VolumeMeter; meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index ec8ca4794..42eb13944 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -116,6 +116,9 @@ ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll @@ -137,6 +140,7 @@ + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -625,6 +629,7 @@ + @@ -896,6 +901,21 @@ AmbientCfgCtrl.cs + + + + + + + + + UserControl + + + RestApiCfgCtrl.cs + + + @@ -2898,6 +2918,9 @@ AmbientCfgCtrl.cs + + RestApiCfgCtrl.cs + AskYesNoForm.cs diff --git a/TBF/packages.config b/TBF/packages.config index 7c92e8860..2503ea1ea 100644 --- a/TBF/packages.config +++ b/TBF/packages.config @@ -5,6 +5,7 @@ +