diff --git a/Common/Common.csproj b/Common/Common.csproj
index 6a451dfc3..f254c3413 100644
--- a/Common/Common.csproj
+++ b/Common/Common.csproj
@@ -41,6 +41,7 @@
+
UserControl
diff --git a/Common/SerializableDictionary.cs b/Common/SerializableDictionary.cs
new file mode 100644
index 000000000..453e3ab46
--- /dev/null
+++ b/Common/SerializableDictionary.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+
+namespace Common
+{
+ [XmlRoot("dictionary")]
+ public class SerializableDictionary
+ : Dictionary, IXmlSerializable
+ {
+ public System.Xml.Schema.XmlSchema GetSchema()
+ {
+ return null;
+ }
+
+ public void ReadXml(System.Xml.XmlReader reader)
+ {
+ XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
+ XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
+
+ bool wasEmpty = reader.IsEmptyElement;
+ reader.Read();
+
+ if (wasEmpty)
+ return;
+
+ while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
+ {
+ reader.ReadStartElement("item");
+
+ reader.ReadStartElement("key");
+ TKey key = (TKey)keySerializer.Deserialize(reader);
+ reader.ReadEndElement();
+
+ reader.ReadStartElement("value");
+ TValue value = (TValue)valueSerializer.Deserialize(reader);
+ reader.ReadEndElement();
+
+ this.Add(key, value);
+
+ reader.ReadEndElement();
+ reader.MoveToContent();
+ }
+ reader.ReadEndElement();
+ }
+
+ public void WriteXml(System.Xml.XmlWriter writer)
+ {
+ XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
+ XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
+
+ foreach (TKey key in this.Keys)
+ {
+ writer.WriteStartElement("item");
+
+ writer.WriteStartElement("key");
+ keySerializer.Serialize(writer, key);
+ writer.WriteEndElement();
+
+ writer.WriteStartElement("value");
+ TValue value = this[key];
+ valueSerializer.Serialize(writer, value);
+ writer.WriteEndElement();
+
+ writer.WriteEndElement();
+ }
+ }
+ }
+}
diff --git a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/Component.cs b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/Component.cs
index 83f9ca8ca..bb3618a83 100644
--- a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/Component.cs
+++ b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/Component.cs
@@ -8,7 +8,7 @@ using Config.Entities;
namespace TBF.BenchControl.TestMethods.Q2CorrectionFromHistory
{
- public class Component : ComponentBase, GenericDevices.ISimultTestMethod, GenericDevices.ITestMethod
+ public class Component : ComponentBase, GenericDevices.ISimultTestMethod
{
private static readonly ILog log = LogManager.GetLogger(typeof(Component));
public override string ToString() { return string.Format("TestMethods.GrabImage({0})", Cfg.ToString(1)); }
@@ -41,11 +41,14 @@ namespace TBF.BenchControl.TestMethods.Q2CorrectionFromHistory
{
if (args.Command == CfgChangeCmd.CfgChange)
{
+ cfg.UseWebService = tmpcfg.UseWebService;
+ cfg.BaseUrl = tmpcfg.BaseUrl;
+ cfg.RelativeUrl = tmpcfg.RelativeUrl;
cfg.UseLocalDB = tmpcfg.UseLocalDB;
cfg.ProcedureName = tmpcfg.ProcedureName;
cfg.ProcedureNameAlt1 = tmpcfg.ProcedureNameAlt1;
cfg.ProcedureNameAlt2 = tmpcfg.ProcedureNameAlt2;
- cfg.UseWebService = tmpcfg.UseWebService;
+ cfg.UseDefaultValues = tmpcfg.UseDefaultValues;
}
}
};
@@ -68,7 +71,7 @@ namespace TBF.BenchControl.TestMethods.Q2CorrectionFromHistory
public IList Execute(Test test, int repetitionNr, bool isLastRepetition)
{
- return (new FromHistorySeq()).Execute(test, repetitionNr, isLastRepetition, cfg);
+ return (new FromHistorySeq()).Execute(test, repetitionNr, cfg);
}
}
}
diff --git a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs
index dd9e442b2..1776ccd39 100644
--- a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs
+++ b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistoryCfg.cs
@@ -36,8 +36,8 @@ namespace TBF.BenchControl.TestMethods.Q2CorrectionFromHistory
ParentName = string.Empty;
UseWebService = false;
- BaseUrl = "https://tludockerhost1:5011/api/";
- RelativeUrl = "q2correction";
+ BaseUrl = "https://api-operations.pemek.sms-esaap.com/core/metrology/";
+ RelativeUrl = "q2correction/Locations/4/Wztyp/{0}";
UseLocalDB = true;
ProcedureName = "iPERL Smart Suez DN15 Q3_2.5 R800";
ProcedureNameAlt1 = "iPERL Suez DN15 Q3_2.5 R800";
diff --git a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs
index b8527b281..569e854bc 100644
--- a/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs
+++ b/TBF/BenchControl/TestMethods/Q2CorrectionFromHistory/FromHistorySeq.cs
@@ -17,7 +17,7 @@ namespace TBF.BenchControl.TestMethods.Q2CorrectionFromHistory
private static readonly ILog log = LogManager.GetLogger(typeof(FromHistorySeq));
- public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, FromHistoryCfg cfg)
+ public IList Execute(Config.Entities.Test test, int repetitionNr, FromHistoryCfg cfg)
{
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Config.Entities.Progress.Test));
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethod.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethod.cs
index cda87a632..280332f7f 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethod.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethod.cs
@@ -1,6 +1,5 @@
///
-/// Copyright (c) 2015-2016 Sensus Metering Systems
-/// Author: Milan Hanajík
+/// Copyright (c) 2015-2020 Sensus Slovensko a.s.
///
using System;
using System.IO.Ports;
@@ -26,6 +25,41 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
public bool SimultWithPrevious { get { return testMethodCfg.TestParams.SimultWithPrevious; } }
public bool SimultWithNext { get { return testMethodCfg.TestParams.SimultWithNext; } }
+ #region Configuration Change Handling
+
+ public static void OnCfgChange(object sender, CfgChangeArgs args)
+ {
+ if (CfgChangeHandler == null) return;
+ try { CfgChangeHandler(sender, args); }
+ catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CfgChangeHandler;
+
+ public override void StartChangeHandler()
+ {
+ CfgChangeHandler += delegate(object sender, CfgChangeArgs args)
+ {
+ TestMethodCfg tmpCfg = args.Cfg as TestMethodCfg;
+ if (tmpCfg != null && tmpCfg.Name.Equals(Name))
+ {
+ if (args.Command == CfgChangeCmd.CfgChange)
+ {
+ testMethodCfg.CommTimeout = tmpCfg.CommTimeout;
+ testMethodCfg.DelayBetweenRetries = tmpCfg.DelayBetweenRetries;
+ testMethodCfg.MaxCommRetries = tmpCfg.MaxCommRetries;
+ testMethodCfg.IperlCheckErrorsToStop = tmpCfg.IperlCheckErrorsToStop;
+ testMethodCfg.UseWebService = tmpCfg.UseWebService;
+ testMethodCfg.BaseUrl = tmpCfg.BaseUrl;
+ testMethodCfg.RelativeUrl = tmpCfg.RelativeUrl;
+ }
+ }
+ };
+ }
+
+ #endregion Configuration Change Handling
+
+
public TestMethod()
{
}
@@ -34,9 +68,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
: base(cfg)
{
testMethodCfg = cfg as TestMethodCfg;
+ StartChangeHandler();
log.Debug(this.ToString());
}
+ /// IDevice interface - only Initialize() is used
public void Initialize()
{
if (DebugLevel == DebugMode.Normal)
@@ -74,8 +110,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
rfidDataLogger.Fatal("------------------------------------------------------------------------");
rfidDataLogger.FatalFormat("Test Bench Framework ver. {0}", Program.Version);
- }
+ }
+ /// IDevice interface - only Initialize() is used
public void RunDeviceBefore() { }
public void RunDeviceAfter() { }
public void StopDevice() { }
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfg.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfg.cs
index 5fb0664a6..fcc2537a2 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfg.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfg.cs
@@ -30,7 +30,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
public int RfidPortNrBoard3;
public int RfidPortNrBoard4;
public int IperlCheckErrorsToStop;
-
+ public bool UseWebService;
+ public string BaseUrl;
+ public string RelativeUrl;
/// Test parameters
[XmlIgnore]
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.cs
index 1aa7b6883..d812238c9 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2015-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2020 Sensus Slovensko a.s.
///
using System;
using System.Windows.Forms;
@@ -9,7 +9,7 @@ using TBF.Resources;
namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
- public partial class TestMethodCfgCtrl : UserControl, IComponentCfgCtrl
+ public partial class TestMethodCfgCtrl : Configs.ConfigCtrlUtils, IComponentCfgCtrl
{
public bool ShowMore { get { return false; } }
@@ -53,7 +53,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
delayBetweenRetriesTextBox.Text = config.DelayBetweenRetries.ToString();
nrThreadsTextBox.Text = config.NrThreads.ToString();
iperlCheckErrorsToStopTextBox.Text = config.IperlCheckErrorsToStop.ToString();
- }
+ useWebServiceCheckBox.Checked = config.UseWebService;
+ baseUrlTextBox.Text = config.BaseUrl;
+ relativeUrlTextBox.Text = config.RelativeUrl;
+ }
public void Unlock()
{
@@ -68,7 +71,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
delayBetweenRetriesTextBox.Enabled = true;
nrThreadsTextBox.Enabled = true;
iperlCheckErrorsToStopTextBox.Enabled = true;
- }
+ useWebServiceCheckBox.Enabled = true;
+ baseUrlTextBox.Enabled = true;
+ relativeUrlTextBox.Enabled = true;
+ }
public CfgUpdateFlags VerifyCfg(ref string message)
{
@@ -126,42 +132,38 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
public CfgUpdateFlags UpdateCfg()
{
- CfgUpdateFlags flags = CfgUpdateFlags.None; /// <------------------- !!!
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
- if (config.Name != nameTextBox.Text) { config.Name = nameTextBox.Text; flags = CfgUpdateFlags.RestartRqrd; }
+ if (config.Name != nameTextBox.Text)
+ {
+ config.Name = nameTextBox.Text;
+ flags |= (CfgUpdateFlags.AnyChange | CfgUpdateFlags.RestartRqrd);
+ }
- int tmp = int.Parse(rfidPortBoard1TextBox.Text);
- if (config.RfidPortNrBoard1 != tmp) { config.RfidPortNrBoard1 = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- tmp = int.Parse(rfidPortBoard2TextBox.Text);
- if (config.RfidPortNrBoard2 != tmp) { config.RfidPortNrBoard2 = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- tmp = int.Parse(rfidPortBoard3TextBox.Text);
- if (config.RfidPortNrBoard3 != tmp) { config.RfidPortNrBoard3 = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- tmp = int.Parse(rfidPortBoard4TextBox.Text);
- if (config.RfidPortNrBoard4 != tmp) { config.RfidPortNrBoard4 = tmp; flags = CfgUpdateFlags.RestartRqrd; }
+ flags |= UpdateDifferent(ref config.CommTimeout, commTimeoutTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.MaxCommRetries, maxCommRetriesTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.DelayBetweenRetries, delayBetweenRetriesTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.IperlCheckErrorsToStop, iperlCheckErrorsToStopTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.UseWebService, useWebServiceCheckBox.Checked, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.BaseUrl, baseUrlTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.RelativeUrl, relativeUrlTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
- tmp = int.Parse(commTimeoutTextBox.Text);
- if (config.CommTimeout != tmp) { config.CommTimeout = tmp; flags = CfgUpdateFlags.RestartRqrd; }
+ flags |= UpdateDifferent(ref config.NrThreads, nrThreadsTextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.UseMuxBoards, useMuxBrdsCheckBox.Checked, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.RfidPortNrBoard1, rfidPortBoard1TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.RfidPortNrBoard2, rfidPortBoard2TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.RfidPortNrBoard3, rfidPortBoard3TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ flags |= UpdateDifferent(ref config.RfidPortNrBoard4, rfidPortBoard4TextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
- tmp = int.Parse(maxCommRetriesTextBox.Text);
- if (config.MaxCommRetries != tmp) { config.MaxCommRetries = tmp; flags = CfgUpdateFlags.RestartRqrd; }
- tmp = int.Parse(delayBetweenRetriesTextBox.Text);
- if (config.DelayBetweenRetries != tmp) { config.DelayBetweenRetries = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- tmp = int.Parse(nrThreadsTextBox.Text);
- if (config.NrThreads != tmp) { config.NrThreads = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- if (config.UseMuxBoards != useMuxBrdsCheckBox.Checked) { config.UseMuxBoards = useMuxBrdsCheckBox.Checked; flags = CfgUpdateFlags.RestartRqrd; }
-
- tmp = int.Parse(iperlCheckErrorsToStopTextBox.Text);
- if (config.IperlCheckErrorsToStop != tmp) { config.IperlCheckErrorsToStop = tmp; flags = CfgUpdateFlags.RestartRqrd; }
-
- return flags;
+ if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0)
+ {
+ TestMethod.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config));
+ }
+
+ return flags;
}
}
}
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.designer.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.designer.cs
index f62da3c53..34c5b31df 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.designer.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/TestMethodCfgCtrl.designer.cs
@@ -55,13 +55,18 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
this.iperlCheckErrorsToStopLabel = new System.Windows.Forms.Label();
this.delayBetweenRetriesTextBox = new System.Windows.Forms.TextBox();
this.delayBetweenRetriesLabel = new System.Windows.Forms.Label();
+ this.relativeUrlTextBox = new System.Windows.Forms.TextBox();
+ this.relativeUrlLabel = new System.Windows.Forms.Label();
+ this.baseUrlTextBox = new System.Windows.Forms.TextBox();
+ this.baseUrlLabel = new System.Windows.Forms.Label();
+ this.useWebServiceCheckBox = new System.Windows.Forms.CheckBox();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// nameTextBox
//
this.nameTextBox.Enabled = false;
- this.nameTextBox.Location = new System.Drawing.Point(165, 25);
+ this.nameTextBox.Location = new System.Drawing.Point(88, 31);
this.nameTextBox.Name = "nameTextBox";
this.nameTextBox.Size = new System.Drawing.Size(130, 20);
this.nameTextBox.TabIndex = 2;
@@ -69,7 +74,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// nameLabel
//
this.nameLabel.AutoSize = true;
- this.nameLabel.Location = new System.Drawing.Point(23, 28);
+ this.nameLabel.Location = new System.Drawing.Point(23, 34);
this.nameLabel.Name = "nameLabel";
this.nameLabel.Size = new System.Drawing.Size(35, 13);
this.nameLabel.TabIndex = 1;
@@ -78,7 +83,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// classNameLabel
//
this.classNameLabel.AutoSize = true;
- this.classNameLabel.Location = new System.Drawing.Point(164, 7);
+ this.classNameLabel.Location = new System.Drawing.Point(24, 7);
this.classNameLabel.Name = "classNameLabel";
this.classNameLabel.Size = new System.Drawing.Size(83, 13);
this.classNameLabel.TabIndex = 0;
@@ -87,7 +92,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard1TextBox
//
this.rfidPortBoard1TextBox.Enabled = false;
- this.rfidPortBoard1TextBox.Location = new System.Drawing.Point(289, 20);
+ this.rfidPortBoard1TextBox.Location = new System.Drawing.Point(130, 38);
this.rfidPortBoard1TextBox.Name = "rfidPortBoard1TextBox";
this.rfidPortBoard1TextBox.Size = new System.Drawing.Size(45, 20);
this.rfidPortBoard1TextBox.TabIndex = 2;
@@ -95,7 +100,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard1Label
//
this.rfidPortBoard1Label.AutoSize = true;
- this.rfidPortBoard1Label.Location = new System.Drawing.Point(171, 23);
+ this.rfidPortBoard1Label.Location = new System.Drawing.Point(12, 41);
this.rfidPortBoard1Label.Name = "rfidPortBoard1Label";
this.rfidPortBoard1Label.Size = new System.Drawing.Size(96, 13);
this.rfidPortBoard1Label.TabIndex = 1;
@@ -104,7 +109,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard2TextBox
//
this.rfidPortBoard2TextBox.Enabled = false;
- this.rfidPortBoard2TextBox.Location = new System.Drawing.Point(289, 42);
+ this.rfidPortBoard2TextBox.Location = new System.Drawing.Point(130, 60);
this.rfidPortBoard2TextBox.Name = "rfidPortBoard2TextBox";
this.rfidPortBoard2TextBox.Size = new System.Drawing.Size(45, 20);
this.rfidPortBoard2TextBox.TabIndex = 4;
@@ -112,7 +117,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard2Label
//
this.rfidPortBoard2Label.AutoSize = true;
- this.rfidPortBoard2Label.Location = new System.Drawing.Point(171, 45);
+ this.rfidPortBoard2Label.Location = new System.Drawing.Point(12, 63);
this.rfidPortBoard2Label.Name = "rfidPortBoard2Label";
this.rfidPortBoard2Label.Size = new System.Drawing.Size(96, 13);
this.rfidPortBoard2Label.TabIndex = 3;
@@ -121,7 +126,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard3TextBox
//
this.rfidPortBoard3TextBox.Enabled = false;
- this.rfidPortBoard3TextBox.Location = new System.Drawing.Point(289, 64);
+ this.rfidPortBoard3TextBox.Location = new System.Drawing.Point(130, 82);
this.rfidPortBoard3TextBox.Name = "rfidPortBoard3TextBox";
this.rfidPortBoard3TextBox.Size = new System.Drawing.Size(45, 20);
this.rfidPortBoard3TextBox.TabIndex = 6;
@@ -129,7 +134,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard3Label
//
this.rfidPortBoard3Label.AutoSize = true;
- this.rfidPortBoard3Label.Location = new System.Drawing.Point(171, 67);
+ this.rfidPortBoard3Label.Location = new System.Drawing.Point(12, 85);
this.rfidPortBoard3Label.Name = "rfidPortBoard3Label";
this.rfidPortBoard3Label.Size = new System.Drawing.Size(96, 13);
this.rfidPortBoard3Label.TabIndex = 5;
@@ -138,7 +143,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard4TextBox
//
this.rfidPortBoard4TextBox.Enabled = false;
- this.rfidPortBoard4TextBox.Location = new System.Drawing.Point(289, 86);
+ this.rfidPortBoard4TextBox.Location = new System.Drawing.Point(130, 104);
this.rfidPortBoard4TextBox.Name = "rfidPortBoard4TextBox";
this.rfidPortBoard4TextBox.Size = new System.Drawing.Size(45, 20);
this.rfidPortBoard4TextBox.TabIndex = 8;
@@ -146,7 +151,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// rfidPortBoard4Label
//
this.rfidPortBoard4Label.AutoSize = true;
- this.rfidPortBoard4Label.Location = new System.Drawing.Point(171, 89);
+ this.rfidPortBoard4Label.Location = new System.Drawing.Point(12, 107);
this.rfidPortBoard4Label.Name = "rfidPortBoard4Label";
this.rfidPortBoard4Label.Size = new System.Drawing.Size(96, 13);
this.rfidPortBoard4Label.TabIndex = 7;
@@ -155,7 +160,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// commTimeoutTextBox
//
this.commTimeoutTextBox.Enabled = false;
- this.commTimeoutTextBox.Location = new System.Drawing.Point(165, 47);
+ this.commTimeoutTextBox.Location = new System.Drawing.Point(173, 53);
this.commTimeoutTextBox.Name = "commTimeoutTextBox";
this.commTimeoutTextBox.Size = new System.Drawing.Size(45, 20);
this.commTimeoutTextBox.TabIndex = 4;
@@ -163,7 +168,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// commTimeoutLabel
//
this.commTimeoutLabel.AutoSize = true;
- this.commTimeoutLabel.Location = new System.Drawing.Point(23, 50);
+ this.commTimeoutLabel.Location = new System.Drawing.Point(23, 56);
this.commTimeoutLabel.Name = "commTimeoutLabel";
this.commTimeoutLabel.Size = new System.Drawing.Size(98, 13);
this.commTimeoutLabel.TabIndex = 3;
@@ -172,7 +177,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// maxCommRetriesTextBox
//
this.maxCommRetriesTextBox.Enabled = false;
- this.maxCommRetriesTextBox.Location = new System.Drawing.Point(165, 69);
+ this.maxCommRetriesTextBox.Location = new System.Drawing.Point(173, 75);
this.maxCommRetriesTextBox.Name = "maxCommRetriesTextBox";
this.maxCommRetriesTextBox.Size = new System.Drawing.Size(45, 20);
this.maxCommRetriesTextBox.TabIndex = 6;
@@ -180,7 +185,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// maxNrRetriesLabel
//
this.maxNrRetriesLabel.AutoSize = true;
- this.maxNrRetriesLabel.Location = new System.Drawing.Point(23, 72);
+ this.maxNrRetriesLabel.Location = new System.Drawing.Point(23, 78);
this.maxNrRetriesLabel.Name = "maxNrRetriesLabel";
this.maxNrRetriesLabel.Size = new System.Drawing.Size(61, 13);
this.maxNrRetriesLabel.TabIndex = 5;
@@ -189,7 +194,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// nrThreadsTextBox
//
this.nrThreadsTextBox.Enabled = false;
- this.nrThreadsTextBox.Location = new System.Drawing.Point(165, 113);
+ this.nrThreadsTextBox.Location = new System.Drawing.Point(173, 119);
this.nrThreadsTextBox.Name = "nrThreadsTextBox";
this.nrThreadsTextBox.Size = new System.Drawing.Size(45, 20);
this.nrThreadsTextBox.TabIndex = 10;
@@ -197,7 +202,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// nrThreadsLabel
//
this.nrThreadsLabel.AutoSize = true;
- this.nrThreadsLabel.Location = new System.Drawing.Point(23, 116);
+ this.nrThreadsLabel.Location = new System.Drawing.Point(23, 122);
this.nrThreadsLabel.Name = "nrThreadsLabel";
this.nrThreadsLabel.Size = new System.Drawing.Size(59, 13);
this.nrThreadsLabel.TabIndex = 9;
@@ -207,7 +212,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
//
this.useMuxBrdsCheckBox.AutoSize = true;
this.useMuxBrdsCheckBox.Enabled = false;
- this.useMuxBrdsCheckBox.Location = new System.Drawing.Point(15, 22);
+ this.useMuxBrdsCheckBox.Location = new System.Drawing.Point(15, 18);
this.useMuxBrdsCheckBox.Name = "useMuxBrdsCheckBox";
this.useMuxBrdsCheckBox.Size = new System.Drawing.Size(132, 17);
this.useMuxBrdsCheckBox.TabIndex = 0;
@@ -225,17 +230,17 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
this.groupBox1.Controls.Add(this.rfidPortBoard3TextBox);
this.groupBox1.Controls.Add(this.rfidPortBoard4Label);
this.groupBox1.Controls.Add(this.rfidPortBoard4TextBox);
- this.groupBox1.Location = new System.Drawing.Point(26, 142);
+ this.groupBox1.Location = new System.Drawing.Point(231, 7);
this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(363, 117);
+ this.groupBox1.Size = new System.Drawing.Size(184, 134);
this.groupBox1.TabIndex = 11;
this.groupBox1.TabStop = false;
- this.groupBox1.Text = "Multiplexer boards connected to USB ports";
+ this.groupBox1.Text = "Mux. boards connected via USB";
//
// iperlCheckErrorsToStopTextBox
//
this.iperlCheckErrorsToStopTextBox.Enabled = false;
- this.iperlCheckErrorsToStopTextBox.Location = new System.Drawing.Point(239, 267);
+ this.iperlCheckErrorsToStopTextBox.Location = new System.Drawing.Point(361, 152);
this.iperlCheckErrorsToStopTextBox.Name = "iperlCheckErrorsToStopTextBox";
this.iperlCheckErrorsToStopTextBox.Size = new System.Drawing.Size(45, 20);
this.iperlCheckErrorsToStopTextBox.TabIndex = 13;
@@ -243,7 +248,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// iperlCheckErrorsToStopLabel
//
this.iperlCheckErrorsToStopLabel.AutoSize = true;
- this.iperlCheckErrorsToStopLabel.Location = new System.Drawing.Point(23, 270);
+ this.iperlCheckErrorsToStopLabel.Location = new System.Drawing.Point(23, 155);
this.iperlCheckErrorsToStopLabel.Name = "iperlCheckErrorsToStopLabel";
this.iperlCheckErrorsToStopLabel.Size = new System.Drawing.Size(202, 13);
this.iperlCheckErrorsToStopLabel.TabIndex = 12;
@@ -252,7 +257,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// delayBetweenRetriesTextBox
//
this.delayBetweenRetriesTextBox.Enabled = false;
- this.delayBetweenRetriesTextBox.Location = new System.Drawing.Point(165, 91);
+ this.delayBetweenRetriesTextBox.Location = new System.Drawing.Point(173, 97);
this.delayBetweenRetriesTextBox.Name = "delayBetweenRetriesTextBox";
this.delayBetweenRetriesTextBox.Size = new System.Drawing.Size(45, 20);
this.delayBetweenRetriesTextBox.TabIndex = 8;
@@ -260,16 +265,66 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
// delayBetweenRetriesLabel
//
this.delayBetweenRetriesLabel.AutoSize = true;
- this.delayBetweenRetriesLabel.Location = new System.Drawing.Point(23, 94);
+ this.delayBetweenRetriesLabel.Location = new System.Drawing.Point(23, 100);
this.delayBetweenRetriesLabel.Name = "delayBetweenRetriesLabel";
this.delayBetweenRetriesLabel.Size = new System.Drawing.Size(131, 13);
this.delayBetweenRetriesLabel.TabIndex = 7;
this.delayBetweenRetriesLabel.Text = "Delay between retries [ms]";
//
+ // relativeUrlTextBox
+ //
+ this.relativeUrlTextBox.Enabled = false;
+ this.relativeUrlTextBox.Location = new System.Drawing.Point(108, 229);
+ this.relativeUrlTextBox.Name = "relativeUrlTextBox";
+ this.relativeUrlTextBox.Size = new System.Drawing.Size(298, 20);
+ this.relativeUrlTextBox.TabIndex = 18;
+ //
+ // relativeUrlLabel
+ //
+ this.relativeUrlLabel.AutoSize = true;
+ this.relativeUrlLabel.Location = new System.Drawing.Point(24, 232);
+ this.relativeUrlLabel.Name = "relativeUrlLabel";
+ this.relativeUrlLabel.Size = new System.Drawing.Size(71, 13);
+ this.relativeUrlLabel.TabIndex = 17;
+ this.relativeUrlLabel.Text = "Relative URL";
+ //
+ // baseUrlTextBox
+ //
+ this.baseUrlTextBox.Enabled = false;
+ this.baseUrlTextBox.Location = new System.Drawing.Point(108, 206);
+ this.baseUrlTextBox.Name = "baseUrlTextBox";
+ this.baseUrlTextBox.Size = new System.Drawing.Size(298, 20);
+ this.baseUrlTextBox.TabIndex = 16;
+ //
+ // baseUrlLabel
+ //
+ this.baseUrlLabel.AutoSize = true;
+ this.baseUrlLabel.Location = new System.Drawing.Point(24, 209);
+ this.baseUrlLabel.Name = "baseUrlLabel";
+ this.baseUrlLabel.Size = new System.Drawing.Size(56, 13);
+ this.baseUrlLabel.TabIndex = 15;
+ this.baseUrlLabel.Text = "Base URL";
+ //
+ // useWebServiceCheckBox
+ //
+ this.useWebServiceCheckBox.AutoSize = true;
+ this.useWebServiceCheckBox.Enabled = false;
+ this.useWebServiceCheckBox.Location = new System.Drawing.Point(25, 184);
+ this.useWebServiceCheckBox.Name = "useWebServiceCheckBox";
+ this.useWebServiceCheckBox.Size = new System.Drawing.Size(189, 17);
+ this.useWebServiceCheckBox.TabIndex = 14;
+ this.useWebServiceCheckBox.Text = "Use web service for default values";
+ this.useWebServiceCheckBox.UseVisualStyleBackColor = true;
+ //
// TestMethodCfgCtrl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.relativeUrlTextBox);
+ this.Controls.Add(this.relativeUrlLabel);
+ this.Controls.Add(this.baseUrlTextBox);
+ this.Controls.Add(this.baseUrlLabel);
+ this.Controls.Add(this.useWebServiceCheckBox);
this.Controls.Add(this.delayBetweenRetriesTextBox);
this.Controls.Add(this.delayBetweenRetriesLabel);
this.Controls.Add(this.iperlCheckErrorsToStopTextBox);
@@ -319,5 +374,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
private System.Windows.Forms.Label iperlCheckErrorsToStopLabel;
private System.Windows.Forms.TextBox delayBetweenRetriesTextBox;
private System.Windows.Forms.Label delayBetweenRetriesLabel;
+ private System.Windows.Forms.TextBox relativeUrlTextBox;
+ private System.Windows.Forms.Label relativeUrlLabel;
+ private System.Windows.Forms.TextBox baseUrlTextBox;
+ private System.Windows.Forms.Label baseUrlLabel;
+ private System.Windows.Forms.CheckBox useWebServiceCheckBox;
}
}
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
index 2eb81a43d..ba7d9d341 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2015-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2020 Sensus Slovensko a.s.
///
//#define VERIFY_ACTIVE_MODE
//#define VERIFY_Q2_CORR_RESET
@@ -65,9 +65,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
public const string WriteCalibrationV4FactorsStr = "Write calibration_V4";
public const string NormalizeCalibrationFactorStr = "Normalize calibration factor";
public const string NormalizeCalibrationV4FactorsStr = "Normalize calibration_V4";
+ public const string GetDefaultQ2CorrectionsStr = "Get default Q2 corrections";
public const string ReadQ2CorrectionStr = "Read Q2 corrections";
public const string ResetQ2CorrectionStr = "Reset Q2 correction";
- public const string InitOrReadQ2CorrectionStr = "Init or read Q2 corrections";
+ public const string WriteDefaultQ2CorrectionsStr = "Write default Q2 corrections";
+ public const string InitOrReadQ2CorrectionsStr = "Init or read Q2 corrections";
public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments
public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments
public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name
@@ -339,6 +341,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
static IList iperlHeads;
static IList waterMeterPositions0; /// keeps original 0-based indices in RegisterReaders list
+ static int commonWMType;
Modbus.QuidoRS.QuidoRS quido;
@@ -409,13 +412,23 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
ProcessData.RegisterReaders = StateMachine.GetMetersPath(tests[0]).RegisterReaders;
activityLabel.Text = multiTestParams[0].Activity;
+ foreach (var p in multiTestParams)
+ {
+ if (p.Activity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower())
+ {
+ /// Reset IsQ2PreCorrectionCalculated that is used for synchronization/to prevent double REST call
+ ProcessData.IsQ2PreCorrectionCalculated = false;
+ commonWMType = 0;
+ break;
+ }
+ }
}
- ConstructorCommon();
+ PrepareForTestsActivities();
}
- void ConstructorCommon()
+ void PrepareForTestsActivities()
{
startTime = DateTime.Now;
startTimeSec = StateMachine.Time;
@@ -494,7 +507,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
workerThreads = new List();
for (int i = 0; i < cfg.NrThreads; i++)
{
- Thread thread = new Thread(iPerlCommunicationForm.Worker);
+ Thread thread = new Thread(Worker);
thread.CurrentCulture = CultureInfo.CurrentCulture;
thread.CurrentUICulture = CultureInfo.CurrentUICulture;
workerThreads.Add(thread);
@@ -633,37 +646,46 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
Localize();
- for (int i = 0; i < textBoxesCount; i++)
+ ///
+ /// Set checkbox states accroding to iPerlHeads[i].Disabled states
+ ///
+ for (int i = 0; i < textBoxesCount; i++)
{
labels[i].Visible = counters[i].Visible = messages[i].Visible = checkBoxes[i].Visible = true;
if (!checkBoxesEditMode && (iperlHeads[i] == null || iperlHeads[i].Disabled))
{
+ /// iPerl position i+1 is disabled
checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = false;
counters[i].BackColor = DisabledColor;
messages[i].Text = Strings.Head_was_disabled_by_the_user;
}
else
{
+ /// iPerl position i+1 is enabled
checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = true;
messages[i].Text = "---";
}
}
- TBF.LocalSettings ls = Program.LocalSettings;
+ ///
+ /// Set location and checkbox states to values stored in local settings
+ ///
+ TBF.LocalSettings ls = Program.LocalSettings;
Left = (ls.iPerlCommunicationsFormLeft != 0) ? ls.iPerlCommunicationsFormLeft : 150;
Top = (ls.iPerlCommunicationsFormTop != 0) ? ls.iPerlCommunicationsFormTop : 150;
if (ls.iPerlCommunicationsFormCheckboxes != 0) SetCheckBoxStates(ls.iPerlCommunicationsFormCheckboxes);
if (!checkBoxesEditMode)
{
+ /// Regular activity (not a checkbox edit mode invoked from TBF menu)
+
/// Reset opto-data indication
for (int i = 0; i < iperlHeads.Count; i++)
{
counters[i].BackColor = OptoNokColor;
}
- ///
/// Set QuidoRS outputs and start the whole communication process
/// by incrementing 'currentGroup'.
///
@@ -675,9 +697,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
currentGroup++;
- /// Start worker threads
int wtId = 0;
- foreach (var wt in workerThreads) wt.Start(new Boxes.IntBox(wtId++));
+ foreach (var wt in workerThreads)
+ {
+ wt.Start(new Boxes.IntBox(wtId++)); /// Start worker threads !!!
+ }
}
}
@@ -743,7 +767,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
/// Worker thread
///
/// Thread ID (integer) wrapped into IntBox
- static void Worker(object threadData)
+ void Worker(object threadData)
{
int threadID = (threadData as Boxes.IntBox).Val;
@@ -821,24 +845,27 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
///
else if (wm == null) error = CommErr.CommFailed;
else if (currentActivity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(ReadCalibrationStr.ToLower())) error = ReadCalibration(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(ReadCalibrationV4Str.ToLower())) error = ReadCalibrationV4(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == ReadCalibrationStr.ToLower()) error = ReadCalibration(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == ReadCalibrationV4Str.ToLower()) error = ReadCalibrationV4(threadID, ihead, wm, ref resultStr);
else if (currentActivity.ToLower().Contains(WriteCalibrationFactorStr.ToLower())) error = WriteCalibrationFactor(threadID, ihead, wm, ref resultStr);
else if (currentActivity.ToLower().Contains(WriteCalibrationV4FactorsStr.ToLower())) error = WriteCalibrationV4Factors(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(NormalizeCalibrationFactorStr.ToLower())) error = NormalizeCalibrationFactor(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(NormalizeCalibrationV4FactorsStr.ToLower())) error = NormalizeCalibrationV4Factors(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(ReadQ2CorrectionStr.ToLower())) error = ReadQ2Correction(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(ResetQ2CorrectionStr.ToLower())) error = ResetQ2Correction(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(InitOrReadQ2CorrectionStr.ToLower())) error = InitOrReadQ2Correction(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(WriteQ2CorrectionStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard, null);
- else if (currentActivity.ToLower().Equals(WriteQ2CorrectionAltStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa, null);
+ else if (currentActivity.ToLower() == NormalizeCalibrationFactorStr.ToLower()) error = NormalizeCalibrationFactor(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == NormalizeCalibrationV4FactorsStr.ToLower()) error = NormalizeCalibrationV4Factors(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == ReadQ2CorrectionStr.ToLower()) error = ReadQ2Correction(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == ResetQ2CorrectionStr.ToLower()) error = ResetQ2Correction(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == WriteDefaultQ2CorrectionsStr.ToLower()) error = WriteDefaultQ2Corrections(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == InitOrReadQ2CorrectionsStr.ToLower()) error = InitOrReadQ2Corrections(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == WriteQ2CorrectionStr.ToLower()) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard, null);
+ else if (currentActivity.ToLower() == WriteQ2CorrectionAltStr.ToLower()) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa, null);
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece, currentActivity.Substring(WriteQ2CorrectionGreeceStr.Length).Trim());
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(WriteQ2CorrectionRLStr.Length).Trim());
else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(WriteQ2CorrectionLRStr.Length).Trim());
else if (currentActivity.ToLower().Contains(UpdateQ2CorrectionsStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Update, currentActivity.Substring(UpdateQ2CorrectionsStr.Length).Trim());
else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrectionsStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdate, currentActivity.Substring(ConditnlUpdateQ2CorrectionsStr.Length).Trim());
- else if (currentActivity.ToLower().Equals(Reset2HzCorrectionStr.ToLower())) error = Reset2HzCorrection(threadID, ihead, wm, ref resultStr);
- else if (currentActivity.ToLower().Equals(Write2HzCorrectionStr.ToLower())) error = Write2HzCorrection(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == Reset2HzCorrectionStr.ToLower()) error = Reset2HzCorrection(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == Write2HzCorrectionStr.ToLower()) error = Write2HzCorrection(threadID, ihead, wm, ref resultStr);
+ else if (currentActivity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) error = GetQ2PreCorrectionsFormRest(threadID, ihead, wm, ref resultStr);
+
#endif
else
{
@@ -1816,9 +1843,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
return error;
}
-
///
- /// Reset both Q2 correction factors in the memory to 0.
+ /// Reset both Q2 correction factors to 0.
/// Read them back to verify factors were written correctly.
///
/// Water meter object
@@ -1826,17 +1852,39 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
/// true on success
static CommErr ResetQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{
- return SetQ2Correction(threadId, ihead, wm, ref resultStr, 0, 0);
+ return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 0);
}
///
- /// Reset both Q2 correction factors in the memory to 0.
+ /// Set both Q2 correction factors to default values obtained by a REST service
+ /// Read them back to verify factors were written correctly.
+ ///
+ /// Water meter object
+ /// String passed to caller
+ /// true on success
+ static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ {
+ if (ihead.CommFailed) return CommErr.CommFailed;
+
+ if (TBF.BenchControl.Sequences.ProcessData.IsQ2PreCorrectionCalculated)
+ {
+ return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionLR,
+ TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionRL);
+ }
+ else
+ {
+ return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 0);
+ }
+ }
+
+ ///
+ /// Write both Q2 correction factors to given values.
/// Read them back to verify factors were written correctly.
///
/// Water meter object
/// String passed to caller
/// true on success
- static CommErr SetQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr, int factorLR, int factorRL)
+ static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr, int factorLR, int factorRL)
{
if (ihead.CommFailed) return CommErr.CommFailed;
@@ -1899,7 +1947,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
}
- static CommErr InitOrReadQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
@@ -1907,12 +1955,12 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
if (TBF.BenchControl.Sequences.ProcessData.IsQ2PreCorrectionCalculated)
{
- return SetQ2Correction(threadId, ihead, wm, ref resultStr, TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionLR,
- TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionRL);
+ return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionLR,
+ TBF.BenchControl.Sequences.ProcessData.CalculatedQ2PreCorrectionRL);
}
else
{
- return SetQ2Correction(threadId, ihead, wm, ref resultStr, ihead.Q2PreCorrectionLR, ihead.Q2PreCorrectionRL);
+ return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, ihead.Q2PreCorrectionLR, ihead.Q2PreCorrectionRL);
}
}
else
@@ -2458,6 +2506,26 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
return error;
}
+ static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
+ {
+ if (!ProcessData.IsQ2PreCorrectionCalculated)
+ {
+ ProcessData.IsQ2PreCorrectionCalculated = true;
+ commonWMType = ihead.WMType_ID;
+ bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, commonWMType,
+ out ProcessData.CalculatedQ2PreCorrectionLR,
+ out ProcessData.CalculatedQ2PreCorrectionRL);
+ }
+ else if (ihead.WMType_ID != commonWMType)
+ {
+ resultStr = string.Format("Different WZ_Typ: {0} ({1} expected)", ihead.WMType_ID, commonWMType);
+ return CommErr.WrongIPerlType;
+ }
+
+ resultStr = string.Format("Q2 pre-corrections: LR={0} RL={1}", ProcessData.CalculatedQ2PreCorrectionLR, ProcessData.CalculatedQ2PreCorrectionRL);
+ return CommErr.None;
+ }
+
#endif /// IPERL
#endregion
@@ -2702,7 +2770,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
private void checkBoxImage47_Click(object sender, EventArgs e) { ckbState[ckbIndex[46]] = checkBoxImage47.Checked; }
private void checkBoxImage48_Click(object sender, EventArgs e) { ckbState[ckbIndex[47]] = checkBoxImage48.Checked; }
-
+ ///
+ /// Get states of checkboxes as one bitfield (long)
+ ///
+ /// Long bitfield
private long GetCheckBoxStates()
{
long result = 0;
@@ -2713,6 +2784,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
return result;
}
+ ///
+ /// Set checkboxes to states stored in a bitfield (long)
+ ///
private void SetCheckBoxStates(long state)
{
CheckBoxImage[] chkBoxes = new CheckBoxImage[48]
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
index 2fa2c2216..5374ef622 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs
@@ -51,9 +51,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
retVal.Add(iPerlCommunicationForm.ReadCalibrationV4Str);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationV4FactorsStr);
+ retVal.Add(iPerlCommunicationForm.GetDefaultQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.ReadQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.ResetQ2CorrectionStr);
- retVal.Add(iPerlCommunicationForm.InitOrReadQ2CorrectionStr);
+ retVal.Add(iPerlCommunicationForm.WriteDefaultQ2CorrectionsStr);
+ retVal.Add(iPerlCommunicationForm.InitOrReadQ2CorrectionsStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationV4FactorsStr);
retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionStr);
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
index f546decf0..944c5bb52 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
@@ -1,10 +1,12 @@
///
-/// Copyright (c) 2015-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2015-2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
+using System.Drawing; /// Point definition
using log4net;
using Config.Entities;
+using RestClient;
using TBF.BenchControl.Sequences;
using TBF.Resources;
using TBF.UiBridge;
@@ -56,7 +58,58 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
const string Q2correctionCheckCmd = "q2 correction check ";
const string IperlCheckCmd = "iperl_check ";
- if (testParams.Activity.ToLower().Contains(Q2correctedFromCmd))
+ if (testParams.Activity.ToLower().Equals(iPerlCommunicationForm.GetDefaultQ2CorrectionsStr.ToLower()))
+ {
+ TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 });
+ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.JustStarted));
+ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.FlowSetting));
+
+ /// Get 'wmType' from IperlHead procedure parameters
+ int wmType = 0;
+ if (IperlHeads != null)
+ {
+ foreach (var ih in IperlHeads)
+ {
+ if (ih.WMType_ID > 0)
+ {
+ wmType = ih.WMType_ID;
+ break;
+ }
+ }
+ }
+
+ IsQ2PreCorrectionCalculated = GetQ2PreCorrectionsOrBackups(cfg, wmType, out CalculatedQ2PreCorrectionLR, out CalculatedQ2PreCorrectionRL);
+
+ /// Generate test results
+ Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(test.Name, 0);
+ if (tstRslt != null)
+ {
+ tstRslt.StartTime = DateTime.Now;
+ tstRslt.TestDone = true;
+ foreach (var wm in BatchRslts.Batch.WaterMeters)
+ {
+ if (!wm.Disabled)
+ {
+ foreach(var mtr in wm.MeterTestRslts)
+ {
+ if (mtr.TestRslt == tstRslt)
+ {
+ mtr.Passed = IsQ2PreCorrectionCalculated;
+ mtr.TestDone = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.Completed));
+ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(test.Name, 0)));
+ allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file
+
+ return new List { Event.Done };
+ }
+ else if (testParams.Activity.ToLower().Contains(Q2correctedFromCmd))
{
TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 });
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.JustStarted));
@@ -285,6 +338,114 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
return new List { Event.Done };
}
+ ///
+ /// Read default Q2 correction factors from a REST service (= Web service).
+ ///
+ /// iPerlCommunication component configuration
+ /// Water meter type (WZ Typ)
+ /// Default Q2 correction LR
+ /// Default Q2 correction RL
+ /// true when successful
+ static bool ReadCorrectionsFromWebService(TestMethodCfg cfg, int wmType, out int q2PreCorrectionLR, out int q2PreCorrectionRL)
+ {
+ if (wmType == 0)
+ {
+ /// No REST service call when wmType == 0, factors are 0
+ q2PreCorrectionLR = 0;
+ q2PreCorrectionRL = 0;
+ return true;
+ }
+
+ try
+ {
+ GetQ2PreCorrectionClient client = new GetQ2PreCorrectionClient(cfg.BaseUrl);
+ client.GetToken("ReadUser", "sensus", "https://sluprimadev/SensusCore/api/v1/Locations/1/Login2").Wait();
+ Q2PreCorrection response = client.GetQ2Correction(string.Format(cfg.RelativeUrl, wmType)).Result;
+ if (response != null && response.AreDataCalculated)
+ {
+ q2PreCorrectionLR = response.CorrLR;
+ q2PreCorrectionRL = response.CorrRL;
+ log.WarnFormat("Q2 corrections from a REST client for WM Type = {0} are: LR = {1}, RL = {2}", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+ return true;
+ }
+ else
+ {
+ log.ErrorFormat("Failed to obtain Q2 corrections from a REST client for WM Type = {0}", wmType);
+ q2PreCorrectionLR = 0;
+ q2PreCorrectionRL = 0;
+ return false;
+ }
+ }
+ catch (Exception exc)
+ {
+ log.ErrorFormat("Failed to obtain Q2 corrections from a REST client for WM Type = {0}: {1}", wmType, exc.Message);
+ q2PreCorrectionLR = 0;
+ q2PreCorrectionRL = 0;
+ return false;
+ }
+ }
+
+ ///
+ /// Obtain Q2 correction factors from a REST service or from local settings (stored backup values)
+ ///
+ /// iPerlCommunication component configuration
+ /// Water meter type (WZ Typ)
+ /// Default Q2 correction LR
+ /// Default Q2 correction RL
+ /// true when successful
+ public static bool GetQ2PreCorrectionsOrBackups(TestMethodCfg cfg, int wmType, out int q2PreCorrectionLR, out int q2PreCorrectionRL)
+ {
+ /// Get Q2 pre-correction values from REST service
+ bool restOK = ReadCorrectionsFromWebService(cfg, wmType, out q2PreCorrectionLR, out q2PreCorrectionRL);
+
+ /// Store / load Q2 pre-correction values
+ Point storedValue;
+ if (restOK)
+ {
+ /// Q2 pre-correction values were successfully obtained from a REST service for the specified wmType
+ if (!Program.LocalSettings.Q2PreCorrections.TryGetValue(wmType, out storedValue))
+ {
+ /// No Q2 pre-correction values in the dictionary for the specified wmType => save them
+ Program.LocalSettings.Q2PreCorrections.Add(wmType, new Point(q2PreCorrectionLR, q2PreCorrectionRL));
+ log.WarnFormat("Q2 corrections added to dictionary for WM Type = {0}: LR = {1}, RL = {2}", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+ }
+ else if (storedValue.X != q2PreCorrectionLR || storedValue.Y != q2PreCorrectionRL)
+ {
+ /// Different Q2 pre-correction values in the dictionary for the specified wmType => overwrite them with ones from the REST service
+ Program.LocalSettings.Q2PreCorrections[wmType] = new Point(q2PreCorrectionLR, q2PreCorrectionRL);
+ log.WarnFormat("Q2 corrections modified in dictionary for WM Type = {0}: LR = {1}, RL = {2}", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+ }
+ else
+ {
+ /// Q2 pre-correction values in the dictionary are the same and were not changed
+ log.WarnFormat("Q2 corrections in dictionary for WM Type = {0} are the same and were not changed", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+ }
+ }
+ else
+ {
+ /// No Q2 pre-correction values from a REST service => read the dictionary
+ if (Program.LocalSettings.Q2PreCorrections.TryGetValue(wmType, out storedValue))
+ {
+ /// Q2 pre-correction values successfully read from the dictionary
+ q2PreCorrectionLR = storedValue.X;
+ q2PreCorrectionRL = storedValue.Y;
+ log.WarnFormat("Q2 corrections loaded from dictionary for WM Type = {0}: LR = {1}, RL = {2}", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+ }
+ else
+ {
+ /// Q2 pre-correction values not found in the dictionary => use zeros
+ q2PreCorrectionLR = 0;
+ q2PreCorrectionRL = 0;
+ log.ErrorFormat("Q2 corrections not found in the dictionary for WM Type = {0}, using zeros", wmType, q2PreCorrectionLR, q2PreCorrectionRL);
+
+ /// Everything failed => using zero values
+ return false;
+ }
+ }
+
+ /// Q2 pre-corections were obtained from REST service or stored backup values were used
+ return true;
+ }
///
/// Virtually apply Q2 correction to a test used for the correction calculation.
diff --git a/TBF/LocalSettings.cs b/TBF/LocalSettings.cs
index 71b906787..130720216 100644
--- a/TBF/LocalSettings.cs
+++ b/TBF/LocalSettings.cs
@@ -2,6 +2,7 @@
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
///
using System;
+using System.Drawing;
using System.IO;
using System.Security.Cryptography;
using System.Text;
@@ -204,7 +205,7 @@ namespace TBF
/// iPerlCommunicationsForm
public int iPerlCommunicationsFormLeft;
public int iPerlCommunicationsFormTop;
- public long iPerlCommunicationsFormCheckboxes;
+ public long iPerlCommunicationsFormCheckboxes; /// Bit field with iPerlCommunicationForm checkboxes states
/// Serial numbers
public string[] LastSNTexts;
@@ -274,6 +275,9 @@ namespace TBF
public bool Graph8_On;
public GraphLib.PlotterGraphPaneEx.LayoutMode GraphsLayoutMode;
+ /// Backup values of Q2 pre-corrections from REST services (point.X = LR, point.Y = RL)
+ public TracingDB.SerializableDictionary Q2PreCorrections;
+
[XmlArrayAttribute("RsltsClmnWidths")]
public int[] RsltsClmnWidths;
[XmlIgnore]
@@ -290,6 +294,8 @@ namespace TBF
{
AlwaysAskPasswdWhenUnlocking = false;
RestoreUserWhenLeavingDialog = true;
+ Q2PreCorrections = new TracingDB.SerializableDictionary();
+
}
///
diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs
index 46ab94f3a..2f4c89c9e 100644
--- a/TBF/Properties/AssemblyInfo.cs
+++ b/TBF/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
-[assembly: AssemblyVersion("2.26.1453.0")]
-[assembly: AssemblyFileVersion("2.26.1453.0")]
+[assembly: AssemblyVersion("2.26.1456.0")]
+[assembly: AssemblyFileVersion("2.26.1456.0")]