From 8a0ae8080f2e6247c316a4ea20b37bc28a5bf868 Mon Sep 17 00:00:00 2001 From: Michal Buzik Date: Wed, 24 Sep 2025 11:57:47 +0200 Subject: [PATCH] refactor - completisation Smart Meter <= iPerl --- TBF.sln.DotSettings.user | 6 +- .../iPerlReaderUNI/IPerlReader.cs | 10 +- .../iPerlReaderUNI/IperlHeadTestCtrl.cs | 4 +- .../iPerlReaderUNI/TestMethodCfg.cs | 100 + .../comminication/CommCompletedEventArgs.cs | 40 + .../comminication/NfcServices.cs | 316 ++ .../comminication/RfidServices.cs | 126 + .../comminication/SimulationServices.cs | 62 + .../iPerlReaderUNI/test/OpticalHeadTest.cs | 26 +- .../test/iPerlCommunicationForm.cs | 2883 ------------- .../test/iPerlCommunicationForm.designer.cs | 2902 ------------- .../test/iPerlCommunicationForm.resx | 3577 ----------------- TBF/Rig/Sequences/ProcessData.cs | 28 + TBF/Rig/Sequences/iPerlCommunicationSeq.cs | 948 +++++ TBF/Rig/StateMachine.cs | 2 + .../SmartTest/SequenceConditionOp.cs | 32 + TBF/Rig/TestMethods/SmartTest/TestMethod.cs | 181 + .../SmartTest/TestMethodCfgCtrl.cs | 257 ++ .../SmartTest/TestMethodCfgCtrl.designer.cs | 520 +++ .../SmartTest/TestMethodCfgCtrl.resx | 120 + .../SmartTest/TestMethodFactory.cs | 25 + .../AllCompletedEventArgs.cs | 18 + .../CommCompletedEventArgs.cs | 41 + .../ISequenceConditionOp.cs | 6 +- .../iPerlCommunication/ISmartTestMethod.cs | 9 +- .../iPerlCommunication/ISmartWrapper.cs | 7 +- .../iPerlCommunication/SmartComponentBase.cs | 21 + .../iPerlCommunicationConstants.cs | 63 + .../iPerlCommunicationForm.cs | 281 +- .../iPerlCommunicationParams.cs | 203 + .../iPerlCommunication/iPerlDataWrite.cs | 26 + .../iPerlCommunication/iPerlEnums.cs | 34 + TBF/TBF.csproj | 47 +- 33 files changed, 3362 insertions(+), 9559 deletions(-) create mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/TestMethodCfg.cs create mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/CommCompletedEventArgs.cs create mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/NfcServices.cs create mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/RfidServices.cs create mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/SimulationServices.cs delete mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.cs delete mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.designer.cs delete mode 100644 TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.resx create mode 100644 TBF/Rig/Sequences/iPerlCommunicationSeq.cs create mode 100644 TBF/Rig/TestMethods/SmartTest/SequenceConditionOp.cs create mode 100644 TBF/Rig/TestMethods/SmartTest/TestMethod.cs create mode 100644 TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.cs create mode 100644 TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.designer.cs create mode 100644 TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.resx create mode 100644 TBF/Rig/TestMethods/SmartTest/TestMethodFactory.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/AllCompletedEventArgs.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/CommCompletedEventArgs.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/SmartComponentBase.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationConstants.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationParams.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlDataWrite.cs create mode 100644 TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlEnums.cs diff --git a/TBF.sln.DotSettings.user b/TBF.sln.DotSettings.user index 17a2cfa6e..397cc4c9c 100644 --- a/TBF.sln.DotSettings.user +++ b/TBF.sln.DotSettings.user @@ -1,4 +1,5 @@  + ForceIncluded ForceIncluded ForceIncluded True @@ -38,6 +39,8 @@ </SessionState> False False + False + True False @@ -58,7 +61,8 @@ True - True + False + True True False diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/IPerlReader.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/IPerlReader.cs index dd814836f..2df5119f1 100644 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/IPerlReader.cs +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/IPerlReader.cs @@ -22,7 +22,7 @@ using MeterType = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.MeterType namespace TBF.Rig.RegisterReaders.iPerlReaderUNI { /// - /// based on IperlHead class + /// based on IPerlReader class /// public class IPerlReader : ComponentBase, IDevice,IRegReaderDatastream, ISessionDataMngmnt, IOperation { @@ -491,13 +491,13 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI extraDataPath = Path.Combine(relativeDirectory, fileName); } - log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} raw data file = {3}", + log.WarnFormat("IPerlReader.Stop() startIx={0} endIx={1} len={2} raw data file = {3}", startIx, endIx, optoData.Length, fileName); } else #endif { - log.WarnFormat("IperlHead.Stop() startIx={0} endIx={1} len={2} no raw data file", startIx, endIx, optoData.Length); + log.WarnFormat("IPerlReader.Stop() startIx={0} endIx={1} len={2} no raw data file", startIx, endIx, optoData.Length); } if (TestStartTelegramIx == 0 || optoDataCount < 100) @@ -1287,13 +1287,13 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI /// Index to the buffer public static int BufferIdx(int index) { - if (index < IperlHead.OptoDataBufferSize) + if (index < IPerlReader.OptoDataBufferSize) { return index; } else { - return IperlHead.StartOptoDataCount + (index - IperlHead.OptoDataBufferSize) % IperlHead.EndOptoDataCount; + return IPerlReader.StartOptoDataCount + (index - IPerlReader.OptoDataBufferSize) % IPerlReader.EndOptoDataCount; } } diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/IperlHeadTestCtrl.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/IperlHeadTestCtrl.cs index 1fa55e9ae..d72908ad9 100644 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/IperlHeadTestCtrl.cs +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/IperlHeadTestCtrl.cs @@ -3,8 +3,8 @@ using System.Threading; using System.Web.UI.WebControls; using System.Windows.Forms; using TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication; +using TBF.Rig.RegisterReaders.iPerlReaderUNI.test; using TBF.Rig.Sequences; -using TBF.Rig.TestMethods.iPerlCommunication; namespace TBF.Rig.RegisterReaders.iPerlReaderUNI { @@ -26,7 +26,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI //TODO fix possibility set test method in config //iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default values for iPerlCommunication - foreach(var head in ProcessData.IperlHeads) + foreach(var head in ProcessData.IperlHeadsUni) { if (head != null && head.Name == config.Name) { _iPerlReader = head; } } diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/TestMethodCfg.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/TestMethodCfg.cs new file mode 100644 index 000000000..bd63e84a6 --- /dev/null +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/TestMethodCfg.cs @@ -0,0 +1,100 @@ +/// +/// Copyright (c) 2015-2021 Sensus Slovensko a.s. +/// +using System.Collections.Generic; +using System.IO.Ports; +using System.Xml.Serialization; +using Common; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.Rig.TestMethods.SmartTest; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; + +namespace TBF.Rig.RegisterReaders.iPerlReaderUNI +{ + public class TestMethodCfg : ComponentCfgBase, IComponentCfg + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TestMethodCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public IComponentCfgCtrl GetControl(IList cmpntEntities) { return new TestMethodCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int CommTimeout; /// Communication timeout in ms (500 .. 5000) + public int DelayBetweenRetries; /// Delay between communication retries in ms (0 .. 5000) + public int MaxCommRetries; /// Max. number of retries (1 .. 10) + public int WaitTimeAfterFailure; /// Wait time after communication failure in ms + public int PassThroughWaitTime; /// Pass Through wait time for radio parameters in ms + public int NrThreads; /// Numbwr of parallel threads (1, 2 or 4) + public int IperlCheckErrorsToStop; + + /// + /// NFC S4.5 Combihead params + /// + public int MciTimeoutMs; + public int BaudRate; + public int DataBits; + public Parity ParityBit; + public StopBits StopBits; + + public int DfltQ2c_15_rl; + public int DfltQ2c_15_lr; + public int DfltQ2c_20_rl; + public int DfltQ2c_20_lr; + public int DfltQ2c_25_63_rl; + public int DfltQ2c_25_63_lr; + public int DfltQ2c_25_10_rl; + public int DfltQ2c_25_10_lr; + public int DfltQ2c_32_rl; + public int DfltQ2c_32_lr; + public int DfltQ2c_40_rl; + public int DfltQ2c_40_lr; + + public bool UseWebService; + public string BaseUrl; + public string RelativeUrl; + + /// Test parameters + [XmlIgnore] + public iPerlCommunicationParams TestParams; + public override IParamsProvider GetRuntimeTestParamsProvider() { return TestParams; } + public override IParamsProvider CreateTestParamsProvider() { return new iPerlCommunicationParams(true); } + public override IParamsProvider GetUITestParamsProvider(Test test) + { + return (test.Method == Name) ? base.GetUITestParamsProvider(test) : null; + } + + /// Private parameterless constructor invoked by all other (public) constructors + TestMethodCfg() + { + Name = "iPerlCommunication"; + ParentName = string.Empty; + CommTimeout = 1800; /// ms + MaxCommRetries = 4; + WaitTimeAfterFailure = 2200; + PassThroughWaitTime = 1500; + NrThreads = 2; /// 1, 2 or 4 threads + IperlCheckErrorsToStop = 10; + MciTimeoutMs = 4000; // ms, NFC interface + BaudRate = 57600; // NFC Interface + DataBits = 8; // NFC Interface + ParityBit = Parity.None; // NFC Interface + StopBits = StopBits.Two; // NFC Interface + + TestParams = CreateTestParamsProvider() as iPerlCommunicationParams; + } + + public TestMethodCfg(IComponentFactory factory) + : this() + { + this.Factory = factory; + } + + public string ToString(int i) + { + return string.Format("Name={0}, CommTimeout={1}, MaxRetries={2}, NrThreads={3}", Name, CommTimeout, MaxCommRetries, NrThreads); + } + } +} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/CommCompletedEventArgs.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/CommCompletedEventArgs.cs new file mode 100644 index 000000000..b301acc1e --- /dev/null +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/CommCompletedEventArgs.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2015-2019 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; + +namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication +{ + public class CommCompletedEventArgs : EventArgs + { + public int ThreadId; + public int WMNr0; /// 0-based water meter position + public IPerlReader Ihead; + public Results.Entities.WaterMeter Wm; + public string CommMessage; + public CommErr CommErr; + + public CommCompletedEventArgs(int threadId, int wmNr0, IPerlReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) + { + this.ThreadId = threadId; + this.WMNr0 = wmNr0; + this.Ihead = ihead; + this.Wm = wm; + this.CommMessage = commMessage; + this.CommErr = commErr; + } + + public override string ToString() + { + return string.Format("Thread={0} WMNr0={1} IHead={2} WM={3} CommMsg={4} CommErr={5}", + ThreadId, + WMNr0, + (Ihead != null) ? Ihead.Name : "null", + Wm.WMPosition, + (CommMessage != null) ? CommMessage : "null", + CommErr); + } + } +} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/NfcServices.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/NfcServices.cs new file mode 100644 index 000000000..fa36e4559 --- /dev/null +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/NfcServices.cs @@ -0,0 +1,316 @@ +using log4net; +using Sensus.iPerl.NfcHandler; +using Sensus.iPerl.RfidCom.Exceptions; +using System; +using System.Globalization; +using System.Text; +using System.Threading; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; + +namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication +{ + internal class NfcServices + { + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + internal static int ReadRequest(TestMethodCfg cfg, IPerlReader iperlHead, MCI_Protocol.StructName structName, int offset, int length, out byte[] buffer) + { + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + + NfcDataHandler _nfcDataHandler = new NfcDataHandler(); + MessageEventHandlers(_nfcDataHandler); + CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader); + ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device); + MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol); + NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config); + try + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length}"); + OpenConnection(_nfcDataHandler, cfg, iperlHead); + + buffer = MciRead(_nfcDataHandler, cfg, structName, (ushort)offset, length); + _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference + + CloseComPort(_nfcDataHandler); + + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length} ; Response= {ByteArrayToHexString(buffer)} ; Error: {_nfcDataHandler.LastErrorMessage}"); + + if (_nfcDataHandler.LastErrorCode != 0) + { + throw new RfidValidationException(_nfcDataHandler.LastErrorMessage); + } + + return Convert.ToInt32(_nfcDataHandler.LastErrorCode); //return 0; + } + catch (RfidValidationException) + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + catch (Exception ex) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} ReadRequest Error: {ex.Message}"); + buffer = new byte[length]; + return 3; + } + } + buffer = new byte[length]; + return 3; + } + + internal static int WriteRequest(TestMethodCfg cfg, IPerlReader iperlHead, MCI_Protocol.StructName structName, int offset, int length, byte[] buffer) + { + NfcDataHandler _nfcDataHandler = new NfcDataHandler(); + MessageEventHandlers(_nfcDataHandler); + CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader); + ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device); + MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol); + NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config); + try + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} WriteRequest : {structName}, {offset}, {length}, {ByteArrayToHexString(buffer)}"); + OpenConnection(_nfcDataHandler, cfg, iperlHead); + + MciWrite(_nfcDataHandler, cfg, structName, (ushort)offset, length, buffer); + _nfcDataHandler.RFProtocolOFF(); // turn off rf antenna due to possible interference + + CloseComPort(_nfcDataHandler); + return 0; + } + catch (Exception ex) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} WriteRequest Error: {ex.Message}"); + return 3; + } + } + + private static void OpenConnection(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, IPerlReader iperlHead) + { + string comPort = $"COM{iperlHead.RfidComPortNr}"; + int retryCount = 0 ; + Open: + nfcDataHandler.Close(); + Thread.Sleep(100); + if (nfcDataHandler.OpenConnection(comPort, cfg.BaudRate, cfg.DataBits, cfg.ParityBit, cfg.StopBits)) + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Port Open"); + + if (nfcDataHandler.ConnectReader()) + { + rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Reader connected"); + if (!nfcDataHandler.ConnectDevice()) + { + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect device."); + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + if (nfcDataHandler.Echo()) break; + } + } + } + else + { + retryCount++; + rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect reader. Reconnect comport {retryCount}"); + if (retryCount < cfg.MaxCommRetries) + { + nfcDataHandler.Close(); + iperlHead.ResetNfcInterface(); // reset NFC head via optoport - switch to RFID and back to NFC interface + goto Open; + } + } + } + else + rfidDataLogger.Error($"Open NFC COM{iperlHead.RfidComPortNr} Port Failed"); + } + + private static void CloseComPort(NfcDataHandler nfcDataHandler) + { + nfcDataHandler.Close(); + } + + private static byte[] MciRead(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, StructName structName, ushort offset, int length) + { + bool isReadValues = false; + int retryCount = 0; + Read: + try + { + isReadValues = false; + long num1 = (long)length; + int timeoutMs = 4000; + byte payloadlength = Convert.ToByte(num1.ToString("X2"), 16); + if (nfcDataHandler.MCI_Read(structName, offset, payloadlength, timeoutMs)) + { + byte[] lastData = nfcDataHandler.LastData; + if ((long)lastData.Length >= num1) + { + rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}"); + return lastData; + } + else + rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}"); + } + else if (nfcDataHandler.LastErrorCode == (byte)0) + { + rfidDataLogger.Info($"MCI Error: Unidentified"); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + else + { + rfidDataLogger.Info("Last error message: " + nfcDataHandler.LastErrorMessage); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + } + catch (Exception ex) + { + rfidDataLogger.Error("MciRead Last error message: " + ex.Message); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Read; + } + return new byte[length]; + } + + private static void MciWrite(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, MCI_Protocol.StructName structName, ushort offset, int length, byte[] payload) + { + int retryCount = 0; + Write: + try + { + long num1 = (long)length; + int timeoutMs = 4000; + byte payloadlength = Convert.ToByte(num1); + if ((int)payloadlength != payload.Length) + rfidDataLogger.Error("Insufficient Payload -- Payload lenth : " + (object)payload.Length); + else if (nfcDataHandler.MCI_Write(structName, offset, payloadlength, payload, timeoutMs)) + { + // OK + } + else if (nfcDataHandler.LastErrorCode > (byte)0) + { + rfidDataLogger.Error("Last error message: " + nfcDataHandler.LastErrorMessage); + //int num2 = (int)MessageBox.Show(this._nfcDataHandler.LastErrorMessage); + } + } + catch (Exception ex) + { + rfidDataLogger.Error("MciWrite error message: " + ex.Message); + retryCount++; + if (retryCount < cfg.MaxCommRetries) + goto Write; + } + } + + private static void MciWriteCommand(NfcDataHandler nfcDataHandler, byte commandcode) + { + try + { + ushort offset = 0; + int timeoutMs = 4000; + byte payloadlength = 1; + byte[] payload = new byte[1] { commandcode }; + if (nfcDataHandler.MCI_Write(MCI_Protocol.StructName.Command, offset, payloadlength, payload, timeoutMs) || nfcDataHandler.LastErrorCode <= (byte)0) + return; + rfidDataLogger.Error("MciWriteCommand Last error message: " + nfcDataHandler.LastErrorMessage); + } + catch (Exception ex) + { + rfidDataLogger.Error("MciWriteCommand Last error message: " + ex.Message); + } + } + + public static string ByteArrayToHexString(byte[] data) + { + StringBuilder stringBuilder = new StringBuilder(); + foreach (byte num in data) + stringBuilder.Append(num.ToString("X2")); + return stringBuilder.ToString(); + } + + private static byte[] BuildPayLoad(string strPayLoad, int length) + { + byte[] collection; + + if (strPayLoad.Split(':').Length > 1) + { + uint timestamp = ConvertDateTimeToTimestamp(Convert.ToDateTime(DateTime.ParseExact(strPayLoad, "HH:mm:ss dd/MM/yyyy", (IFormatProvider)CultureInfo.InvariantCulture))); + byte[] bytes = BitConverter.GetBytes(timestamp); + return bytes; + } + else if (strPayLoad.Split(',').Length > 1) + { + string[] strArray = strPayLoad.Split(','); + collection = new byte[strArray.Length]; + for (int index3 = 0; index3 < strArray.Length; ++index3) + collection[index3] = Convert.ToByte(strArray[index3], 16); + return collection; + } + else + { + //int num = strPayLoad.Split(',').Length; + collection = HexStringToByteArray(strPayLoad.Substring(strPayLoad.Length - length * 2).ToUpper()); + Array.Reverse((Array)collection); + return collection; + } + } + + public static byte[] HexStringToByteArray(string hexString) + { + int length = hexString.Length; + byte[] byteArray = new byte[length / 2]; + for (int startIndex = 0; startIndex < length; startIndex += 2) + byteArray[startIndex / 2] = Convert.ToByte(hexString.Substring(startIndex, 2), 16); + return byteArray; + } + + private static uint ConvertDateTimeToTimestamp(DateTime datetime) + { + TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); + return (uint)((datetime - new DateTime(2000, 1, 1, 0, 0, 0).ToLocalTime()).TotalSeconds + utcOffset.TotalSeconds); + } + + #region EventHandlers + public static void MCI_MessageEventHandlers(MCI_Protocol e) + { + DelNfc_MCI_MessageHandler mciMessageHandler = new DelNfc_MCI_MessageHandler(OnHandler); + e.MessageEvent += mciMessageHandler; + } + + public static void ST25DV_MessageEventHandlers(ST25DV_Device e) + { + DelNfc_ST25DV_MessageHandler dvMessageHandler = new DelNfc_ST25DV_MessageHandler(OnHandler); + e.MessageEvent += dvMessageHandler; + } + + public static void CR95HF_MessageEventHandlers(CR95HF_Reader e) + { + DelNfc_CR95HF_MessageHandler hfMessageHandler = new DelNfc_CR95HF_MessageHandler(OnHandler); + e.MessageEvent += hfMessageHandler; + } + + public static void NFCHeadConfig_MessageEventHandlers(NFCHeadConfig e) + { + DelNfc_NFCHeadConfig_MessageHandler configMessageHandler = new DelNfc_NFCHeadConfig_MessageHandler(OnHandler); + e.MessageEvent += configMessageHandler; + } + + public static void MessageEventHandlers(NfcDataHandler e) + { + DelNfcMessageHandler nfcMessageHandler = new DelNfcMessageHandler(OnHandler); + e.MessageEvent += nfcMessageHandler; + } + + public static void OnHandler(object sender, NfcMessageEventArgs e) + { + if (e.Message == null) + return; + string message = e.Message.Replace("\n", " ").Replace("\r", ""); + rfidDataLogger.Debug(message); + } + #endregion + } +} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/RfidServices.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/RfidServices.cs new file mode 100644 index 000000000..6ba09a108 --- /dev/null +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/RfidServices.cs @@ -0,0 +1,126 @@ +using Sensus.iPerl.RfidCom.Exceptions; +using Sensus.iPerl.RfidCom.Helper; +using Sensus.iPerl.RfidCom; +using System; +using System.Text.RegularExpressions; +using System.Threading; +using log4net; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; +using static TBF.Rig.Uni.SharedDialogs.iPerlCommunication.iPerlCommunicationForm; + + +namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication +{ + internal class RfidServices + { + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm)); + + internal static int ReadRequest(TestMethodCfg cfg, IPerlReader iperlHead, MessageID messageID, int offset, int length, out byte[] buffer) + { + for (int i = 0; i < cfg.MaxCommRetries; i++) + { + rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} reading: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},{offset}, {length}... timeout {cfg.CommTimeout})"); + using (RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}")) + { + try + { + byte[] response = writer.ReadRequest((byte)messageID, offset, length, cfg.CommTimeout); + string hexString = RfidHelper.ConvertByteArrayToHexString(response); + string swapHexString = RfidHelper.SwapHexcode(hexString); + string decString = RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(hexString)).ToString(); + + if (length > 10) + { + //if the result only contains "00"s we are working on the wrong COM port + // or the module just isn't connected + if (Regex.IsMatch(hexString, @"^(00)\1+$")) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No RFID signal."); + throw new RfidValidationException("Error_Rfid_NoSignal"); + } + + //if the result only contains "03"s the meter did not answer. + // Might be due to the module being positioned incorrectly. + if (Regex.IsMatch(hexString, @"^(03)\1+$")) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No meter signal."); + throw new RfidValidationException("Error_Rfid_NoAnswerFromMeter"); + } + } + + writer.ClosePort(); + buffer = response; + rfidDataLogger.Info($"{iperlHead.Name} ({iperlHead.SerialNr}): ReadRequestPort(COM{iperlHead.RfidComPortNr},...) returned HEX: {hexString}; SwapHexCodeToDecimal: {decString}"); + return 0; + } + catch (RfidDataNotAvailableException) + { + if (/*RfidHelper.IsPassThrough(messageID)*/ messageID == MessageID.ASICRegisterReadTest || messageID == MessageID.RadioPassthrough) + { + rfidDataLogger.Info($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {(i > 0 ? "<- Error: Invalid Pass-Through data." : "<- Info: Wait for Pass-Through data.")}"); + Thread.Sleep(cfg.PassThroughWaitTime); + } + else + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + } + catch (RfidValidationException) + { + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + catch (Exception ex) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {ex.Message}"); + Thread.Sleep(cfg.WaitTimeAfterFailure); + } + } + } + rfidDataLogger.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)"); + log.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)"); + buffer = new byte[length]; + return 3; + } + + internal static int WriteRequest(TestMethodCfg cfg, IPerlReader iperlHead, MessageID messageID, int offset, int length, byte[] buffer) + { + RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}"); + string payload = RfidHelper.ConvertByteArrayToHexString(buffer); + + for (var i = 0; i < cfg.MaxCommRetries; i++) + { + rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} writting: COM{iperlHead.RfidComPortNr}: WriteRequest ({messageID},{offset}, {length}, {payload}... timeout {cfg.CommTimeout})"); + try + { + if (writer.ClosePort()) writer.OpenPort(); + writer.WriteRequest((byte)messageID, offset, length, buffer, cfg.CommTimeout, false); + writer.ClosePort(); + rfidDataLogger.InfoFormat($"{iperlHead.Name}({iperlHead.SerialNr},COM{iperlHead.RfidComPortNr}): WriteRequestPort({messageID}, {offset}, {length}, {payload})"); + return 0; + } + catch (Exception ex) + { + if (messageID == MessageID.RadioPassthrough || messageID == MessageID.ASICRegisterReadTest) + { + Thread.Sleep(1500); + } + else + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Error: {ex.Message}"); + Thread.Sleep(cfg.WaitTimeAfterFailure); + if (i > 1) + { + rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Reopen the com port."); + writer.ClosePort(); + } + } + } + } + writer.ClosePort(); + rfidDataLogger.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}"); + log.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}"); + return 2; + } + } +} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/SimulationServices.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/SimulationServices.cs new file mode 100644 index 000000000..f9717828f --- /dev/null +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/comminication/SimulationServices.cs @@ -0,0 +1,62 @@ +using System; +using System.Linq; + +namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication +{ + internal class SimulationServices + { + const int Q2CorrFactorsAddr = Uni.SharedDialogs.iPerlCommunication.iPerlCommunicationConstants.Q2CorrFactorsAddr; + + internal static int ReadRequest(IPerlReader iperlHead, MessageID messageID, int offset, int length, out byte[] buffer) + { + byte[] configurationBuffer = new byte[ConfigStruct.Length] { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + byte[] calibrationBuffer = new byte[CalibrationStructV4.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 150, 10 }; + buffer = new byte[length]; + + if (messageID == MessageID.Configuration) + { + Array.Copy(GetPCB(iperlHead), 0, configurationBuffer, 16, 5); // set PCB Number according to iPerlHead configuration + Array.Copy(configurationBuffer,offset,buffer,0,length); + } + else if (messageID == MessageID.Calibration) + { + Array.Copy(calibrationBuffer, offset, buffer, 0, length); + } + else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2)) + { + buffer = new byte[2] { 0, 0 }; + } + else + { + buffer = new byte[length]; + } + + return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13 + } + + internal static int WriteRequest(TestMethodCfg cfg, IPerlReader iperlHead, MessageID messageID, int offset, + int length, byte[] buffer) + { + return 0; + } + + private static Array GetPCB(IPerlReader iperlHead) + { + string pcbStr = iperlHead.RfidComPortNr.ToString().PadRight(10,'0') + iperlHead.Position.ToString("D2"); + long decVal = Convert.ToInt64(pcbStr); + string nHexStr = decVal.ToString("X4"); + + string hexStr = ""; + for (int a = nHexStr.Length; a >= 1; a = a - 2) + { + hexStr = hexStr + nHexStr.Substring(a - 2, 2); + } + + return Enumerable.Range(0, hexStr.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(hexStr.Substring(x, 2), 16)) + .ToArray(); + + } + } +} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/OpticalHeadTest.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/OpticalHeadTest.cs index 3116d301a..fc4e1db05 100644 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/OpticalHeadTest.cs +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/OpticalHeadTest.cs @@ -1,27 +1,25 @@ using Config.Resources; using log4net; using Sensus.iPerl.RfidCom.Helper; -using Sensus.iPerl.RfidCom.Services; -using Sensus.iPerl.RfidCom.Structures; using System; -using System.Threading; -using TBF.Rig.Hart.Common; -using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; using static Sensus.iPerl.NfcHandler.MCI_Protocol; +using TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication; + namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test { internal class OpticalHeadTest { protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); - internal static string OpenSealing(IperlHead iHead) + internal static string OpenSealing(IPerlReader iHead) { if (RfidCommands.OpenSealing($"COM{iHead.RfidComPortNr}")) return "OK"; return "Error Open Sealing"; } - internal static string ReadRequest_PCB(IperlHead iHead) + internal static string ReadRequest_PCB(IPerlReader iHead) { try { @@ -40,7 +38,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test } } - internal static string SetActiveMode(IperlHead iHead) + internal static string SetActiveMode(IPerlReader iHead) { byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd)) @@ -53,7 +51,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test } } - internal static string SetTestMode(IperlHead iHead) + internal static string SetTestMode(IPerlReader iHead) { byte[] cmd = new byte[1] { (byte)Command.SetTestMode }; if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd)) @@ -67,7 +65,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test } #if IPERL - internal static string TurnOffRadio(IperlHead iHead) + internal static string TurnOffRadio(IPerlReader iHead) { try { @@ -80,7 +78,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test } } - internal static string SetProductionMode(IperlHead iHead) + internal static string SetProductionMode(IPerlReader iHead) { try { @@ -93,7 +91,7 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test } } - internal static string WriteRequestPort_u8_Customer_Text(IperlHead iHead) + internal static string WriteRequestPort_u8_Customer_Text(IPerlReader iHead) { string custText = "FF0123456789ABCDEF"; // Sample text to test write function /*try @@ -113,14 +111,14 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test return $"Error COM{iHead.RfidComPortNr}"; } - internal static string SetRfidMode(IperlHead iHead) + internal static string SetRfidMode(IPerlReader iHead) { iHead.SetRfidInterface(); iHead.SetCommunicationInterface(CommunicationInterface.RFID); return ($"OK - {Strings.Program_restart_is_required_to_apply_some_settings}"); } - internal static string SetNfcMode(IperlHead iHead) + internal static string SetNfcMode(IPerlReader iHead) { iHead.SetNfcInterface(); iHead.SetCommunicationInterface(CommunicationInterface.NFC); diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.cs deleted file mode 100644 index 65f16e382..000000000 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.cs +++ /dev/null @@ -1,2883 +0,0 @@ -/// -/// Copyright (c) 2015-2023 Sensus Slovensko a.s. -/// -//#define VERIFY_ACTIVE_MODE -//#define VERIFY_Q2_CORR_RESET - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Threading; -using System.Windows.Forms; -using log4net; -using Common; -using Config.Entities; -using TBF.Resources; -using TBF.Rig.Sequences; -using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; -using Results.Entities; -using static Sensus.iPerl.NfcHandler.MCI_Protocol; -using System.Threading.Tasks; - -namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test -{ - public enum CommErr - { - None = 0, - CommFailed, /// 1 - OpenPort, /// 2 - Read, /// 3 - Read1, /// 4 - Read2, /// 5 - Read3, /// 6 - Read4, /// 7 - Write, /// 8 - ReadAfterWrite, /// 9 - CmdActive, /// 0AH = 10 - CmdTest, /// 0BH = 11 - Verify, /// 0CH = 12 - WrongIPerlType, /// 0DH = 13 - OutOfRange, /// 0EH = 14 - Q2OutOfRange, /// 0FH = 15 - MissingTest, /// 10H = 16 - RFPowerRecordMissing, /// 11H = 17 - HeadDisabledByUser, /// 12H = 18 - WrongArguments, /// 13H = 19 - } - - - public partial class iPerlCommunicationForm : Form, GenericDevices.IHasCompleted - { - private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm)); - protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); - - const int Hz2CorrFactorsAddr = 0x1875; /// Used by Reset2HzCorrection(...) and Write2HzCorrection(...) - const int Q2CorrFactorsAddr = 0x1878; /// Used by ResetQ2Correction(...) and WriteQ2Correction(...) - const int Q2CorrFactorsAddrLR = 0x1878; - const int Q2CorrFactorsAddrRL = 0x1879; - - public const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled" - public const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig' - public const string SetActiveModeStr = "Set Active mode"; - public const string ReadCalibrationStr = "Read calibration"; - public const string ReadCalibrationV4Str = "Read calibration_V4"; - public const string WriteCalibrationFactorStr = "Write calibration factor"; - 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 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 - public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name - public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name - public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name - public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments - public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments - public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name - public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name - public const string Reset2HzCorrectionStr = "Reset 2Hz correction"; - public const string Write2HzCorrectionStr = "Write 2Hz correction"; - public const string DewaReworkRLStr = "DEWA rework R-L"; - public const string DewaReworkLRStr = "DEWA rework L-R"; - public const string StartTestingSealedMetersStr = "Start testing sealed meters"; - public const string EndTestingSealedMetersStr = "End testing sealed meters"; - public const string SimulateCmd = "simulate "; - - public static Color DisabledColor = Color.DarkGray; - public static Color OptoAndDirOKColor = Color.Green; - public static Color OptoNokColor = Color.Orange; - public static Color DirNokColor = Color.Red; - - - #region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort - /// - /// Wrapper function with safe interface and unsafe body - /// - /// Water meter (iPerlHead) object - /// Value returned by readRequestPort(...) - public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer) - { - Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); - if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; - - if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation - { - return SimulationServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer); - } - - if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface - { - return NfcServices.ReadRequest(cfg, iperlHead, structName, offset, length, out buffer); - } - else // RFID Interface - { - return RfidServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer); - } - } - - /// - /// Wrapper function with safe interface and unsafe body - /// - /// Water meter (iPerlHead) object - /// Value returned by writeRequestPort(...) - public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer) - { - Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); - if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; - - if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation - { - return SimulationServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer); - } - - if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface - { - return NfcServices.WriteRequest(cfg, iperlHead, structName, offset, length, buffer); - } - else // RFID Interface - { - return RfidServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer); - } - } - #endregion iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort - - - readonly bool checkBoxesEditMode; - - DateTime startTime; - int startTimeSec; - - - // Set to 'true' when the form closes - public bool Completed { get { return formCompleted; } } - bool formCompleted; - - bool forcedClose; /// Set in the forced close handler - - - /// Number of text boxes for serial numbers - public int WaterMetersCount; - - const int MaxTextBoxesCount = 48; - int textBoxesCount; - - Label[] labels; - PictureBox[] counters; - TextBox[] messages; - CheckBoxImage[] checkBoxes; - static int[] ckbIndex; - static bool[] ckbState; - - static IList iperlHeads; - static IList waterMeterPositions0; /// keeps original 0-based indices in RegisterReaders list - static int commonWMType; - - - /// - /// RFID multiplexer PCB / RFID serial port and worker thread related variables - /// - static TestMethod testMethod; - public static TestMethodCfg cfg; - static IList tests; - static IList multiTestParams; - - - static int currentActivityStep; - static int currentGroup; /// form -> worker thread (0 = none) - static int lastGroup; - static int completedCommCount; /// Number of completed communication steps - - static IList workerThreads; - static IList muxBrdOrGroup14Nrs; - static bool stopWorkerThreads; /// form -> worker thread - - - /// Parameterless constructor (without watermeters, threads) - public iPerlCommunicationForm() - { - InitializeComponent(); - } - - /// - /// Constructor for checkBox states (active/inactive iPerl head) editing. - /// - /// Initial check box states - public iPerlCommunicationForm(bool isCheckBoxesEditMode) - : this() - { - iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default iPerl Head communication params - if (isCheckBoxesEditMode) - { - checkBoxesEditMode = true; - saveButton.Visible = true; - activityLabel.Text = Strings.Optical_heads; - ShuffleTextBoxes(ProcessData.WMsCount, ProcessData.LineSize); - -#if IPERL - ContextMenu cm = new ContextMenu(); - cm.MenuItems.Add(NewMenuItem("Read PCB Number" , "ReadPCB")); - cm.MenuItems.Add(NewMenuItem("Enter Test Mode" , "StartTestMode")); - cm.MenuItems.Add(NewMenuItem("Turn Off Test Mode (Enter Active Mode)", "TurnOffTestMode")); - cm.MenuItems.Add(NewMenuItem("Set Production Mode (Radio not start with flow)" , "SetProductionMode")); - cm.MenuItems.Add(NewMenuItem("Turn Off Radio" , "TurnOffRadio")); - cm.MenuItems.Add(NewMenuItem($"Set RFID mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetRFID")); - cm.MenuItems.Add(NewMenuItem($"Set NFC mode ({Strings.Program_restart_is_required_to_apply_some_settings})" , "SetNFC")); - /*if (Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser) - { - //cm.MenuItems.Add(NewMenuItem("Test WriteRequestPort (u8_Customer_Text)", "WriteRequestPort_u8_Customer_Text")); - cm.MenuItems.Add(NewMenuItem("Open sealing", "OpenSealing")); - }*/ - this.ContextMenu = cm; -#endif - } - } - - - /// - /// Constructor for one iPerlCommunication 'test' - /// - /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethod testMethod, Test test, iPerlCommunicationParams testParams) - : this(testMethod, new List { test }, new List { testParams }) - { - } - - /// - /// Constructor for multiple iPerlCommunication 'tests' - /// - /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethod testMethod, IList tests, IList multiTestParams) - : this() - { - checkBoxesEditMode = false; - - iPerlCommunicationForm.testMethod = testMethod; - iPerlCommunicationForm.cfg = testMethod.Cfg as TestMethodCfg; - iPerlCommunicationForm.tests = tests; - iPerlCommunicationForm.multiTestParams = multiTestParams; - - if (multiTestParams.Count > 0) - { - 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; - } - } - } - - PrepareForTestsActivities(); - } - - - void PrepareForTestsActivities() - { - startTime = DateTime.Now; - startTimeSec = StateMachine.Time; - - /// Attach to 'CommCompleted' handler - CommCompletedHandler += delegate(object sender, CommCompletedEventArgs args) - { - if (InvokeRequired) - { - Invoke(new EventHandler(DoOnCommCompleted), sender, args); - } - else DoOnCommCompleted(sender, args); - }; - - /// Attach to 'AllCompleted' handler - AllCompletedHandler += delegate(object sender, AllCompletedEventArgs args) - { - if (InvokeRequired) - { - Invoke(new EventHandler(DoOnAllCompleted), sender, args); - } - else DoOnAllCompleted(sender, args); - }; - - formCompleted = false; - StartForceCloseHandler(); - - - iperlHeads = new List(); - waterMeterPositions0 = new List(); - /// - for (int wmPos = 0; wmPos < ProcessData.RegisterReaders.Length; wmPos++) - { - IperlHead iperlHead = ProcessData.RegisterReaders[wmPos] as IperlHead; - - if (iperlHead != null) - { - iperlHeads.Add(iperlHead); - waterMeterPositions0.Add(wmPos); - } - } - - WaterMetersCount = iperlHeads.Count; - ShuffleTextBoxes(WaterMetersCount, ProcessData.LineSize); - - /// - /// Prepare worker threads, 'rfidPortNrs', 'lastGroup', etc.. - /// - currentActivityStep = 0; - currentGroup = 0; - completedCommCount = 0; - stopWorkerThreads = false; - - /// group numbers are >=1, lastGroup == 0 means there is no group - lastGroup = 0; - foreach (var iPerl in iPerlCommunicationForm.iperlHeads) - { - if (iPerl.Group > lastGroup) lastGroup = iPerl.Group; - } - - workerThreads = new List(); - for (int i = 0; i < cfg.NrThreads; i++) - { - Thread thread = new Thread(Worker); - thread.CurrentCulture = CultureInfo.CurrentCulture; - thread.CurrentUICulture = CultureInfo.CurrentUICulture; - workerThreads.Add(thread); - } - - muxBrdOrGroup14Nrs = new List(); - foreach (var iPerl in iPerlCommunicationForm.iperlHeads) - { - if (!muxBrdOrGroup14Nrs.Contains(iPerl.MuxBoardNrOrGroup14)) muxBrdOrGroup14Nrs.Add(iPerl.MuxBoardNrOrGroup14); - } - - log.WarnFormat("nrThreads = {0}", workerThreads.Count); - } - - /// - /// Make sure the layout of labels/text boxes on the screen - /// corresponds to the layout of watermeters of the test bench. - /// - /// Number of watermeters - /// Number of watermeters in one line - void ShuffleTextBoxes(int wmsCount, int lineSize) - { - labels = new Label[MaxTextBoxesCount] - { - wmLabel1, wmLabel2, wmLabel3, wmLabel4, wmLabel5, wmLabel6, wmLabel7, wmLabel8, wmLabel9, wmLabel10, - wmLabel11, wmLabel12, wmLabel13, wmLabel14, wmLabel15, wmLabel16, wmLabel17, wmLabel18, wmLabel19, wmLabel20, - wmLabel21, wmLabel22, wmLabel23, wmLabel24, wmLabel25, wmLabel26, wmLabel27, wmLabel28, wmLabel29, wmLabel30, - wmLabel31, wmLabel32, wmLabel33, wmLabel34, wmLabel35, wmLabel36, wmLabel37, wmLabel38, wmLabel39, wmLabel40, - wmLabel41, wmLabel42, wmLabel43, wmLabel44, wmLabel45, wmLabel46, wmLabel47, wmLabel48, - }; - counters = new PictureBox[MaxTextBoxesCount] - { - pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, pictureBox7, pictureBox8, pictureBox9, pictureBox10, - pictureBox11, pictureBox12, pictureBox13, pictureBox14, pictureBox15, pictureBox16, pictureBox17, pictureBox18, pictureBox19, pictureBox20, - pictureBox21, pictureBox22, pictureBox23, pictureBox24, pictureBox25, pictureBox26, pictureBox27, pictureBox28, pictureBox29, pictureBox30, - pictureBox31, pictureBox32, pictureBox33, pictureBox34, pictureBox35, pictureBox36, pictureBox37, pictureBox38, pictureBox39, pictureBox40, - pictureBox41, pictureBox42, pictureBox43, pictureBox44, pictureBox45, pictureBox46, pictureBox47, pictureBox48, - }; - messages = new TextBox[MaxTextBoxesCount] - { - wmTextBox1, wmTextBox2, wmTextBox3, wmTextBox4, wmTextBox5, wmTextBox6, wmTextBox7, wmTextBox8, wmTextBox9, wmTextBox10, - wmTextBox11, wmTextBox12, wmTextBox13, wmTextBox14, wmTextBox15, wmTextBox16, wmTextBox17, wmTextBox18, wmTextBox19, wmTextBox20, - wmTextBox21, wmTextBox22, wmTextBox23, wmTextBox24, wmTextBox25, wmTextBox26, wmTextBox27, wmTextBox28, wmTextBox29, wmTextBox30, - wmTextBox31, wmTextBox32, wmTextBox33, wmTextBox34, wmTextBox35, wmTextBox36, wmTextBox37, wmTextBox38, wmTextBox39, wmTextBox40, - wmTextBox41, wmTextBox42, wmTextBox43, wmTextBox44, wmTextBox45, wmTextBox46, wmTextBox47, wmTextBox48, - }; - checkBoxes = new CheckBoxImage[MaxTextBoxesCount] - { - checkBoxImage1, checkBoxImage2, checkBoxImage3, checkBoxImage4, checkBoxImage5, checkBoxImage6, checkBoxImage7, checkBoxImage8, checkBoxImage9, checkBoxImage10, - checkBoxImage11, checkBoxImage12, checkBoxImage13, checkBoxImage14, checkBoxImage15, checkBoxImage16, checkBoxImage17, checkBoxImage18, checkBoxImage19, checkBoxImage20, - checkBoxImage21, checkBoxImage22, checkBoxImage23, checkBoxImage24, checkBoxImage25, checkBoxImage26, checkBoxImage27, checkBoxImage28, checkBoxImage29, checkBoxImage30, - checkBoxImage31, checkBoxImage32, checkBoxImage33, checkBoxImage34, checkBoxImage35, checkBoxImage36, checkBoxImage37, checkBoxImage38, checkBoxImage39, checkBoxImage40, - checkBoxImage41, checkBoxImage42, checkBoxImage43, checkBoxImage44, checkBoxImage45, checkBoxImage46, checkBoxImage47, checkBoxImage48, - }; - ckbIndex = new int[MaxTextBoxesCount]; - ckbState = new bool[MaxTextBoxesCount]; - - - textBoxesCount = MaxTextBoxesCount; - /// - if (wmsCount < textBoxesCount && lineSize > 0) - { - int nrLines = (wmsCount + lineSize - 1) / lineSize; - int gap = (textBoxesCount - wmsCount) / nrLines; - - for (int i = 0; i < ckbIndex.Length; i++) - { - ckbIndex[i] = -1; /// Initialize with invalid indices - } - - int dest = 0; - for (int l = 0; l < nrLines; l++) - { - for (int i = 0; i < lineSize; i++) - { - int origin = l * lineSize + l * gap + i; - labels[dest] = labels[origin]; - counters[dest] = counters[origin]; - messages[dest] = messages[origin]; - checkBoxes[dest] = checkBoxes[origin]; - ckbIndex[origin] = dest; - dest++; - } - } - - textBoxesCount = wmsCount; - } - - int count = checkBoxesEditMode ? textBoxesCount : Math.Min(textBoxesCount, iperlHeads.Count); - for (int j = 0; j < count; j++) - { - labels[j].Text = (j + 1).ToString(); - } - - ResizeDlgToFitEnabledControls(); - } - - void ResizeDlgToFitEnabledControls() - { - int xMax = 0; - int yMax = 0; - for (int i = 0; i < textBoxesCount; i++) - { - if (messages[i].Left + messages[i].Width > xMax) xMax = messages[i].Left + messages[i].Width; - if (messages[i].Top + messages[i].Height > yMax) yMax = messages[i].Top + messages[i].Height; - } - Width = xMax + 50; - Height = yMax + 60; - } - - - void Localize() - { - Text = checkBoxesEditMode ? Strings.Optical_heads : Strings.Water_Meter_States; - saveButton.Text = Strings.Save; - - sampleLabel1.Text = Strings.Direction_and_pulses_are_OK; - sampleLabel2.Text = Strings.There_are_no_opto_pulses; - sampleLabel3.Text = Strings.Direction_is_NOK; - - samplePictureBox1.BackColor = OptoAndDirOKColor; - samplePictureBox2.BackColor = OptoNokColor; - samplePictureBox3.BackColor = DirNokColor; - } - - - private void iPerlCommunicationForm_Load(object sender, EventArgs e) - { - Localize(); - - if (checkBoxesEditMode) - { - /// Check box edit mode => Hide explanation of activity colours - sampleLabel1.Visible = false; - sampleLabel2.Visible = false; - sampleLabel3.Visible = false; - samplePictureBox1.Visible = false; - samplePictureBox2.Visible = false; - samplePictureBox3.Visible = false; - } - - /// - /// 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 = "---"; - } - } - - /// - /// 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; - SetCheckBoxStates(ls.OptoHeadsEnabled); - - 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; - } - - /// Start communication process by incrementing 'currentGroup'. - currentGroup++; - - int wtId = 0; - foreach (var wt in workerThreads) - { - wt.Start(new Boxes.IntBox(wtId++)); /// Start worker threads !!! - } - } - } - - - private void NormalClose() - { - CommCompletedHandler = null; - AllCompletedHandler = null; - - if (multiTestParams != null && - multiTestParams.Count > 0 && - !multiTestParams[0].SimultWithNext) /// RFID Communication at the end of the cycle does not influence the result - { - UpdateRfidCommResult(tests); /// TODO: Pass the test info in a correct way - } - - long checkboxStates = GetCheckBoxStates(); - if (Program.LocalSettings.iPerlCommunicationsFormLeft != Location.X || - Program.LocalSettings.iPerlCommunicationsFormTop != Location.Y || - Program.LocalSettings.OptoHeadsEnabled != checkboxStates) - { - /// Update local settings - Program.LocalSettings.iPerlCommunicationsFormLeft = Location.X; - Program.LocalSettings.iPerlCommunicationsFormTop = Location.Y; - Program.LocalSettings.OptoHeadsEnabled = checkboxStates; - Program.LocalSettings.Save(); - } - - formCompleted = true; - - DialogResult = DialogResult.OK; - Close(); - } - - - #region Forced close handling - - public void StartForceCloseHandler() - { - UiBridge.Bridge.CloseModelessFormHandler += delegate(object sender, EventArgs args) - { - if (InvokeRequired) { Invoke(new EventHandler(OnForceClose), sender, args); } - else OnForceClose(sender, args); - }; - } - - void OnForceClose(object sender, EventArgs args) - { - CommCompletedHandler = null; - AllCompletedHandler = null; - - stopWorkerThreads = true; - forcedClose = true; - - DialogResult = DialogResult.Cancel; - Close(); - } - - #endregion - - - /// - /// Worker thread - /// - /// Thread ID (integer) wrapped into IntBox - void Worker(object threadData) - { - int threadID = (threadData as Boxes.IntBox).Val; - - int activityStep = 0; /// activity step > 0 in case multiTestParams are used - - for (int i = 0; i < multiTestParams.Count; i++ ) - { - Test currentTest = tests[i]; - iPerlCommunicationParams currentTestParams = multiTestParams[i]; - string currentActivity = currentTestParams.Activity; /// Current activity - - TBF.UiBridge.TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 10, 0, 140, 0, 0, 0 }); - TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.JustStarted)); - - - if (threadID == 0) - { - /// Check whether previous activity was 'Set test mode A0' or 'A4' - if (i > 0 && multiTestParams[i - 1].Activity.ToLower().Contains(SetTestModeStr.ToLower()) && !multiTestParams[i - 1].Activity.Contains("80")) - { - /// Start processing of opto-datastreams from all iPERL-s - int count = 0; - for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) - { - WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0) - ? ProcessData.BatchRslts.Batch.WaterMeters[wmNr0] : null; - - IperlHead ihead = iperlHeads[wmNr0]; - - if (ihead != null && wm != null && !wm.Disabled) - { - lock (ihead) - { - ihead.StartDataStreamProcessing(); - count++; - } - } - } - log.WarnFormat("End of activity '{0}', StartDataStreamProcessing() of {1} heads was called.", multiTestParams[i - 1].Activity, count); - } - - /// A new activity starts - information into RFID data log - rfidDataLogger.InfoFormat(""); - rfidDataLogger.WarnFormat("Activity = {0}", currentActivity); - rfidDataLogger.InfoFormat(""); - } - - for (int group = 1; group <= lastGroup; group++) - { - /// Synchronize with QuidoRS and other threads - while (((group != currentGroup) || (activityStep != currentActivityStep)) && !stopWorkerThreads) - { - Thread.Sleep(50); - } - - if (stopWorkerThreads) break; - -#if TURA_SPECIAL - int threadIx = threadID; /// Just one thread for TURA_SPECIAL -#else - for (int threadIx = threadID; threadIx < threadID + 4; threadIx += cfg.NrThreads) -#endif - { - bool wmFound = false; - - for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) - { - IperlHead ihead = iperlHeads[wmNr0]; - if ((ihead.Group == group) && (threadIx < muxBrdOrGroup14Nrs.Count) && (ihead.MuxBoardNrOrGroup14 == muxBrdOrGroup14Nrs[threadIx])) - { - wmFound = true; - - WaterMeter wm = null; - if (ProcessData.BatchRslts.Batch.WaterMeters != null) - { - foreach (var w in ProcessData.BatchRslts.Batch.WaterMeters) - { - if (w.WMPosition == wmNr0 + 1) - { - wm = w; - break; - } - } - } - - CommErr error; - string resultStr = string.Empty; - - /// - /// RFID communication activity call - /// - if ((ihead == null) || ihead.Disabled || !ckbState[wmNr0]) error = CommErr.HeadDisabledByUser; -#if IPERL - else if (currentActivity.ToLower().Contains(SetTestModeStr.ToLower())) error = SetTestMode(threadID, ihead, ref resultStr); - else if (currentActivity.ToLower().Equals(SetActiveModeStr.ToLower())) error = SetActiveMode(threadID, ihead, ref resultStr); - /// - /// RFID communication functions below require a reference to water meter entity (wm != null) - /// - else if (wm == null) error = CommErr.CommFailed; - else if (currentActivity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(ihead, wm, ref resultStr); - else if (currentActivity.ToLower() == ReadCalibrationStr.ToLower()) error = ReadCalibration(ihead, wm, ref resultStr); - else if (currentActivity.ToLower() == ReadCalibrationV4Str.ToLower()) error = ReadCalibrationV4(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() == 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 = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionAltStr.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa, null); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece, currentActivity.Substring(WriteQ2CorrectionGreeceStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(WriteQ2CorrectionRLStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(WriteQ2CorrectionLRStr.Length).Trim()); - else if (currentActivity.ToLower() == WriteQ2CorrectionIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionPlusIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_plus_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionPlusAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_plus_incl_05, null); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL_incl_05, currentActivity.Substring(WriteQ2CorrectionRLIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR_incl_05, currentActivity.Substring(WriteQ2CorrectionLRIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestRLOnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestRLDir, null); - else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestLROnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestLRDir, null); - else if (currentActivity.ToLower().Contains(UpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Update, currentActivity.Substring(UpdateQ2CorrectionsStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdate, currentActivity.Substring(ConditnlUpdateQ2CorrectionsStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateRL, currentActivity.Substring(ConditnlUpdateQ2CorrRLStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateLR, currentActivity.Substring(ConditnlUpdateQ2CorrLRStr.Length).Trim()); - 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); - else if (currentActivity.ToLower() == DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr); - else if (currentActivity.ToLower() == DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr); - else if (currentActivity.ToLower().Contains(StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr); - else if (currentActivity.ToLower().Contains(EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr); - else if (currentActivity.ToLower().Contains(SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr); -#endif - else - { - error = CommErr.None; - - ConditionID id = ConditionID.Count; -#if IPERL - for (id = ConditionID.A; id < ConditionID.Count; id++) - { - if (currentActivity.ToLower() == string.Format(SequenceConditionOp.ConditionNameFmt, id).ToLower()) - { - error = SetIperlCommMilestoneReached(testMethod, id, ref resultStr); - break; - } - } -#endif - if (id == ConditionID.Count) - { - resultStr = "Invalid activity"; /// No activity or milestone - } - } - - /// - /// Process the result of RFID communication activity - /// - if (error == CommErr.HeadDisabledByUser || !ckbState[wmNr0]) - { - OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, Strings.Head_was_disabled_by_the_user, CommErr.HeadDisabledByUser)); - } - else if (error == CommErr.None) - { - OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, CommErr.None)); - } - else if ((error == CommErr.OutOfRange) || (error == CommErr.Q2OutOfRange)) - { - OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, CommErr.CommFailed)); - } - else if (ihead.CommFailed || (error == CommErr.CommFailed)) - { - ihead.CommFailed = true; - - if (wm != null && (wm.ResultCode & (int)Results.Entities.ResultCode.RfidErrorCodeMask) == 0) - { - wm.ResultCode |= (((int)error << 16) | ((int)tests[i].ItemNr << 20)); - } - - OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, Strings.RFID_communication_failed, error)); - } - else - { - ihead.CommFailed = true; - - if (wm != null && (wm.ResultCode & (int)Results.Entities.ResultCode.RfidErrorCodeMask) == 0) - { - wm.ResultCode |= (((int)error << 16) | ((int)tests[i].ItemNr << 20)); - } - - string failureCauseLocal = string.Format(Strings.failed_0_1_exclamation, currentActivity, error); - rfidDataLogger.ErrorFormat("Group={0}, Board={1}, {2}", currentGroup, ihead.MuxBoardNrOrGroup14, failureCauseLocal); - - OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, failureCauseLocal, error)); - } - - break; - } - - TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.FlowSetting)); - } - - if (!wmFound) - { - OnCommCompleted(null, new CommCompletedEventArgs(threadID, -1, null, null, string.Empty, CommErr.None)); /// Send negative wmNr - } - - if (stopWorkerThreads) break; - } - - if (stopWorkerThreads) break; - } /// for (int group - - TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.Completed)); - activityStep++; - - if (stopWorkerThreads) break; - } - } - - #region Communication functions - -#if IPERL - - /// - /// Read a complete configuration structure of the watermeter - /// - /// iPERL head object - /// Water meter object - /// String passed to caller - /// true on success - static CommErr ReadConfiguration(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - /// - /// The activity is "Read configuration" (this enables the watermeter, resets error flag) - /// or "Read configuration if enabled" (this keeps the error flag). - /// - if (!multiTestParams[currentActivityStep].Activity.ToLower().Contains(" if enabled")) - { - ihead.CommFailed = false; - } - - if (ihead.CommFailed) return CommErr.CommFailed; - - ihead.ConfigStruct = null; /// Clear previous ConfigStruct, avoid reuse of (not anymore valid) PCB Number - - CommErr error = CommErr.Read; - int readRetVal = 0; - - /// Read configuration - byte[] config = null; - readRetVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config); - if (readRetVal == 0) - { - error = CommErr.None; - ihead.ConfigStruct = ConfigStruct.FromByteArray(config); - resultStr = ihead.ConfigStruct.ToString(1); - } - - return error + Math.Max(0, Math.Min(readRetVal, 4)); - } - - - /// - /// Set the watermeter to the test mode. - /// If testModeConfig is specified as a hexadeximal number appended to "set test mode ", it is verified - /// whether the testModeConfig is correctly set, if necessary it is changed to the specified value. - /// Read a part of configuration afterwards to verify the mode was set correctly. - /// - /// Thread ID passed to RFID communication functions - /// iPERL head object - /// String passed to caller - /// true on success - static CommErr SetTestMode(int threadId, IperlHead ihead, ref string resultStr) - { - if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; - - Byte testModeConfig = 0xA0; /// Default value - /// - if (multiTestParams[currentActivityStep].Activity.Length > SetTestModeStr.Length) - { - string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(SetTestModeStr.Length + 1); - UInt16 byteVal; - if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255) - { - testModeConfig = (Byte)byteVal; /// Update with specified value - } - } - - if (ihead.ConfigStruct.MeterState == MeterState.Test && ihead.ConfigStruct.TestModeConfig == testModeConfig) - { - /// Already in the correct test mode - resultStr = "Already " + ihead.ConfigStruct.ToString(1); - return CommErr.None; - } - - /// Communication necessary - CommErr error = CommErr.None; - - if (error==CommErr.None && (ihead.ConfigStruct.TestModeConfig != testModeConfig) && (ihead.ConfigStruct.MeterState != MeterState.Active)) - { - /// Switch to Active mode in order to change TestModeConfig - error = CommErr.CmdActive; - byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; - if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) - { - error = CommErr.None; - } - - /// Delay min. 250 ms - Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); - } - - if (error == CommErr.None && (ihead.ConfigStruct.TestModeConfig != testModeConfig)) - { - /// Change the TestModeConfig if necessary - error = CommErr.Write; - byte[] tstMdCfg = new byte[1] { testModeConfig }; - if (0 == WriteRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 21, 1, tstMdCfg)) - { - ihead.ConfigStruct.Update(21, tstMdCfg); - error = CommErr.None; - } - - /// Delay min. 250 ms - Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); - } - - if (error == CommErr.None) - { - /// Switch to test mode - error = CommErr.CmdTest; - byte[] cmd = new byte[1] { (byte)Command.SetTestMode }; - if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) - { - error = CommErr.None; - } - - /// Delay min. 250 ms - Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); - } - - /// Now the meter should be in the Test mode ... verify - if (error == CommErr.None) - { - /// Verify the configuration - Thread.Sleep(2000); // RFID: 1000 ms is enough, NFC needs min 2000 ms - error = CommErr.Verify; - byte[] config = null; - int retVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config); - if (0 == retVal) - { - ihead.ConfigStruct = ConfigStruct.FromByteArray(config); - if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig)) - { - error = CommErr.None; - resultStr = ihead.ConfigStruct.ToString(1); - } - } - } - - return error; - } - - - /// - /// Set the watermeter to the active mode. - /// Read a part of configuration afterwards to verify the mode was set correctly. - /// - /// iPERL head object - /// String passed to caller - /// true on success - static CommErr SetActiveMode(int threadId, IperlHead ihead, ref string resultStr) - { - CommErr error = CommErr.CmdActive; - - /// Switch to active mode - byte[] cmd = new byte[1] { (byte)Command.SetActiveMode }; - if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd)) - { - error = CommErr.None; - } - -#if VERIFY_ACTIVE_MODE - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read configuration - byte[] cfg_0_3 = null; - if (ihead.ConfigStruct == null) - { - if (0 == ReadRequestPort(threadId, ihead, MessageID.Configuration, 0, 4, out cfg_0_3)) - { - ihead.ConfigStruct.Update(0, cfg_0_3); - if (ihead.ConfigStruct.MeterState == MeterState.Active) - { - error = CommErr.None; - resultStr = ihead.ConfigStruct.ToString(1); - } - } - } - } -#else - if (error == CommErr.None) - { - if (ihead.ConfigStruct == null) - resultStr = "OK (Config not available)"; - else - resultStr = ihead.ConfigStruct.ToString(1); - } -#endif - - return error; - } - - - /// - /// Read a complete calibration structure from the watermeter - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr ReadCalibration(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Read; - int readRetVal = 0; - - /// Read calibration - byte[] calib = null; - readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStruct.Length, out calib); - if (readRetVal == 0) - { - ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib); - - if (wm.OrigCalibFactor == 0) - { - wm.OrigCalibFactor = ihead.CalibrationStruct.Calibration; - wm.FWVersion = ihead.CalibrationStruct.FWVersionStr(); - } - - resultStr = ihead.CalibrationStruct.ToString(); - error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; - } - - return error + Math.Max(0, Math.Min(readRetVal, 4)); - } - - - /// - /// Read a complete calibration structure from the watermeter - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr ReadCalibrationV4(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Read; - int readRetVal = 0; - - /// Read calibration - byte[] calib = null; - readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStructV4.Length, out calib); - if (readRetVal == 0) - { - ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib); - - if ((wm.OrigCalibFactor == 0) && (wm.OrigCalibFactorLNA == 0)) - { - wm.OrigCalibFactor = ihead.CalibrationStructV4.Calibration; - wm.OrigCalibFactorLNA = ihead.CalibrationStructV4.CalibrationLNA; - wm.FWVersion = ihead.CalibrationStructV4.FWVersionStr(); - } - - resultStr = ihead.CalibrationStructV4.ToString(); - error = ihead.VerifyIPerlType() ? CommErr.None : CommErr.WrongIPerlType; - } - - return error + Math.Max(0, Math.Min(readRetVal, 4)); - } - - - /// - /// Write the calculated calibration factor to the water meter. - /// Read a part of CalibrationStruct afterwards to verify factor was written correctly. - /// - /// Thread ID - /// IperlHead object - /// Water meter object - /// String passed to caller - /// true on success - static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; - - /// - /// Parse calibration factor (1 argument) or calibration factor limits (2 arguments) - /// - UInt16 newCalibFactor = 0; - if (multiTestParams[currentActivityStep].Activity.Length > WriteCalibrationFactorStr.Length) - { - UInt16 factorLimitLo; - UInt16 factorLimitHi; - UInt16 val; - - string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(WriteCalibrationFactorStr.Length + 1); - string[] arguments = calibFactrorStr.Split(new char[] { ' ' }); - - if (arguments.Length >= 2 && - UInt16.TryParse(arguments[0], out factorLimitLo) && factorLimitLo > 0 && - UInt16.TryParse(arguments[1], out factorLimitHi) && factorLimitHi > 0) - { - /// - /// Lower and upper limits for the calibration factor are specified as iPerlCommunication activity arguments - /// - if (ihead.LastTestResult == null || !ihead.LastTestResult.TestDone) return CommErr.MissingTest; - - newCalibFactor = ihead.CalculateNewCalibFactor(ihead.LastTestResult, ihead.CalibFactor, factorLimitLo, factorLimitHi); - } - else if (arguments.Length == 1 && UInt16.TryParse(arguments[0], out val) && val > 0) - { - /// - /// Calibration factor value is specified as an iPerlCommunication activity argument - /// - newCalibFactor = val; /// Update with specified value - } - else if (arguments.Length == 1 && wm.GetTestData(arguments[0]) != null) - { - /// - /// Adjustment test name is specified as an iPerlCommunication activity argument - /// - Results.Entities.TestData adjustTestData = wm.GetTestData(arguments[0]); - Results.Entities.MeterTestRslt adjustTestRslt; - if (adjustTestData == null) - { - return CommErr.MissingTest; - } - else if (adjustTestData.Repeats == 1) - { - /// Find a test result if Repeats == 1 - adjustTestRslt = wm.GetMeterTestRslt(arguments[0]); - - if (adjustTestRslt == null || !adjustTestRslt.TestDone) return CommErr.MissingTest; - } - else - { - /// Calculate a summarized test result if Repeats > 1 - adjustTestRslt = new Results.Entities.MeterTestRslt(); - for (int i = 1; i <= adjustTestData.Repeats; i++) - { - Results.Entities.MeterTestRslt oneMTR = wm.GetMeterTestRslt(Utils.TestTitle(adjustTestData, i)); - if (oneMTR == null || !oneMTR.TestDone) return CommErr.MissingTest; - - adjustTestRslt.VolumeMeter += oneMTR.VolumeMeter; - adjustTestRslt.VolumeRef += oneMTR.VolumeRef; - } - } - - newCalibFactor = ihead.CalculateNewCalibFactor(adjustTestRslt, ihead.CalibFactor, ihead.FactorLimitLo, ihead.FactorLimitHi); - } - else - { - /// - /// Otherwise the last test is supposed to be an adjustment test - /// - if (ihead.LastTestResult == null || !ihead.LastTestResult.TestDone) return CommErr.MissingTest; - - newCalibFactor = ihead.CalculateNewCalibFactor(ihead.LastTestResult, ihead.CalibFactor, ihead.FactorLimitLo, ihead.FactorLimitHi); - } - } - else - { - /// - /// No iPerlCommunication activity arguments --> The last test is supposed to be an adjustment test - /// - if (ihead.LastTestResult == null || !ihead.LastTestResult.TestDone) return CommErr.MissingTest; - - newCalibFactor = ihead.CalculateNewCalibFactor(ihead.LastTestResult, ihead.CalibFactor, ihead.FactorLimitLo, ihead.FactorLimitHi); - } - - if (newCalibFactor == 0) return CommErr.OutOfRange; - - /// - /// Start communication with iPerl - /// - CommErr error; - byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) }; - /// - /// Write the new calibration factor (up to cfg.MaxCommRetries tims) - /// - error = CommErr.Write; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) - { - /// - /// Read and verify the calibration factor - /// - error = CommErr.ReadAfterWrite; - byte[] calib_2_3 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) - { - error = CommErr.Verify; - if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1]) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(data, 2); - wm.CalibFactor = newCalibFactor; - resultStr = ihead.CalibrationStruct.ToString(); - } - } - } - - ihead.CalibrationStruct.Update(data, 2); - - return error; - } - - - /// - /// Write the calculated calibration factor to the water meter. - /// Read a part of CalibrationStruct afterwards to verify factor was written correctly. - /// - /// Thread ID - /// IperlHead object - /// Water meter object - /// String passed to caller - /// true on success - static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; - - /// - /// Parse calibration factor (1 argument) or calibration factor limits (2 arguments) - /// - UInt16 newCalibFactor = 0; - UInt16 newCalibFactorLNA = 0; - if (multiTestParams[currentActivityStep].Activity.Length > WriteCalibrationV4FactorsStr.Length) - { - UInt16 factorLimitLo = 0; - UInt16 factorLimitHi = 0; - UInt16 lnaFactorLimitLo = 0; - UInt16 lnaFactorLimitHi = 0; - Results.Entities.TestData adjustTestData = null; - Results.Entities.TestData lnaAdjustTestData = null; - Results.Entities.MeterTestRslt adjustTestRslt = null; - Results.Entities.MeterTestRslt lnaAdjustTestRslt = null; - - string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(WriteCalibrationV4FactorsStr.Length + 1); - string[] arguments = calibFactrorStr.Split(new char[] { ' ' }); - - if (arguments.Length == 6) - { - if (!wm.TryGetTestData(arguments[0], out adjustTestData) || - !UInt16.TryParse(arguments[1], out factorLimitLo) || factorLimitLo <= 0 && - !UInt16.TryParse(arguments[2], out factorLimitHi) || factorLimitHi <= 0 && - !wm.TryGetTestData(arguments[3], out lnaAdjustTestData) || - !UInt16.TryParse(arguments[4], out lnaFactorLimitLo) || lnaFactorLimitLo <= 0 && - !UInt16.TryParse(arguments[5], out lnaFactorLimitHi) || lnaFactorLimitHi <= 0) - { - return CommErr.WrongArguments; - } - else - { - adjustTestRslt = GetAverageTestRslt(wm, adjustTestData); - lnaAdjustTestRslt = GetAverageTestRslt(wm, lnaAdjustTestData); - - if ((adjustTestRslt == null) || (lnaAdjustTestRslt == null)) - { - return CommErr.MissingTest; - } - - newCalibFactor = ihead.CalculateNewCalibFactor(adjustTestRslt, ihead.CalibFactor, factorLimitLo, factorLimitHi); - newCalibFactorLNA = ihead.CalculateNewCalibFactor(lnaAdjustTestRslt, ihead.CalibFactorLNA, lnaFactorLimitLo, lnaFactorLimitHi); - } - } - else if (arguments.Length == 4) - { - if (!wm.TryGetTestData(arguments[0], out adjustTestData) || - !wm.TryGetTestData(arguments[1], out lnaAdjustTestData) || - !UInt16.TryParse(arguments[2], out lnaFactorLimitLo) || lnaFactorLimitLo <= 0 && - !UInt16.TryParse(arguments[3], out lnaFactorLimitHi) || lnaFactorLimitHi <= 0) - { - return CommErr.WrongArguments; - } - else - { - factorLimitLo = ihead.FactorLimitLo; - factorLimitHi = ihead.FactorLimitHi; - - adjustTestRslt = GetAverageTestRslt(wm, adjustTestData); - lnaAdjustTestRslt = GetAverageTestRslt(wm, lnaAdjustTestData); - - if ((adjustTestRslt == null) || (lnaAdjustTestRslt == null)) - { - return CommErr.MissingTest; - } - - newCalibFactor = ihead.CalculateNewCalibFactor(adjustTestRslt, ihead.CalibFactor, factorLimitLo, factorLimitHi); - newCalibFactorLNA = ihead.CalculateNewCalibFactor(lnaAdjustTestRslt, ihead.CalibFactorLNA, lnaFactorLimitLo, lnaFactorLimitHi); - } - } - else if (arguments.Length == 2) - { - if (!wm.TryGetTestData(arguments[0], out adjustTestData) || - !wm.TryGetTestData(arguments[1], out lnaAdjustTestData)) - { - return CommErr.WrongArguments; - } - else - { - factorLimitLo = ihead.FactorLimitLo; - factorLimitHi = ihead.FactorLimitHi; - lnaFactorLimitLo = ihead.FactorLimitLo; - lnaFactorLimitHi = ihead.FactorLimitHi; - - adjustTestRslt = GetAverageTestRslt(wm, adjustTestData); - lnaAdjustTestRslt = GetAverageTestRslt(wm, lnaAdjustTestData); - - if ((adjustTestRslt == null) || (lnaAdjustTestRslt == null)) - { - return CommErr.MissingTest; - } - - newCalibFactor = ihead.CalculateNewCalibFactor(adjustTestRslt, ihead.CalibFactor, factorLimitLo, factorLimitHi); - newCalibFactorLNA = ihead.CalculateNewCalibFactor(lnaAdjustTestRslt, ihead.CalibFactorLNA, lnaFactorLimitLo, lnaFactorLimitHi); - } - } - else - { - return CommErr.WrongArguments; - } - } - else - { - return CommErr.WrongArguments; - } - - if (newCalibFactor == 0 || newCalibFactorLNA == 0) return CommErr.OutOfRange; - - /// - /// Start communication with iPerl - /// - CommErr error; - byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) }; - byte[] dataLNA = new byte[2] { (byte)(newCalibFactorLNA & 0x00FF), (byte)((newCalibFactorLNA >> 8) & 0x00FF) }; - /// - /// Write the new calibration factor (up to cfg.MaxCommRetries tims) - /// - error = CommErr.Write; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data) && - 0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, dataLNA)) - { - /// - /// Read and verify the calibration factor - /// - error = CommErr.ReadAfterWrite; - byte[] calib_2_3 = null; - byte[] calib_34_35 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3) && - 0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, out calib_34_35)) - { - error = CommErr.Verify; - if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] && - calib_34_35 != null && calib_34_35.Length == 2 && dataLNA[0] == calib_34_35[0] && dataLNA[1] == calib_34_35[1]) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(data, 2); - ihead.CalibrationStructV4.Update(dataLNA, 34); - wm.CalibFactor = newCalibFactor; - wm.CalibFactorLNA = newCalibFactorLNA; - resultStr = ihead.CalibrationStructV4.ToString(); - } - } - } - - ihead.CalibrationStructV4.Update(data, 2); - ihead.CalibrationStructV4.Update(dataLNA, 34); - - return error; - } - - - /// - /// Get averaged meter test result using test name and repetitions from a given test data. - /// - /// Water meter - /// TestData (name and repetitions) - /// (1) selected MeterTestRslt or (2) average of repeated MTR-s or (3) null when at least one MTR is missing - static Results.Entities.MeterTestRslt GetAverageTestRslt(WaterMeter wm, Results.Entities.TestData testData) - { - Results.Entities.MeterTestRslt avgTestRslt; - - if (testData.Repeats > 1) - { - /// Calculate a summarized test result if Repeats > 1 - avgTestRslt = new Results.Entities.MeterTestRslt(); - for (int i = 1; i <= testData.Repeats; i++) - { - Results.Entities.MeterTestRslt oneMTR = wm.GetMeterTestRslt(Utils.TestTitle(testData, i)); - if (oneMTR == null || !oneMTR.TestDone) return null; - - avgTestRslt.VolumeMeter += oneMTR.VolumeMeter; - avgTestRslt.VolumeRef += oneMTR.VolumeRef; - } - } - else - { - avgTestRslt = wm.GetMeterTestRslt(Utils.TestTitle(testData, 1)); - if (avgTestRslt == null || !avgTestRslt.TestDone) return null; - } - - return avgTestRslt; - } - - /// - /// Normalize calibration factor in case ti is close to value 8000. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; - - if (ihead.FactorLimitLo <= ihead.CalibFactor && ihead.CalibFactor <= ihead.FactorLimitHi) - { - resultStr = "Calibration factor is OK"; - return CommErr.None; /// No need to update the calibration factor - } - - CommErr error = CommErr.Write; - - /// Determine the new calibration factor - UInt16 defaultCalibFactor; - switch (ihead.CalibrationStruct.MeterType) - { - case MeterType.DN15: - defaultCalibFactor = 2710; - break; - case MeterType.DN20: - defaultCalibFactor = 3746; - break; - case MeterType.DN25: - defaultCalibFactor = 3300; - break; - case MeterType.DN32: - defaultCalibFactor = 2500; - break; - case MeterType.DN40: - defaultCalibFactor = 3080; - break; - case MeterType.DN25_Q3_10: - case MeterType.CoaxManifold: - default: - defaultCalibFactor = 3040; - break; - } - - byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) }; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(data, 2); - } - - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] calib_2_3 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) - { - error = CommErr.None; - ihead.CalibrationStruct.Update(calib_2_3, 2); - resultStr = ihead.CalibrationStruct.ToString(); - } - } - - return error; - } - - - /// - /// Normalize calibration factor in case ti is close to value 8000. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; - - if (ihead.FactorLimitLo <= ihead.CalibFactor && ihead.CalibFactor <= ihead.FactorLimitHi) - { - resultStr = "Calibratin factor is OK"; - return CommErr.None; /// No need to update the calibration factor - } - - CommErr error = CommErr.Write; - - /// Determine the new calibration factor - UInt16 defaultCalibFactor; - switch (ihead.CalibrationStructV4.MeterType) - { - case MeterType.DN15: - defaultCalibFactor = 2710; - break; - case MeterType.DN20: - defaultCalibFactor = 3746; - break; - case MeterType.DN25: - defaultCalibFactor = 3300; - break; - case MeterType.DN32: - defaultCalibFactor = 2500; - break; - case MeterType.DN40: - defaultCalibFactor = 3080; - break; - case MeterType.DN25_Q3_10: - case MeterType.CoaxManifold: - default: - defaultCalibFactor = 3040; - break; - } - - byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) }; - if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data)) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(data, 2); - } - - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] calib_2_3 = null; - if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3)) - { - error = CommErr.None; - ihead.CalibrationStructV4.Update(calib_2_3, 2); - resultStr = ihead.CalibrationStructV4.ToString(); - } - } - - return error; - } - - - /// - /// Reset both Q2 correction factors in the memory to 0. - /// Read them back to verify factors were written correctly. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr ReadQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Read; - - /// Write zero Q2 correction - byte[] rdData = null; - /// - if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, 2, out rdData)) - { - error = CommErr.None; - } - - if ((error == CommErr.None) && (rdData != null) && (rdData.Length == 2)) - { - resultStr = "Q2 corrections successfully read"; - wm.Q2CorrLR = ihead.Q2CorrLR = (int)((SByte)rdData[0]); - wm.Q2CorrRL = ihead.Q2CorrRL = (int)((SByte)rdData[1]); - } - - return error; - } - - /// - /// Reset both Q2 correction factors to 0. - /// Read them back to verify factors were written correctly. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr ResetQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 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, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - if (ProcessData.IsQ2PreCorrectionCalculated) - { - return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, ProcessData.CalculatedQ2PreCorrectionLR, - ProcessData.CalculatedQ2PreCorrectionRL); - } - else - { - int q2corrRL; - int q2corrLR; - switch (ihead.MeterType) - { - case MeterType.DN15: - q2corrRL = cfg.DfltQ2c_15_rl; - q2corrLR = cfg.DfltQ2c_15_lr; - break; - case MeterType.DN20: - q2corrRL = cfg.DfltQ2c_20_rl; - q2corrLR = cfg.DfltQ2c_20_lr; - break; - case MeterType.DN25: - q2corrRL = cfg.DfltQ2c_25_63_rl; - q2corrLR = cfg.DfltQ2c_25_63_lr; - break; - case MeterType.DN25_Q3_10: - q2corrRL = cfg.DfltQ2c_25_10_rl; - q2corrLR = cfg.DfltQ2c_25_10_lr; - break; - case MeterType.DN32: - q2corrRL = cfg.DfltQ2c_32_rl; - q2corrLR = cfg.DfltQ2c_32_lr; - break; - case MeterType.DN40: - q2corrRL = cfg.DfltQ2c_40_rl; - q2corrLR = cfg.DfltQ2c_40_lr; - break; - default: - q2corrRL = 0; - q2corrLR = 0; - break; - } - - return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, q2corrLR, q2corrRL); - } - } - - /// - /// 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 WriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr, int factorLR, int factorRL) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Write; - - /// Write zero Q2 correction - byte[] wrData = new byte[2] { (byte)factorLR, (byte)factorRL }; - /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) - { - wm.Q2CorrRL = ihead.Q2CorrRL = factorRL; - wm.Q2CorrLR = ihead.Q2CorrLR = factorLR; - error = CommErr.None; - } - - /// - /// Verification disabled on 16.02.2016 - /// -#if VERIFY_Q2_CORR_RESET - /// Verify the correction factors - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] rdData = null; - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) && - (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0)) - { - error = CommErr.None; - resultStr = string.Format("Q2 correction set to LR={0}, RL={1}", factorLR, factorRL); - } - } -#else - if (error == CommErr.None) - { - resultStr = string.Format("Q2 correction set to LR={0}, RL={1}", factorLR, factorRL); - } -#endif - - return error; - } - - - static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - if (wm.Pruefindex == 0) return CommErr.CommFailed; /// Unknown pruefindex - - if (wm.Pruefindex == 1) - { - int q2corrRL; - int q2corrLR; - if (ProcessData.IsQ2PreCorrectionCalculated) - { - q2corrRL = ProcessData.CalculatedQ2PreCorrectionRL; - q2corrLR = ProcessData.CalculatedQ2PreCorrectionLR; - } - else - { - switch (ihead.MeterType) - { - case MeterType.DN15: - q2corrRL = cfg.DfltQ2c_15_rl; - q2corrLR = cfg.DfltQ2c_15_lr; - break; - case MeterType.DN20: - q2corrRL = cfg.DfltQ2c_20_rl; - q2corrLR = cfg.DfltQ2c_20_lr; - break; - case MeterType.DN25: - q2corrRL = cfg.DfltQ2c_25_63_rl; - q2corrLR = cfg.DfltQ2c_25_63_lr; - break; - case MeterType.DN25_Q3_10: - q2corrRL = cfg.DfltQ2c_25_10_rl; - q2corrLR = cfg.DfltQ2c_25_10_lr; - break; - case MeterType.DN32: - q2corrRL = cfg.DfltQ2c_32_rl; - q2corrLR = cfg.DfltQ2c_32_lr; - break; - case MeterType.DN40: - q2corrRL = cfg.DfltQ2c_40_rl; - q2corrLR = cfg.DfltQ2c_40_lr; - break; - default: - q2corrRL = 0; - q2corrLR = 0; - break; - } - } - - return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, q2corrLR, q2corrRL); - } - else - { - return ReadQ2Correction(threadId, ihead, wm, ref resultStr); - } - } - - - /// - /// Reset 2Hz correction factor in the memory to 0. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Write; - - /// Write zero Q2 correction - byte[] wrData = new byte[1] { 0 }; - /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) - { - error = CommErr.None; - } - - /// - /// Verification disabled on 16.02.2016 - /// -#if false - /// Verify the correction factors - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] rdData = null; - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) && - (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0)) - { - error = CommErr.None; - resultStr = "2Hz correction reset to 0"; - ihead.Q2CorrectionFactor = 0; - } - } -#else - if (error == CommErr.None) - { - resultStr = "2Hz correction reset to 0"; - ihead.Hz2Correction = 0; - } -#endif - - return error; - } - - - /// - /// Write the calculated Q2 correction factors to the memory. - /// Read them back to verify factors were written correctly. - /// - /// Write Q2 correction - /// Write Q2 correction Alt - /// Write Q2 correction [Greece | R-L | L-R] testname - /// Update Q2 corrections - /// Conditional update of Q2 corrections - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, - Test test, ref string resultStr, Q2CorrType q2CorrType, string restOfLine) - { - var args = string.IsNullOrEmpty(restOfLine) ? new string[0] : restOfLine.Split(new char[] { ' ' }); - - Results.Entities.MeterTestRslt q2adjResult; /// The only test or the 1st test (the test in R-L direction) - Results.Entities.TestData q2adjTestData; /// The 2nd test in L-R direction in case tests in both directions are done - /// - if (args.Length == 0) - { - /// In case of no test name argument, ihead.LastTestResult is used (if it exists) - if (ihead.LastTestResult == null || !ihead.LastTestResult.TestDone) return CommErr.MissingTest; - q2adjResult = ihead.LastTestResult; - q2adjTestData = q2adjResult.TestRslt.TestData; - } - else // if (args.Length >= 1) - { - /// Get test data from (the 1st) test name - q2adjTestData = wm.GetTestData(args[0]); - if (q2adjTestData == null) return CommErr.MissingTest; - - if (q2adjTestData.Repeats == 1) - { - /// Find a test result if Repets == 1 - q2adjResult = wm.GetMeterTestRslt(args[0]); - if (q2adjResult == null || !q2adjResult.TestDone) return CommErr.MissingTest; - } - else - { - /// Calculate a summarized test result if Repeats > 1 - q2adjResult = new Results.Entities.MeterTestRslt(); - for (int i = 1; i <= q2adjTestData.Repeats; i++) - { - Results.Entities.MeterTestRslt oneMTR = wm.GetMeterTestRslt(string.Format("{0} ({1}/{2})", args[0], i, q2adjTestData.Repeats)); - if (oneMTR == null || !oneMTR.TestDone) return CommErr.MissingTest; - - q2adjResult.VolumeMeter += oneMTR.VolumeMeter; - q2adjResult.VolumeRef += oneMTR.VolumeRef; - - if (i == 1) - { - q2adjResult.CalibFactor = oneMTR.CalibFactor; - q2adjResult.CalibFactorLNA = oneMTR.CalibFactorLNA; - q2adjResult.Q2CorrRL = oneMTR.Q2CorrRL; - q2adjResult.Q2CorrLR = oneMTR.Q2CorrLR; - } - } - - q2adjResult.Error = Config.Formulas.ErrorFromVolumes(q2adjResult.VolumeMeter, q2adjResult.VolumeRef); - } - } - - var q3mtr = wm.MeterTestRslts.FirstOrDefault(x => x.Name() == "Q3"); - double q3error = (q3mtr != null) ? q3mtr.Error : 0; - - Results.Entities.MeterTestRslt q2adjResult2 = null; /// 2nd test name for a test in L-R direction - Results.Entities.TestData q2adjTestData2 = null; - /// - if (args.Length >= 2) - { - /// Get the 2nd test data from the 2nd test name - q2adjTestData2 = wm.GetTestData(args[1]); - if (q2adjTestData2 == null) return CommErr.MissingTest; - - if (q2adjTestData2.Repeats == 1) - { - /// Find a test result if Repets == 1 - q2adjResult2 = wm.GetMeterTestRslt(args[1]); - if (q2adjResult2 == null || !q2adjResult2.TestDone) return CommErr.MissingTest; - } - else - { - /// Calculate a summarized test result if Repeats > 1 - q2adjResult2 = new Results.Entities.MeterTestRslt(); - for (int i = 1; i <= q2adjTestData2.Repeats; i++) - { - Results.Entities.MeterTestRslt oneMTR = wm.GetMeterTestRslt(string.Format("{0} ({1}/{2})", args[1], i, q2adjTestData2.Repeats)); - if (oneMTR == null || !oneMTR.TestDone) return CommErr.MissingTest; - - q2adjResult2.VolumeMeter += oneMTR.VolumeMeter; - q2adjResult2.VolumeRef += oneMTR.VolumeRef; - - if (i == 1) - { - q2adjResult2.CalibFactor = oneMTR.CalibFactor; - q2adjResult2.CalibFactorLNA = oneMTR.CalibFactorLNA; - q2adjResult2.Q2CorrRL = oneMTR.Q2CorrRL; - q2adjResult2.Q2CorrLR = oneMTR.Q2CorrLR; - } - } - - q2adjResult2.Error = Config.Formulas.ErrorFromVolumes(q2adjResult2.VolumeMeter, q2adjResult2.VolumeRef); - } - } - - - if (q2adjResult == null || - ((q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate) && q2adjResult2 == null)) - { - return CommErr.MissingTest; /// Procedure configuration error - } - - - if ((q2CorrType == Q2CorrType.ConditionalUpdate || - q2CorrType == Q2CorrType.ConditionalUpdateRL || - q2CorrType == Q2CorrType.ConditionalUpdateLR) && wm.PassedFromTests()) - { - resultStr = string.Format("No Q2 correction update"); - rfidDataLogger.InfoFormat("{0}({1}): No Q2 correction update", ihead.Name, ihead.SerialNr); - return CommErr.None; /// No Q2 correction when doing conditional update and WM passed - } - - double errLimitLo = test.ErrLimLo + test.Uncertainty; - double errLimitHi = test.ErrLimHi - test.Uncertainty; - - /// - /// Calculate Q2 correction factor(s) - /// - int q2CorrRL = 0; - int q2CorrLR = 0; - /// - if (q2CorrType == Q2CorrType.Standard || - q2CorrType == Q2CorrType.Standard_incl_05 || - q2CorrType == Q2CorrType.Standard_plus_incl_05) - { - /// - /// Standard process (RL) - /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error - /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...) - /// - double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); - q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget)))); - } - else if (q2CorrType == Q2CorrType.Dewa || - q2CorrType == Q2CorrType.Dewa_incl_05 || - q2CorrType == Q2CorrType.Dewa_plus_incl_05) - { - /// - /// Standard process for the oposite flow direction (LR) - /// No 2nd Q2 test, MakeQ2CorrectedFrom(...) is used to calculate Q2 error - /// Do not forget to modify iPerlCommunicationSeq.MakeQ2CorrectedFrom(...) - /// - double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); - q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom, errorTarget)))); - } - else if (q2CorrType == Q2CorrType.RL || - q2CorrType == Q2CorrType.RL_incl_05 || - q2CorrType == Q2CorrType.ConditionalUpdateRL) - { - /// - /// RL only - /// Assuming the 2nd Q2 test is done afterwards - /// MakeQ2CorrectedFrom(...) is not used - /// - if (q2CorrType == Q2CorrType.RL && Math.Abs(q2adjResult.Error) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom)))); - } - else if (q2CorrType == Q2CorrType.LR || - q2CorrType == Q2CorrType.LR_incl_05 || - q2CorrType == Q2CorrType.ConditionalUpdateLR) - { - /// - /// LR only - /// Assuming the 2nd Q2 test is done afterwards - /// MakeQ2CorrectedFrom(...) is not used - /// - if (q2CorrType == Q2CorrType.LR && Math.Abs(q2adjResult.Error) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom)))); - } - else if (q2CorrType == Q2CorrType.Update || q2CorrType == Q2CorrType.ConditionalUpdate) - { - /// - /// After tests in both directions - /// Assuming the 2nd Q2 tests are done afterwards - /// MakeQ2CorrectedFrom(...) is not used - /// - q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom)))); - q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult2, q2adjResult2.Q2CorrLR, q2adjTestData2.Qfrom)))); - } - else if (q2CorrType == Q2CorrType.Greece || q2CorrType == Q2CorrType.Greece_incl_05 || q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestLRDir) - { - /// - /// Process for Greece - /// - if (q2CorrType == Q2CorrType.Greece && Math.Abs(q2adjResult.Error) <= 0.5) - { - resultStr = string.Format("Q2 correction = 0 (writing bypassed)"); - return CommErr.None; - } - - q2CorrLR = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrLR, q2adjTestData.Qfrom)))); - q2CorrRL = q2CorrLR; - } - else if (q2CorrType == Q2CorrType.UpdateBothQ2FactorsTestRLDir) - { - /// - /// Another strange process - /// - double errorTarget = (q3error * q2adjResult.Error < 0) ? (0.1 * q2adjResult.Error) : (-0.1 * q2adjResult.Error); - q2CorrRL = Math.Max(-128, Math.Min(127, Convert.ToInt32(ihead.CalculateQ2CorrectionFactor(q2adjResult, q2adjResult.Q2CorrRL, q2adjTestData.Qfrom, errorTarget)))); - q2CorrLR = q2CorrRL; - } - - - /// - /// Write calculated Q2 correction factors into the water meter - /// - if (ihead.CommFailed) return CommErr.CommFailed; - - CommErr error = CommErr.Write; - - if (q2CorrType == Q2CorrType.Standard || - q2CorrType == Q2CorrType.Standard_incl_05 || - q2CorrType == Q2CorrType.Standard_plus_incl_05 || - q2CorrType == Q2CorrType.RL || - q2CorrType == Q2CorrType.RL_incl_05 || - q2CorrType == Q2CorrType.ConditionalUpdateRL) - { - /// - /// Write R-L Q2 correction factor only - /// - byte[] wrData = new byte[1] { (byte)q2CorrRL }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrRL, wrData.Length, wrData)) - { - wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; - resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL); - error = CommErr.None; - } - } - else if (q2CorrType == Q2CorrType.Dewa || - q2CorrType == Q2CorrType.Dewa_incl_05 || - q2CorrType == Q2CorrType.Dewa_plus_incl_05 || - q2CorrType == Q2CorrType.LR || - q2CorrType == Q2CorrType.LR_incl_05 || - q2CorrType == Q2CorrType.ConditionalUpdateLR) - { - /// - /// Write L-R Q2 correction factor only - /// - byte[] wrData = new byte[1] { (byte)q2CorrLR }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrLR, wrData.Length, wrData)) - { - wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; - resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR); - error = CommErr.None; - } - } - else - { - /// - /// Write both Q2 correction factors - /// - byte[] wrData = new byte[2] { (byte)q2CorrLR, (byte)q2CorrRL }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) - { - wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; - wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; - resultStr = string.Format("Q2 correction: RL={0}, LR={1}", q2CorrRL, q2CorrLR); - error = CommErr.None; - } - } - - - /// - /// Q2 correction factor was successfully written to the water meter. - /// Check whether the original error at Q2 was within limits. - /// - if (error == CommErr.None && - (q2adjResult.Error < errLimitLo || errLimitHi < q2adjResult.Error || - (q2adjResult2 != null && (q2adjResult2.Error < errLimitLo || errLimitHi < q2adjResult2.Error)))) - { - resultStr += " (OoR)"; - - /// At least one of Q2 errors is out of range for Q2 correction - log.WarnFormat("OoR => anyhow Q2 correction was done: Pos={0}, PCB#={1}, ***Q2_RL err={2}%***, ***Q2_LR err={3}%***, [Lo={4}%, Hi={5}%]", - ihead.Name, - ihead.SerialNr, - q2adjResult.Error.ToString("F2"), - q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, - errLimitLo.ToString("F2"), - errLimitHi.ToString("F2")); - - rfidDataLogger.InfoFormat("{0}({1}): Q2 error ({2},{3}) is out of range ({4}..{5}) => Failed", - ihead.Name, - ihead.SerialNr, - q2adjResult.Error.ToString("F2"), - q2adjResult2 != null ? q2adjResult2.Error.ToString("F2") : string.Empty, - errLimitLo.ToString("F2"), - errLimitHi.ToString("F2")); - - error = CommErr.Q2OutOfRange; - } - - /// - /// Verification disabled on 16.02.2016 - /// -#if false - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] rdData = null; - if ((0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData)) && - (rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrLFlow)) - { - error = CommErr.None; - resultStr = string.Format("Q2 factors: R-flow={0}, L-flow={1}", (SByte)q2CorrRFlow, (SByte)q2CorrLFlow); - rfidDataLogger.Warn(ihead.Name + ": " + resultStr); - - wm.Q2ErrWOCorrection = ihead.Q2ErrorWOCorrection; - if (q2CorrType != Q2CorrType.LR) wm.Q2CorrRFlow = ihead.Q2CorrRFlow = (int)(sbyte)q2CorrRFlow; - if (q2CorrType != Q2CorrType.RL) wm.Q2CorrLFlow = ihead.Q2CorrLFlow = (int)(sbyte)q2CorrLFlow; - } - } -#else - - if ((q2CorrType != Q2CorrType.Update) && (q2CorrType != Q2CorrType.ConditionalUpdate)) - { - wm.Q2ErrWOCorrection = ihead.Q2ErrWOCorrection = q2adjResult.Error; - } - - /// - /// Update WaterMeter entity and IperlHead - /// - if (error == CommErr.None) - { - rfidDataLogger.WarnFormat("{0}({1}): {2}", ihead.Name, ihead.SerialNr, resultStr); - } -#endif - - return error; - } - - - /// - /// Write the calculated 2Hz correction factor to the memory. - /// - /// Water meter object - /// String passed to caller - /// true on success - static CommErr Write2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - /// Calculate the correction - ihead.Hz2CorrectionDone = false; - int hz2CorrectionFactor; - bool wmOK = ihead.Calculate2HzCorrectionFactor(ihead.LastTestResult2, ihead.LastTestResult, out ihead.Diff2Hz8Hz, out hz2CorrectionFactor); - - if (hz2CorrectionFactor == 0) - { - resultStr = string.Format("2Hz correction = 0 (writing bypassed)"); - return CommErr.None; - } - - CommErr error = CommErr.Write; - - Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF); - byte[] wrData = new byte[1] { hz2CorrectionByte }; - /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) - { - error = CommErr.None; - wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor; - wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true; - } - - /// - /// Verification disabled on 16.02.2016 - /// -#if false - if (error == CommErr.None) - { - error = CommErr.Verify; - - /// Read calibration - byte[] rdData = null; - if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData)) && - (rdData != null) && (rdData.Length == 2) && (rdData[0] == hz2CorrectionByte)) - { - error = CommErr.None; - resultStr = string.Format("2Hz factor = {0}", (SByte)hz2CorrectionByte); - rfidDataLogger.Warn(ihead.Name + ": " + resultStr); - wm.Hz2Correction = ihead.Hz2CorrectionFactor = hz2CorrectionFactor; - wm.Diff2Hz8Hz = ihead.Diff2Hz8Hz; - wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone; - } - } -#else - if (error == CommErr.None) - { - resultStr = string.Format("2Hz correction = {0}", (SByte)hz2CorrectionByte); - rfidDataLogger.Warn(ihead.Name + ": " + resultStr); - wm.Diff2Hz8Hz = ihead.Diff2Hz8Hz; - wm.Hz2CorrectionDone = ihead.Hz2CorrectionDone = true; - wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor; - } -#endif - - return error; - } - - /// - /// DEWA rework. - /// - /// iPERL head object - /// Water meter object - /// Arrow direction - /// String passed to caller - /// true on success - static CommErr DewaRework(IperlHead ihead, WaterMeter wm, FlowDir flowDir, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - byte arrow = (flowDir == FlowDir.L_R) ? (byte)1 : (byte)2; /// L-R is reverse flow (=1), R-L is forward flow (=2)(default) - - List dataToBeWritten = new List - { - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), // ????? - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 5:0x1985, new byte[] { arrow }, "Arrow"), - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 28:0x199C, new byte[5], "Clear S/N"), - new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"), - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 14:0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current") - }; - - // check meter status: 1-Idle, 2-Active, 3-Test, 4-End Of Life - if (0 == ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 1, 1, out byte[] rdData)) - { - int eMeterState = (int)((SByte)rdData[0]); - switch (eMeterState) - { - case 1: // Idle -> Test -> Active - dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetTestMode }, "Set test mode")); - dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode")); - break; - case 3: // Test Mode -> Active - dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode")); - break; - } - } - - dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status")); - dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, new byte[] { (byte)3 }, "WakeUpInterval")); - dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F, - (byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D, - (byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07, - (byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted")); - - int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step - int mask = 1; - foreach (var wData in dataToBeWritten) - { - bool isSuccessfullyWritten = false; - if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) - { - isSuccessfullyWritten = true; - } - - if (!isSuccessfullyWritten) - { - /// Communication failed in this step - successfyllyWrittenFlags = (successfyllyWrittenFlags | mask); - } - - mask = (mask << 1); /// Adjust the mask for the next step - } - - if (successfyllyWrittenFlags == 0) - { - /// Success - if (ihead.ConfigStruct != null) - { - ihead.ConfigStruct.MeterState = MeterState.Active; - ihead.ConfigStruct.TestModeConfig = (byte)0xA0; - } - - resultStr = "OK"; - return CommErr.None; - } - else - { - return CommErr.Write; - } - } - - /// - /// Start testing a sealed meter - /// - /// iPERL head object - /// Water meter object - /// String passed to caller - /// true on success - static CommErr StartTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - Byte testModeConfig = 0xA0; /// Default value - /// - if (multiTestParams[currentActivityStep].Activity.Length > StartTestingSealedMetersStr.Length) - { - string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(StartTestingSealedMetersStr.Length + 1); - UInt16 byteVal; - if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255) - { - testModeConfig = (Byte)byteVal; /// Update with specified value - } - } - - iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[] - { - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed ?????? - new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"), - new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"), - new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)), - }; - - if (ihead.ConfigStruct != null) ihead.OrigTestModeConfig = ihead.ConfigStruct.TestModeConfig; - - int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step - int mask = 1; - foreach (var wData in dataToBeWritten) - { - bool isSuccessfullyWritten = false; - if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) - { - isSuccessfullyWritten = true; - } - - if (!isSuccessfullyWritten) - { - /// Communication failed in this step - successfyllyWrittenFlags = (successfyllyWrittenFlags | mask); - } - - mask = (mask << 1); /// Adjust the mask for the next step - } - - if (successfyllyWrittenFlags == 0) - { - /// Success - if (ihead.ConfigStruct != null) - { - ihead.ConfigStruct.MeterState = MeterState.Active; - ihead.ConfigStruct.TestModeConfig = (byte)0xA0; - } - - resultStr = "OK"; - return CommErr.None; - } - else - { - return CommErr.Write; - } - } - - /// - /// End testing a sealed meter - /// - /// iPERL head object - /// Water meter object - /// String passed to caller - /// true on success - static CommErr EndTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (ihead.CommFailed) return CommErr.CommFailed; - - Byte testModeConfig = (ihead.OrigTestModeConfig != 0) ? ihead.OrigTestModeConfig : (byte)0x80; /// Restore original value (default is 0x80) - - iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[] - { - new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"), - new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)), - new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)0 }, "System Status"), - new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0x5A }, "Close Sealing") /// 0x5A=sealed, 0xA5=unsealed ?????? - }; - - int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step - int mask = 1; - foreach (var wData in dataToBeWritten) - { - bool isSuccessfullyWritten = false; - if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data)) - { - isSuccessfullyWritten = true; - } - - if (!isSuccessfullyWritten) - { - /// Communication failed in this step - successfyllyWrittenFlags = (successfyllyWrittenFlags | mask); - } - - mask = (mask << 1); /// Adjust the mask for the next step - } - - if (successfyllyWrittenFlags == 0) - { - /// Success - if (ihead.ConfigStruct != null) - { - ihead.ConfigStruct.MeterState = MeterState.Active; - ihead.ConfigStruct.TestModeConfig = (byte)0xA0; - } - - resultStr = "OK"; - return CommErr.None; - } - else - { - return CommErr.Write; - } - } - - static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - { - if (!ProcessData.IsQ2PreCorrectionCalculated) - { - ProcessData.IsQ2PreCorrectionCalculated = true; - /*bool success = iPerlCommunicationSeq.GetQ2PreCorrectionsOrBackups(cfg, wm.WMTypeId(), - out ProcessData.CalculatedQ2PreCorrectionLR, - out ProcessData.CalculatedQ2PreCorrectionRL);*/ - } - - resultStr = string.Format("Q2 pre-corrections: LR={0} RL={1}", ProcessData.CalculatedQ2PreCorrectionLR, ProcessData.CalculatedQ2PreCorrectionRL); - return CommErr.None; - } - - static CommErr SetIperlCommMilestoneReached(TestMethod testMethod, ConditionID id, ref string resultStr) - { - if (id < ConditionID.A || id >= ConditionID.Count) - { - resultStr = Strings.Error; - return CommErr.WrongArguments; - } - - testMethod.IperlCommMilestone[(int)id] = true; - resultStr = string.Format(SequenceConditionOp.ConditionNameFmt, id); - return CommErr.None; - } - - static CommErr Simulate(IperlHead ihead, WaterMeter wm, ref string resultStr) - { - string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' }); - - if (arguments.Length < 2 || arguments[1].ToLower() != "iperls") return CommErr.None; - - if (ihead.CommFailed) return CommErr.CommFailed; - - string[] pcbNrs = new string[] { "831232435539", "831232435562", - "831232435587", "831232432141", - "831232432497", "831232763641" }; - - if (wm.WMPosition > 0 && wm.WMPosition <= pcbNrs.Length) - { - ihead.SerialNr = wm.SerialNr = pcbNrs[wm.WMPosition - 1]; - } - - resultStr = string.Format("PCB Nr. = {0}", wm.SerialNr ?? ""); - return CommErr.None; - } - -#endif /// IPERL - - #endregion - - /// - /// Called when communication with one watermeter is completed - /// - public static void OnCommCompleted(object sender, CommCompletedEventArgs data) - { - if (CommCompletedHandler == null) return; - try { CommCompletedHandler(sender, data); } - catch (Exception e) { log.Error("CommCompletedHandler(...) failed", e); } - } - public static event EventHandler CommCompletedHandler; - - void DoOnCommCompleted(object sender, CommCompletedEventArgs data) - { - try - { - /// - /// Update the text message - /// - if (data.WMNr0 >= 0) messages[data.WMNr0].Text = data.CommMessage; - - /// - /// Update head active/inactive switch - /// - if (data.WMNr0 >= 0 && data.CommErr == CommErr.HeadDisabledByUser) - { - /// iPerl head was disabled by the user - ckbState[data.WMNr0] = false; - checkBoxes[data.WMNr0].Checked = false; - checkBoxes[data.WMNr0].Enabled = false; - if (data.Ihead != null) data.Ihead.Disabled = true; - if (data.Wm != null) data.Wm.Disabled = true; - } - else if (data.WMNr0 >= 0 && data.CommErr == CommErr.None) - { - /// One RFID communication successful => iPerl cannot be disabled by the user anymore - ckbState[data.WMNr0] = true; - checkBoxes[data.WMNr0].Checked = true; - checkBoxes[data.WMNr0].Enabled = false; - } - - /// - /// Update opto-communication indication - /// - for (int i = 0; i < iperlHeads.Count; i++) - { - if (iperlHeads[i] == null || iperlHeads[i].Disabled) - { - counters[i].BackColor = DisabledColor; - } - else - { - switch (iperlHeads[i].CheckFlowDirection()) - { - case OptoHeadState.OptoAndDirOK: - counters[i].BackColor = OptoAndDirOKColor; - break; - - case OptoHeadState.DirNok: - counters[i].BackColor = DirNokColor; - break; - - default: - case OptoHeadState.OptoNok: - counters[i].BackColor = OptoNokColor; - break; - } - } - } - -#if !TURA_SPECIAL - /// - /// Branch - /// - lock (this) - { - if (++completedCommCount < 4) return; - completedCommCount = 0; - } -#endif - - if (currentGroup < lastGroup) - { - /// Go to the next step / next group - currentGroup++; - } - else if (currentActivityStep + 1 < multiTestParams.Count) - { - currentGroup = 0; - currentActivityStep++; - activityLabel.Text = multiTestParams[currentActivityStep].Activity; - currentGroup++; - } - else - { - /// Wait until all threads are finished - workerThreads[data.ThreadId].Join(2000); - NormalClose(); - } - } - catch (Exception e) - { - log.ErrorFormat("DoOnCommCompleted({0}) failed: {1}", data, e.Message); - log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); - } - } - - - /// - /// Called when communication with all watermeters is completed - /// - public static void OnAllCompleted(object sender, AllCompletedEventArgs data) - { - if (AllCompletedHandler == null) return; - try { AllCompletedHandler(sender, data); } - catch (Exception e) { log.Error("AllCompletedHandler(...) failed", e); } - } - public static event EventHandler AllCompletedHandler; - - void DoOnAllCompleted(object sender, AllCompletedEventArgs data) - { - Text = data.CommMessage; - } - - /// - /// Update test result representing RFID communication success/failure - /// - /// - void UpdateRfidCommResult(IList tests) - { - DateTime endTime = DateTime.Now; - int testTime = StateMachine.Time - startTimeSec; - - if (!tests.Contains(StateMachine.TestInstances[0].Test)) - { - tests.Insert(0, StateMachine.TestInstances[0].Test); /// Add RFID test as the 1st item - } - - foreach (var test in tests) - { - Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); - - if (tstRslt != null) - { - Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); - - /// Auxiliary results ... not required - - /// Main results - tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; - tstRslt.TestDone = true; - tstRslt.StartTime = tstRslt.Batch.StartTime; - tstRslt.EndTime = endTime; - tstRslt.FlowSetTime = 0; - tstRslt.MassOfEvapWater = 0; - tstRslt.TestTime += testTime; /// [s] total communication time of all tests - - for (int i = 0; i < iperlHeads.Count; i++) - { - Results.Entities.MeterTestRslt meterRslt = - ProcessData.BatchRslts.GetMeterTestRslt(test.Name, waterMeterPositions0[i], CompoundMeterId.Single); - - if (meterRslt != null && iperlHeads[i] != null) - { - meterRslt.WaterMeter.SerialNr = iperlHeads[i].SerialNr; - meterRslt.Passed = (!iperlHeads[i].CommFailed && !iperlHeads[i].Disabled); - meterRslt.TestDone = true; - } - } - } - } - - UiBridge.Bridge.OnTestCompleted(this, new UiBridge.TestCompletedEventArgs(string.Empty, null)); - } - -#if IPERL - private MenuItem NewMenuItem(string text, string tag) - { - MenuItem menuItem = new MenuItem { Text = text, Tag = tag }; - menuItem.Click += OnClick_Optical_Heads_Settings_Menu; - return menuItem; - } - private async void OnClick_Optical_Heads_Settings_Menu(object sender, EventArgs e) - { - MenuItem menuItem = (MenuItem)sender; - activityLabel.Text = menuItem.Text; - List tasks = new List(); - foreach (var iHead in ProcessData.IperlHeads) - { - if (!checkBoxes[iHead.Position - 1].Checked) - { - if (iHead.Position - 1 < messages.Length) messages[iHead.Position - 1].Text = ""; - continue; - } - messages[iHead.Position - 1].Text = $"COM{iHead.RfidComPortNr}"; - Application.DoEvents(); // Refresh UI - tasks.Add(Task.Run(async () => - { - string result = await ProcessTask(iHead, menuItem.Tag); - this.Invoke((Action)(() => - { - messages[iHead.Position - 1].Text = result; - Application.DoEvents(); // Refresh UI - })); - - })); - - } - await Task.WhenAll(tasks); - } - - private async Task ProcessTask(IperlHead iHead, object tag) - { - string txt = ""; - switch (tag) - { - case "ReadPCB": - txt = OpticalHeadTest.ReadRequest_PCB(iHead); - break; - case "WriteRequestPort_u8_Customer_Text": - txt = OpticalHeadTest.WriteRequestPort_u8_Customer_Text(iHead); - break; - case "OpenSealing": - txt = OpticalHeadTest.OpenSealing(iHead); - break; - case "StartTestMode": - txt = OpticalHeadTest.SetTestMode(iHead); - break; - case "TurnOffTestMode": - txt = OpticalHeadTest.SetActiveMode(iHead); - break; - case "TurnOffRadio": - txt = OpticalHeadTest.TurnOffRadio(iHead); - break; - case "SetProductionMode": - txt = OpticalHeadTest.SetProductionMode(iHead); - break; - case "SetRFID": - txt = OpticalHeadTest.SetRfidMode(iHead); - break; - case "SetNFC": - txt = OpticalHeadTest.SetNfcMode(iHead); - break; - } - return txt; - } -#endif /// IPERL - - #region Check boxes edit mode support - - private void checkBoxImage1_Click(object sender, EventArgs e) { ckbState[ckbIndex[0]] = checkBoxImage1.Checked; } - private void checkBoxImage2_Click(object sender, EventArgs e) { ckbState[ckbIndex[1]] = checkBoxImage2.Checked; } - private void checkBoxImage3_Click(object sender, EventArgs e) { ckbState[ckbIndex[2]] = checkBoxImage3.Checked; } - private void checkBoxImage4_Click(object sender, EventArgs e) { ckbState[ckbIndex[3]] = checkBoxImage4.Checked; } - private void checkBoxImage5_Click(object sender, EventArgs e) { ckbState[ckbIndex[4]] = checkBoxImage5.Checked; } - private void checkBoxImage6_Click(object sender, EventArgs e) { ckbState[ckbIndex[5]] = checkBoxImage6.Checked; } - private void checkBoxImage7_Click(object sender, EventArgs e) { ckbState[ckbIndex[6]] = checkBoxImage7.Checked; } - private void checkBoxImage8_Click(object sender, EventArgs e) { ckbState[ckbIndex[7]] = checkBoxImage8.Checked; } - private void checkBoxImage9_Click(object sender, EventArgs e) { ckbState[ckbIndex[8]] = checkBoxImage9.Checked; } - private void checkBoxImage10_Click(object sender, EventArgs e) { ckbState[ckbIndex[9]] = checkBoxImage10.Checked; } - private void checkBoxImage11_Click(object sender, EventArgs e) { ckbState[ckbIndex[10]] = checkBoxImage11.Checked; } - private void checkBoxImage12_Click(object sender, EventArgs e) { ckbState[ckbIndex[11]] = checkBoxImage12.Checked; } - private void checkBoxImage13_Click(object sender, EventArgs e) { ckbState[ckbIndex[12]] = checkBoxImage13.Checked; } - private void checkBoxImage14_Click(object sender, EventArgs e) { ckbState[ckbIndex[13]] = checkBoxImage14.Checked; } - private void checkBoxImage15_Click(object sender, EventArgs e) { ckbState[ckbIndex[14]] = checkBoxImage15.Checked; } - private void checkBoxImage16_Click(object sender, EventArgs e) { ckbState[ckbIndex[15]] = checkBoxImage16.Checked; } - private void checkBoxImage17_Click(object sender, EventArgs e) { ckbState[ckbIndex[16]] = checkBoxImage17.Checked; } - private void checkBoxImage18_Click(object sender, EventArgs e) { ckbState[ckbIndex[17]] = checkBoxImage18.Checked; } - private void checkBoxImage19_Click(object sender, EventArgs e) { ckbState[ckbIndex[18]] = checkBoxImage19.Checked; } - private void checkBoxImage20_Click(object sender, EventArgs e) { ckbState[ckbIndex[19]] = checkBoxImage20.Checked; } - private void checkBoxImage21_Click(object sender, EventArgs e) { ckbState[ckbIndex[20]] = checkBoxImage21.Checked; } - private void checkBoxImage22_Click(object sender, EventArgs e) { ckbState[ckbIndex[21]] = checkBoxImage22.Checked; } - private void checkBoxImage23_Click(object sender, EventArgs e) { ckbState[ckbIndex[22]] = checkBoxImage23.Checked; } - private void checkBoxImage24_Click(object sender, EventArgs e) { ckbState[ckbIndex[23]] = checkBoxImage24.Checked; } - private void checkBoxImage25_Click(object sender, EventArgs e) { ckbState[ckbIndex[24]] = checkBoxImage25.Checked; } - private void checkBoxImage26_Click(object sender, EventArgs e) { ckbState[ckbIndex[25]] = checkBoxImage26.Checked; } - private void checkBoxImage27_Click(object sender, EventArgs e) { ckbState[ckbIndex[26]] = checkBoxImage27.Checked; } - private void checkBoxImage28_Click(object sender, EventArgs e) { ckbState[ckbIndex[27]] = checkBoxImage28.Checked; } - private void checkBoxImage29_Click(object sender, EventArgs e) { ckbState[ckbIndex[28]] = checkBoxImage29.Checked; } - private void checkBoxImage30_Click(object sender, EventArgs e) { ckbState[ckbIndex[29]] = checkBoxImage30.Checked; } - private void checkBoxImage31_Click(object sender, EventArgs e) { ckbState[ckbIndex[30]] = checkBoxImage31.Checked; } - private void checkBoxImage32_Click(object sender, EventArgs e) { ckbState[ckbIndex[31]] = checkBoxImage32.Checked; } - private void checkBoxImage33_Click(object sender, EventArgs e) { ckbState[ckbIndex[32]] = checkBoxImage33.Checked; } - private void checkBoxImage34_Click(object sender, EventArgs e) { ckbState[ckbIndex[33]] = checkBoxImage34.Checked; } - private void checkBoxImage35_Click(object sender, EventArgs e) { ckbState[ckbIndex[34]] = checkBoxImage35.Checked; } - private void checkBoxImage36_Click(object sender, EventArgs e) { ckbState[ckbIndex[35]] = checkBoxImage36.Checked; } - private void checkBoxImage37_Click(object sender, EventArgs e) { ckbState[ckbIndex[36]] = checkBoxImage37.Checked; } - private void checkBoxImage38_Click(object sender, EventArgs e) { ckbState[ckbIndex[37]] = checkBoxImage38.Checked; } - private void checkBoxImage39_Click(object sender, EventArgs e) { ckbState[ckbIndex[38]] = checkBoxImage39.Checked; } - private void checkBoxImage40_Click(object sender, EventArgs e) { ckbState[ckbIndex[39]] = checkBoxImage40.Checked; } - private void checkBoxImage41_Click(object sender, EventArgs e) { ckbState[ckbIndex[40]] = checkBoxImage41.Checked; } - private void checkBoxImage42_Click(object sender, EventArgs e) { ckbState[ckbIndex[41]] = checkBoxImage42.Checked; } - private void checkBoxImage43_Click(object sender, EventArgs e) { ckbState[ckbIndex[42]] = checkBoxImage43.Checked; } - private void checkBoxImage44_Click(object sender, EventArgs e) { ckbState[ckbIndex[43]] = checkBoxImage44.Checked; } - private void checkBoxImage45_Click(object sender, EventArgs e) { ckbState[ckbIndex[44]] = checkBoxImage45.Checked; } - private void checkBoxImage46_Click(object sender, EventArgs e) { ckbState[ckbIndex[45]] = checkBoxImage46.Checked; } - 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; - for (int i = 0; i < 48; i++) - { - int wmNr0 = ckbIndex[i]; - if (wmNr0 >= 0 && ckbState[wmNr0]) - { - result += (1L << wmNr0); - } - } - return result; - } - - /// - /// Set checkboxes to states stored in a bitfield (long) - /// - private void SetCheckBoxStates(long state) - { - CheckBoxImage[] chkBoxes = new CheckBoxImage[48] - { - checkBoxImage1, checkBoxImage2, checkBoxImage3, checkBoxImage4, checkBoxImage5, - checkBoxImage6, checkBoxImage7, checkBoxImage8, checkBoxImage9, checkBoxImage10, - checkBoxImage11, checkBoxImage12, checkBoxImage13, checkBoxImage14, checkBoxImage15, - checkBoxImage16, checkBoxImage17, checkBoxImage18, checkBoxImage19, checkBoxImage20, - checkBoxImage21, checkBoxImage22, checkBoxImage23, checkBoxImage24, checkBoxImage25, - checkBoxImage26, checkBoxImage27, checkBoxImage28, checkBoxImage29, checkBoxImage30, - checkBoxImage31, checkBoxImage32, checkBoxImage33, checkBoxImage34, checkBoxImage35, - checkBoxImage36, checkBoxImage37, checkBoxImage38, checkBoxImage39, checkBoxImage40, - checkBoxImage41, checkBoxImage42, checkBoxImage43, checkBoxImage44, checkBoxImage45, - checkBoxImage46, checkBoxImage47, checkBoxImage48, - }; - for (int i = 0; i < 48; i++) - { - int wmNr0 = ckbIndex[i]; - if (wmNr0 >= 0) - { - chkBoxes[i].Checked = ckbState[wmNr0] = ((state & (1L << wmNr0)) != 0); - } - } - } - - private void saveButton_Click(object sender, EventArgs e) - { - Program.LocalSettings.OptoHeadsEnabled = GetCheckBoxStates(); - Program.LocalSettings.Save(); - DialogResult = DialogResult.OK; - Close(); - } - - #endregion - - private void iPerlCommunicationForm_FormClosing(object sender, FormClosingEventArgs e) - { - if (!forcedClose && !formCompleted && !checkBoxesEditMode) - { - e.Cancel = true; - } - } - } -} diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.designer.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.designer.cs deleted file mode 100644 index d21299f9b..000000000 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.designer.cs +++ /dev/null @@ -1,2902 +0,0 @@ -/// -/// Copyright (c) 2015 Sensus Metering Systems -/// Author: Milan Hanajík -/// -namespace TBF.Rig.RegisterReaders.iPerlReaderUNI.test -{ - partial class iPerlCommunicationForm - { - /// - /// 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 Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(iPerlCommunicationForm)); - this.wmTextBox2 = new System.Windows.Forms.TextBox(); - this.wmLabel2 = new System.Windows.Forms.Label(); - this.wmLabel1 = new System.Windows.Forms.Label(); - this.wmTextBox3 = new System.Windows.Forms.TextBox(); - this.wmLabel3 = new System.Windows.Forms.Label(); - this.wmTextBox4 = new System.Windows.Forms.TextBox(); - this.wmLabel4 = new System.Windows.Forms.Label(); - this.wmTextBox5 = new System.Windows.Forms.TextBox(); - this.wmLabel5 = new System.Windows.Forms.Label(); - this.wmTextBox6 = new System.Windows.Forms.TextBox(); - this.wmLabel6 = new System.Windows.Forms.Label(); - this.wmTextBox1 = new System.Windows.Forms.TextBox(); - this.wmTextBox7 = new System.Windows.Forms.TextBox(); - this.wmLabel7 = new System.Windows.Forms.Label(); - this.wmTextBox8 = new System.Windows.Forms.TextBox(); - this.wmLabel8 = new System.Windows.Forms.Label(); - this.wmTextBox9 = new System.Windows.Forms.TextBox(); - this.wmLabel9 = new System.Windows.Forms.Label(); - this.wmTextBox10 = new System.Windows.Forms.TextBox(); - this.wmLabel10 = new System.Windows.Forms.Label(); - this.wmTextBox12 = new System.Windows.Forms.TextBox(); - this.wmLabel12 = new System.Windows.Forms.Label(); - this.wmTextBox11 = new System.Windows.Forms.TextBox(); - this.wmLabel11 = new System.Windows.Forms.Label(); - this.wmTextBox24 = new System.Windows.Forms.TextBox(); - this.wmLabel24 = new System.Windows.Forms.Label(); - this.wmTextBox23 = new System.Windows.Forms.TextBox(); - this.wmLabel23 = new System.Windows.Forms.Label(); - this.wmTextBox22 = new System.Windows.Forms.TextBox(); - this.wmLabel22 = new System.Windows.Forms.Label(); - this.wmTextBox21 = new System.Windows.Forms.TextBox(); - this.wmLabel21 = new System.Windows.Forms.Label(); - this.wmTextBox20 = new System.Windows.Forms.TextBox(); - this.wmLabel20 = new System.Windows.Forms.Label(); - this.wmTextBox19 = new System.Windows.Forms.TextBox(); - this.wmLabel19 = new System.Windows.Forms.Label(); - this.wmTextBox18 = new System.Windows.Forms.TextBox(); - this.wmLabel18 = new System.Windows.Forms.Label(); - this.wmTextBox17 = new System.Windows.Forms.TextBox(); - this.wmLabel17 = new System.Windows.Forms.Label(); - this.wmTextBox16 = new System.Windows.Forms.TextBox(); - this.wmLabel16 = new System.Windows.Forms.Label(); - this.wmTextBox15 = new System.Windows.Forms.TextBox(); - this.wmLabel15 = new System.Windows.Forms.Label(); - this.wmTextBox14 = new System.Windows.Forms.TextBox(); - this.wmLabel14 = new System.Windows.Forms.Label(); - this.wmTextBox13 = new System.Windows.Forms.TextBox(); - this.wmLabel13 = new System.Windows.Forms.Label(); - this.wmTextBox48 = new System.Windows.Forms.TextBox(); - this.wmLabel48 = new System.Windows.Forms.Label(); - this.wmTextBox47 = new System.Windows.Forms.TextBox(); - this.wmLabel47 = new System.Windows.Forms.Label(); - this.wmTextBox46 = new System.Windows.Forms.TextBox(); - this.wmLabel46 = new System.Windows.Forms.Label(); - this.wmTextBox45 = new System.Windows.Forms.TextBox(); - this.wmLabel45 = new System.Windows.Forms.Label(); - this.wmTextBox44 = new System.Windows.Forms.TextBox(); - this.wmLabel44 = new System.Windows.Forms.Label(); - this.wmTextBox43 = new System.Windows.Forms.TextBox(); - this.wmLabel43 = new System.Windows.Forms.Label(); - this.wmTextBox42 = new System.Windows.Forms.TextBox(); - this.wmLabel42 = new System.Windows.Forms.Label(); - this.wmTextBox41 = new System.Windows.Forms.TextBox(); - this.wmLabel41 = new System.Windows.Forms.Label(); - this.wmTextBox40 = new System.Windows.Forms.TextBox(); - this.wmLabel40 = new System.Windows.Forms.Label(); - this.wmTextBox39 = new System.Windows.Forms.TextBox(); - this.wmLabel39 = new System.Windows.Forms.Label(); - this.wmTextBox38 = new System.Windows.Forms.TextBox(); - this.wmLabel38 = new System.Windows.Forms.Label(); - this.wmTextBox37 = new System.Windows.Forms.TextBox(); - this.wmLabel37 = new System.Windows.Forms.Label(); - this.wmTextBox36 = new System.Windows.Forms.TextBox(); - this.wmLabel36 = new System.Windows.Forms.Label(); - this.wmTextBox35 = new System.Windows.Forms.TextBox(); - this.wmLabel35 = new System.Windows.Forms.Label(); - this.wmTextBox34 = new System.Windows.Forms.TextBox(); - this.wmLabel34 = new System.Windows.Forms.Label(); - this.wmTextBox33 = new System.Windows.Forms.TextBox(); - this.wmLabel33 = new System.Windows.Forms.Label(); - this.wmTextBox32 = new System.Windows.Forms.TextBox(); - this.wmLabel32 = new System.Windows.Forms.Label(); - this.wmTextBox31 = new System.Windows.Forms.TextBox(); - this.wmLabel31 = new System.Windows.Forms.Label(); - this.wmTextBox30 = new System.Windows.Forms.TextBox(); - this.wmLabel30 = new System.Windows.Forms.Label(); - this.wmTextBox29 = new System.Windows.Forms.TextBox(); - this.wmLabel29 = new System.Windows.Forms.Label(); - this.wmTextBox28 = new System.Windows.Forms.TextBox(); - this.wmLabel28 = new System.Windows.Forms.Label(); - this.wmTextBox27 = new System.Windows.Forms.TextBox(); - this.wmLabel27 = new System.Windows.Forms.Label(); - this.wmTextBox26 = new System.Windows.Forms.TextBox(); - this.wmLabel26 = new System.Windows.Forms.Label(); - this.wmTextBox25 = new System.Windows.Forms.TextBox(); - this.wmLabel25 = new System.Windows.Forms.Label(); - this.activityLabel = new System.Windows.Forms.Label(); - this.pictureBox48 = new System.Windows.Forms.PictureBox(); - this.pictureBox47 = new System.Windows.Forms.PictureBox(); - this.pictureBox46 = new System.Windows.Forms.PictureBox(); - this.pictureBox45 = new System.Windows.Forms.PictureBox(); - this.pictureBox44 = new System.Windows.Forms.PictureBox(); - this.pictureBox43 = new System.Windows.Forms.PictureBox(); - this.pictureBox42 = new System.Windows.Forms.PictureBox(); - this.pictureBox41 = new System.Windows.Forms.PictureBox(); - this.pictureBox40 = new System.Windows.Forms.PictureBox(); - this.pictureBox39 = new System.Windows.Forms.PictureBox(); - this.pictureBox38 = new System.Windows.Forms.PictureBox(); - this.pictureBox37 = new System.Windows.Forms.PictureBox(); - this.pictureBox36 = new System.Windows.Forms.PictureBox(); - this.pictureBox35 = new System.Windows.Forms.PictureBox(); - this.pictureBox34 = new System.Windows.Forms.PictureBox(); - this.pictureBox33 = new System.Windows.Forms.PictureBox(); - this.pictureBox32 = new System.Windows.Forms.PictureBox(); - this.pictureBox31 = new System.Windows.Forms.PictureBox(); - this.pictureBox30 = new System.Windows.Forms.PictureBox(); - this.pictureBox29 = new System.Windows.Forms.PictureBox(); - this.pictureBox28 = new System.Windows.Forms.PictureBox(); - this.pictureBox27 = new System.Windows.Forms.PictureBox(); - this.pictureBox26 = new System.Windows.Forms.PictureBox(); - this.pictureBox25 = new System.Windows.Forms.PictureBox(); - this.pictureBox24 = new System.Windows.Forms.PictureBox(); - this.pictureBox23 = new System.Windows.Forms.PictureBox(); - this.pictureBox22 = new System.Windows.Forms.PictureBox(); - this.pictureBox21 = new System.Windows.Forms.PictureBox(); - this.pictureBox20 = new System.Windows.Forms.PictureBox(); - this.pictureBox19 = new System.Windows.Forms.PictureBox(); - this.pictureBox18 = new System.Windows.Forms.PictureBox(); - this.pictureBox17 = new System.Windows.Forms.PictureBox(); - this.pictureBox16 = new System.Windows.Forms.PictureBox(); - this.pictureBox15 = new System.Windows.Forms.PictureBox(); - this.pictureBox14 = new System.Windows.Forms.PictureBox(); - this.pictureBox13 = new System.Windows.Forms.PictureBox(); - this.pictureBox12 = new System.Windows.Forms.PictureBox(); - this.pictureBox11 = new System.Windows.Forms.PictureBox(); - this.pictureBox10 = new System.Windows.Forms.PictureBox(); - this.pictureBox9 = new System.Windows.Forms.PictureBox(); - this.pictureBox8 = new System.Windows.Forms.PictureBox(); - this.pictureBox7 = new System.Windows.Forms.PictureBox(); - this.pictureBox6 = new System.Windows.Forms.PictureBox(); - this.pictureBox5 = new System.Windows.Forms.PictureBox(); - this.pictureBox4 = new System.Windows.Forms.PictureBox(); - this.pictureBox3 = new System.Windows.Forms.PictureBox(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.saveButton = new System.Windows.Forms.Button(); - this.samplePictureBox1 = new System.Windows.Forms.PictureBox(); - this.samplePictureBox2 = new System.Windows.Forms.PictureBox(); - this.samplePictureBox3 = new System.Windows.Forms.PictureBox(); - this.sampleLabel1 = new System.Windows.Forms.Label(); - this.sampleLabel2 = new System.Windows.Forms.Label(); - this.sampleLabel3 = new System.Windows.Forms.Label(); - this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox45)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox44)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox43)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox42)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox41)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox40)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox39)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox38)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox37)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox36)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox35)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox34)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox33)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox32)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox31)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox30)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox29)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox28)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox27)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox26)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox25)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox24)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox23)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox22)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox20)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox19)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox18)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox17)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox16)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox15)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox14)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox13)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit(); - this.SuspendLayout(); - // - // wmTextBox2 - // - this.wmTextBox2.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox2.Location = new System.Drawing.Point(160, 118); - this.wmTextBox2.Name = "wmTextBox2"; - this.wmTextBox2.Size = new System.Drawing.Size(380, 23); - this.wmTextBox2.TabIndex = 1; - this.wmTextBox2.Visible = false; - // - // wmLabel2 - // - this.wmLabel2.AutoSize = true; - this.wmLabel2.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel2.Location = new System.Drawing.Point(35, 124); - this.wmLabel2.Name = "wmLabel2"; - this.wmLabel2.Size = new System.Drawing.Size(16, 16); - this.wmLabel2.TabIndex = 0; - this.wmLabel2.Text = "2"; - this.wmLabel2.Visible = false; - // - // wmLabel1 - // - this.wmLabel1.AutoSize = true; - this.wmLabel1.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel1.Location = new System.Drawing.Point(35, 95); - this.wmLabel1.Name = "wmLabel1"; - this.wmLabel1.Size = new System.Drawing.Size(16, 16); - this.wmLabel1.TabIndex = 0; - this.wmLabel1.Text = "1"; - this.wmLabel1.Visible = false; - // - // wmTextBox3 - // - this.wmTextBox3.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox3.Location = new System.Drawing.Point(160, 147); - this.wmTextBox3.Name = "wmTextBox3"; - this.wmTextBox3.Size = new System.Drawing.Size(380, 23); - this.wmTextBox3.TabIndex = 1; - this.wmTextBox3.Visible = false; - // - // wmLabel3 - // - this.wmLabel3.AutoSize = true; - this.wmLabel3.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel3.Location = new System.Drawing.Point(35, 153); - this.wmLabel3.Name = "wmLabel3"; - this.wmLabel3.Size = new System.Drawing.Size(16, 16); - this.wmLabel3.TabIndex = 0; - this.wmLabel3.Text = "3"; - this.wmLabel3.Visible = false; - // - // wmTextBox4 - // - this.wmTextBox4.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox4.Location = new System.Drawing.Point(160, 176); - this.wmTextBox4.Name = "wmTextBox4"; - this.wmTextBox4.Size = new System.Drawing.Size(380, 23); - this.wmTextBox4.TabIndex = 1; - this.wmTextBox4.Visible = false; - // - // wmLabel4 - // - this.wmLabel4.AutoSize = true; - this.wmLabel4.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel4.Location = new System.Drawing.Point(35, 182); - this.wmLabel4.Name = "wmLabel4"; - this.wmLabel4.Size = new System.Drawing.Size(16, 16); - this.wmLabel4.TabIndex = 0; - this.wmLabel4.Text = "4"; - this.wmLabel4.Visible = false; - // - // wmTextBox5 - // - this.wmTextBox5.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox5.Location = new System.Drawing.Point(160, 205); - this.wmTextBox5.Name = "wmTextBox5"; - this.wmTextBox5.Size = new System.Drawing.Size(380, 23); - this.wmTextBox5.TabIndex = 1; - this.wmTextBox5.Visible = false; - // - // wmLabel5 - // - this.wmLabel5.AutoSize = true; - this.wmLabel5.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel5.Location = new System.Drawing.Point(35, 211); - this.wmLabel5.Name = "wmLabel5"; - this.wmLabel5.Size = new System.Drawing.Size(16, 16); - this.wmLabel5.TabIndex = 0; - this.wmLabel5.Text = "5"; - this.wmLabel5.Visible = false; - // - // wmTextBox6 - // - this.wmTextBox6.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox6.Location = new System.Drawing.Point(160, 234); - this.wmTextBox6.Name = "wmTextBox6"; - this.wmTextBox6.Size = new System.Drawing.Size(380, 23); - this.wmTextBox6.TabIndex = 1; - this.wmTextBox6.Visible = false; - // - // wmLabel6 - // - this.wmLabel6.AutoSize = true; - this.wmLabel6.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel6.Location = new System.Drawing.Point(35, 241); - this.wmLabel6.Name = "wmLabel6"; - this.wmLabel6.Size = new System.Drawing.Size(16, 16); - this.wmLabel6.TabIndex = 0; - this.wmLabel6.Text = "6"; - this.wmLabel6.Visible = false; - // - // wmTextBox1 - // - this.wmTextBox1.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox1.Location = new System.Drawing.Point(160, 89); - this.wmTextBox1.Name = "wmTextBox1"; - this.wmTextBox1.Size = new System.Drawing.Size(380, 23); - this.wmTextBox1.TabIndex = 1; - this.wmTextBox1.Visible = false; - // - // wmTextBox7 - // - this.wmTextBox7.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox7.Location = new System.Drawing.Point(160, 263); - this.wmTextBox7.Name = "wmTextBox7"; - this.wmTextBox7.Size = new System.Drawing.Size(380, 23); - this.wmTextBox7.TabIndex = 9; - this.wmTextBox7.Visible = false; - // - // wmLabel7 - // - this.wmLabel7.AutoSize = true; - this.wmLabel7.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel7.Location = new System.Drawing.Point(35, 270); - this.wmLabel7.Name = "wmLabel7"; - this.wmLabel7.Size = new System.Drawing.Size(16, 16); - this.wmLabel7.TabIndex = 8; - this.wmLabel7.Text = "7"; - this.wmLabel7.Visible = false; - // - // wmTextBox8 - // - this.wmTextBox8.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox8.Location = new System.Drawing.Point(160, 292); - this.wmTextBox8.Name = "wmTextBox8"; - this.wmTextBox8.Size = new System.Drawing.Size(380, 23); - this.wmTextBox8.TabIndex = 11; - this.wmTextBox8.Visible = false; - // - // wmLabel8 - // - this.wmLabel8.AutoSize = true; - this.wmLabel8.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel8.Location = new System.Drawing.Point(35, 299); - this.wmLabel8.Name = "wmLabel8"; - this.wmLabel8.Size = new System.Drawing.Size(16, 16); - this.wmLabel8.TabIndex = 10; - this.wmLabel8.Text = "8"; - this.wmLabel8.Visible = false; - // - // wmTextBox9 - // - this.wmTextBox9.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox9.Location = new System.Drawing.Point(160, 321); - this.wmTextBox9.Name = "wmTextBox9"; - this.wmTextBox9.Size = new System.Drawing.Size(380, 23); - this.wmTextBox9.TabIndex = 13; - this.wmTextBox9.Visible = false; - // - // wmLabel9 - // - this.wmLabel9.AutoSize = true; - this.wmLabel9.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel9.Location = new System.Drawing.Point(35, 327); - this.wmLabel9.Name = "wmLabel9"; - this.wmLabel9.Size = new System.Drawing.Size(16, 16); - this.wmLabel9.TabIndex = 12; - this.wmLabel9.Text = "9"; - this.wmLabel9.Visible = false; - // - // wmTextBox10 - // - this.wmTextBox10.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox10.Location = new System.Drawing.Point(160, 350); - this.wmTextBox10.Name = "wmTextBox10"; - this.wmTextBox10.Size = new System.Drawing.Size(380, 23); - this.wmTextBox10.TabIndex = 15; - this.wmTextBox10.Visible = false; - // - // wmLabel10 - // - this.wmLabel10.AutoSize = true; - this.wmLabel10.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel10.Location = new System.Drawing.Point(35, 356); - this.wmLabel10.Name = "wmLabel10"; - this.wmLabel10.Size = new System.Drawing.Size(24, 16); - this.wmLabel10.TabIndex = 14; - this.wmLabel10.Text = "10"; - this.wmLabel10.Visible = false; - // - // wmTextBox12 - // - this.wmTextBox12.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox12.Location = new System.Drawing.Point(160, 408); - this.wmTextBox12.Name = "wmTextBox12"; - this.wmTextBox12.Size = new System.Drawing.Size(380, 23); - this.wmTextBox12.TabIndex = 19; - this.wmTextBox12.Visible = false; - // - // wmLabel12 - // - this.wmLabel12.AutoSize = true; - this.wmLabel12.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel12.Location = new System.Drawing.Point(35, 414); - this.wmLabel12.Name = "wmLabel12"; - this.wmLabel12.Size = new System.Drawing.Size(24, 16); - this.wmLabel12.TabIndex = 18; - this.wmLabel12.Text = "12"; - this.wmLabel12.Visible = false; - // - // wmTextBox11 - // - this.wmTextBox11.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox11.Location = new System.Drawing.Point(160, 379); - this.wmTextBox11.Name = "wmTextBox11"; - this.wmTextBox11.Size = new System.Drawing.Size(380, 23); - this.wmTextBox11.TabIndex = 17; - this.wmTextBox11.Visible = false; - // - // wmLabel11 - // - this.wmLabel11.AutoSize = true; - this.wmLabel11.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel11.Location = new System.Drawing.Point(35, 385); - this.wmLabel11.Name = "wmLabel11"; - this.wmLabel11.Size = new System.Drawing.Size(24, 16); - this.wmLabel11.TabIndex = 16; - this.wmLabel11.Text = "11"; - this.wmLabel11.Visible = false; - // - // wmTextBox24 - // - this.wmTextBox24.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox24.Location = new System.Drawing.Point(160, 756); - this.wmTextBox24.Name = "wmTextBox24"; - this.wmTextBox24.Size = new System.Drawing.Size(380, 23); - this.wmTextBox24.TabIndex = 43; - this.wmTextBox24.Visible = false; - // - // wmLabel24 - // - this.wmLabel24.AutoSize = true; - this.wmLabel24.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel24.Location = new System.Drawing.Point(35, 762); - this.wmLabel24.Name = "wmLabel24"; - this.wmLabel24.Size = new System.Drawing.Size(24, 16); - this.wmLabel24.TabIndex = 42; - this.wmLabel24.Text = "24"; - this.wmLabel24.Visible = false; - // - // wmTextBox23 - // - this.wmTextBox23.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox23.Location = new System.Drawing.Point(160, 727); - this.wmTextBox23.Name = "wmTextBox23"; - this.wmTextBox23.Size = new System.Drawing.Size(380, 23); - this.wmTextBox23.TabIndex = 41; - this.wmTextBox23.Visible = false; - // - // wmLabel23 - // - this.wmLabel23.AutoSize = true; - this.wmLabel23.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel23.Location = new System.Drawing.Point(35, 733); - this.wmLabel23.Name = "wmLabel23"; - this.wmLabel23.Size = new System.Drawing.Size(24, 16); - this.wmLabel23.TabIndex = 40; - this.wmLabel23.Text = "23"; - this.wmLabel23.Visible = false; - // - // wmTextBox22 - // - this.wmTextBox22.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox22.Location = new System.Drawing.Point(160, 698); - this.wmTextBox22.Name = "wmTextBox22"; - this.wmTextBox22.Size = new System.Drawing.Size(380, 23); - this.wmTextBox22.TabIndex = 39; - this.wmTextBox22.Visible = false; - // - // wmLabel22 - // - this.wmLabel22.AutoSize = true; - this.wmLabel22.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel22.Location = new System.Drawing.Point(35, 704); - this.wmLabel22.Name = "wmLabel22"; - this.wmLabel22.Size = new System.Drawing.Size(24, 16); - this.wmLabel22.TabIndex = 38; - this.wmLabel22.Text = "22"; - this.wmLabel22.Visible = false; - // - // wmTextBox21 - // - this.wmTextBox21.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox21.Location = new System.Drawing.Point(160, 669); - this.wmTextBox21.Name = "wmTextBox21"; - this.wmTextBox21.Size = new System.Drawing.Size(380, 23); - this.wmTextBox21.TabIndex = 37; - this.wmTextBox21.Visible = false; - // - // wmLabel21 - // - this.wmLabel21.AutoSize = true; - this.wmLabel21.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel21.Location = new System.Drawing.Point(35, 675); - this.wmLabel21.Name = "wmLabel21"; - this.wmLabel21.Size = new System.Drawing.Size(24, 16); - this.wmLabel21.TabIndex = 36; - this.wmLabel21.Text = "21"; - this.wmLabel21.Visible = false; - // - // wmTextBox20 - // - this.wmTextBox20.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox20.Location = new System.Drawing.Point(160, 640); - this.wmTextBox20.Name = "wmTextBox20"; - this.wmTextBox20.Size = new System.Drawing.Size(380, 23); - this.wmTextBox20.TabIndex = 35; - this.wmTextBox20.Visible = false; - // - // wmLabel20 - // - this.wmLabel20.AutoSize = true; - this.wmLabel20.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel20.Location = new System.Drawing.Point(35, 647); - this.wmLabel20.Name = "wmLabel20"; - this.wmLabel20.Size = new System.Drawing.Size(24, 16); - this.wmLabel20.TabIndex = 34; - this.wmLabel20.Text = "20"; - this.wmLabel20.Visible = false; - // - // wmTextBox19 - // - this.wmTextBox19.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox19.Location = new System.Drawing.Point(160, 611); - this.wmTextBox19.Name = "wmTextBox19"; - this.wmTextBox19.Size = new System.Drawing.Size(380, 23); - this.wmTextBox19.TabIndex = 33; - this.wmTextBox19.Visible = false; - // - // wmLabel19 - // - this.wmLabel19.AutoSize = true; - this.wmLabel19.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel19.Location = new System.Drawing.Point(35, 618); - this.wmLabel19.Name = "wmLabel19"; - this.wmLabel19.Size = new System.Drawing.Size(24, 16); - this.wmLabel19.TabIndex = 32; - this.wmLabel19.Text = "19"; - this.wmLabel19.Visible = false; - // - // wmTextBox18 - // - this.wmTextBox18.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox18.Location = new System.Drawing.Point(160, 582); - this.wmTextBox18.Name = "wmTextBox18"; - this.wmTextBox18.Size = new System.Drawing.Size(380, 23); - this.wmTextBox18.TabIndex = 27; - this.wmTextBox18.Visible = false; - // - // wmLabel18 - // - this.wmLabel18.AutoSize = true; - this.wmLabel18.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel18.Location = new System.Drawing.Point(35, 589); - this.wmLabel18.Name = "wmLabel18"; - this.wmLabel18.Size = new System.Drawing.Size(24, 16); - this.wmLabel18.TabIndex = 23; - this.wmLabel18.Text = "18"; - this.wmLabel18.Visible = false; - // - // wmTextBox17 - // - this.wmTextBox17.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox17.Location = new System.Drawing.Point(160, 553); - this.wmTextBox17.Name = "wmTextBox17"; - this.wmTextBox17.Size = new System.Drawing.Size(380, 23); - this.wmTextBox17.TabIndex = 26; - this.wmTextBox17.Visible = false; - // - // wmLabel17 - // - this.wmLabel17.AutoSize = true; - this.wmLabel17.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel17.Location = new System.Drawing.Point(35, 559); - this.wmLabel17.Name = "wmLabel17"; - this.wmLabel17.Size = new System.Drawing.Size(24, 16); - this.wmLabel17.TabIndex = 22; - this.wmLabel17.Text = "17"; - this.wmLabel17.Visible = false; - // - // wmTextBox16 - // - this.wmTextBox16.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox16.Location = new System.Drawing.Point(160, 524); - this.wmTextBox16.Name = "wmTextBox16"; - this.wmTextBox16.Size = new System.Drawing.Size(380, 23); - this.wmTextBox16.TabIndex = 30; - this.wmTextBox16.Visible = false; - // - // wmLabel16 - // - this.wmLabel16.AutoSize = true; - this.wmLabel16.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel16.Location = new System.Drawing.Point(35, 530); - this.wmLabel16.Name = "wmLabel16"; - this.wmLabel16.Size = new System.Drawing.Size(24, 16); - this.wmLabel16.TabIndex = 21; - this.wmLabel16.Text = "16"; - this.wmLabel16.Visible = false; - // - // wmTextBox15 - // - this.wmTextBox15.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox15.Location = new System.Drawing.Point(160, 495); - this.wmTextBox15.Name = "wmTextBox15"; - this.wmTextBox15.Size = new System.Drawing.Size(380, 23); - this.wmTextBox15.TabIndex = 31; - this.wmTextBox15.Visible = false; - // - // wmLabel15 - // - this.wmLabel15.AutoSize = true; - this.wmLabel15.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel15.Location = new System.Drawing.Point(35, 501); - this.wmLabel15.Name = "wmLabel15"; - this.wmLabel15.Size = new System.Drawing.Size(24, 16); - this.wmLabel15.TabIndex = 20; - this.wmLabel15.Text = "15"; - this.wmLabel15.Visible = false; - // - // wmTextBox14 - // - this.wmTextBox14.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox14.Location = new System.Drawing.Point(160, 466); - this.wmTextBox14.Name = "wmTextBox14"; - this.wmTextBox14.Size = new System.Drawing.Size(380, 23); - this.wmTextBox14.TabIndex = 28; - this.wmTextBox14.Visible = false; - // - // wmLabel14 - // - this.wmLabel14.AutoSize = true; - this.wmLabel14.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel14.Location = new System.Drawing.Point(35, 472); - this.wmLabel14.Name = "wmLabel14"; - this.wmLabel14.Size = new System.Drawing.Size(24, 16); - this.wmLabel14.TabIndex = 25; - this.wmLabel14.Text = "14"; - this.wmLabel14.Visible = false; - // - // wmTextBox13 - // - this.wmTextBox13.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox13.Location = new System.Drawing.Point(160, 437); - this.wmTextBox13.Name = "wmTextBox13"; - this.wmTextBox13.Size = new System.Drawing.Size(380, 23); - this.wmTextBox13.TabIndex = 29; - this.wmTextBox13.Visible = false; - // - // wmLabel13 - // - this.wmLabel13.AutoSize = true; - this.wmLabel13.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel13.Location = new System.Drawing.Point(35, 443); - this.wmLabel13.Name = "wmLabel13"; - this.wmLabel13.Size = new System.Drawing.Size(24, 16); - this.wmLabel13.TabIndex = 24; - this.wmLabel13.Text = "13"; - this.wmLabel13.Visible = false; - // - // wmTextBox48 - // - this.wmTextBox48.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox48.Location = new System.Drawing.Point(720, 756); - this.wmTextBox48.Name = "wmTextBox48"; - this.wmTextBox48.Size = new System.Drawing.Size(380, 23); - this.wmTextBox48.TabIndex = 94; - this.wmTextBox48.Visible = false; - // - // wmLabel48 - // - this.wmLabel48.AutoSize = true; - this.wmLabel48.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel48.Location = new System.Drawing.Point(595, 762); - this.wmLabel48.Name = "wmLabel48"; - this.wmLabel48.Size = new System.Drawing.Size(24, 16); - this.wmLabel48.TabIndex = 93; - this.wmLabel48.Text = "48"; - this.wmLabel48.Visible = false; - // - // wmTextBox47 - // - this.wmTextBox47.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox47.Location = new System.Drawing.Point(720, 727); - this.wmTextBox47.Name = "wmTextBox47"; - this.wmTextBox47.Size = new System.Drawing.Size(380, 23); - this.wmTextBox47.TabIndex = 92; - this.wmTextBox47.Visible = false; - // - // wmLabel47 - // - this.wmLabel47.AutoSize = true; - this.wmLabel47.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel47.Location = new System.Drawing.Point(595, 733); - this.wmLabel47.Name = "wmLabel47"; - this.wmLabel47.Size = new System.Drawing.Size(24, 16); - this.wmLabel47.TabIndex = 91; - this.wmLabel47.Text = "47"; - this.wmLabel47.Visible = false; - // - // wmTextBox46 - // - this.wmTextBox46.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox46.Location = new System.Drawing.Point(720, 698); - this.wmTextBox46.Name = "wmTextBox46"; - this.wmTextBox46.Size = new System.Drawing.Size(380, 23); - this.wmTextBox46.TabIndex = 90; - this.wmTextBox46.Visible = false; - // - // wmLabel46 - // - this.wmLabel46.AutoSize = true; - this.wmLabel46.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel46.Location = new System.Drawing.Point(595, 704); - this.wmLabel46.Name = "wmLabel46"; - this.wmLabel46.Size = new System.Drawing.Size(24, 16); - this.wmLabel46.TabIndex = 89; - this.wmLabel46.Text = "46"; - this.wmLabel46.Visible = false; - // - // wmTextBox45 - // - this.wmTextBox45.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox45.Location = new System.Drawing.Point(720, 669); - this.wmTextBox45.Name = "wmTextBox45"; - this.wmTextBox45.Size = new System.Drawing.Size(380, 23); - this.wmTextBox45.TabIndex = 88; - this.wmTextBox45.Visible = false; - // - // wmLabel45 - // - this.wmLabel45.AutoSize = true; - this.wmLabel45.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel45.Location = new System.Drawing.Point(595, 675); - this.wmLabel45.Name = "wmLabel45"; - this.wmLabel45.Size = new System.Drawing.Size(24, 16); - this.wmLabel45.TabIndex = 87; - this.wmLabel45.Text = "45"; - this.wmLabel45.Visible = false; - // - // wmTextBox44 - // - this.wmTextBox44.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox44.Location = new System.Drawing.Point(720, 640); - this.wmTextBox44.Name = "wmTextBox44"; - this.wmTextBox44.Size = new System.Drawing.Size(380, 23); - this.wmTextBox44.TabIndex = 86; - this.wmTextBox44.Visible = false; - // - // wmLabel44 - // - this.wmLabel44.AutoSize = true; - this.wmLabel44.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel44.Location = new System.Drawing.Point(595, 647); - this.wmLabel44.Name = "wmLabel44"; - this.wmLabel44.Size = new System.Drawing.Size(24, 16); - this.wmLabel44.TabIndex = 85; - this.wmLabel44.Text = "44"; - this.wmLabel44.Visible = false; - // - // wmTextBox43 - // - this.wmTextBox43.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox43.Location = new System.Drawing.Point(720, 611); - this.wmTextBox43.Name = "wmTextBox43"; - this.wmTextBox43.Size = new System.Drawing.Size(380, 23); - this.wmTextBox43.TabIndex = 84; - this.wmTextBox43.Visible = false; - // - // wmLabel43 - // - this.wmLabel43.AutoSize = true; - this.wmLabel43.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel43.Location = new System.Drawing.Point(595, 618); - this.wmLabel43.Name = "wmLabel43"; - this.wmLabel43.Size = new System.Drawing.Size(24, 16); - this.wmLabel43.TabIndex = 83; - this.wmLabel43.Text = "43"; - this.wmLabel43.Visible = false; - // - // wmTextBox42 - // - this.wmTextBox42.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox42.Location = new System.Drawing.Point(720, 582); - this.wmTextBox42.Name = "wmTextBox42"; - this.wmTextBox42.Size = new System.Drawing.Size(380, 23); - this.wmTextBox42.TabIndex = 78; - this.wmTextBox42.Visible = false; - // - // wmLabel42 - // - this.wmLabel42.AutoSize = true; - this.wmLabel42.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel42.Location = new System.Drawing.Point(595, 589); - this.wmLabel42.Name = "wmLabel42"; - this.wmLabel42.Size = new System.Drawing.Size(24, 16); - this.wmLabel42.TabIndex = 74; - this.wmLabel42.Text = "42"; - this.wmLabel42.Visible = false; - // - // wmTextBox41 - // - this.wmTextBox41.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox41.Location = new System.Drawing.Point(720, 553); - this.wmTextBox41.Name = "wmTextBox41"; - this.wmTextBox41.Size = new System.Drawing.Size(380, 23); - this.wmTextBox41.TabIndex = 77; - this.wmTextBox41.Visible = false; - // - // wmLabel41 - // - this.wmLabel41.AutoSize = true; - this.wmLabel41.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel41.Location = new System.Drawing.Point(595, 559); - this.wmLabel41.Name = "wmLabel41"; - this.wmLabel41.Size = new System.Drawing.Size(24, 16); - this.wmLabel41.TabIndex = 73; - this.wmLabel41.Text = "41"; - this.wmLabel41.Visible = false; - // - // wmTextBox40 - // - this.wmTextBox40.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox40.Location = new System.Drawing.Point(720, 524); - this.wmTextBox40.Name = "wmTextBox40"; - this.wmTextBox40.Size = new System.Drawing.Size(380, 23); - this.wmTextBox40.TabIndex = 81; - this.wmTextBox40.Visible = false; - // - // wmLabel40 - // - this.wmLabel40.AutoSize = true; - this.wmLabel40.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel40.Location = new System.Drawing.Point(595, 530); - this.wmLabel40.Name = "wmLabel40"; - this.wmLabel40.Size = new System.Drawing.Size(24, 16); - this.wmLabel40.TabIndex = 72; - this.wmLabel40.Text = "40"; - this.wmLabel40.Visible = false; - // - // wmTextBox39 - // - this.wmTextBox39.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox39.Location = new System.Drawing.Point(720, 495); - this.wmTextBox39.Name = "wmTextBox39"; - this.wmTextBox39.Size = new System.Drawing.Size(380, 23); - this.wmTextBox39.TabIndex = 82; - this.wmTextBox39.Visible = false; - // - // wmLabel39 - // - this.wmLabel39.AutoSize = true; - this.wmLabel39.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel39.Location = new System.Drawing.Point(595, 501); - this.wmLabel39.Name = "wmLabel39"; - this.wmLabel39.Size = new System.Drawing.Size(24, 16); - this.wmLabel39.TabIndex = 71; - this.wmLabel39.Text = "39"; - this.wmLabel39.Visible = false; - // - // wmTextBox38 - // - this.wmTextBox38.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox38.Location = new System.Drawing.Point(720, 466); - this.wmTextBox38.Name = "wmTextBox38"; - this.wmTextBox38.Size = new System.Drawing.Size(380, 23); - this.wmTextBox38.TabIndex = 79; - this.wmTextBox38.Visible = false; - // - // wmLabel38 - // - this.wmLabel38.AutoSize = true; - this.wmLabel38.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel38.Location = new System.Drawing.Point(595, 472); - this.wmLabel38.Name = "wmLabel38"; - this.wmLabel38.Size = new System.Drawing.Size(24, 16); - this.wmLabel38.TabIndex = 76; - this.wmLabel38.Text = "38"; - this.wmLabel38.Visible = false; - // - // wmTextBox37 - // - this.wmTextBox37.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox37.Location = new System.Drawing.Point(720, 437); - this.wmTextBox37.Name = "wmTextBox37"; - this.wmTextBox37.Size = new System.Drawing.Size(380, 23); - this.wmTextBox37.TabIndex = 80; - this.wmTextBox37.Visible = false; - // - // wmLabel37 - // - this.wmLabel37.AutoSize = true; - this.wmLabel37.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel37.Location = new System.Drawing.Point(595, 443); - this.wmLabel37.Name = "wmLabel37"; - this.wmLabel37.Size = new System.Drawing.Size(24, 16); - this.wmLabel37.TabIndex = 75; - this.wmLabel37.Text = "37"; - this.wmLabel37.Visible = false; - // - // wmTextBox36 - // - this.wmTextBox36.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox36.Location = new System.Drawing.Point(720, 408); - this.wmTextBox36.Name = "wmTextBox36"; - this.wmTextBox36.Size = new System.Drawing.Size(380, 23); - this.wmTextBox36.TabIndex = 70; - this.wmTextBox36.Visible = false; - // - // wmLabel36 - // - this.wmLabel36.AutoSize = true; - this.wmLabel36.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel36.Location = new System.Drawing.Point(595, 414); - this.wmLabel36.Name = "wmLabel36"; - this.wmLabel36.Size = new System.Drawing.Size(24, 16); - this.wmLabel36.TabIndex = 69; - this.wmLabel36.Text = "36"; - this.wmLabel36.Visible = false; - // - // wmTextBox35 - // - this.wmTextBox35.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox35.Location = new System.Drawing.Point(720, 379); - this.wmTextBox35.Name = "wmTextBox35"; - this.wmTextBox35.Size = new System.Drawing.Size(380, 23); - this.wmTextBox35.TabIndex = 68; - this.wmTextBox35.Visible = false; - // - // wmLabel35 - // - this.wmLabel35.AutoSize = true; - this.wmLabel35.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel35.Location = new System.Drawing.Point(595, 385); - this.wmLabel35.Name = "wmLabel35"; - this.wmLabel35.Size = new System.Drawing.Size(24, 16); - this.wmLabel35.TabIndex = 67; - this.wmLabel35.Text = "35"; - this.wmLabel35.Visible = false; - // - // wmTextBox34 - // - this.wmTextBox34.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox34.Location = new System.Drawing.Point(720, 350); - this.wmTextBox34.Name = "wmTextBox34"; - this.wmTextBox34.Size = new System.Drawing.Size(380, 23); - this.wmTextBox34.TabIndex = 66; - this.wmTextBox34.Visible = false; - // - // wmLabel34 - // - this.wmLabel34.AutoSize = true; - this.wmLabel34.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel34.Location = new System.Drawing.Point(595, 356); - this.wmLabel34.Name = "wmLabel34"; - this.wmLabel34.Size = new System.Drawing.Size(24, 16); - this.wmLabel34.TabIndex = 65; - this.wmLabel34.Text = "34"; - this.wmLabel34.Visible = false; - // - // wmTextBox33 - // - this.wmTextBox33.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox33.Location = new System.Drawing.Point(720, 321); - this.wmTextBox33.Name = "wmTextBox33"; - this.wmTextBox33.Size = new System.Drawing.Size(380, 23); - this.wmTextBox33.TabIndex = 64; - this.wmTextBox33.Visible = false; - // - // wmLabel33 - // - this.wmLabel33.AutoSize = true; - this.wmLabel33.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel33.Location = new System.Drawing.Point(595, 327); - this.wmLabel33.Name = "wmLabel33"; - this.wmLabel33.Size = new System.Drawing.Size(24, 16); - this.wmLabel33.TabIndex = 63; - this.wmLabel33.Text = "33"; - this.wmLabel33.Visible = false; - // - // wmTextBox32 - // - this.wmTextBox32.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox32.Location = new System.Drawing.Point(720, 292); - this.wmTextBox32.Name = "wmTextBox32"; - this.wmTextBox32.Size = new System.Drawing.Size(380, 23); - this.wmTextBox32.TabIndex = 62; - this.wmTextBox32.Visible = false; - // - // wmLabel32 - // - this.wmLabel32.AutoSize = true; - this.wmLabel32.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel32.Location = new System.Drawing.Point(595, 299); - this.wmLabel32.Name = "wmLabel32"; - this.wmLabel32.Size = new System.Drawing.Size(24, 16); - this.wmLabel32.TabIndex = 61; - this.wmLabel32.Text = "32"; - this.wmLabel32.Visible = false; - // - // wmTextBox31 - // - this.wmTextBox31.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox31.Location = new System.Drawing.Point(720, 263); - this.wmTextBox31.Name = "wmTextBox31"; - this.wmTextBox31.Size = new System.Drawing.Size(380, 23); - this.wmTextBox31.TabIndex = 60; - this.wmTextBox31.Visible = false; - // - // wmLabel31 - // - this.wmLabel31.AutoSize = true; - this.wmLabel31.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel31.Location = new System.Drawing.Point(595, 270); - this.wmLabel31.Name = "wmLabel31"; - this.wmLabel31.Size = new System.Drawing.Size(24, 16); - this.wmLabel31.TabIndex = 59; - this.wmLabel31.Text = "31"; - this.wmLabel31.Visible = false; - // - // wmTextBox30 - // - this.wmTextBox30.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox30.Location = new System.Drawing.Point(720, 234); - this.wmTextBox30.Name = "wmTextBox30"; - this.wmTextBox30.Size = new System.Drawing.Size(380, 23); - this.wmTextBox30.TabIndex = 54; - this.wmTextBox30.Visible = false; - // - // wmLabel30 - // - this.wmLabel30.AutoSize = true; - this.wmLabel30.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel30.Location = new System.Drawing.Point(595, 241); - this.wmLabel30.Name = "wmLabel30"; - this.wmLabel30.Size = new System.Drawing.Size(24, 16); - this.wmLabel30.TabIndex = 50; - this.wmLabel30.Text = "30"; - this.wmLabel30.Visible = false; - // - // wmTextBox29 - // - this.wmTextBox29.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox29.Location = new System.Drawing.Point(720, 205); - this.wmTextBox29.Name = "wmTextBox29"; - this.wmTextBox29.Size = new System.Drawing.Size(380, 23); - this.wmTextBox29.TabIndex = 53; - this.wmTextBox29.Visible = false; - // - // wmLabel29 - // - this.wmLabel29.AutoSize = true; - this.wmLabel29.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel29.Location = new System.Drawing.Point(595, 211); - this.wmLabel29.Name = "wmLabel29"; - this.wmLabel29.Size = new System.Drawing.Size(24, 16); - this.wmLabel29.TabIndex = 49; - this.wmLabel29.Text = "29"; - this.wmLabel29.Visible = false; - // - // wmTextBox28 - // - this.wmTextBox28.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox28.Location = new System.Drawing.Point(720, 176); - this.wmTextBox28.Name = "wmTextBox28"; - this.wmTextBox28.Size = new System.Drawing.Size(380, 23); - this.wmTextBox28.TabIndex = 57; - this.wmTextBox28.Visible = false; - // - // wmLabel28 - // - this.wmLabel28.AutoSize = true; - this.wmLabel28.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel28.Location = new System.Drawing.Point(595, 182); - this.wmLabel28.Name = "wmLabel28"; - this.wmLabel28.Size = new System.Drawing.Size(24, 16); - this.wmLabel28.TabIndex = 48; - this.wmLabel28.Text = "28"; - this.wmLabel28.Visible = false; - // - // wmTextBox27 - // - this.wmTextBox27.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox27.Location = new System.Drawing.Point(720, 147); - this.wmTextBox27.Name = "wmTextBox27"; - this.wmTextBox27.Size = new System.Drawing.Size(380, 23); - this.wmTextBox27.TabIndex = 58; - this.wmTextBox27.Visible = false; - // - // wmLabel27 - // - this.wmLabel27.AutoSize = true; - this.wmLabel27.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel27.Location = new System.Drawing.Point(595, 153); - this.wmLabel27.Name = "wmLabel27"; - this.wmLabel27.Size = new System.Drawing.Size(24, 16); - this.wmLabel27.TabIndex = 47; - this.wmLabel27.Text = "27"; - this.wmLabel27.Visible = false; - // - // wmTextBox26 - // - this.wmTextBox26.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox26.Location = new System.Drawing.Point(720, 118); - this.wmTextBox26.Name = "wmTextBox26"; - this.wmTextBox26.Size = new System.Drawing.Size(380, 23); - this.wmTextBox26.TabIndex = 55; - this.wmTextBox26.Visible = false; - // - // wmLabel26 - // - this.wmLabel26.AutoSize = true; - this.wmLabel26.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel26.Location = new System.Drawing.Point(595, 124); - this.wmLabel26.Name = "wmLabel26"; - this.wmLabel26.Size = new System.Drawing.Size(24, 16); - this.wmLabel26.TabIndex = 52; - this.wmLabel26.Text = "26"; - this.wmLabel26.Visible = false; - // - // wmTextBox25 - // - this.wmTextBox25.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmTextBox25.Location = new System.Drawing.Point(720, 89); - this.wmTextBox25.Name = "wmTextBox25"; - this.wmTextBox25.Size = new System.Drawing.Size(380, 23); - this.wmTextBox25.TabIndex = 56; - this.wmTextBox25.Visible = false; - // - // wmLabel25 - // - this.wmLabel25.AutoSize = true; - this.wmLabel25.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.wmLabel25.Location = new System.Drawing.Point(595, 95); - this.wmLabel25.Name = "wmLabel25"; - this.wmLabel25.Size = new System.Drawing.Size(24, 16); - this.wmLabel25.TabIndex = 51; - this.wmLabel25.Text = "25"; - this.wmLabel25.Visible = false; - // - // activityLabel - // - this.activityLabel.AutoSize = true; - this.activityLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.activityLabel.Location = new System.Drawing.Point(189, 22); - this.activityLabel.Name = "activityLabel"; - this.activityLabel.Size = new System.Drawing.Size(225, 42); - this.activityLabel.TabIndex = 95; - this.activityLabel.Text = "Activity label"; - // - // pictureBox48 - // - this.pictureBox48.Location = new System.Drawing.Point(680, 756); - this.pictureBox48.Name = "pictureBox48"; - this.pictureBox48.Size = new System.Drawing.Size(23, 23); - this.pictureBox48.TabIndex = 143; - this.pictureBox48.TabStop = false; - // - // pictureBox47 - // - this.pictureBox47.Location = new System.Drawing.Point(680, 727); - this.pictureBox47.Name = "pictureBox47"; - this.pictureBox47.Size = new System.Drawing.Size(23, 23); - this.pictureBox47.TabIndex = 142; - this.pictureBox47.TabStop = false; - // - // pictureBox46 - // - this.pictureBox46.Location = new System.Drawing.Point(680, 698); - this.pictureBox46.Name = "pictureBox46"; - this.pictureBox46.Size = new System.Drawing.Size(23, 23); - this.pictureBox46.TabIndex = 141; - this.pictureBox46.TabStop = false; - // - // pictureBox45 - // - this.pictureBox45.Location = new System.Drawing.Point(680, 669); - this.pictureBox45.Name = "pictureBox45"; - this.pictureBox45.Size = new System.Drawing.Size(23, 23); - this.pictureBox45.TabIndex = 140; - this.pictureBox45.TabStop = false; - // - // pictureBox44 - // - this.pictureBox44.Location = new System.Drawing.Point(680, 640); - this.pictureBox44.Name = "pictureBox44"; - this.pictureBox44.Size = new System.Drawing.Size(23, 23); - this.pictureBox44.TabIndex = 139; - this.pictureBox44.TabStop = false; - // - // pictureBox43 - // - this.pictureBox43.Location = new System.Drawing.Point(680, 611); - this.pictureBox43.Name = "pictureBox43"; - this.pictureBox43.Size = new System.Drawing.Size(23, 23); - this.pictureBox43.TabIndex = 138; - this.pictureBox43.TabStop = false; - // - // pictureBox42 - // - this.pictureBox42.Location = new System.Drawing.Point(680, 582); - this.pictureBox42.Name = "pictureBox42"; - this.pictureBox42.Size = new System.Drawing.Size(23, 23); - this.pictureBox42.TabIndex = 137; - this.pictureBox42.TabStop = false; - // - // pictureBox41 - // - this.pictureBox41.Location = new System.Drawing.Point(680, 553); - this.pictureBox41.Name = "pictureBox41"; - this.pictureBox41.Size = new System.Drawing.Size(23, 23); - this.pictureBox41.TabIndex = 136; - this.pictureBox41.TabStop = false; - // - // pictureBox40 - // - this.pictureBox40.Location = new System.Drawing.Point(680, 524); - this.pictureBox40.Name = "pictureBox40"; - this.pictureBox40.Size = new System.Drawing.Size(23, 23); - this.pictureBox40.TabIndex = 135; - this.pictureBox40.TabStop = false; - // - // pictureBox39 - // - this.pictureBox39.Location = new System.Drawing.Point(680, 495); - this.pictureBox39.Name = "pictureBox39"; - this.pictureBox39.Size = new System.Drawing.Size(23, 23); - this.pictureBox39.TabIndex = 134; - this.pictureBox39.TabStop = false; - // - // pictureBox38 - // - this.pictureBox38.Location = new System.Drawing.Point(680, 466); - this.pictureBox38.Name = "pictureBox38"; - this.pictureBox38.Size = new System.Drawing.Size(23, 23); - this.pictureBox38.TabIndex = 133; - this.pictureBox38.TabStop = false; - // - // pictureBox37 - // - this.pictureBox37.Location = new System.Drawing.Point(680, 437); - this.pictureBox37.Name = "pictureBox37"; - this.pictureBox37.Size = new System.Drawing.Size(23, 23); - this.pictureBox37.TabIndex = 132; - this.pictureBox37.TabStop = false; - // - // pictureBox36 - // - this.pictureBox36.Location = new System.Drawing.Point(680, 408); - this.pictureBox36.Name = "pictureBox36"; - this.pictureBox36.Size = new System.Drawing.Size(23, 23); - this.pictureBox36.TabIndex = 131; - this.pictureBox36.TabStop = false; - // - // pictureBox35 - // - this.pictureBox35.Location = new System.Drawing.Point(680, 379); - this.pictureBox35.Name = "pictureBox35"; - this.pictureBox35.Size = new System.Drawing.Size(23, 23); - this.pictureBox35.TabIndex = 130; - this.pictureBox35.TabStop = false; - // - // pictureBox34 - // - this.pictureBox34.Location = new System.Drawing.Point(680, 350); - this.pictureBox34.Name = "pictureBox34"; - this.pictureBox34.Size = new System.Drawing.Size(23, 23); - this.pictureBox34.TabIndex = 129; - this.pictureBox34.TabStop = false; - // - // pictureBox33 - // - this.pictureBox33.Location = new System.Drawing.Point(680, 321); - this.pictureBox33.Name = "pictureBox33"; - this.pictureBox33.Size = new System.Drawing.Size(23, 23); - this.pictureBox33.TabIndex = 128; - this.pictureBox33.TabStop = false; - // - // pictureBox32 - // - this.pictureBox32.Location = new System.Drawing.Point(680, 292); - this.pictureBox32.Name = "pictureBox32"; - this.pictureBox32.Size = new System.Drawing.Size(23, 23); - this.pictureBox32.TabIndex = 127; - this.pictureBox32.TabStop = false; - // - // pictureBox31 - // - this.pictureBox31.Location = new System.Drawing.Point(680, 263); - this.pictureBox31.Name = "pictureBox31"; - this.pictureBox31.Size = new System.Drawing.Size(23, 23); - this.pictureBox31.TabIndex = 126; - this.pictureBox31.TabStop = false; - // - // pictureBox30 - // - this.pictureBox30.Location = new System.Drawing.Point(680, 234); - this.pictureBox30.Name = "pictureBox30"; - this.pictureBox30.Size = new System.Drawing.Size(23, 23); - this.pictureBox30.TabIndex = 125; - this.pictureBox30.TabStop = false; - // - // pictureBox29 - // - this.pictureBox29.Location = new System.Drawing.Point(680, 205); - this.pictureBox29.Name = "pictureBox29"; - this.pictureBox29.Size = new System.Drawing.Size(23, 23); - this.pictureBox29.TabIndex = 124; - this.pictureBox29.TabStop = false; - // - // pictureBox28 - // - this.pictureBox28.Location = new System.Drawing.Point(680, 176); - this.pictureBox28.Name = "pictureBox28"; - this.pictureBox28.Size = new System.Drawing.Size(23, 23); - this.pictureBox28.TabIndex = 123; - this.pictureBox28.TabStop = false; - // - // pictureBox27 - // - this.pictureBox27.Location = new System.Drawing.Point(680, 147); - this.pictureBox27.Name = "pictureBox27"; - this.pictureBox27.Size = new System.Drawing.Size(23, 23); - this.pictureBox27.TabIndex = 122; - this.pictureBox27.TabStop = false; - // - // pictureBox26 - // - this.pictureBox26.Location = new System.Drawing.Point(680, 118); - this.pictureBox26.Name = "pictureBox26"; - this.pictureBox26.Size = new System.Drawing.Size(23, 23); - this.pictureBox26.TabIndex = 121; - this.pictureBox26.TabStop = false; - // - // pictureBox25 - // - this.pictureBox25.Location = new System.Drawing.Point(680, 89); - this.pictureBox25.Name = "pictureBox25"; - this.pictureBox25.Size = new System.Drawing.Size(23, 23); - this.pictureBox25.TabIndex = 120; - this.pictureBox25.TabStop = false; - // - // pictureBox24 - // - this.pictureBox24.Location = new System.Drawing.Point(120, 756); - this.pictureBox24.Name = "pictureBox24"; - this.pictureBox24.Size = new System.Drawing.Size(23, 23); - this.pictureBox24.TabIndex = 119; - this.pictureBox24.TabStop = false; - // - // pictureBox23 - // - this.pictureBox23.Location = new System.Drawing.Point(120, 727); - this.pictureBox23.Name = "pictureBox23"; - this.pictureBox23.Size = new System.Drawing.Size(23, 23); - this.pictureBox23.TabIndex = 118; - this.pictureBox23.TabStop = false; - // - // pictureBox22 - // - this.pictureBox22.Location = new System.Drawing.Point(120, 698); - this.pictureBox22.Name = "pictureBox22"; - this.pictureBox22.Size = new System.Drawing.Size(23, 23); - this.pictureBox22.TabIndex = 117; - this.pictureBox22.TabStop = false; - // - // pictureBox21 - // - this.pictureBox21.Location = new System.Drawing.Point(120, 669); - this.pictureBox21.Name = "pictureBox21"; - this.pictureBox21.Size = new System.Drawing.Size(23, 23); - this.pictureBox21.TabIndex = 116; - this.pictureBox21.TabStop = false; - // - // pictureBox20 - // - this.pictureBox20.Location = new System.Drawing.Point(120, 640); - this.pictureBox20.Name = "pictureBox20"; - this.pictureBox20.Size = new System.Drawing.Size(23, 23); - this.pictureBox20.TabIndex = 115; - this.pictureBox20.TabStop = false; - // - // pictureBox19 - // - this.pictureBox19.Location = new System.Drawing.Point(120, 611); - this.pictureBox19.Name = "pictureBox19"; - this.pictureBox19.Size = new System.Drawing.Size(23, 23); - this.pictureBox19.TabIndex = 114; - this.pictureBox19.TabStop = false; - // - // pictureBox18 - // - this.pictureBox18.Location = new System.Drawing.Point(120, 582); - this.pictureBox18.Name = "pictureBox18"; - this.pictureBox18.Size = new System.Drawing.Size(23, 23); - this.pictureBox18.TabIndex = 113; - this.pictureBox18.TabStop = false; - // - // pictureBox17 - // - this.pictureBox17.Location = new System.Drawing.Point(120, 553); - this.pictureBox17.Name = "pictureBox17"; - this.pictureBox17.Size = new System.Drawing.Size(23, 23); - this.pictureBox17.TabIndex = 112; - this.pictureBox17.TabStop = false; - // - // pictureBox16 - // - this.pictureBox16.Location = new System.Drawing.Point(120, 524); - this.pictureBox16.Name = "pictureBox16"; - this.pictureBox16.Size = new System.Drawing.Size(23, 23); - this.pictureBox16.TabIndex = 111; - this.pictureBox16.TabStop = false; - // - // pictureBox15 - // - this.pictureBox15.Location = new System.Drawing.Point(120, 495); - this.pictureBox15.Name = "pictureBox15"; - this.pictureBox15.Size = new System.Drawing.Size(23, 23); - this.pictureBox15.TabIndex = 110; - this.pictureBox15.TabStop = false; - // - // pictureBox14 - // - this.pictureBox14.Location = new System.Drawing.Point(120, 466); - this.pictureBox14.Name = "pictureBox14"; - this.pictureBox14.Size = new System.Drawing.Size(23, 23); - this.pictureBox14.TabIndex = 109; - this.pictureBox14.TabStop = false; - // - // pictureBox13 - // - this.pictureBox13.Location = new System.Drawing.Point(120, 437); - this.pictureBox13.Name = "pictureBox13"; - this.pictureBox13.Size = new System.Drawing.Size(23, 23); - this.pictureBox13.TabIndex = 108; - this.pictureBox13.TabStop = false; - // - // pictureBox12 - // - this.pictureBox12.Location = new System.Drawing.Point(120, 408); - this.pictureBox12.Name = "pictureBox12"; - this.pictureBox12.Size = new System.Drawing.Size(23, 23); - this.pictureBox12.TabIndex = 107; - this.pictureBox12.TabStop = false; - // - // pictureBox11 - // - this.pictureBox11.Location = new System.Drawing.Point(120, 379); - this.pictureBox11.Name = "pictureBox11"; - this.pictureBox11.Size = new System.Drawing.Size(23, 23); - this.pictureBox11.TabIndex = 106; - this.pictureBox11.TabStop = false; - // - // pictureBox10 - // - this.pictureBox10.Location = new System.Drawing.Point(120, 350); - this.pictureBox10.Name = "pictureBox10"; - this.pictureBox10.Size = new System.Drawing.Size(23, 23); - this.pictureBox10.TabIndex = 105; - this.pictureBox10.TabStop = false; - // - // pictureBox9 - // - this.pictureBox9.Location = new System.Drawing.Point(120, 321); - this.pictureBox9.Name = "pictureBox9"; - this.pictureBox9.Size = new System.Drawing.Size(23, 23); - this.pictureBox9.TabIndex = 104; - this.pictureBox9.TabStop = false; - // - // pictureBox8 - // - this.pictureBox8.Location = new System.Drawing.Point(120, 292); - this.pictureBox8.Name = "pictureBox8"; - this.pictureBox8.Size = new System.Drawing.Size(23, 23); - this.pictureBox8.TabIndex = 103; - this.pictureBox8.TabStop = false; - // - // pictureBox7 - // - this.pictureBox7.Location = new System.Drawing.Point(120, 263); - this.pictureBox7.Name = "pictureBox7"; - this.pictureBox7.Size = new System.Drawing.Size(23, 23); - this.pictureBox7.TabIndex = 102; - this.pictureBox7.TabStop = false; - // - // pictureBox6 - // - this.pictureBox6.Location = new System.Drawing.Point(120, 234); - this.pictureBox6.Name = "pictureBox6"; - this.pictureBox6.Size = new System.Drawing.Size(23, 23); - this.pictureBox6.TabIndex = 101; - this.pictureBox6.TabStop = false; - // - // pictureBox5 - // - this.pictureBox5.Location = new System.Drawing.Point(120, 205); - this.pictureBox5.Name = "pictureBox5"; - this.pictureBox5.Size = new System.Drawing.Size(23, 23); - this.pictureBox5.TabIndex = 100; - this.pictureBox5.TabStop = false; - // - // pictureBox4 - // - this.pictureBox4.Location = new System.Drawing.Point(120, 176); - this.pictureBox4.Name = "pictureBox4"; - this.pictureBox4.Size = new System.Drawing.Size(23, 23); - this.pictureBox4.TabIndex = 99; - this.pictureBox4.TabStop = false; - // - // pictureBox3 - // - this.pictureBox3.Location = new System.Drawing.Point(120, 147); - this.pictureBox3.Name = "pictureBox3"; - this.pictureBox3.Size = new System.Drawing.Size(23, 23); - this.pictureBox3.TabIndex = 98; - this.pictureBox3.TabStop = false; - // - // pictureBox2 - // - this.pictureBox2.Location = new System.Drawing.Point(120, 118); - this.pictureBox2.Name = "pictureBox2"; - this.pictureBox2.Size = new System.Drawing.Size(23, 23); - this.pictureBox2.TabIndex = 97; - this.pictureBox2.TabStop = false; - // - // pictureBox1 - // - this.pictureBox1.Location = new System.Drawing.Point(120, 89); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(23, 23); - this.pictureBox1.TabIndex = 96; - this.pictureBox1.TabStop = false; - // - // saveButton - // - this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.saveButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.saveButton.Location = new System.Drawing.Point(1025, 22); - this.saveButton.Name = "saveButton"; - this.saveButton.Size = new System.Drawing.Size(75, 42); - this.saveButton.TabIndex = 192; - this.saveButton.Text = "Save"; - this.saveButton.UseVisualStyleBackColor = true; - this.saveButton.Visible = false; - this.saveButton.Click += new System.EventHandler(this.saveButton_Click); - // - // samplePictureBox1 - // - this.samplePictureBox1.Location = new System.Drawing.Point(7, 7); - this.samplePictureBox1.Name = "samplePictureBox1"; - this.samplePictureBox1.Size = new System.Drawing.Size(23, 23); - this.samplePictureBox1.TabIndex = 193; - this.samplePictureBox1.TabStop = false; - // - // samplePictureBox2 - // - this.samplePictureBox2.Location = new System.Drawing.Point(7, 32); - this.samplePictureBox2.Name = "samplePictureBox2"; - this.samplePictureBox2.Size = new System.Drawing.Size(23, 23); - this.samplePictureBox2.TabIndex = 194; - this.samplePictureBox2.TabStop = false; - // - // samplePictureBox3 - // - this.samplePictureBox3.Location = new System.Drawing.Point(7, 57); - this.samplePictureBox3.Name = "samplePictureBox3"; - this.samplePictureBox3.Size = new System.Drawing.Size(23, 23); - this.samplePictureBox3.TabIndex = 195; - this.samplePictureBox3.TabStop = false; - // - // sampleLabel1 - // - this.sampleLabel1.AutoSize = true; - this.sampleLabel1.Location = new System.Drawing.Point(36, 12); - this.sampleLabel1.Name = "sampleLabel1"; - this.sampleLabel1.Size = new System.Drawing.Size(139, 13); - this.sampleLabel1.TabIndex = 196; - this.sampleLabel1.Text = "Direction and pulses are OK"; - // - // sampleLabel2 - // - this.sampleLabel2.AutoSize = true; - this.sampleLabel2.Location = new System.Drawing.Point(36, 37); - this.sampleLabel2.Name = "sampleLabel2"; - this.sampleLabel2.Size = new System.Drawing.Size(125, 13); - this.sampleLabel2.TabIndex = 197; - this.sampleLabel2.Text = "There are no opto pulses"; - // - // sampleLabel3 - // - this.sampleLabel3.AutoSize = true; - this.sampleLabel3.Location = new System.Drawing.Point(36, 62); - this.sampleLabel3.Name = "sampleLabel3"; - this.sampleLabel3.Size = new System.Drawing.Size(85, 13); - this.sampleLabel3.TabIndex = 198; - this.sampleLabel3.Text = "Direction is NOK"; - // - // checkBoxImage48 - // - this.checkBoxImage48.Checked = false; - this.checkBoxImage48.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage48.Image"))); - this.checkBoxImage48.Location = new System.Drawing.Point(630, 758); - this.checkBoxImage48.Name = "checkBoxImage48"; - this.checkBoxImage48.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage48.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage48.TabIndex = 191; - this.checkBoxImage48.TabStop = false; - this.checkBoxImage48.Visible = false; - this.checkBoxImage48.Click += new System.EventHandler(this.checkBoxImage48_Click); - // - // checkBoxImage47 - // - this.checkBoxImage47.Checked = false; - this.checkBoxImage47.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage47.Image"))); - this.checkBoxImage47.Location = new System.Drawing.Point(630, 729); - this.checkBoxImage47.Name = "checkBoxImage47"; - this.checkBoxImage47.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage47.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage47.TabIndex = 190; - this.checkBoxImage47.TabStop = false; - this.checkBoxImage47.Visible = false; - this.checkBoxImage47.Click += new System.EventHandler(this.checkBoxImage47_Click); - // - // checkBoxImage46 - // - this.checkBoxImage46.Checked = false; - this.checkBoxImage46.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage46.Image"))); - this.checkBoxImage46.Location = new System.Drawing.Point(630, 700); - this.checkBoxImage46.Name = "checkBoxImage46"; - this.checkBoxImage46.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage46.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage46.TabIndex = 189; - this.checkBoxImage46.TabStop = false; - this.checkBoxImage46.Visible = false; - this.checkBoxImage46.Click += new System.EventHandler(this.checkBoxImage46_Click); - // - // checkBoxImage45 - // - this.checkBoxImage45.Checked = false; - this.checkBoxImage45.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage45.Image"))); - this.checkBoxImage45.Location = new System.Drawing.Point(630, 671); - this.checkBoxImage45.Name = "checkBoxImage45"; - this.checkBoxImage45.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage45.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage45.TabIndex = 188; - this.checkBoxImage45.TabStop = false; - this.checkBoxImage45.Visible = false; - this.checkBoxImage45.Click += new System.EventHandler(this.checkBoxImage45_Click); - // - // checkBoxImage44 - // - this.checkBoxImage44.Checked = false; - this.checkBoxImage44.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage44.Image"))); - this.checkBoxImage44.Location = new System.Drawing.Point(630, 642); - this.checkBoxImage44.Name = "checkBoxImage44"; - this.checkBoxImage44.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage44.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage44.TabIndex = 187; - this.checkBoxImage44.TabStop = false; - this.checkBoxImage44.Visible = false; - this.checkBoxImage44.Click += new System.EventHandler(this.checkBoxImage44_Click); - // - // checkBoxImage43 - // - this.checkBoxImage43.Checked = false; - this.checkBoxImage43.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage43.Image"))); - this.checkBoxImage43.Location = new System.Drawing.Point(630, 613); - this.checkBoxImage43.Name = "checkBoxImage43"; - this.checkBoxImage43.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage43.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage43.TabIndex = 186; - this.checkBoxImage43.TabStop = false; - this.checkBoxImage43.Visible = false; - this.checkBoxImage43.Click += new System.EventHandler(this.checkBoxImage43_Click); - // - // checkBoxImage42 - // - this.checkBoxImage42.Checked = false; - this.checkBoxImage42.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage42.Image"))); - this.checkBoxImage42.Location = new System.Drawing.Point(630, 584); - this.checkBoxImage42.Name = "checkBoxImage42"; - this.checkBoxImage42.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage42.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage42.TabIndex = 185; - this.checkBoxImage42.TabStop = false; - this.checkBoxImage42.Visible = false; - this.checkBoxImage42.Click += new System.EventHandler(this.checkBoxImage42_Click); - // - // checkBoxImage41 - // - this.checkBoxImage41.Checked = false; - this.checkBoxImage41.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage41.Image"))); - this.checkBoxImage41.Location = new System.Drawing.Point(630, 555); - this.checkBoxImage41.Name = "checkBoxImage41"; - this.checkBoxImage41.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage41.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage41.TabIndex = 184; - this.checkBoxImage41.TabStop = false; - this.checkBoxImage41.Visible = false; - this.checkBoxImage41.Click += new System.EventHandler(this.checkBoxImage41_Click); - // - // checkBoxImage40 - // - this.checkBoxImage40.Checked = false; - this.checkBoxImage40.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage40.Image"))); - this.checkBoxImage40.Location = new System.Drawing.Point(630, 526); - this.checkBoxImage40.Name = "checkBoxImage40"; - this.checkBoxImage40.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage40.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage40.TabIndex = 183; - this.checkBoxImage40.TabStop = false; - this.checkBoxImage40.Visible = false; - this.checkBoxImage40.Click += new System.EventHandler(this.checkBoxImage40_Click); - // - // checkBoxImage39 - // - this.checkBoxImage39.Checked = false; - this.checkBoxImage39.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage39.Image"))); - this.checkBoxImage39.Location = new System.Drawing.Point(630, 497); - this.checkBoxImage39.Name = "checkBoxImage39"; - this.checkBoxImage39.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage39.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage39.TabIndex = 182; - this.checkBoxImage39.TabStop = false; - this.checkBoxImage39.Visible = false; - this.checkBoxImage39.Click += new System.EventHandler(this.checkBoxImage39_Click); - // - // checkBoxImage38 - // - this.checkBoxImage38.Checked = false; - this.checkBoxImage38.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage38.Image"))); - this.checkBoxImage38.Location = new System.Drawing.Point(630, 468); - this.checkBoxImage38.Name = "checkBoxImage38"; - this.checkBoxImage38.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage38.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage38.TabIndex = 181; - this.checkBoxImage38.TabStop = false; - this.checkBoxImage38.Visible = false; - this.checkBoxImage38.Click += new System.EventHandler(this.checkBoxImage38_Click); - // - // checkBoxImage37 - // - this.checkBoxImage37.Checked = false; - this.checkBoxImage37.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage37.Image"))); - this.checkBoxImage37.Location = new System.Drawing.Point(630, 439); - this.checkBoxImage37.Name = "checkBoxImage37"; - this.checkBoxImage37.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage37.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage37.TabIndex = 180; - this.checkBoxImage37.TabStop = false; - this.checkBoxImage37.Visible = false; - this.checkBoxImage37.Click += new System.EventHandler(this.checkBoxImage37_Click); - // - // checkBoxImage36 - // - this.checkBoxImage36.Checked = false; - this.checkBoxImage36.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage36.Image"))); - this.checkBoxImage36.Location = new System.Drawing.Point(630, 410); - this.checkBoxImage36.Name = "checkBoxImage36"; - this.checkBoxImage36.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage36.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage36.TabIndex = 179; - this.checkBoxImage36.TabStop = false; - this.checkBoxImage36.Visible = false; - this.checkBoxImage36.Click += new System.EventHandler(this.checkBoxImage36_Click); - // - // checkBoxImage35 - // - this.checkBoxImage35.Checked = false; - this.checkBoxImage35.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage35.Image"))); - this.checkBoxImage35.Location = new System.Drawing.Point(630, 381); - this.checkBoxImage35.Name = "checkBoxImage35"; - this.checkBoxImage35.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage35.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage35.TabIndex = 178; - this.checkBoxImage35.TabStop = false; - this.checkBoxImage35.Visible = false; - this.checkBoxImage35.Click += new System.EventHandler(this.checkBoxImage35_Click); - // - // checkBoxImage34 - // - this.checkBoxImage34.Checked = false; - this.checkBoxImage34.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage34.Image"))); - this.checkBoxImage34.Location = new System.Drawing.Point(630, 352); - this.checkBoxImage34.Name = "checkBoxImage34"; - this.checkBoxImage34.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage34.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage34.TabIndex = 177; - this.checkBoxImage34.TabStop = false; - this.checkBoxImage34.Visible = false; - this.checkBoxImage34.Click += new System.EventHandler(this.checkBoxImage34_Click); - // - // checkBoxImage33 - // - this.checkBoxImage33.Checked = false; - this.checkBoxImage33.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage33.Image"))); - this.checkBoxImage33.Location = new System.Drawing.Point(630, 323); - this.checkBoxImage33.Name = "checkBoxImage33"; - this.checkBoxImage33.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage33.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage33.TabIndex = 176; - this.checkBoxImage33.TabStop = false; - this.checkBoxImage33.Visible = false; - this.checkBoxImage33.Click += new System.EventHandler(this.checkBoxImage33_Click); - // - // checkBoxImage32 - // - this.checkBoxImage32.Checked = false; - this.checkBoxImage32.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage32.Image"))); - this.checkBoxImage32.Location = new System.Drawing.Point(630, 294); - this.checkBoxImage32.Name = "checkBoxImage32"; - this.checkBoxImage32.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage32.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage32.TabIndex = 175; - this.checkBoxImage32.TabStop = false; - this.checkBoxImage32.Visible = false; - this.checkBoxImage32.Click += new System.EventHandler(this.checkBoxImage32_Click); - // - // checkBoxImage31 - // - this.checkBoxImage31.Checked = false; - this.checkBoxImage31.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage31.Image"))); - this.checkBoxImage31.Location = new System.Drawing.Point(630, 265); - this.checkBoxImage31.Name = "checkBoxImage31"; - this.checkBoxImage31.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage31.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage31.TabIndex = 174; - this.checkBoxImage31.TabStop = false; - this.checkBoxImage31.Visible = false; - this.checkBoxImage31.Click += new System.EventHandler(this.checkBoxImage31_Click); - // - // checkBoxImage30 - // - this.checkBoxImage30.Checked = false; - this.checkBoxImage30.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage30.Image"))); - this.checkBoxImage30.Location = new System.Drawing.Point(630, 236); - this.checkBoxImage30.Name = "checkBoxImage30"; - this.checkBoxImage30.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage30.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage30.TabIndex = 173; - this.checkBoxImage30.TabStop = false; - this.checkBoxImage30.Visible = false; - this.checkBoxImage30.Click += new System.EventHandler(this.checkBoxImage30_Click); - // - // checkBoxImage29 - // - this.checkBoxImage29.Checked = false; - this.checkBoxImage29.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage29.Image"))); - this.checkBoxImage29.Location = new System.Drawing.Point(630, 207); - this.checkBoxImage29.Name = "checkBoxImage29"; - this.checkBoxImage29.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage29.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage29.TabIndex = 172; - this.checkBoxImage29.TabStop = false; - this.checkBoxImage29.Visible = false; - this.checkBoxImage29.Click += new System.EventHandler(this.checkBoxImage29_Click); - // - // checkBoxImage28 - // - this.checkBoxImage28.Checked = false; - this.checkBoxImage28.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage28.Image"))); - this.checkBoxImage28.Location = new System.Drawing.Point(630, 178); - this.checkBoxImage28.Name = "checkBoxImage28"; - this.checkBoxImage28.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage28.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage28.TabIndex = 171; - this.checkBoxImage28.TabStop = false; - this.checkBoxImage28.Visible = false; - this.checkBoxImage28.Click += new System.EventHandler(this.checkBoxImage28_Click); - // - // checkBoxImage27 - // - this.checkBoxImage27.Checked = false; - this.checkBoxImage27.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage27.Image"))); - this.checkBoxImage27.Location = new System.Drawing.Point(630, 149); - this.checkBoxImage27.Name = "checkBoxImage27"; - this.checkBoxImage27.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage27.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage27.TabIndex = 170; - this.checkBoxImage27.TabStop = false; - this.checkBoxImage27.Visible = false; - this.checkBoxImage27.Click += new System.EventHandler(this.checkBoxImage27_Click); - // - // checkBoxImage26 - // - this.checkBoxImage26.Checked = false; - this.checkBoxImage26.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage26.Image"))); - this.checkBoxImage26.Location = new System.Drawing.Point(630, 120); - this.checkBoxImage26.Name = "checkBoxImage26"; - this.checkBoxImage26.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage26.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage26.TabIndex = 169; - this.checkBoxImage26.TabStop = false; - this.checkBoxImage26.Visible = false; - this.checkBoxImage26.Click += new System.EventHandler(this.checkBoxImage26_Click); - // - // checkBoxImage25 - // - this.checkBoxImage25.Checked = false; - this.checkBoxImage25.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage25.Image"))); - this.checkBoxImage25.Location = new System.Drawing.Point(630, 91); - this.checkBoxImage25.Name = "checkBoxImage25"; - this.checkBoxImage25.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage25.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage25.TabIndex = 168; - this.checkBoxImage25.TabStop = false; - this.checkBoxImage25.Visible = false; - this.checkBoxImage25.Click += new System.EventHandler(this.checkBoxImage25_Click); - // - // checkBoxImage24 - // - this.checkBoxImage24.Checked = false; - this.checkBoxImage24.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage24.Image"))); - this.checkBoxImage24.Location = new System.Drawing.Point(70, 758); - this.checkBoxImage24.Name = "checkBoxImage24"; - this.checkBoxImage24.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage24.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage24.TabIndex = 167; - this.checkBoxImage24.TabStop = false; - this.checkBoxImage24.Visible = false; - this.checkBoxImage24.Click += new System.EventHandler(this.checkBoxImage24_Click); - // - // checkBoxImage23 - // - this.checkBoxImage23.Checked = false; - this.checkBoxImage23.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage23.Image"))); - this.checkBoxImage23.Location = new System.Drawing.Point(70, 729); - this.checkBoxImage23.Name = "checkBoxImage23"; - this.checkBoxImage23.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage23.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage23.TabIndex = 166; - this.checkBoxImage23.TabStop = false; - this.checkBoxImage23.Visible = false; - this.checkBoxImage23.Click += new System.EventHandler(this.checkBoxImage23_Click); - // - // checkBoxImage22 - // - this.checkBoxImage22.Checked = false; - this.checkBoxImage22.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage22.Image"))); - this.checkBoxImage22.Location = new System.Drawing.Point(70, 700); - this.checkBoxImage22.Name = "checkBoxImage22"; - this.checkBoxImage22.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage22.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage22.TabIndex = 165; - this.checkBoxImage22.TabStop = false; - this.checkBoxImage22.Visible = false; - this.checkBoxImage22.Click += new System.EventHandler(this.checkBoxImage22_Click); - // - // checkBoxImage21 - // - this.checkBoxImage21.Checked = false; - this.checkBoxImage21.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage21.Image"))); - this.checkBoxImage21.Location = new System.Drawing.Point(70, 671); - this.checkBoxImage21.Name = "checkBoxImage21"; - this.checkBoxImage21.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage21.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage21.TabIndex = 164; - this.checkBoxImage21.TabStop = false; - this.checkBoxImage21.Visible = false; - this.checkBoxImage21.Click += new System.EventHandler(this.checkBoxImage21_Click); - // - // checkBoxImage20 - // - this.checkBoxImage20.Checked = false; - this.checkBoxImage20.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage20.Image"))); - this.checkBoxImage20.Location = new System.Drawing.Point(70, 642); - this.checkBoxImage20.Name = "checkBoxImage20"; - this.checkBoxImage20.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage20.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage20.TabIndex = 163; - this.checkBoxImage20.TabStop = false; - this.checkBoxImage20.Visible = false; - this.checkBoxImage20.Click += new System.EventHandler(this.checkBoxImage20_Click); - // - // checkBoxImage19 - // - this.checkBoxImage19.Checked = false; - this.checkBoxImage19.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage19.Image"))); - this.checkBoxImage19.Location = new System.Drawing.Point(70, 613); - this.checkBoxImage19.Name = "checkBoxImage19"; - this.checkBoxImage19.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage19.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage19.TabIndex = 162; - this.checkBoxImage19.TabStop = false; - this.checkBoxImage19.Visible = false; - this.checkBoxImage19.Click += new System.EventHandler(this.checkBoxImage19_Click); - // - // checkBoxImage18 - // - this.checkBoxImage18.Checked = false; - this.checkBoxImage18.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage18.Image"))); - this.checkBoxImage18.Location = new System.Drawing.Point(70, 584); - this.checkBoxImage18.Name = "checkBoxImage18"; - this.checkBoxImage18.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage18.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage18.TabIndex = 161; - this.checkBoxImage18.TabStop = false; - this.checkBoxImage18.Visible = false; - this.checkBoxImage18.Click += new System.EventHandler(this.checkBoxImage18_Click); - // - // checkBoxImage17 - // - this.checkBoxImage17.Checked = false; - this.checkBoxImage17.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage17.Image"))); - this.checkBoxImage17.Location = new System.Drawing.Point(70, 555); - this.checkBoxImage17.Name = "checkBoxImage17"; - this.checkBoxImage17.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage17.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage17.TabIndex = 160; - this.checkBoxImage17.TabStop = false; - this.checkBoxImage17.Visible = false; - this.checkBoxImage17.Click += new System.EventHandler(this.checkBoxImage17_Click); - // - // checkBoxImage16 - // - this.checkBoxImage16.Checked = false; - this.checkBoxImage16.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage16.Image"))); - this.checkBoxImage16.Location = new System.Drawing.Point(70, 526); - this.checkBoxImage16.Name = "checkBoxImage16"; - this.checkBoxImage16.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage16.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage16.TabIndex = 159; - this.checkBoxImage16.TabStop = false; - this.checkBoxImage16.Visible = false; - this.checkBoxImage16.Click += new System.EventHandler(this.checkBoxImage16_Click); - // - // checkBoxImage15 - // - this.checkBoxImage15.Checked = false; - this.checkBoxImage15.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage15.Image"))); - this.checkBoxImage15.Location = new System.Drawing.Point(70, 497); - this.checkBoxImage15.Name = "checkBoxImage15"; - this.checkBoxImage15.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage15.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage15.TabIndex = 158; - this.checkBoxImage15.TabStop = false; - this.checkBoxImage15.Visible = false; - this.checkBoxImage15.Click += new System.EventHandler(this.checkBoxImage15_Click); - // - // checkBoxImage14 - // - this.checkBoxImage14.Checked = false; - this.checkBoxImage14.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage14.Image"))); - this.checkBoxImage14.Location = new System.Drawing.Point(70, 468); - this.checkBoxImage14.Name = "checkBoxImage14"; - this.checkBoxImage14.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage14.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage14.TabIndex = 157; - this.checkBoxImage14.TabStop = false; - this.checkBoxImage14.Visible = false; - this.checkBoxImage14.Click += new System.EventHandler(this.checkBoxImage14_Click); - // - // checkBoxImage13 - // - this.checkBoxImage13.Checked = false; - this.checkBoxImage13.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage13.Image"))); - this.checkBoxImage13.Location = new System.Drawing.Point(70, 439); - this.checkBoxImage13.Name = "checkBoxImage13"; - this.checkBoxImage13.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage13.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage13.TabIndex = 156; - this.checkBoxImage13.TabStop = false; - this.checkBoxImage13.Visible = false; - this.checkBoxImage13.Click += new System.EventHandler(this.checkBoxImage13_Click); - // - // checkBoxImage12 - // - this.checkBoxImage12.Checked = false; - this.checkBoxImage12.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage12.Image"))); - this.checkBoxImage12.Location = new System.Drawing.Point(70, 410); - this.checkBoxImage12.Name = "checkBoxImage12"; - this.checkBoxImage12.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage12.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage12.TabIndex = 155; - this.checkBoxImage12.TabStop = false; - this.checkBoxImage12.Visible = false; - this.checkBoxImage12.Click += new System.EventHandler(this.checkBoxImage12_Click); - // - // checkBoxImage11 - // - this.checkBoxImage11.Checked = false; - this.checkBoxImage11.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage11.Image"))); - this.checkBoxImage11.Location = new System.Drawing.Point(70, 381); - this.checkBoxImage11.Name = "checkBoxImage11"; - this.checkBoxImage11.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage11.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage11.TabIndex = 154; - this.checkBoxImage11.TabStop = false; - this.checkBoxImage11.Visible = false; - this.checkBoxImage11.Click += new System.EventHandler(this.checkBoxImage11_Click); - // - // checkBoxImage10 - // - this.checkBoxImage10.Checked = false; - this.checkBoxImage10.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage10.Image"))); - this.checkBoxImage10.Location = new System.Drawing.Point(70, 352); - this.checkBoxImage10.Name = "checkBoxImage10"; - this.checkBoxImage10.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage10.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage10.TabIndex = 153; - this.checkBoxImage10.TabStop = false; - this.checkBoxImage10.Visible = false; - this.checkBoxImage10.Click += new System.EventHandler(this.checkBoxImage10_Click); - // - // checkBoxImage9 - // - this.checkBoxImage9.Checked = false; - this.checkBoxImage9.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage9.Image"))); - this.checkBoxImage9.Location = new System.Drawing.Point(70, 323); - this.checkBoxImage9.Name = "checkBoxImage9"; - this.checkBoxImage9.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage9.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage9.TabIndex = 152; - this.checkBoxImage9.TabStop = false; - this.checkBoxImage9.Visible = false; - this.checkBoxImage9.Click += new System.EventHandler(this.checkBoxImage9_Click); - // - // checkBoxImage8 - // - this.checkBoxImage8.Checked = false; - this.checkBoxImage8.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage8.Image"))); - this.checkBoxImage8.Location = new System.Drawing.Point(70, 294); - this.checkBoxImage8.Name = "checkBoxImage8"; - this.checkBoxImage8.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage8.TabIndex = 151; - this.checkBoxImage8.TabStop = false; - this.checkBoxImage8.Visible = false; - this.checkBoxImage8.Click += new System.EventHandler(this.checkBoxImage8_Click); - // - // checkBoxImage7 - // - this.checkBoxImage7.Checked = false; - this.checkBoxImage7.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage7.Image"))); - this.checkBoxImage7.Location = new System.Drawing.Point(70, 265); - this.checkBoxImage7.Name = "checkBoxImage7"; - this.checkBoxImage7.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage7.TabIndex = 150; - this.checkBoxImage7.TabStop = false; - this.checkBoxImage7.Visible = false; - this.checkBoxImage7.Click += new System.EventHandler(this.checkBoxImage7_Click); - // - // checkBoxImage6 - // - this.checkBoxImage6.Checked = false; - this.checkBoxImage6.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage6.Image"))); - this.checkBoxImage6.Location = new System.Drawing.Point(70, 236); - this.checkBoxImage6.Name = "checkBoxImage6"; - this.checkBoxImage6.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage6.TabIndex = 149; - this.checkBoxImage6.TabStop = false; - this.checkBoxImage6.Visible = false; - this.checkBoxImage6.Click += new System.EventHandler(this.checkBoxImage6_Click); - // - // checkBoxImage5 - // - this.checkBoxImage5.Checked = false; - this.checkBoxImage5.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage5.Image"))); - this.checkBoxImage5.Location = new System.Drawing.Point(70, 207); - this.checkBoxImage5.Name = "checkBoxImage5"; - this.checkBoxImage5.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage5.TabIndex = 148; - this.checkBoxImage5.TabStop = false; - this.checkBoxImage5.Visible = false; - this.checkBoxImage5.Click += new System.EventHandler(this.checkBoxImage5_Click); - // - // checkBoxImage4 - // - this.checkBoxImage4.Checked = false; - this.checkBoxImage4.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage4.Image"))); - this.checkBoxImage4.Location = new System.Drawing.Point(70, 178); - this.checkBoxImage4.Name = "checkBoxImage4"; - this.checkBoxImage4.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage4.TabIndex = 147; - this.checkBoxImage4.TabStop = false; - this.checkBoxImage4.Visible = false; - this.checkBoxImage4.Click += new System.EventHandler(this.checkBoxImage4_Click); - // - // checkBoxImage3 - // - this.checkBoxImage3.Checked = false; - this.checkBoxImage3.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage3.Image"))); - this.checkBoxImage3.Location = new System.Drawing.Point(70, 149); - this.checkBoxImage3.Name = "checkBoxImage3"; - this.checkBoxImage3.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage3.TabIndex = 146; - this.checkBoxImage3.TabStop = false; - this.checkBoxImage3.Visible = false; - this.checkBoxImage3.Click += new System.EventHandler(this.checkBoxImage3_Click); - // - // checkBoxImage2 - // - this.checkBoxImage2.Checked = false; - this.checkBoxImage2.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage2.Image"))); - this.checkBoxImage2.Location = new System.Drawing.Point(70, 120); - this.checkBoxImage2.Name = "checkBoxImage2"; - this.checkBoxImage2.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage2.TabIndex = 145; - this.checkBoxImage2.TabStop = false; - this.checkBoxImage2.Visible = false; - this.checkBoxImage2.Click += new System.EventHandler(this.checkBoxImage2_Click); - // - // checkBoxImage1 - // - this.checkBoxImage1.Checked = false; - this.checkBoxImage1.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage1.Image"))); - this.checkBoxImage1.Location = new System.Drawing.Point(70, 91); - this.checkBoxImage1.Name = "checkBoxImage1"; - this.checkBoxImage1.Size = new System.Drawing.Size(32, 21); - this.checkBoxImage1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.checkBoxImage1.TabIndex = 144; - this.checkBoxImage1.TabStop = false; - this.checkBoxImage1.Visible = false; - this.checkBoxImage1.Click += new System.EventHandler(this.checkBoxImage1_Click); - // - // iPerlCommunicationForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.DarkGray; - this.ClientSize = new System.Drawing.Size(1134, 800); - this.Controls.Add(this.sampleLabel3); - this.Controls.Add(this.sampleLabel2); - this.Controls.Add(this.sampleLabel1); - this.Controls.Add(this.samplePictureBox3); - this.Controls.Add(this.samplePictureBox2); - this.Controls.Add(this.samplePictureBox1); - this.Controls.Add(this.saveButton); - this.Controls.Add(this.checkBoxImage48); - this.Controls.Add(this.checkBoxImage47); - this.Controls.Add(this.checkBoxImage46); - this.Controls.Add(this.checkBoxImage45); - this.Controls.Add(this.checkBoxImage44); - this.Controls.Add(this.checkBoxImage43); - this.Controls.Add(this.checkBoxImage42); - this.Controls.Add(this.checkBoxImage41); - this.Controls.Add(this.checkBoxImage40); - this.Controls.Add(this.checkBoxImage39); - this.Controls.Add(this.checkBoxImage38); - this.Controls.Add(this.checkBoxImage37); - this.Controls.Add(this.checkBoxImage36); - this.Controls.Add(this.checkBoxImage35); - this.Controls.Add(this.checkBoxImage34); - this.Controls.Add(this.checkBoxImage33); - this.Controls.Add(this.checkBoxImage32); - this.Controls.Add(this.checkBoxImage31); - this.Controls.Add(this.checkBoxImage30); - this.Controls.Add(this.checkBoxImage29); - this.Controls.Add(this.checkBoxImage28); - this.Controls.Add(this.checkBoxImage27); - this.Controls.Add(this.checkBoxImage26); - this.Controls.Add(this.checkBoxImage25); - this.Controls.Add(this.checkBoxImage24); - this.Controls.Add(this.checkBoxImage23); - this.Controls.Add(this.checkBoxImage22); - this.Controls.Add(this.checkBoxImage21); - this.Controls.Add(this.checkBoxImage20); - this.Controls.Add(this.checkBoxImage19); - this.Controls.Add(this.checkBoxImage18); - this.Controls.Add(this.checkBoxImage17); - this.Controls.Add(this.checkBoxImage16); - this.Controls.Add(this.checkBoxImage15); - this.Controls.Add(this.checkBoxImage14); - this.Controls.Add(this.checkBoxImage13); - this.Controls.Add(this.checkBoxImage12); - this.Controls.Add(this.checkBoxImage11); - this.Controls.Add(this.checkBoxImage10); - this.Controls.Add(this.checkBoxImage9); - this.Controls.Add(this.checkBoxImage8); - this.Controls.Add(this.checkBoxImage7); - this.Controls.Add(this.checkBoxImage6); - this.Controls.Add(this.checkBoxImage5); - this.Controls.Add(this.checkBoxImage4); - this.Controls.Add(this.checkBoxImage3); - this.Controls.Add(this.checkBoxImage2); - this.Controls.Add(this.checkBoxImage1); - this.Controls.Add(this.pictureBox48); - this.Controls.Add(this.pictureBox47); - this.Controls.Add(this.pictureBox46); - this.Controls.Add(this.pictureBox45); - this.Controls.Add(this.pictureBox44); - this.Controls.Add(this.pictureBox43); - this.Controls.Add(this.pictureBox42); - this.Controls.Add(this.pictureBox41); - this.Controls.Add(this.pictureBox40); - this.Controls.Add(this.pictureBox39); - this.Controls.Add(this.pictureBox38); - this.Controls.Add(this.pictureBox37); - this.Controls.Add(this.pictureBox36); - this.Controls.Add(this.pictureBox35); - this.Controls.Add(this.pictureBox34); - this.Controls.Add(this.pictureBox33); - this.Controls.Add(this.pictureBox32); - this.Controls.Add(this.pictureBox31); - this.Controls.Add(this.pictureBox30); - this.Controls.Add(this.pictureBox29); - this.Controls.Add(this.pictureBox28); - this.Controls.Add(this.pictureBox27); - this.Controls.Add(this.pictureBox26); - this.Controls.Add(this.pictureBox25); - this.Controls.Add(this.pictureBox24); - this.Controls.Add(this.pictureBox23); - this.Controls.Add(this.pictureBox22); - this.Controls.Add(this.pictureBox21); - this.Controls.Add(this.pictureBox20); - this.Controls.Add(this.pictureBox19); - this.Controls.Add(this.pictureBox18); - this.Controls.Add(this.pictureBox17); - this.Controls.Add(this.pictureBox16); - this.Controls.Add(this.pictureBox15); - this.Controls.Add(this.pictureBox14); - this.Controls.Add(this.pictureBox13); - this.Controls.Add(this.pictureBox12); - this.Controls.Add(this.pictureBox11); - this.Controls.Add(this.pictureBox10); - this.Controls.Add(this.pictureBox9); - this.Controls.Add(this.pictureBox8); - this.Controls.Add(this.pictureBox7); - this.Controls.Add(this.pictureBox6); - this.Controls.Add(this.pictureBox5); - this.Controls.Add(this.pictureBox4); - this.Controls.Add(this.pictureBox3); - this.Controls.Add(this.pictureBox2); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.activityLabel); - this.Controls.Add(this.wmTextBox48); - this.Controls.Add(this.wmLabel48); - this.Controls.Add(this.wmTextBox47); - this.Controls.Add(this.wmLabel47); - this.Controls.Add(this.wmTextBox46); - this.Controls.Add(this.wmLabel46); - this.Controls.Add(this.wmTextBox45); - this.Controls.Add(this.wmLabel45); - this.Controls.Add(this.wmTextBox44); - this.Controls.Add(this.wmLabel44); - this.Controls.Add(this.wmTextBox43); - this.Controls.Add(this.wmLabel43); - this.Controls.Add(this.wmTextBox42); - this.Controls.Add(this.wmLabel42); - this.Controls.Add(this.wmTextBox41); - this.Controls.Add(this.wmLabel41); - this.Controls.Add(this.wmTextBox40); - this.Controls.Add(this.wmLabel40); - this.Controls.Add(this.wmTextBox39); - this.Controls.Add(this.wmLabel39); - this.Controls.Add(this.wmTextBox38); - this.Controls.Add(this.wmLabel38); - this.Controls.Add(this.wmTextBox37); - this.Controls.Add(this.wmLabel37); - this.Controls.Add(this.wmTextBox36); - this.Controls.Add(this.wmLabel36); - this.Controls.Add(this.wmTextBox35); - this.Controls.Add(this.wmLabel35); - this.Controls.Add(this.wmTextBox34); - this.Controls.Add(this.wmLabel34); - this.Controls.Add(this.wmTextBox33); - this.Controls.Add(this.wmLabel33); - this.Controls.Add(this.wmTextBox32); - this.Controls.Add(this.wmLabel32); - this.Controls.Add(this.wmTextBox31); - this.Controls.Add(this.wmLabel31); - this.Controls.Add(this.wmTextBox30); - this.Controls.Add(this.wmLabel30); - this.Controls.Add(this.wmTextBox29); - this.Controls.Add(this.wmLabel29); - this.Controls.Add(this.wmTextBox28); - this.Controls.Add(this.wmLabel28); - this.Controls.Add(this.wmTextBox27); - this.Controls.Add(this.wmLabel27); - this.Controls.Add(this.wmTextBox26); - this.Controls.Add(this.wmLabel26); - this.Controls.Add(this.wmTextBox25); - this.Controls.Add(this.wmLabel25); - this.Controls.Add(this.wmTextBox24); - this.Controls.Add(this.wmLabel24); - this.Controls.Add(this.wmTextBox23); - this.Controls.Add(this.wmLabel23); - this.Controls.Add(this.wmTextBox22); - this.Controls.Add(this.wmLabel22); - this.Controls.Add(this.wmTextBox21); - this.Controls.Add(this.wmLabel21); - this.Controls.Add(this.wmTextBox20); - this.Controls.Add(this.wmLabel20); - this.Controls.Add(this.wmTextBox19); - this.Controls.Add(this.wmLabel19); - this.Controls.Add(this.wmTextBox18); - this.Controls.Add(this.wmLabel18); - this.Controls.Add(this.wmTextBox17); - this.Controls.Add(this.wmLabel17); - this.Controls.Add(this.wmTextBox16); - this.Controls.Add(this.wmLabel16); - this.Controls.Add(this.wmTextBox15); - this.Controls.Add(this.wmLabel15); - this.Controls.Add(this.wmTextBox14); - this.Controls.Add(this.wmLabel14); - this.Controls.Add(this.wmTextBox13); - this.Controls.Add(this.wmLabel13); - this.Controls.Add(this.wmTextBox12); - this.Controls.Add(this.wmLabel12); - this.Controls.Add(this.wmTextBox11); - this.Controls.Add(this.wmLabel11); - this.Controls.Add(this.wmTextBox10); - this.Controls.Add(this.wmLabel10); - this.Controls.Add(this.wmTextBox9); - this.Controls.Add(this.wmLabel9); - this.Controls.Add(this.wmTextBox8); - this.Controls.Add(this.wmLabel8); - this.Controls.Add(this.wmTextBox7); - this.Controls.Add(this.wmLabel7); - this.Controls.Add(this.wmTextBox6); - this.Controls.Add(this.wmLabel6); - this.Controls.Add(this.wmTextBox5); - this.Controls.Add(this.wmLabel5); - this.Controls.Add(this.wmTextBox4); - this.Controls.Add(this.wmLabel4); - this.Controls.Add(this.wmTextBox3); - this.Controls.Add(this.wmLabel3); - this.Controls.Add(this.wmTextBox2); - this.Controls.Add(this.wmLabel2); - this.Controls.Add(this.wmTextBox1); - this.Controls.Add(this.wmLabel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "iPerlCommunicationForm"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.Text = "iPerl Communication"; - this.TopMost = true; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.iPerlCommunicationForm_FormClosing); - this.Load += new System.EventHandler(this.iPerlCommunicationForm_Load); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox45)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox44)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox43)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox42)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox41)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox40)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox39)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox38)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox37)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox36)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox35)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox34)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox33)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox32)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox31)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox30)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox29)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox28)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox27)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox26)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox25)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox24)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox23)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox22)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox20)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox19)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox18)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox17)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox16)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox15)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox14)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox13)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox wmTextBox2; - private System.Windows.Forms.Label wmLabel2; - private System.Windows.Forms.Label wmLabel1; - private System.Windows.Forms.TextBox wmTextBox3; - private System.Windows.Forms.Label wmLabel3; - private System.Windows.Forms.TextBox wmTextBox4; - private System.Windows.Forms.Label wmLabel4; - private System.Windows.Forms.TextBox wmTextBox5; - private System.Windows.Forms.Label wmLabel5; - private System.Windows.Forms.TextBox wmTextBox6; - private System.Windows.Forms.Label wmLabel6; - private System.Windows.Forms.TextBox wmTextBox1; - private System.Windows.Forms.TextBox wmTextBox7; - private System.Windows.Forms.Label wmLabel7; - private System.Windows.Forms.TextBox wmTextBox8; - private System.Windows.Forms.Label wmLabel8; - private System.Windows.Forms.TextBox wmTextBox9; - private System.Windows.Forms.Label wmLabel9; - private System.Windows.Forms.TextBox wmTextBox10; - private System.Windows.Forms.Label wmLabel10; - private System.Windows.Forms.TextBox wmTextBox12; - private System.Windows.Forms.Label wmLabel12; - private System.Windows.Forms.TextBox wmTextBox11; - private System.Windows.Forms.Label wmLabel11; - private System.Windows.Forms.TextBox wmTextBox24; - private System.Windows.Forms.Label wmLabel24; - private System.Windows.Forms.TextBox wmTextBox23; - private System.Windows.Forms.Label wmLabel23; - private System.Windows.Forms.TextBox wmTextBox22; - private System.Windows.Forms.Label wmLabel22; - private System.Windows.Forms.TextBox wmTextBox21; - private System.Windows.Forms.Label wmLabel21; - private System.Windows.Forms.TextBox wmTextBox20; - private System.Windows.Forms.Label wmLabel20; - private System.Windows.Forms.TextBox wmTextBox19; - private System.Windows.Forms.Label wmLabel19; - private System.Windows.Forms.TextBox wmTextBox18; - private System.Windows.Forms.Label wmLabel18; - private System.Windows.Forms.TextBox wmTextBox17; - private System.Windows.Forms.Label wmLabel17; - private System.Windows.Forms.TextBox wmTextBox16; - private System.Windows.Forms.Label wmLabel16; - private System.Windows.Forms.TextBox wmTextBox15; - private System.Windows.Forms.Label wmLabel15; - private System.Windows.Forms.TextBox wmTextBox14; - private System.Windows.Forms.Label wmLabel14; - private System.Windows.Forms.TextBox wmTextBox13; - private System.Windows.Forms.Label wmLabel13; - private System.Windows.Forms.TextBox wmTextBox48; - private System.Windows.Forms.Label wmLabel48; - private System.Windows.Forms.TextBox wmTextBox47; - private System.Windows.Forms.Label wmLabel47; - private System.Windows.Forms.TextBox wmTextBox46; - private System.Windows.Forms.Label wmLabel46; - private System.Windows.Forms.TextBox wmTextBox45; - private System.Windows.Forms.Label wmLabel45; - private System.Windows.Forms.TextBox wmTextBox44; - private System.Windows.Forms.Label wmLabel44; - private System.Windows.Forms.TextBox wmTextBox43; - private System.Windows.Forms.Label wmLabel43; - private System.Windows.Forms.TextBox wmTextBox42; - private System.Windows.Forms.Label wmLabel42; - private System.Windows.Forms.TextBox wmTextBox41; - private System.Windows.Forms.Label wmLabel41; - private System.Windows.Forms.TextBox wmTextBox40; - private System.Windows.Forms.Label wmLabel40; - private System.Windows.Forms.TextBox wmTextBox39; - private System.Windows.Forms.Label wmLabel39; - private System.Windows.Forms.TextBox wmTextBox38; - private System.Windows.Forms.Label wmLabel38; - private System.Windows.Forms.TextBox wmTextBox37; - private System.Windows.Forms.Label wmLabel37; - private System.Windows.Forms.TextBox wmTextBox36; - private System.Windows.Forms.Label wmLabel36; - private System.Windows.Forms.TextBox wmTextBox35; - private System.Windows.Forms.Label wmLabel35; - private System.Windows.Forms.TextBox wmTextBox34; - private System.Windows.Forms.Label wmLabel34; - private System.Windows.Forms.TextBox wmTextBox33; - private System.Windows.Forms.Label wmLabel33; - private System.Windows.Forms.TextBox wmTextBox32; - private System.Windows.Forms.Label wmLabel32; - private System.Windows.Forms.TextBox wmTextBox31; - private System.Windows.Forms.Label wmLabel31; - private System.Windows.Forms.TextBox wmTextBox30; - private System.Windows.Forms.Label wmLabel30; - private System.Windows.Forms.TextBox wmTextBox29; - private System.Windows.Forms.Label wmLabel29; - private System.Windows.Forms.TextBox wmTextBox28; - private System.Windows.Forms.Label wmLabel28; - private System.Windows.Forms.TextBox wmTextBox27; - private System.Windows.Forms.Label wmLabel27; - private System.Windows.Forms.TextBox wmTextBox26; - private System.Windows.Forms.Label wmLabel26; - private System.Windows.Forms.TextBox wmTextBox25; - private System.Windows.Forms.Label wmLabel25; - private System.Windows.Forms.Label activityLabel; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.PictureBox pictureBox3; - private System.Windows.Forms.PictureBox pictureBox4; - private System.Windows.Forms.PictureBox pictureBox5; - private System.Windows.Forms.PictureBox pictureBox6; - private System.Windows.Forms.PictureBox pictureBox7; - private System.Windows.Forms.PictureBox pictureBox8; - private System.Windows.Forms.PictureBox pictureBox9; - private System.Windows.Forms.PictureBox pictureBox10; - private System.Windows.Forms.PictureBox pictureBox11; - private System.Windows.Forms.PictureBox pictureBox12; - private System.Windows.Forms.PictureBox pictureBox13; - private System.Windows.Forms.PictureBox pictureBox14; - private System.Windows.Forms.PictureBox pictureBox15; - private System.Windows.Forms.PictureBox pictureBox16; - private System.Windows.Forms.PictureBox pictureBox17; - private System.Windows.Forms.PictureBox pictureBox18; - private System.Windows.Forms.PictureBox pictureBox19; - private System.Windows.Forms.PictureBox pictureBox20; - private System.Windows.Forms.PictureBox pictureBox21; - private System.Windows.Forms.PictureBox pictureBox22; - private System.Windows.Forms.PictureBox pictureBox23; - private System.Windows.Forms.PictureBox pictureBox24; - private System.Windows.Forms.PictureBox pictureBox25; - private System.Windows.Forms.PictureBox pictureBox26; - private System.Windows.Forms.PictureBox pictureBox27; - private System.Windows.Forms.PictureBox pictureBox28; - private System.Windows.Forms.PictureBox pictureBox29; - private System.Windows.Forms.PictureBox pictureBox30; - private System.Windows.Forms.PictureBox pictureBox31; - private System.Windows.Forms.PictureBox pictureBox32; - private System.Windows.Forms.PictureBox pictureBox33; - private System.Windows.Forms.PictureBox pictureBox34; - private System.Windows.Forms.PictureBox pictureBox35; - private System.Windows.Forms.PictureBox pictureBox36; - private System.Windows.Forms.PictureBox pictureBox37; - private System.Windows.Forms.PictureBox pictureBox38; - private System.Windows.Forms.PictureBox pictureBox39; - private System.Windows.Forms.PictureBox pictureBox40; - private System.Windows.Forms.PictureBox pictureBox41; - private System.Windows.Forms.PictureBox pictureBox42; - private System.Windows.Forms.PictureBox pictureBox43; - private System.Windows.Forms.PictureBox pictureBox44; - private System.Windows.Forms.PictureBox pictureBox45; - private System.Windows.Forms.PictureBox pictureBox46; - private System.Windows.Forms.PictureBox pictureBox47; - private System.Windows.Forms.PictureBox pictureBox48; - private CheckBoxImage checkBoxImage1; - private CheckBoxImage checkBoxImage2; - private CheckBoxImage checkBoxImage3; - private CheckBoxImage checkBoxImage4; - private CheckBoxImage checkBoxImage5; - private CheckBoxImage checkBoxImage6; - private CheckBoxImage checkBoxImage7; - private CheckBoxImage checkBoxImage8; - private CheckBoxImage checkBoxImage9; - private CheckBoxImage checkBoxImage10; - private CheckBoxImage checkBoxImage11; - private CheckBoxImage checkBoxImage12; - private CheckBoxImage checkBoxImage13; - private CheckBoxImage checkBoxImage14; - private CheckBoxImage checkBoxImage15; - private CheckBoxImage checkBoxImage16; - private CheckBoxImage checkBoxImage17; - private CheckBoxImage checkBoxImage18; - private CheckBoxImage checkBoxImage19; - private CheckBoxImage checkBoxImage20; - private CheckBoxImage checkBoxImage21; - private CheckBoxImage checkBoxImage22; - private CheckBoxImage checkBoxImage23; - private CheckBoxImage checkBoxImage24; - private CheckBoxImage checkBoxImage25; - private CheckBoxImage checkBoxImage26; - private CheckBoxImage checkBoxImage27; - private CheckBoxImage checkBoxImage28; - private CheckBoxImage checkBoxImage29; - private CheckBoxImage checkBoxImage30; - private CheckBoxImage checkBoxImage31; - private CheckBoxImage checkBoxImage32; - private CheckBoxImage checkBoxImage33; - private CheckBoxImage checkBoxImage34; - private CheckBoxImage checkBoxImage35; - private CheckBoxImage checkBoxImage36; - private CheckBoxImage checkBoxImage37; - private CheckBoxImage checkBoxImage38; - private CheckBoxImage checkBoxImage39; - private CheckBoxImage checkBoxImage40; - private CheckBoxImage checkBoxImage41; - private CheckBoxImage checkBoxImage42; - private CheckBoxImage checkBoxImage43; - private CheckBoxImage checkBoxImage44; - private CheckBoxImage checkBoxImage45; - private CheckBoxImage checkBoxImage46; - private CheckBoxImage checkBoxImage47; - private CheckBoxImage checkBoxImage48; - private System.Windows.Forms.Button saveButton; - private System.Windows.Forms.PictureBox samplePictureBox1; - private System.Windows.Forms.PictureBox samplePictureBox2; - private System.Windows.Forms.PictureBox samplePictureBox3; - private System.Windows.Forms.Label sampleLabel1; - private System.Windows.Forms.Label sampleLabel2; - private System.Windows.Forms.Label sampleLabel3; - - } -} \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.resx b/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.resx deleted file mode 100644 index 20987c220..000000000 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/test/iPerlCommunicationForm.resx +++ /dev/null @@ -1,3577 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - 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 - - - \ No newline at end of file diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs index 105741a3c..6fc522ad3 100644 --- a/TBF/Rig/Sequences/ProcessData.cs +++ b/TBF/Rig/Sequences/ProcessData.cs @@ -110,6 +110,7 @@ namespace TBF.Rig.Sequences /// iPERL related state variables to be saved after each completed test /// public static IList IperlHeads; + public static IList IperlHeadsUni; public static bool IsQ2PreCorrectionCalculated; public static int CalculatedQ2PreCorrectionLR; public static int CalculatedQ2PreCorrectionRL; @@ -154,6 +155,7 @@ namespace TBF.Rig.Sequences { IperlHeads[i].WriteBinary(writer); } + writer.Write(IsQ2PreCorrectionCalculated); writer.Write(CalculatedQ2PreCorrectionLR); @@ -173,6 +175,12 @@ namespace TBF.Rig.Sequences for (int i = 0; i < CompleteTestInfos.Length; i++) CompleteTestInfos[i].WriteBinary(writer); } #endif + /////// IperlHeadsUni - added for support of smart meters + writer.Write(IperlHeadsUni.Count); + for (int i = 0; i < IperlHeadsUni.Count; i++) + { + IperlHeadsUni[i].WriteBinary(writer); + } log.WarnFormat("Process data succesfully saved to file {0}", PDataFileName); } } @@ -246,6 +254,26 @@ namespace TBF.Rig.Sequences CompleteTestInfos[i] = ti; } #endif + try + { + int iPerlHeadsCountUni = reader.ReadInt32(); + for (int i = 0; i < iPerlHeadsCountUni; i++) + { + if (IperlHeadsUni != null && i < IperlHeadsUni.Count) + { + IperlHeadsUni[i].ReadBinary(reader); + } + else + { + new TestMethods.iPerlCommunication.iPerlHead.IperlHead().ReadBinary(reader); + } + } + } + catch (Exception exc) + { + + } + log.WarnFormat("Process data succesfully loaded from file {0}", PDataFileName); return true; } diff --git a/TBF/Rig/Sequences/iPerlCommunicationSeq.cs b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs new file mode 100644 index 000000000..d560099d8 --- /dev/null +++ b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs @@ -0,0 +1,948 @@ +/// +/// Copyright (c) 2015-2023 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; /// Point definition +using log4net; +using Common; +using Config.Entities; +using RestClient; +using TBF.Rig.Sequences; +using TBF.Resources; +using TBF.UiBridge; +using Results; +using Results.Entities; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; + +namespace TBF.Rig.Sequences +{ + public class iPerlCommunicationSeq : SequenceBase + { + private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationSeq)); + + + System.Windows.Forms.Form modelessDlg; + /// + delegate void iPerlCommFormDlgt(iPerlCommunicationSeq myRef, SmartComponentBase smartComponentBase, Test test, iPerlCommunicationParams testParams); + /// + void OpenIPerlCommForm(iPerlCommunicationSeq myRef, SmartComponentBase method, Test test, iPerlCommunicationParams testParams) + { + myRef.modelessDlg = new iPerlCommunicationForm(method, test, testParams); + myRef.modelessDlg.Show(); + } + + + void CloseIPerlCommForm() + { + UiBridge.Bridge.OnCloseModelessForm(this, null); + modelessDlg = null; + } + + + /// + /// Flying start mass collection method sequence + /// + /// Test entity + /// + /// Event.Done . . . . . . . OK + /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP + /// Event.OpArgumentError . Target flow is out of range + /// Event.Error . . . . . . Unspecified error + /// + public IList Execute(Test test, int repetitionNr, SmartComponentBase method, iPerlCommunicationParams testParams) + { + TestMethodCfg cfg = method.Cfg as TestMethodCfg; + + IList e; /// Events from currently running operations + checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state + modelessDlg = null; + + processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, false); + + string cmd; + if (testParams.Activity.ToLower().Equals(cmd = iPerlCommunicationConstants.GetDefaultQ2CorrectionsStr.ToLower())) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + /// Get 'wmType' from IperlHead procedure parameters + int wmType = 0; +#if IPERL + /*foreach (var wm in ProcessData.BatchRslts.Batch.WaterMeters) + { + if (wm != null && !wm.Disabled && wm.WMTypeId() > 0) + { + wmType = wm.WMTypeId(); + break; + } + }*/ +#endif + + if (cfg.UseWebService) + { + 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 = !cfg.UseWebService || IsQ2PreCorrectionCalculated; + mtr.TestDone = true; + break; + } + } + } + } + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 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(cmd = iPerlCommunicationConstants.Q2correctedFromCmd.ToLower())) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' }); + string fromTestName = (args.Length >= 1) ? args[0] : string.Empty; + bool isPlus = (args.Length >= 2) ? args[1].ToLower().Contains("plus") : false; + MakeQ2CorrectedFrom(test.Name, fromTestName, isPlus); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 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(cmd = iPerlCommunicationConstants.StrictQ2ErrorCheckStr.ToLower())) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + string fromTestName = testParams.Activity.Substring(cmd.Length); + + StrictQ2ErrorCheck(test.Name, fromTestName); + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 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(cmd = iPerlCommunicationConstants.Q2correctionCheckCmd.ToLower())) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + string[] testNames = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' }); + + if (testNames.Length >= 2) + { + CheckQ2Correction(test.Name, testNames[0], testNames[1]); + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 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(cmd = iPerlCommunicationConstants.IperlCheckCmd.ToLower())) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + string[] args = testParams.Activity.Substring(cmd.Length).Split(new char[] { ' ' }); + + //int maxTestIndex = (ProcessData.BenchInfo is TBF.Rig.DataContainer.BenchInfo.Component) + // ? (ProcessData.BenchInfo as TBF.Rig.DataContainer.BenchInfo.Component).MaxTestIndex + // : int.MaxValue; + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, 0); + + if (tstRslt != null) + { + tstRslt.StartTime = DateTime.Now; + + int wrongMetersCount = 0; + string message = string.Empty; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + Results.Entities.WaterMeter wm = BatchRslts.Batch.WaterMeters[i]; + Results.Entities.MeterTestRslt mtr = ProcessData.BatchRslts.GetMeterTestRslt(test.Name, i, CompoundMeterId.Single); + + ///// Reference to iPerl water meter or null: + //TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerlHead = ((sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + // ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + // : null; + + if ((wm != null) && (mtr != null)) + { + int errorIndicators = 0; + bool anyErrorOfThisMeter = false; + foreach (var arg in args) + { +#if TURA_SPECIAL + if (arg.ToLower() == "q2factors") + { + if ((wm.ProdQ2CorrRL != wm.Q2CorrRL) || (wm.ProdQ2CorrLR != wm.Q2CorrLR)) + { + anyErrorOfThisMeter = true; + message += string.Format("Q2 korekčné faktory vodomera {0} nesedia{1}", wm.WMPosition, Environment.NewLine); + errorIndicators |= (int)ErrorFlagMask.E26; /// Q2 correction factors not valid + } + } +#endif + if (arg.ToLower() == "direction") + { + //if (wm.Pruefindex > maxTestIndex) + //{ + // anyErrorOfThisMeter = true; + // message += string.Format("Príliš veľa opakovaní testu vodomera {0}{1}", wm.WMPosition, Environment.NewLine); + // errorIndicators |= (int)ErrorFlagMask.E27; /// Wrong direction (positive/negative counting) + //} + } + + if (arg.ToLower() == "prevworkstep") + { + if (wm.LastRecordIsNok) + { + wm.ErrorFlags |= (int)ErrorFlagMask.E28; /// Set E28 + } + + if ((wm.ErrorFlags & (int)ErrorFlagMask.E28) != 0) + { + anyErrorOfThisMeter = true; + message += string.Format("iPerl{0} : Predchádzajúci krok nebol zaznamenaný{1}", wm.WMPosition, Environment.NewLine); + errorIndicators |= (int)ErrorFlagMask.E28; /// Previous workstep missing or NOK (production tracing) + } + } + } + + mtr.TestDone = true; + mtr.ErrorIndicators = errorIndicators; + /// + if (anyErrorOfThisMeter) + { + /// This iPerl check did not pass + mtr.Passed = false; + wrongMetersCount++; + } + else + { + /// Check passed OK + mtr.Passed = true; + } + } + } + + tstRslt.EndTime = DateTime.Now; + tstRslt.TestDone = true; + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed)); + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, tstRslt)); + allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file + + if (wrongMetersCount >= cfg.IperlCheckErrorsToStop) + { + State.Create("iPerlCommunicationSeq : Show check result") + .AddOperation(new Operations.LargeMessageBoxOp(message)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + } + while (!e.Contains(Event.Continue) && !e.Contains(Event.Abort)); + + if (e.Contains(Event.Abort)) + { + Bridge.OnError(this, string.Format("Niečo nie je v poriadku !")); + return new List { Event.UiCmdStop }; + } + } + } + + return new List { Event.Done }; + } + else if (testParams.Activity.ToLower().Contains(cmd = iPerlCommunicationConstants.SimulateCmd)) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.FlowSetting)); + + if (testParams.Activity.ToLower().Contains("q3")) MakeSimulated(test, 1, 0, -0.5f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "q2") MakeSimulated(test, 1, 0, 0.5f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "q1") MakeSimulated(test, 1, 0, -5.1f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound ok") MakeSimulatedCompound(test, 1, 0, 0.7f, 1.0f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound nok") MakeSimulatedCompound(test, 1, 0, 4.7f, 0.9f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound rise") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.0f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "compound fall") MakeSimulatedCompound(test, 1, 0, 0.7f, 0.9f); + else if (testParams.Activity.Substring(cmd.Length).ToLower() == "iperls") + { + string[] pcbNrs = new string[] { "831232435539", "831232435562", "831232435587", + "831232432141", "831232432497", "831232763641" }; + + TestRslt tstRslt = BatchRslts.GetTestRslt(test.Name, test.Part); + if (tstRslt != null) + { + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); + + /// Auxiliary results ... not required + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.TestDone = true; + tstRslt.StartTime = tstRslt.Batch.StartTime; + tstRslt.EndTime = DateTime.Now; + tstRslt.FlowSetTime = 0; + tstRslt.MassOfEvapWater = 0; + tstRslt.TestTime = 1; + + for (int i = 0; i < BatchRslts.Batch.WaterMeters.Count; i++) + { + MeterTestRslt meterRslt = + BatchRslts.GetMeterTestRslt(test.Name, i, CompoundMeterId.Single); + + if (meterRslt != null) + { + meterRslt.WaterMeter.SerialNr = pcbNrs[i % pcbNrs.Length]; + meterRslt.Passed = true; + meterRslt.TestDone = true; + } + //if (iperlHeads[i] != null) + //{ + // iperlHeads[i].CommFailed = iperlHeads[i].Disabled = false; + // iperlHeads[i].SerialNr = pcbNrs[i % pcbNrs.Length]; + //} + } + } + } + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.Completed)); + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0))); + allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file + + //------------------------------------------------ + Bridge.OnActivity(this, testParams.Activity); + //------------------------------------------------ + + State.Create(string.Format("iPerlCommunicationSeq : {0}", testParams.Activity)) + .AddOperation(checkUiOp) + .EnterState(); + e = StateMachine.WaitRunDevsRunOps(); + + if (TestAndLogUiCmdStop(test, e)) + { + return new List { Event.UiCmdStop }; + } + } + else + { + /// + /// Show the modeless dialog with error indication + /// + Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, method, test, testParams }); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.iPerl_Communication_in_progress); + //------------------------------------------------ + + bool stopPressed = false; /// true when STOP button pressed + bool completed = false; + + State.Create("iPerlCommunicationSeq : Wait until the entry form is closed") + .AddOperation(checkUiOp) + .EnterState(); + do { + e = StateMachine.WaitRunDevsRunOps(); + stopPressed = TestAndLogUiCmdStop(test, e); + completed = (modelessDlg is GenericDevices.IHasCompleted) + && (modelessDlg as GenericDevices.IHasCompleted).Completed; + } + while (!stopPressed && !completed); + + if (stopPressed) + { + CloseIPerlCommForm(); + return new List { Event.UiCmdStop }; + } + else + { + TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(test.Name, Progress.Completed)); + } + + /// Test 'Quit' + modelessDlg = null; /// Modeless dialog is closed now + } + + 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://deluh1web03.world.fluidtechnology.net/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. + /// + /// This test name + /// Name of Q2 test done before Q2 correction (Q2adj) + /// Assuming this test does not have multiple parts (part = 0) + void MakeQ2CorrectedFrom(string testName, string oriTestName, bool isPlus = false) + { + Results.Entities.TestRslt oriTestRslt = ProcessData.BatchRslts.GetTestRslt(oriTestName, 0); + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0); + + if (oriTestRslt == null || tstRslt == null) return; + + tstRslt.Components = oriTestRslt.Components; + + /// Auxiliary results, as in SequenceBase.UpdateTemoPressDensAmb() + tstRslt.AmbTempMean = oriTestRslt.AmbTempMean; + tstRslt.AmbTempStart = oriTestRslt.AmbTempStart; + tstRslt.AmbTempEnd = oriTestRslt.AmbTempEnd; + tstRslt.AmbTempMin = oriTestRslt.AmbTempMin; + tstRslt.AmbTempMax = oriTestRslt.AmbTempMax; + tstRslt.AmbPressMean = oriTestRslt.AmbPressMean; + tstRslt.AmbPressStart = oriTestRslt.AmbPressStart; + tstRslt.AmbPressEnd = oriTestRslt.AmbPressEnd; + tstRslt.AmbPressMin = oriTestRslt.AmbPressMin; + tstRslt.AmbPressMax = oriTestRslt.AmbPressMax; + tstRslt.AmbHumiMean = oriTestRslt.AmbHumiMean; + tstRslt.AmbHumiStart = oriTestRslt.AmbHumiStart; + tstRslt.AmbHumiEnd = oriTestRslt.AmbHumiEnd; + tstRslt.AmbHumiMin = oriTestRslt.AmbHumiMin; + tstRslt.AmbHumiMax = oriTestRslt.AmbHumiMax; + tstRslt.PressUpMean = oriTestRslt.PressUpMean; + tstRslt.PressUpStart = oriTestRslt.PressUpStart; + tstRslt.PressUpEnd = oriTestRslt.PressUpEnd; + tstRslt.PressUpMin = oriTestRslt.PressUpMin; + tstRslt.PressUpMax = oriTestRslt.PressUpMax; + tstRslt.PressDownMean = oriTestRslt.PressDownMean; + tstRslt.PressDownStart = oriTestRslt.PressDownStart; + tstRslt.PressDownEnd = oriTestRslt.PressDownEnd; + tstRslt.PressDownMin = oriTestRslt.PressDownMin; + tstRslt.PressDownMax = oriTestRslt.PressDownMax; + tstRslt.PressDeltaMean = oriTestRslt.PressDeltaMean; + tstRslt.PressDeltaStart = oriTestRslt.PressDeltaStart; + tstRslt.PressDeltaEnd = oriTestRslt.PressDeltaEnd; + tstRslt.PressDeltaMin = oriTestRslt.PressDeltaMin; + tstRslt.PressDeltaMax = oriTestRslt.PressDeltaMax; + tstRslt.ConductMean = oriTestRslt.ConductMean; + tstRslt.ConductStart = oriTestRslt.ConductStart; + tstRslt.ConductEnd = oriTestRslt.ConductEnd; + tstRslt.ConductMin = oriTestRslt.ConductMin; + tstRslt.ConductMax = oriTestRslt.ConductMax; + tstRslt.TempUpMean = oriTestRslt.TempUpMean; + tstRslt.TempUpStart = oriTestRslt.TempUpStart; + tstRslt.TempUpEnd = oriTestRslt.TempUpEnd; + tstRslt.TempUpMin = oriTestRslt.TempUpMin; + tstRslt.TempUpMax = oriTestRslt.TempUpMax; + tstRslt.TempDownMean = oriTestRslt.TempDownMean; + tstRslt.TempDownStart = oriTestRslt.TempDownStart; + tstRslt.TempDownEnd = oriTestRslt.TempDownEnd; + tstRslt.TempDownMin = oriTestRslt.TempDownMin; + tstRslt.TempDownMax = oriTestRslt.TempDownMax; + tstRslt.TempDivMean = oriTestRslt.TempDivMean; + tstRslt.TempDivStart = oriTestRslt.TempDivStart; + tstRslt.TempDivEnd = oriTestRslt.TempDivEnd; + tstRslt.TempDivMin = oriTestRslt.TempDivMin; + tstRslt.TempDivMax = oriTestRslt.TempDivMax; + tstRslt.DensityIn = oriTestRslt.DensityIn; + tstRslt.DensityLine = oriTestRslt.DensityLine; + tstRslt.DensityDiv = oriTestRslt.DensityDiv; + + tstRslt.StartTime = oriTestRslt.StartTime; + tstRslt.EndTime = oriTestRslt.EndTime; + tstRslt.FlowSetTime = oriTestRslt.FlowSetTime; + tstRslt.TestTime = oriTestRslt.TestTime; + tstRslt.PulsesMaster = oriTestRslt.PulsesMaster; + tstRslt.ConstMasterRaw = oriTestRslt.ConstMasterRaw; + tstRslt.ConstMaster = oriTestRslt.ConstMaster; + tstRslt.MassStartRaw = oriTestRslt.MassStartRaw; + tstRslt.MassStart = oriTestRslt.MassStart; + tstRslt.MassEndRaw = oriTestRslt.MassEndRaw; + tstRslt.MassEnd = oriTestRslt.MassEnd; + tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater; + //tstRslt.FlowMass = oriTestRslt.FlowMass; + //tstRslt.FlowVolume = oriTestRslt.FlowVolume; + tstRslt.VolumeCTV = oriTestRslt.VolumeCTV; + tstRslt.VolumeMaster = oriTestRslt.VolumeMaster; + tstRslt.ErrorMaster = oriTestRslt.ErrorMaster; + + tstRslt.FlowMean = oriTestRslt.FlowMean; + tstRslt.FlowMin = oriTestRslt.FlowMin; + tstRslt.FlowMax = oriTestRslt.FlowMax; + + tstRslt.Custom1 = oriTestRslt.Custom1; + tstRslt.Custom2 = oriTestRslt.Custom2; + tstRslt.Custom3 = oriTestRslt.Custom3; + tstRslt.Custom4 = oriTestRslt.Custom4; + tstRslt.Custom5 = oriTestRslt.Custom5; + tstRslt.Custom6 = oriTestRslt.Custom6; + tstRslt.Custom7 = oriTestRslt.Custom7; + tstRslt.Custom8 = oriTestRslt.Custom8; + + for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++) + { + // Fix for CS7036: Added the missing 'meterId' argument to the GetMeterTestRslt method call. + var q3mtr = ProcessData.BatchRslts.GetMeterTestRslt("Q3", i, CompoundMeterId.SingleOrCompound); + double q3error = (q3mtr != null) ? q3mtr.Error : 0; + + Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.SingleOrCompound); + Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.SingleOrCompound); + + /// Reference to iPerl water meter or null: + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath != null) && (sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + + if (iPerl != null && meterRslt != null && oriMeterRslt != null) + { +#if ORACLE_DB + meterRslt.ErrorBC = oriMeterRslt.Error; +#endif + meterRslt.PulsesMeter = oriMeterRslt.PulsesMeter; + meterRslt.PulsesMaster = oriMeterRslt.PulsesMaster; + meterRslt.PulsesPerLiter = oriMeterRslt.PulsesPerLiter; + meterRslt.VolumeRef = oriMeterRslt.VolumeRef; + meterRslt.TestTime = oriMeterRslt.TestTime; + + if (q3error * oriMeterRslt.Error < 0) + { + /// iPerl with Q2 correction => generate an artificial error equal to +1/10 of the original one (relative to Q2 target error) + meterRslt.Error = 0.1 * oriMeterRslt.Error; + } + else + { + /// iPerl with Q2 correction => generate an artificial error equal to -1/10 of the original one (relative to Q2 target error) + meterRslt.Error = - 0.1 * oriMeterRslt.Error; + } + + meterRslt.VolumeMeter = meterRslt.VolumeRef * (100.0 + meterRslt.Error) / 100.0; + double signature = (oriMeterRslt.VolumeEnd > oriMeterRslt.VolumeStart) ? (+1) : (-1); + meterRslt.VolumeStart = oriMeterRslt.VolumeStart; + meterRslt.VolumeEnd = meterRslt.VolumeStart + signature * meterRslt.VolumeMeter; + + meterRslt.Passed = (meterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() + && meterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + + /// + /// Evaluate a given Q2 test result agains stricter error limits when Oruefindex == 1. + /// + /// This test name + /// Name of Q2 test done before Q2 correction (Q2adj) + /// Assuming this test does not have multiple parts (part = 0) + void StrictQ2ErrorCheck(string testName, string oriTestName) + { + Results.Entities.TestRslt oriTestRslt = ProcessData.BatchRslts.GetTestRslt(oriTestName, 0); + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0); + + if (oriTestRslt == null || tstRslt == null) return; + + tstRslt.Components = oriTestRslt.Components; + + /// Auxiliary results, as in SequenceBase.UpdateTemoPressDensAmb() + tstRslt.AmbTempMean = oriTestRslt.AmbTempMean; + tstRslt.AmbTempStart = oriTestRslt.AmbTempStart; + tstRslt.AmbTempEnd = oriTestRslt.AmbTempEnd; + tstRslt.AmbTempMin = oriTestRslt.AmbTempMin; + tstRslt.AmbTempMax = oriTestRslt.AmbTempMax; + tstRslt.AmbPressMean = oriTestRslt.AmbPressMean; + tstRslt.AmbPressStart = oriTestRslt.AmbPressStart; + tstRslt.AmbPressEnd = oriTestRslt.AmbPressEnd; + tstRslt.AmbPressMin = oriTestRslt.AmbPressMin; + tstRslt.AmbPressMax = oriTestRslt.AmbPressMax; + tstRslt.AmbHumiMean = oriTestRslt.AmbHumiMean; + tstRslt.AmbHumiStart = oriTestRslt.AmbHumiStart; + tstRslt.AmbHumiEnd = oriTestRslt.AmbHumiEnd; + tstRslt.AmbHumiMin = oriTestRslt.AmbHumiMin; + tstRslt.AmbHumiMax = oriTestRslt.AmbHumiMax; + tstRslt.PressUpMean = oriTestRslt.PressUpMean; + tstRslt.PressUpStart = oriTestRslt.PressUpStart; + tstRslt.PressUpEnd = oriTestRslt.PressUpEnd; + tstRslt.PressUpMin = oriTestRslt.PressUpMin; + tstRslt.PressUpMax = oriTestRslt.PressUpMax; + tstRslt.PressDownMean = oriTestRslt.PressDownMean; + tstRslt.PressDownStart = oriTestRslt.PressDownStart; + tstRslt.PressDownEnd = oriTestRslt.PressDownEnd; + tstRslt.PressDownMin = oriTestRslt.PressDownMin; + tstRslt.PressDownMax = oriTestRslt.PressDownMax; + tstRslt.PressDeltaMean = oriTestRslt.PressDeltaMean; + tstRslt.PressDeltaStart = oriTestRslt.PressDeltaStart; + tstRslt.PressDeltaEnd = oriTestRslt.PressDeltaEnd; + tstRslt.PressDeltaMin = oriTestRslt.PressDeltaMin; + tstRslt.PressDeltaMax = oriTestRslt.PressDeltaMax; + tstRslt.ConductMean = oriTestRslt.ConductMean; + tstRslt.ConductStart = oriTestRslt.ConductStart; + tstRslt.ConductEnd = oriTestRslt.ConductEnd; + tstRslt.ConductMin = oriTestRslt.ConductMin; + tstRslt.ConductMax = oriTestRslt.ConductMax; + tstRslt.TempUpMean = oriTestRslt.TempUpMean; + tstRslt.TempUpStart = oriTestRslt.TempUpStart; + tstRslt.TempUpEnd = oriTestRslt.TempUpEnd; + tstRslt.TempUpMin = oriTestRslt.TempUpMin; + tstRslt.TempUpMax = oriTestRslt.TempUpMax; + tstRslt.TempDownMean = oriTestRslt.TempDownMean; + tstRslt.TempDownStart = oriTestRslt.TempDownStart; + tstRslt.TempDownEnd = oriTestRslt.TempDownEnd; + tstRslt.TempDownMin = oriTestRslt.TempDownMin; + tstRslt.TempDownMax = oriTestRslt.TempDownMax; + tstRslt.TempDivMean = oriTestRslt.TempDivMean; + tstRslt.TempDivStart = oriTestRslt.TempDivStart; + tstRslt.TempDivEnd = oriTestRslt.TempDivEnd; + tstRslt.TempDivMin = oriTestRslt.TempDivMin; + tstRslt.TempDivMax = oriTestRslt.TempDivMax; + tstRslt.DensityIn = oriTestRslt.DensityIn; + tstRslt.DensityLine = oriTestRslt.DensityLine; + tstRslt.DensityDiv = oriTestRslt.DensityDiv; + + tstRslt.StartTime = oriTestRslt.StartTime; + tstRslt.EndTime = oriTestRslt.EndTime; + tstRslt.FlowSetTime = oriTestRslt.FlowSetTime; + tstRslt.TestTime = oriTestRslt.TestTime; + tstRslt.PulsesMaster = oriTestRslt.PulsesMaster; + tstRslt.ConstMasterRaw = oriTestRslt.ConstMasterRaw; + tstRslt.ConstMaster = oriTestRslt.ConstMaster; + tstRslt.MassStartRaw = oriTestRslt.MassStartRaw; + tstRslt.MassStart = oriTestRslt.MassStart; + tstRslt.MassEndRaw = oriTestRslt.MassEndRaw; + tstRslt.MassEnd = oriTestRslt.MassEnd; + tstRslt.MassOfEvapWater = oriTestRslt.MassOfEvapWater; + //tstRslt.FlowMass = oriTestRslt.FlowMass; + //tstRslt.FlowVolume = oriTestRslt.FlowVolume; + tstRslt.VolumeCTV = oriTestRslt.VolumeCTV; + tstRslt.VolumeMaster = oriTestRslt.VolumeMaster; + tstRslt.ErrorMaster = oriTestRslt.ErrorMaster; + + tstRslt.FlowMean = oriTestRslt.FlowMean; + tstRslt.FlowMin = oriTestRslt.FlowMin; + tstRslt.FlowMax = oriTestRslt.FlowMax; + + tstRslt.Custom1 = oriTestRslt.Custom1; + tstRslt.Custom2 = oriTestRslt.Custom2; + tstRslt.Custom3 = oriTestRslt.Custom3; + tstRslt.Custom4 = oriTestRslt.Custom4; + tstRslt.Custom5 = oriTestRslt.Custom5; + tstRslt.Custom6 = oriTestRslt.Custom6; + tstRslt.Custom7 = oriTestRslt.Custom7; + tstRslt.Custom8 = oriTestRslt.Custom8; + + for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++) + { + Results.Entities.MeterTestRslt oriMeterRslt = ProcessData.BatchRslts.GetMeterTestRslt(oriTestName, i, CompoundMeterId.Single); + Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + + /// Reference to iPerl water meter or null: + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = ((sensPath != null) && (sensPath.RegisterReaders != null) && (i < sensPath.RegisterReaders.Length)) + ? (sensPath.RegisterReaders[i] as TestMethods.iPerlCommunication.iPerlHead.IperlHead) + : null; + + if (meterRslt != null && oriMeterRslt != null) + { +#if ORACLE_DB + meterRslt.ErrorBC = oriMeterRslt.Error; +#endif + meterRslt.PulsesMeter = oriMeterRslt.PulsesMeter; + meterRslt.PulsesMaster = oriMeterRslt.PulsesMaster; + meterRslt.PulsesPerLiter = oriMeterRslt.PulsesPerLiter; + meterRslt.VolumeRef = oriMeterRslt.VolumeRef; + meterRslt.TestTime = oriMeterRslt.TestTime; + + if (iPerl != null && ProcessData.BatchRslts.Batch.WaterMeters[i] != null && + !ProcessData.BatchRslts.Batch.WaterMeters[i].Disabled) + { + /// Either no iPerl head or no Q2 correction + meterRslt.Error = oriMeterRslt.Error; + meterRslt.VolumeMeter = oriMeterRslt.VolumeMeter; + meterRslt.VolumeStart = oriMeterRslt.VolumeStart; + meterRslt.VolumeEnd = oriMeterRslt.VolumeEnd; +#if ORACLE_DB + if ((ProcessData.BatchRslts.Batch.WaterMeters[i].Pruefindex % 100) == 1) + { + meterRslt.Passed = (oriMeterRslt.Error >= tstRslt.ErrLimLo() + tstRslt.ErrLimMargin() + && oriMeterRslt.Error <= tstRslt.ErrLimHi() - tstRslt.ErrLimMargin()); + } + else +#endif + { + meterRslt.Passed = oriMeterRslt.Passed; + } + meterRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } + } + + + /// + /// Check results of 2 tests: before Q2 correction and after Q2 correction. + /// Evaluate whether Q2 correction works OK. + /// + /// This test name + /// Name of Q2 test done before correction + /// Name of Q2 test done after correction + /// Assuming these tests do not have multiple parts (part = 0) + void CheckQ2Correction(string testName, string testNameQ2bc, string testNameQ2ac) + { + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0); + Results.Entities.TestRslt testRsltQ2bc = ProcessData.BatchRslts.GetTestRslt(testNameQ2bc, 0); + Results.Entities.TestRslt testRsltQ2ac = ProcessData.BatchRslts.GetTestRslt(testNameQ2ac, 0); + + if ((tstRslt == null) || (testRsltQ2bc == null) || (testRsltQ2ac == null)) return; + + tstRslt.Components = testRsltQ2ac.Components; + + /// Auxiliary results, as in SequenceBase.UpdateTemoPressDensAmb() + tstRslt.AmbTempMean = testRsltQ2ac.AmbTempMean; + tstRslt.AmbTempStart = testRsltQ2ac.AmbTempStart; + tstRslt.AmbTempEnd = testRsltQ2ac.AmbTempEnd; + tstRslt.AmbTempMin = testRsltQ2ac.AmbTempMin; + tstRslt.AmbTempMax = testRsltQ2ac.AmbTempMax; + tstRslt.AmbPressMean = testRsltQ2ac.AmbPressMean; + tstRslt.AmbPressStart = testRsltQ2ac.AmbPressStart; + tstRslt.AmbPressEnd = testRsltQ2ac.AmbPressEnd; + tstRslt.AmbPressMin = testRsltQ2ac.AmbPressMin; + tstRslt.AmbPressMax = testRsltQ2ac.AmbPressMax; + tstRslt.AmbHumiMean = testRsltQ2ac.AmbHumiMean; + tstRslt.AmbHumiStart = testRsltQ2ac.AmbHumiStart; + tstRslt.AmbHumiEnd = testRsltQ2ac.AmbHumiEnd; + tstRslt.AmbHumiMin = testRsltQ2ac.AmbHumiMin; + tstRslt.AmbHumiMax = testRsltQ2ac.AmbHumiMax; + tstRslt.PressUpMean = testRsltQ2ac.PressUpMean; + tstRslt.PressUpStart = testRsltQ2ac.PressUpStart; + tstRslt.PressUpEnd = testRsltQ2ac.PressUpEnd; + tstRslt.PressUpMin = testRsltQ2ac.PressUpMin; + tstRslt.PressUpMax = testRsltQ2ac.PressUpMax; + tstRslt.PressDownMean = testRsltQ2ac.PressDownMean; + tstRslt.PressDownStart = testRsltQ2ac.PressDownStart; + tstRslt.PressDownEnd = testRsltQ2ac.PressDownEnd; + tstRslt.PressDownMin = testRsltQ2ac.PressDownMin; + tstRslt.PressDownMax = testRsltQ2ac.PressDownMax; + tstRslt.PressDeltaMean = testRsltQ2ac.PressDeltaMean; + tstRslt.PressDeltaStart = testRsltQ2ac.PressDeltaStart; + tstRslt.PressDeltaEnd = testRsltQ2ac.PressDeltaEnd; + tstRslt.PressDeltaMin = testRsltQ2ac.PressDeltaMin; + tstRslt.PressDeltaMax = testRsltQ2ac.PressDeltaMax; + tstRslt.ConductMean = testRsltQ2ac.ConductMean; + tstRslt.ConductStart = testRsltQ2ac.ConductStart; + tstRslt.ConductEnd = testRsltQ2ac.ConductEnd; + tstRslt.ConductMin = testRsltQ2ac.ConductMin; + tstRslt.ConductMax = testRsltQ2ac.ConductMax; + tstRslt.TempUpMean = testRsltQ2ac.TempUpMean; + tstRslt.TempUpStart = testRsltQ2ac.TempUpStart; + tstRslt.TempUpEnd = testRsltQ2ac.TempUpEnd; + tstRslt.TempUpMin = testRsltQ2ac.TempUpMin; + tstRslt.TempUpMax = testRsltQ2ac.TempUpMax; + tstRslt.TempDownMean = testRsltQ2ac.TempDownMean; + tstRslt.TempDownStart = testRsltQ2ac.TempDownStart; + tstRslt.TempDownEnd = testRsltQ2ac.TempDownEnd; + tstRslt.TempDownMin = testRsltQ2ac.TempDownMin; + tstRslt.TempDownMax = testRsltQ2ac.TempDownMax; + tstRslt.TempDivMean = testRsltQ2ac.TempDivMean; + tstRslt.TempDivStart = testRsltQ2ac.TempDivStart; + tstRslt.TempDivEnd = testRsltQ2ac.TempDivEnd; + tstRslt.TempDivMin = testRsltQ2ac.TempDivMin; + tstRslt.TempDivMax = testRsltQ2ac.TempDivMax; + tstRslt.DensityIn = testRsltQ2ac.DensityIn; + tstRslt.DensityLine = testRsltQ2ac.DensityLine; + tstRslt.DensityDiv = testRsltQ2ac.DensityDiv; + + tstRslt.StartTime = testRsltQ2ac.StartTime; + tstRslt.EndTime = testRsltQ2ac.EndTime; + tstRslt.FlowSetTime = testRsltQ2ac.FlowSetTime; + tstRslt.TestTime = testRsltQ2ac.TestTime; + tstRslt.PulsesMaster = testRsltQ2ac.PulsesMaster; + tstRslt.ConstMasterRaw = testRsltQ2ac.ConstMasterRaw; + tstRslt.ConstMaster = testRsltQ2ac.ConstMaster; + tstRslt.MassStartRaw = testRsltQ2ac.MassStartRaw; + tstRslt.MassStart = testRsltQ2ac.MassStart; + tstRslt.MassEndRaw = testRsltQ2ac.MassEndRaw; + tstRslt.MassEnd = testRsltQ2ac.MassEnd; + tstRslt.MassOfEvapWater = testRsltQ2ac.MassOfEvapWater; + //tstRslt.FlowMass = testRsltQ2ac.FlowMass; + //tstRslt.FlowVolume = testRsltQ2ac.FlowVolume; + tstRslt.VolumeCTV = testRsltQ2ac.VolumeCTV; + tstRslt.VolumeMaster = testRsltQ2ac.VolumeMaster; + tstRslt.ErrorMaster = testRsltQ2ac.ErrorMaster; + + tstRslt.FlowMean = testRsltQ2ac.FlowMean; + tstRslt.FlowMin = testRsltQ2ac.FlowMin; + tstRslt.FlowMax = testRsltQ2ac.FlowMax; + + tstRslt.Custom1 = testRsltQ2ac.Custom1; + tstRslt.Custom2 = testRsltQ2ac.Custom2; + tstRslt.Custom3 = testRsltQ2ac.Custom3; + tstRslt.Custom4 = testRsltQ2ac.Custom4; + tstRslt.Custom5 = testRsltQ2ac.Custom5; + tstRslt.Custom6 = testRsltQ2ac.Custom6; + tstRslt.Custom7 = testRsltQ2ac.Custom7; + tstRslt.Custom8 = testRsltQ2ac.Custom8; + + for (int i = 0; i < ProcessData.BatchRslts.WMPositionsCount; i++) + { + Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Single); + Results.Entities.MeterTestRslt meterRsltQ2bc = ProcessData.BatchRslts.GetMeterTestRslt(testNameQ2bc, i, CompoundMeterId.Single); + Results.Entities.MeterTestRslt meterRsltQ2ac = ProcessData.BatchRslts.GetMeterTestRslt(testNameQ2ac, i, CompoundMeterId.Single); + + if ((meterRslt != null) && (meterRsltQ2bc != null) && (meterRsltQ2ac != null)) + { + meterRslt.PulsesMeter = meterRsltQ2ac.PulsesMeter; + meterRslt.PulsesMaster = meterRsltQ2ac.PulsesMaster; + meterRslt.PulsesPerLiter = meterRsltQ2ac.PulsesPerLiter; + meterRslt.VolumeRef = meterRsltQ2ac.VolumeRef; + meterRslt.TestTime = meterRsltQ2ac.TestTime; + meterRslt.VolumeStart = meterRsltQ2ac.VolumeStart; + meterRslt.VolumeEnd = meterRsltQ2ac.VolumeEnd; + meterRslt.VolumeMeter = meterRsltQ2ac.VolumeMeter; + meterRslt.Error = meterRsltQ2ac.Error; + meterRslt.TestDone = meterRsltQ2ac.TestDone; + tstRslt.TestDone = true; + + if (((meterRsltQ2bc.Error < -0.51) && (meterRsltQ2ac.Error < meterRsltQ2bc.Error)) || + ((meterRsltQ2bc.Error > +0.51) && (meterRsltQ2ac.Error > meterRsltQ2bc.Error))) + { + meterRslt.Passed = false; /// Q2 correction check failed + } + else + { + meterRslt.Passed = true; /// Q2 correction check passed + } + } + } + } + } +} diff --git a/TBF/Rig/StateMachine.cs b/TBF/Rig/StateMachine.cs index 0265842a4..6f7ff0be9 100644 --- a/TBF/Rig/StateMachine.cs +++ b/TBF/Rig/StateMachine.cs @@ -14,6 +14,7 @@ using TBF.Rig.GenericDevices; using TBF.Rig.Sequences; using Dirichlet.Numerics; using TBF.Resources; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; namespace TBF.Rig { @@ -154,6 +155,7 @@ namespace TBF.Rig TestMethod2Class = new Dictionary(); ProcessData.IperlHeads = new List(); + ProcessData.IperlHeadsUni = new List(); SequenceBase.FlowMeters = new List(); SequenceBase.RegVPositions = new List(); SequenceBase.PumpsWithFM = new List(); diff --git a/TBF/Rig/TestMethods/SmartTest/SequenceConditionOp.cs b/TBF/Rig/TestMethods/SmartTest/SequenceConditionOp.cs new file mode 100644 index 000000000..c3e8a8b84 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/SequenceConditionOp.cs @@ -0,0 +1,32 @@ +/// +/// Copyright (c) 2022 Sensus Slovensko a.s. +/// +using TBF.Resources; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; + +namespace TBF.Rig.TestMethods.SmartTest +{ + + public class SequenceConditionOp : ISequenceConditionOp, IOperation + { + public SequenceConditionOp(TestMethod testMethodComponent, ConditionID id) + : base(testMethodComponent, id) + { + } + + public void Start() { } + + public Event Run() + { + bool conditionMet = testMethodComponent.IsMeterCommMilestone((int)id);// IperlCommMilestone[(int)id]; + return conditionMet ? Event.ConditionMet : Event.ConditionNotMet; + } + + public void Stop() { } + + public override string ToString() + { + return GetConditionNameFmt(id); + } + } +} diff --git a/TBF/Rig/TestMethods/SmartTest/TestMethod.cs b/TBF/Rig/TestMethods/SmartTest/TestMethod.cs new file mode 100644 index 000000000..2a38883c0 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/TestMethod.cs @@ -0,0 +1,181 @@ +/// +/// Copyright (c) 2015-2022 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using log4net; +using Common; +using Config.Entities; +using TBF.Rig.GenericDevices; +using TBF.Rig.Sequences; +using TBF.Rig.Uni.SharedDialogs.iPerlCommunication; +using TBF.UiBridge; +using ConditionID = TBF.Rig.Uni.SharedDialogs.iPerlCommunication.ConditionID; +using iPerlCommunicationSeq = TBF.Rig.Sequences.iPerlCommunicationSeq; +using TestMethodCfg = TBF.Rig.RegisterReaders.iPerlReaderUNI.TestMethodCfg; + +namespace TBF.Rig.TestMethods.SmartTest +{ + public class TestMethod : SmartComponentBase, ISimultTestMethod, ISequenceCondition, ISessionDataMngmnt, ISmartTestMethod + { + private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + + public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } + + public bool CanTest(MetersKind meters) { return meters == MetersKind.Single; } + public bool DoTransitions() { return false; } + + 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; + } + } + }; + } + + public override void MeterCommMilestone(int iItem, bool bValue) + { + IperlCommMilestone[iItem] = bValue; + } + + public override bool IsMeterCommMilestone(int iItem) + { + return IperlCommMilestone[iItem]; + } + + #endregion Configuration Change Handling + + + readonly TestMethodCfg testMethodCfg; + + public bool[] IperlCommMilestone; + IList sequenceConditionOps; + + public TestMethod() + { + CreateMilestonesAndConditions(); + } + + public TestMethod(Generic.IComponentCfg cfg) + : base(cfg) + { + testMethodCfg = cfg as TestMethodCfg; + CreateMilestonesAndConditions(); + } + + void CreateMilestonesAndConditions() + { + IperlCommMilestone = new bool[(int)ConditionID.Count]; + + sequenceConditionOps = new List(); + for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++) + { + sequenceConditionOps.Add(new SequenceConditionOp(this, id)); + } + } + + /// IDevice interface - only Initialize() is used + public override void Initialize() + { + if (DebugLevel == DebugMode.Normal) + { + rfidDataLogger.Fatal("------------------------------------------------------------------------"); + rfidDataLogger.FatalFormat("Test Bench Framework ver. {0}", Program.Version); + + log.FatalFormat("{0} initialized: {1}", Name, this); + } + else + { + log.FatalFormat("{0} simulated: {1}", Name, this); + } + } + + public IList Execute(Test test, int repetNr, bool isLastRepetition) + { + if (DebugLevel == DebugMode.Normal) + { + return (new iPerlCommunicationSeq()).Execute(test, repetNr, this, testMethodCfg.TestParams); + } + else + { + /// DebugLevel == DebugMode.Simulate + (new iPerlCommunicationSeq()).MakeSimulatedTrivial(test, repetNr, test.Part); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, 1, Progress.Completed)); + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(Common.Utils.GetTestName(test.Name, 1, 1), 0))); + return new List { Event.Done }; + } + } + + + public int ConditionsCount { get { return (int)ConditionID.Count; } } + + public string ConditionName(int i) + { + return (i >= 0 && i < (int)ConditionID.Count) ? ConditionOp(i).ToString() : string.Empty; + } + + public IOperation ConditionOp(int i) + { + return (i >= 0 && i < (int)ConditionID.Count) ? sequenceConditionOps[i] : null; + } + + + public void StartSession() + { + /// Clear milestones + if (IperlCommMilestone != null) + { + for (int i = 0; i < IperlCommMilestone.Length; i++) + { + IperlCommMilestone[i] = false; + } + } + } + + public void SaveMark(object o) + { + /// No marks + } + + public void EndSession() + { + /// Nothing at the end of session + } + + public bool CheckDeviceCaps(Test test, OutputPath devices, out string message) + { + // Implement the method to satisfy the ITestMethod interface. + // For now, provide a basic implementation. + message = "Device capabilities check not implemented."; + return true; + } + } +} diff --git a/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.cs b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.cs new file mode 100644 index 000000000..faba70574 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.cs @@ -0,0 +1,257 @@ +/// +/// Copyright (c) 2015-2020 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Common; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.Resources; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; + +namespace TBF.Rig.TestMethods.SmartTest +{ + public partial class TestMethodCfgCtrl : Configs.ConfigCtrlUtils, IComponentCfgCtrl + { + public bool ShowMore { get { return false; } } + + TestMethodCfg config; + public IComponentCfg Config + { + get { return config as IComponentCfg; } + set + { + config = value as TestMethodCfg; + Redraw(); + } + } + + public TestMethodCfgCtrl() + { + InitializeComponent(); + } + + private void EntryFormCfgCtrl_Load(object sender, EventArgs e) + { + Redraw(); + } + + public void Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + classNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + commTimeoutTextBox.Text = config.CommTimeout.ToString(); + maxCommRetriesTextBox.Text = config.MaxCommRetries.ToString(); + delayBetweenRetriesTextBox.Text = config.DelayBetweenRetries.ToString(); + nrThreadsTextBox.Text = config.NrThreads.ToString(); + iperlCheckErrorsToStopTextBox.Text = config.IperlCheckErrorsToStop.ToString(); + + textBox15rl.Text = config.DfltQ2c_15_rl.ToString(); + textBox15lr.Text = config.DfltQ2c_15_lr.ToString(); + textBox20rl.Text = config.DfltQ2c_20_rl.ToString(); + textBox20lr.Text = config.DfltQ2c_20_lr.ToString(); + textBox25_63rl.Text = config.DfltQ2c_25_63_rl.ToString(); + textBox25_63lr.Text = config.DfltQ2c_25_63_lr.ToString(); + textBox25_10rl.Text = config.DfltQ2c_25_10_rl.ToString(); + textBox25_10lr.Text = config.DfltQ2c_25_10_lr.ToString(); + textBox32rl.Text = config.DfltQ2c_32_rl.ToString(); + textBox32lr.Text = config.DfltQ2c_32_lr.ToString(); + textBox40rl.Text = config.DfltQ2c_40_rl.ToString(); + textBox40lr.Text = config.DfltQ2c_40_lr.ToString(); + + useWebServiceCheckBox.Checked = config.UseWebService; + baseUrlTextBox.Text = config.BaseUrl; + relativeUrlTextBox.Text = config.RelativeUrl; + } + + public void Unlock() + { + nameTextBox.Enabled = true; + commTimeoutTextBox.Enabled = true; + maxCommRetriesTextBox.Enabled = true; + delayBetweenRetriesTextBox.Enabled = true; + nrThreadsTextBox.Enabled = true; + iperlCheckErrorsToStopTextBox.Enabled = true; + + textBox15rl.Enabled = true; + textBox15lr.Enabled = true; + textBox20rl.Enabled = true; + textBox20lr.Enabled = true; + textBox25_63rl.Enabled = true; + textBox25_63lr.Enabled = true; + textBox25_10rl.Enabled = true; + textBox25_10lr.Enabled = true; + textBox32rl.Enabled = true; + textBox32lr.Enabled = true; + textBox40rl.Enabled = true; + textBox40lr.Enabled = true; + + useWebServiceCheckBox.Enabled = true; + ManageCheckGroupBox(useWebServiceCheckBox, useWebServiceGroupBox); + baseUrlTextBox.Enabled = useWebServiceCheckBox.Enabled; + relativeUrlTextBox.Enabled = useWebServiceCheckBox.Enabled; + } + + public CfgUpdateFlags VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!int.TryParse(commTimeoutTextBox.Text, out dummy) || dummy < 500 || dummy > 5000) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Comm. timeout' should be in range 500 .. 5000"; + } + if (!int.TryParse(maxCommRetriesTextBox.Text, out dummy) || dummy < 1 || dummy > 10) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Max. retries' should be in range 1 .. 10"; + } + if (!int.TryParse(delayBetweenRetriesTextBox.Text, out dummy) || dummy < 0 || dummy > 5000) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Comm. timeout' should be in range 0 .. 5000"; + } + if (!int.TryParse(nrThreadsTextBox.Text, out dummy) || (dummy != 1 && dummy != 2 && dummy != 4)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Nr. threads' should be 1, 2 or 4"; + } + if (!int.TryParse(iperlCheckErrorsToStopTextBox.Text, out dummy) || ((dummy < 1) && (dummy > 40))) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + string.Format(Strings.Invalid_0, iperlCheckErrorsToStopLabel.Text); + } + + if (!int.TryParse(textBox15rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN15 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox15lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN15 LR should be in range -50 .. 50"; + } + if (!int.TryParse(textBox20rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN20 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox20lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN20 LR should be in range -50 .. 50"; + } + if (!int.TryParse(textBox25_63rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN25 Q3 6.3 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox25_63lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN25 Q3 6.3 LR should be in range -50 .. 50"; + } + if (!int.TryParse(textBox25_10rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN25 Q3 10 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox25_10lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN25 Q3 10 LR should be in range -50 .. 50"; + } + if (!int.TryParse(textBox32rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN32 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox32lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN32 LR should be in range -50 .. 50"; + } + if (!int.TryParse(textBox40rl.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN40 RL should be in range -50 .. 50"; + } + if (!int.TryParse(textBox40lr.Text, out dummy) || dummy < -50 || dummy > 50) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Default Q2 correction factor DN40 LR should be in range -50 .. 50"; + } + + return flags; + } + + public CfgUpdateFlags UpdateCfg() + { + 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.AnyChange | 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.NrThreads, nrThreadsTextBox.Text, CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.IperlCheckErrorsToStop, iperlCheckErrorsToStopTextBox.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + + flags |= UpdateDifferent(ref config.DfltQ2c_15_rl, textBox15rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_15_lr, textBox15lr.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_20_rl, textBox20rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_20_lr, textBox20lr.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_25_63_rl, textBox25_63rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_25_63_lr, textBox25_63lr.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_25_10_rl, textBox25_10rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_25_10_lr, textBox25_10lr.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_32_rl, textBox32rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_32_lr, textBox32lr.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_40_rl, textBox40rl.Text, CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange); + flags |= UpdateDifferent(ref config.DfltQ2c_40_lr, textBox40lr.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); + + if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0) + { + TestMethod.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config)); + } + + return flags; + } + + private void ManageCheckGroupBox(CheckBox chk, GroupBox grp) + { + /// Make sure the CheckBox isn't in the GroupBox. This will only happen the first time. + if (chk.Parent == grp) + { + grp.Parent.Controls.Add(chk); /// Reparent the CheckBox so it's not in the GroupBox. + chk.Location = new System.Drawing.Point(chk.Left + grp.Left, chk.Top + grp.Top); /// Adjust the CheckBox's location. + chk.BringToFront(); /// Move the CheckBox to the top of the stacking order. + } + + /// Enable or disable the GroupBox. + grp.Enabled = chk.Checked; + } + + private void useWebServiceCheckBox_CheckedChanged(object sender, EventArgs e) + { + useWebServiceGroupBox.Enabled = useWebServiceCheckBox.Checked; + } + } +} diff --git a/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.designer.cs b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.designer.cs new file mode 100644 index 000000000..df1d42ab7 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.designer.cs @@ -0,0 +1,520 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.Rig.TestMethods.SmartTest +{ + partial class TestMethodCfgCtrl + { + /// + /// 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.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.classNameLabel = new System.Windows.Forms.Label(); + this.commTimeoutTextBox = new System.Windows.Forms.TextBox(); + this.commTimeoutLabel = new System.Windows.Forms.Label(); + this.maxCommRetriesTextBox = new System.Windows.Forms.TextBox(); + this.maxNrRetriesLabel = new System.Windows.Forms.Label(); + this.nrThreadsTextBox = new System.Windows.Forms.TextBox(); + this.nrThreadsLabel = new System.Windows.Forms.Label(); + this.iperlCheckErrorsToStopTextBox = new System.Windows.Forms.TextBox(); + 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.useWebServiceGroupBox = new System.Windows.Forms.GroupBox(); + this.dfltQ2corrFactorsGroupBox = new System.Windows.Forms.GroupBox(); + this.label8 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox40lr = new System.Windows.Forms.TextBox(); + this.textBox32lr = new System.Windows.Forms.TextBox(); + this.textBox25_10lr = new System.Windows.Forms.TextBox(); + this.textBox25_63lr = new System.Windows.Forms.TextBox(); + this.textBox20lr = new System.Windows.Forms.TextBox(); + this.textBox15lr = new System.Windows.Forms.TextBox(); + this.textBox40rl = new System.Windows.Forms.TextBox(); + this.textBox32rl = new System.Windows.Forms.TextBox(); + this.textBox25_10rl = new System.Windows.Forms.TextBox(); + this.textBox25_63rl = new System.Windows.Forms.TextBox(); + this.textBox20rl = new System.Windows.Forms.TextBox(); + this.textBox15rl = new System.Windows.Forms.TextBox(); + this.useWebServiceGroupBox.SuspendLayout(); + this.dfltQ2corrFactorsGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(237, 31); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + 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; + this.nameLabel.Text = "Name"; + // + // classNameLabel + // + this.classNameLabel.AutoSize = true; + this.classNameLabel.Location = new System.Drawing.Point(234, 11); + this.classNameLabel.Name = "classNameLabel"; + this.classNameLabel.Size = new System.Drawing.Size(83, 13); + this.classNameLabel.TabIndex = 0; + this.classNameLabel.Text = "ComonentName"; + // + // commTimeoutTextBox + // + this.commTimeoutTextBox.Enabled = false; + this.commTimeoutTextBox.Location = new System.Drawing.Point(237, 53); + this.commTimeoutTextBox.Name = "commTimeoutTextBox"; + this.commTimeoutTextBox.Size = new System.Drawing.Size(45, 20); + this.commTimeoutTextBox.TabIndex = 4; + // + // commTimeoutLabel + // + this.commTimeoutLabel.AutoSize = true; + 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; + this.commTimeoutLabel.Text = "Comm. timeout [ms]"; + // + // maxCommRetriesTextBox + // + this.maxCommRetriesTextBox.Enabled = false; + this.maxCommRetriesTextBox.Location = new System.Drawing.Point(237, 75); + this.maxCommRetriesTextBox.Name = "maxCommRetriesTextBox"; + this.maxCommRetriesTextBox.Size = new System.Drawing.Size(45, 20); + this.maxCommRetriesTextBox.TabIndex = 6; + // + // maxNrRetriesLabel + // + this.maxNrRetriesLabel.AutoSize = true; + 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; + this.maxNrRetriesLabel.Text = "Max. retries"; + // + // nrThreadsTextBox + // + this.nrThreadsTextBox.Enabled = false; + this.nrThreadsTextBox.Location = new System.Drawing.Point(237, 119); + this.nrThreadsTextBox.Name = "nrThreadsTextBox"; + this.nrThreadsTextBox.Size = new System.Drawing.Size(45, 20); + this.nrThreadsTextBox.TabIndex = 10; + // + // nrThreadsLabel + // + this.nrThreadsLabel.AutoSize = true; + 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; + this.nrThreadsLabel.Text = "Nr. threads"; + // + // iperlCheckErrorsToStopTextBox + // + this.iperlCheckErrorsToStopTextBox.Enabled = false; + this.iperlCheckErrorsToStopTextBox.Location = new System.Drawing.Point(237, 141); + this.iperlCheckErrorsToStopTextBox.Name = "iperlCheckErrorsToStopTextBox"; + this.iperlCheckErrorsToStopTextBox.Size = new System.Drawing.Size(45, 20); + this.iperlCheckErrorsToStopTextBox.TabIndex = 13; + // + // iperlCheckErrorsToStopLabel + // + this.iperlCheckErrorsToStopLabel.AutoSize = true; + this.iperlCheckErrorsToStopLabel.Location = new System.Drawing.Point(23, 144); + this.iperlCheckErrorsToStopLabel.Name = "iperlCheckErrorsToStopLabel"; + this.iperlCheckErrorsToStopLabel.Size = new System.Drawing.Size(202, 13); + this.iperlCheckErrorsToStopLabel.TabIndex = 12; + this.iperlCheckErrorsToStopLabel.Text = "iperl_check errors count to stop the cycle"; + // + // delayBetweenRetriesTextBox + // + this.delayBetweenRetriesTextBox.Enabled = false; + this.delayBetweenRetriesTextBox.Location = new System.Drawing.Point(237, 97); + this.delayBetweenRetriesTextBox.Name = "delayBetweenRetriesTextBox"; + this.delayBetweenRetriesTextBox.Size = new System.Drawing.Size(45, 20); + this.delayBetweenRetriesTextBox.TabIndex = 8; + // + // delayBetweenRetriesLabel + // + this.delayBetweenRetriesLabel.AutoSize = true; + 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(89, 50); + 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(13, 53); + 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(89, 24); + 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(13, 27); + 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(15, 0); + 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; + this.useWebServiceCheckBox.CheckedChanged += new System.EventHandler(this.useWebServiceCheckBox_CheckedChanged); + // + // useWebServiceGroupBox + // + this.useWebServiceGroupBox.Controls.Add(this.baseUrlTextBox); + this.useWebServiceGroupBox.Controls.Add(this.useWebServiceCheckBox); + this.useWebServiceGroupBox.Controls.Add(this.relativeUrlTextBox); + this.useWebServiceGroupBox.Controls.Add(this.relativeUrlLabel); + this.useWebServiceGroupBox.Controls.Add(this.baseUrlLabel); + this.useWebServiceGroupBox.Location = new System.Drawing.Point(11, 266); + this.useWebServiceGroupBox.Name = "useWebServiceGroupBox"; + this.useWebServiceGroupBox.Size = new System.Drawing.Size(404, 83); + this.useWebServiceGroupBox.TabIndex = 0; + this.useWebServiceGroupBox.TabStop = false; + // + // dfltQ2corrFactorsGroupBox + // + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label8); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label7); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label6); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label5); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label4); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label3); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label2); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.label1); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox40lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox32lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox25_10lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox25_63lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox20lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox15lr); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox40rl); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox32rl); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox25_10rl); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox25_63rl); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox20rl); + this.dfltQ2corrFactorsGroupBox.Controls.Add(this.textBox15rl); + this.dfltQ2corrFactorsGroupBox.Location = new System.Drawing.Point(11, 175); + this.dfltQ2corrFactorsGroupBox.Name = "dfltQ2corrFactorsGroupBox"; + this.dfltQ2corrFactorsGroupBox.Size = new System.Drawing.Size(404, 85); + this.dfltQ2corrFactorsGroupBox.TabIndex = 14; + this.dfltQ2corrFactorsGroupBox.TabStop = false; + this.dfltQ2corrFactorsGroupBox.Text = "Default Q2 correction factors"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(344, 17); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(35, 13); + this.label8.TabIndex = 19; + this.label8.Text = "DN40"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(289, 17); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(35, 13); + this.label7.TabIndex = 18; + this.label7.Text = "DN32"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(233, 17); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(45, 13); + this.label6.TabIndex = 17; + this.label6.Text = "...Q3 10"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(163, 17); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(70, 13); + this.label5.TabIndex = 16; + this.label5.Text = "DN25 Q3 6.3"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(121, 17); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(35, 13); + this.label4.TabIndex = 15; + this.label4.Text = "DN20"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(65, 17); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 14; + this.label3.Text = "DN15"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(22, 57); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(24, 13); + this.label2.TabIndex = 13; + this.label2.Text = "L-R"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(22, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(24, 13); + this.label1.TabIndex = 12; + this.label1.Text = "R-L"; + // + // textBox40lr + // + this.textBox40lr.Enabled = false; + this.textBox40lr.Location = new System.Drawing.Point(337, 54); + this.textBox40lr.Name = "textBox40lr"; + this.textBox40lr.Size = new System.Drawing.Size(50, 20); + this.textBox40lr.TabIndex = 11; + // + // textBox32lr + // + this.textBox32lr.Enabled = false; + this.textBox32lr.Location = new System.Drawing.Point(281, 54); + this.textBox32lr.Name = "textBox32lr"; + this.textBox32lr.Size = new System.Drawing.Size(50, 20); + this.textBox32lr.TabIndex = 10; + // + // textBox25_10lr + // + this.textBox25_10lr.Enabled = false; + this.textBox25_10lr.Location = new System.Drawing.Point(225, 54); + this.textBox25_10lr.Name = "textBox25_10lr"; + this.textBox25_10lr.Size = new System.Drawing.Size(50, 20); + this.textBox25_10lr.TabIndex = 9; + // + // textBox25_63lr + // + this.textBox25_63lr.Enabled = false; + this.textBox25_63lr.Location = new System.Drawing.Point(169, 54); + this.textBox25_63lr.Name = "textBox25_63lr"; + this.textBox25_63lr.Size = new System.Drawing.Size(50, 20); + this.textBox25_63lr.TabIndex = 8; + // + // textBox20lr + // + this.textBox20lr.Enabled = false; + this.textBox20lr.Location = new System.Drawing.Point(113, 54); + this.textBox20lr.Name = "textBox20lr"; + this.textBox20lr.Size = new System.Drawing.Size(50, 20); + this.textBox20lr.TabIndex = 7; + // + // textBox15lr + // + this.textBox15lr.Enabled = false; + this.textBox15lr.Location = new System.Drawing.Point(57, 54); + this.textBox15lr.Name = "textBox15lr"; + this.textBox15lr.Size = new System.Drawing.Size(50, 20); + this.textBox15lr.TabIndex = 6; + // + // textBox40rl + // + this.textBox40rl.Enabled = false; + this.textBox40rl.Location = new System.Drawing.Point(337, 31); + this.textBox40rl.Name = "textBox40rl"; + this.textBox40rl.Size = new System.Drawing.Size(50, 20); + this.textBox40rl.TabIndex = 5; + // + // textBox32rl + // + this.textBox32rl.Enabled = false; + this.textBox32rl.Location = new System.Drawing.Point(281, 31); + this.textBox32rl.Name = "textBox32rl"; + this.textBox32rl.Size = new System.Drawing.Size(50, 20); + this.textBox32rl.TabIndex = 4; + // + // textBox25_10rl + // + this.textBox25_10rl.Enabled = false; + this.textBox25_10rl.Location = new System.Drawing.Point(225, 31); + this.textBox25_10rl.Name = "textBox25_10rl"; + this.textBox25_10rl.Size = new System.Drawing.Size(50, 20); + this.textBox25_10rl.TabIndex = 3; + // + // textBox25_63rl + // + this.textBox25_63rl.Enabled = false; + this.textBox25_63rl.Location = new System.Drawing.Point(169, 31); + this.textBox25_63rl.Name = "textBox25_63rl"; + this.textBox25_63rl.Size = new System.Drawing.Size(50, 20); + this.textBox25_63rl.TabIndex = 2; + // + // textBox20rl + // + this.textBox20rl.Enabled = false; + this.textBox20rl.Location = new System.Drawing.Point(113, 31); + this.textBox20rl.Name = "textBox20rl"; + this.textBox20rl.Size = new System.Drawing.Size(50, 20); + this.textBox20rl.TabIndex = 1; + // + // textBox15rl + // + this.textBox15rl.Enabled = false; + this.textBox15rl.Location = new System.Drawing.Point(57, 31); + this.textBox15rl.Name = "textBox15rl"; + this.textBox15rl.Size = new System.Drawing.Size(50, 20); + this.textBox15rl.TabIndex = 0; + // + // TestMethodCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.dfltQ2corrFactorsGroupBox); + this.Controls.Add(this.useWebServiceGroupBox); + this.Controls.Add(this.delayBetweenRetriesTextBox); + this.Controls.Add(this.delayBetweenRetriesLabel); + this.Controls.Add(this.iperlCheckErrorsToStopTextBox); + this.Controls.Add(this.iperlCheckErrorsToStopLabel); + this.Controls.Add(this.nrThreadsTextBox); + this.Controls.Add(this.nrThreadsLabel); + this.Controls.Add(this.maxCommRetriesTextBox); + this.Controls.Add(this.maxNrRetriesLabel); + this.Controls.Add(this.commTimeoutTextBox); + this.Controls.Add(this.commTimeoutLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.classNameLabel); + this.Name = "TestMethodCfgCtrl"; + this.Size = new System.Drawing.Size(427, 363); + this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load); + this.useWebServiceGroupBox.ResumeLayout(false); + this.useWebServiceGroupBox.PerformLayout(); + this.dfltQ2corrFactorsGroupBox.ResumeLayout(false); + this.dfltQ2corrFactorsGroupBox.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label classNameLabel; + private System.Windows.Forms.TextBox commTimeoutTextBox; + private System.Windows.Forms.Label commTimeoutLabel; + private System.Windows.Forms.TextBox maxCommRetriesTextBox; + private System.Windows.Forms.Label maxNrRetriesLabel; + private System.Windows.Forms.TextBox nrThreadsTextBox; + private System.Windows.Forms.Label nrThreadsLabel; + private System.Windows.Forms.TextBox iperlCheckErrorsToStopTextBox; + 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; + private System.Windows.Forms.GroupBox useWebServiceGroupBox; + private System.Windows.Forms.GroupBox dfltQ2corrFactorsGroupBox; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox40lr; + private System.Windows.Forms.TextBox textBox32lr; + private System.Windows.Forms.TextBox textBox25_10lr; + private System.Windows.Forms.TextBox textBox25_63lr; + private System.Windows.Forms.TextBox textBox20lr; + private System.Windows.Forms.TextBox textBox15lr; + private System.Windows.Forms.TextBox textBox40rl; + private System.Windows.Forms.TextBox textBox32rl; + private System.Windows.Forms.TextBox textBox25_10rl; + private System.Windows.Forms.TextBox textBox25_63rl; + private System.Windows.Forms.TextBox textBox20rl; + private System.Windows.Forms.TextBox textBox15rl; + } +} diff --git a/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.resx b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/TestMethodCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/TBF/Rig/TestMethods/SmartTest/TestMethodFactory.cs b/TBF/Rig/TestMethods/SmartTest/TestMethodFactory.cs new file mode 100644 index 000000000..bad85ac63 --- /dev/null +++ b/TBF/Rig/TestMethods/SmartTest/TestMethodFactory.cs @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2015-2016 Sensus Metering Systems +/// +using System.Collections.Generic; +using TBF.Rig.Generic; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; + +namespace TBF.Rig.TestMethods.SmartTest +{ + public class TestMethodFactory : IComponentFactory + { + public string ClassName { get { return GetType().Namespace.Substring(8); } } + + public IComponent DummyComponent() { return new TestMethod(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new TestMethod(cfg); } + + public IComponentCfg DefaultConfig() { return new TestMethodCfg(this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(TestMethodCfg.Serializer, component, this); + } + } +} diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/AllCompletedEventArgs.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/AllCompletedEventArgs.cs new file mode 100644 index 000000000..2c025dd68 --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/AllCompletedEventArgs.cs @@ -0,0 +1,18 @@ +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public class AllCompletedEventArgs : EventArgs + { + public string CommMessage; + + public AllCompletedEventArgs(string commMessage) + { + this.CommMessage = commMessage; + } + } +} diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/CommCompletedEventArgs.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/CommCompletedEventArgs.cs new file mode 100644 index 000000000..b46c5b0cf --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/CommCompletedEventArgs.cs @@ -0,0 +1,41 @@ +/// +/// Copyright (c) 2015-2019 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; +using TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public class CommCompletedEventArgs : EventArgs + { + public int ThreadId; + public int WMNr0; /// 0-based water meter position + public IPerlReader Ihead; + public Results.Entities.WaterMeter Wm; + public string CommMessage; + public CommErr CommErr; + + public CommCompletedEventArgs(int threadId, int wmNr0, IPerlReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) + { + this.ThreadId = threadId; + this.WMNr0 = wmNr0; + this.Ihead = ihead; + this.Wm = wm; + this.CommMessage = commMessage; + this.CommErr = commErr; + } + + public override string ToString() + { + return string.Format("Thread={0} WMNr0={1} IHead={2} WM={3} CommMsg={4} CommErr={5}", + ThreadId, + WMNr0, + (Ihead != null) ? Ihead.Name : "null", + Wm.WMPosition, + (CommMessage != null) ? CommMessage : "null", + CommErr); + } + } +} diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISequenceConditionOp.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISequenceConditionOp.cs index 3aaaa6de7..ba9c9f070 100644 --- a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISequenceConditionOp.cs +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISequenceConditionOp.cs @@ -11,13 +11,13 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication public abstract class ISequenceConditionOp { const string ConditionNameFmt = "iPERL communication milestone {0}"; - public static string GetConditionNameFmt(int id) + public static string GetConditionNameFmt(ConditionID id) { return string.Format(ConditionNameFmt, id); } - private ConditionID id; - private ISmartTestMethod testMethodComponent; + public ConditionID id; + public ISmartTestMethod testMethodComponent; public ISequenceConditionOp(ISmartTestMethod testMethodComponent, ConditionID id) { diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartTestMethod.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartTestMethod.cs index d86ce48d1..5c1be4bb3 100644 --- a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartTestMethod.cs +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartTestMethod.cs @@ -1,9 +1,12 @@ + + +using TBF.Rig.RegisterReaders.iPerlReaderUNI; + namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication { - - public interface ISmartTestMethod { - void MeterCommMilestone(int iItem, bool bValue); + public void MeterCommMilestone(int iItem, bool bValue); + public bool IsMeterCommMilestone(int iItem); } } \ No newline at end of file diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartWrapper.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartWrapper.cs index dee1ad9c2..e5c080d59 100644 --- a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartWrapper.cs +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/ISmartWrapper.cs @@ -1,8 +1,11 @@ +using TBF.Rig.RegisterReaders.iPerlReaderUNI; +using Results.Entities; + namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication { public interface ISmartWrapper { - CommErr ResetQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) - CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr); + CommErr ResetQ2Correction(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr); + CommErr WriteDefaultQ2Corrections(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr); } } \ No newline at end of file diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/SmartComponentBase.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/SmartComponentBase.cs new file mode 100644 index 000000000..d414aedd5 --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/SmartComponentBase.cs @@ -0,0 +1,21 @@ +using TBF.Rig.Generic; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public abstract class SmartComponentBase : ComponentBase, ISmartTestMethod + { + public abstract void MeterCommMilestone(int iItem, bool bValue); + public abstract bool IsMeterCommMilestone(int iItem); + + + public SmartComponentBase() + : base() + { + } + + public SmartComponentBase(IComponentCfg cfg) + : base(cfg) + { + } + } +} \ No newline at end of file diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationConstants.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationConstants.cs new file mode 100644 index 000000000..fd4256d6d --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationConstants.cs @@ -0,0 +1,63 @@ +using System.Drawing; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public static class iPerlCommunicationConstants + { + public const int Hz2CorrFactorsAddr = 0x1875; /// Used by Reset2HzCorrection(...) and Write2HzCorrection(...) + public const int Q2CorrFactorsAddr = 0x1878; /// Used by ResetQ2Correction(...) and WriteQ2Correction(...) + public const int Q2CorrFactorsAddrLR = 0x1878; + public const int Q2CorrFactorsAddrRL = 0x1879; + + public const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled" + public const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig' + public const string SetActiveModeStr = "Set Active mode"; + public const string ReadCalibrationStr = "Read calibration"; + public const string ReadCalibrationV4Str = "Read calibration_V4"; + public const string WriteCalibrationFactorStr = "Write calibration factor"; + 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 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 + public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name + public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name + public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name + public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments + public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments + public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name + public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name + public const string Reset2HzCorrectionStr = "Reset 2Hz correction"; + public const string Write2HzCorrectionStr = "Write 2Hz correction"; + public const string DewaReworkRLStr = "DEWA rework R-L"; + public const string DewaReworkLRStr = "DEWA rework L-R"; + public const string StartTestingSealedMetersStr = "Start testing sealed meters"; + public const string EndTestingSealedMetersStr = "End testing sealed meters"; + public const string SimulateCmd = "simulate "; + + public static Color DisabledColor = Color.DarkGray; + public static Color OptoAndDirOKColor = Color.Green; + public static Color OptoNokColor = Color.Orange; + public static Color DirNokColor = Color.Red; + + public const string Q2correctedFromCmd = "Q2 corrected from "; + public const string StrictQ2ErrorCheckStr = "Strict Q2 error check "; + public const string Q2correctionCheckCmd = "Q2 correction check "; + public const string IperlCheckCmd = "iPERL_check "; + + } +} \ No newline at end of file diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationForm.cs index 40f27c012..83c1d53c5 100644 --- a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationForm.cs @@ -16,11 +16,24 @@ using Common; using Config.Entities; using TBF.Resources; using TBF.Rig.Sequences; -using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; using Results.Entities; using static Sensus.iPerl.NfcHandler.MCI_Protocol; using System.Threading.Tasks; -using TBF.Boxes; +using TBF.Rig.RegisterReaders.iPerlReaderUNI; +using TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication; +using TBF.Rig.RegisterReaders.iPerlReaderUNI.test; +using CalibrationStruct = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.CalibrationStruct; +using CalibrationStructV4 = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.CalibrationStructV4; +using CheckBoxImage = TBF.Boxes.CheckBoxImage; +using Command = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.Command; +using CommunicationInterface = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.CommunicationInterface; +using ConfigStruct = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.ConfigStruct; +using MessageID = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.MessageID; +using MeterState = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.MeterState; +using MeterType = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.MeterType; +using RfidServices = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.RfidServices; +using SimulationServices = TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication.SimulationServices; +//using TestMethodCfg = TBF.Rig.RegisterReaders.iPerlReaderUNI.TestMethodCfg; namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication { @@ -54,55 +67,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm)); protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); - const int Hz2CorrFactorsAddr = 0x1875; /// Used by Reset2HzCorrection(...) and Write2HzCorrection(...) - const int Q2CorrFactorsAddr = 0x1878; /// Used by ResetQ2Correction(...) and WriteQ2Correction(...) - const int Q2CorrFactorsAddrLR = 0x1878; - const int Q2CorrFactorsAddrRL = 0x1879; - - public const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled" - public const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig' - public const string SetActiveModeStr = "Set Active mode"; - public const string ReadCalibrationStr = "Read calibration"; - public const string ReadCalibrationV4Str = "Read calibration_V4"; - public const string WriteCalibrationFactorStr = "Write calibration factor"; - 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 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 - public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name - public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name - public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments - public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name - public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name - public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments - public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments - public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name - public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name - public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name - public const string Reset2HzCorrectionStr = "Reset 2Hz correction"; - public const string Write2HzCorrectionStr = "Write 2Hz correction"; - public const string DewaReworkRLStr = "DEWA rework R-L"; - public const string DewaReworkLRStr = "DEWA rework L-R"; - public const string StartTestingSealedMetersStr = "Start testing sealed meters"; - public const string EndTestingSealedMetersStr = "End testing sealed meters"; - public const string SimulateCmd = "simulate "; - - public static Color DisabledColor = Color.DarkGray; - public static Color OptoAndDirOKColor = Color.Green; - public static Color OptoNokColor = Color.Orange; - public static Color DirNokColor = Color.Red; + #region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort @@ -111,14 +76,14 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// /// Water meter (iPerlHead) object /// Value returned by readRequestPort(...) - public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer) + public static int ReadRequestPort(IPerlReader iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer) { Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation { - return SimulationServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer); + return SimulationServices.ReadRequest(iperlHead, messageID, offset, length, out buffer); } if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface @@ -136,7 +101,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// /// Water meter (iPerlHead) object /// Value returned by writeRequestPort(...) - public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer) + public static int WriteRequestPort(IPerlReader iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer) { Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries)); if (iperlHead.DebugLevel == DebugMode.FailureDuringOperation) iperlHead.DebugLevel = DebugMode.Normal; @@ -184,7 +149,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication static int[] ckbIndex; static bool[] ckbState; - static IList iperlHeads; + static IList iperlHeads; static IList waterMeterPositions0; /// keeps original 0-based indices in RegisterReaders list static int commonWMType; @@ -253,8 +218,8 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Constructor for one iPerlCommunication 'test' /// /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethod testMethod, Test test, iPerlCommunicationParams testParams) - : this(testMethod, new List { test }, new List { testParams }) + public iPerlCommunicationForm(SmartComponentBase componentBase, Test test, iPerlCommunicationParams testParams) + : this(componentBase, new List { test }, new List { testParams }) { } @@ -262,13 +227,13 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Constructor for multiple iPerlCommunication 'tests' /// /// Number of text boxes for serial numbers - public iPerlCommunicationForm(TestMethod testMethod, IList tests, IList multiTestParams) + public iPerlCommunicationForm(SmartComponentBase componentBase, IList tests, IList multiTestParams) : this() { checkBoxesEditMode = false; - iPerlCommunicationForm.testMethod = testMethod; - iPerlCommunicationForm.cfg = testMethod.Cfg as TestMethodCfg; + iPerlCommunicationForm.testMethod = componentBase; + iPerlCommunicationForm.cfg = componentBase.Cfg as TestMethodCfg; iPerlCommunicationForm.tests = tests; iPerlCommunicationForm.multiTestParams = multiTestParams; @@ -278,7 +243,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication activityLabel.Text = multiTestParams[0].Activity; foreach (var p in multiTestParams) { - if (p.Activity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) + if (p.Activity.ToLower() == iPerlCommunicationConstants.GetDefaultQ2CorrectionsStr.ToLower()) { /// Reset IsQ2PreCorrectionCalculated that is used for synchronization/to prevent double REST call ProcessData.IsQ2PreCorrectionCalculated = false; @@ -321,12 +286,12 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication StartForceCloseHandler(); - iperlHeads = new List(); + iperlHeads = new List(); waterMeterPositions0 = new List(); /// for (int wmPos = 0; wmPos < ProcessData.RegisterReaders.Length; wmPos++) { - IperlHead iperlHead = ProcessData.RegisterReaders[wmPos] as IperlHead; + IPerlReader iperlHead = ProcessData.RegisterReaders[wmPos] as IPerlReader; if (iperlHead != null) { @@ -477,9 +442,9 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication sampleLabel2.Text = Strings.There_are_no_opto_pulses; sampleLabel3.Text = Strings.Direction_is_NOK; - samplePictureBox1.BackColor = OptoAndDirOKColor; - samplePictureBox2.BackColor = OptoNokColor; - samplePictureBox3.BackColor = DirNokColor; + samplePictureBox1.BackColor = iPerlCommunicationConstants.OptoAndDirOKColor; + samplePictureBox2.BackColor = iPerlCommunicationConstants.OptoNokColor; + samplePictureBox3.BackColor = iPerlCommunicationConstants.DirNokColor; } @@ -509,7 +474,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication { /// iPerl position i+1 is disabled checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = false; - counters[i].BackColor = DisabledColor; + counters[i].BackColor = iPerlCommunicationConstants.DisabledColor; messages[i].Text = Strings.Head_was_disabled_by_the_user; } else @@ -535,7 +500,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Reset opto-data indication for (int i = 0; i < iperlHeads.Count; i++) { - counters[i].BackColor = OptoNokColor; + counters[i].BackColor = iPerlCommunicationConstants.OptoNokColor; } /// Start communication process by incrementing 'currentGroup'. @@ -630,7 +595,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication if (threadID == 0) { /// Check whether previous activity was 'Set test mode A0' or 'A4' - if (i > 0 && multiTestParams[i - 1].Activity.ToLower().Contains(SetTestModeStr.ToLower()) && !multiTestParams[i - 1].Activity.Contains("80")) + if (i > 0 && multiTestParams[i - 1].Activity.ToLower().Contains(iPerlCommunicationConstants.SetTestModeStr.ToLower()) && !multiTestParams[i - 1].Activity.Contains("80")) { /// Start processing of opto-datastreams from all iPERL-s int count = 0; @@ -639,7 +604,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0) ? ProcessData.BatchRslts.Batch.WaterMeters[wmNr0] : null; - IperlHead ihead = iperlHeads[wmNr0]; + IPerlReader ihead = iperlHeads[wmNr0]; if (ihead != null && wm != null && !wm.Disabled) { @@ -679,7 +644,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) { - IperlHead ihead = iperlHeads[wmNr0]; + IPerlReader ihead = iperlHeads[wmNr0]; if ((ihead.Group == group) && (threadIx < muxBrdOrGroup14Nrs.Count) && (ihead.MuxBoardNrOrGroup14 == muxBrdOrGroup14Nrs[threadIx])) { wmFound = true; @@ -705,49 +670,49 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// if ((ihead == null) || ihead.Disabled || !ckbState[wmNr0]) error = CommErr.HeadDisabledByUser; #if IPERL - else if (currentActivity.ToLower().Contains(SetTestModeStr.ToLower())) error = SetTestMode(threadID, ihead, ref resultStr); - else if (currentActivity.ToLower().Equals(SetActiveModeStr.ToLower())) error = SetActiveMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.SetTestModeStr.ToLower())) error = SetTestMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(iPerlCommunicationConstants.SetActiveModeStr.ToLower())) error = SetActiveMode(threadID, ihead, ref resultStr); /// /// RFID communication functions below require a reference to water meter entity (wm != null) /// else if (wm == null) error = CommErr.CommFailed; - else if (currentActivity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(ihead, wm, ref resultStr); - else if (currentActivity.ToLower() == ReadCalibrationStr.ToLower()) error = ReadCalibration(ihead, wm, ref resultStr); - else if (currentActivity.ToLower() == ReadCalibrationV4Str.ToLower()) error = ReadCalibrationV4(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() == 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 = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionAltStr.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa, null); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece, currentActivity.Substring(WriteQ2CorrectionGreeceStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(WriteQ2CorrectionRLStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(WriteQ2CorrectionLRStr.Length).Trim()); - else if (currentActivity.ToLower() == WriteQ2CorrectionIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionPlusIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_plus_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_incl_05, null); - else if (currentActivity.ToLower() == WriteQ2CorrectionPlusAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_plus_incl_05, null); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionGreeceIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(WriteQ2CorrectionGreeceIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionRLIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL_incl_05, currentActivity.Substring(WriteQ2CorrectionRLIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(WriteQ2CorrectionLRIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR_incl_05, currentActivity.Substring(WriteQ2CorrectionLRIncl05Str.Length).Trim()); - else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestRLOnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestRLDir, null); - else if (currentActivity.ToLower().Contains(UpdateBothQ2FactorsTestLROnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestLRDir, null); - else if (currentActivity.ToLower().Contains(UpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Update, currentActivity.Substring(UpdateQ2CorrectionsStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdate, currentActivity.Substring(ConditnlUpdateQ2CorrectionsStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateRL, currentActivity.Substring(ConditnlUpdateQ2CorrRLStr.Length).Trim()); - else if (currentActivity.ToLower().Contains(ConditnlUpdateQ2CorrLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateLR, currentActivity.Substring(ConditnlUpdateQ2CorrLRStr.Length).Trim()); - 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); - else if (currentActivity.ToLower() == DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr); - else if (currentActivity.ToLower() == DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr); - else if (currentActivity.ToLower().Contains(StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr); - else if (currentActivity.ToLower().Contains(EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr); - else if (currentActivity.ToLower().Contains(SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.ReadConfigurationStr.ToLower())) error = ReadConfiguration(ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.ReadCalibrationStr.ToLower()) error = ReadCalibration(ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.ReadCalibrationV4Str.ToLower()) error = ReadCalibrationV4(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteCalibrationFactorStr.ToLower())) error = WriteCalibrationFactor(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteCalibrationV4FactorsStr.ToLower())) error = WriteCalibrationV4Factors(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.NormalizeCalibrationFactorStr.ToLower()) error = NormalizeCalibrationFactor(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.NormalizeCalibrationV4FactorsStr.ToLower()) error = NormalizeCalibrationV4Factors(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.ReadQ2CorrectionStr.ToLower()) error = ReadQ2Correction(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.ResetQ2CorrectionStr.ToLower()) error = ResetQ2Correction(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteDefaultQ2CorrectionsStr.ToLower()) error = WriteDefaultQ2Corrections(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.InitOrReadQ2CorrectionsStr.ToLower()) error = InitOrReadQ2Corrections(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionStr.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard, null); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionAltStr.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa, null); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionGreeceStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionGreeceStr.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionRLStr.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionLRStr.Length).Trim()); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_incl_05, null); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionPlusIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Standard_plus_incl_05, null); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_incl_05, null); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.WriteQ2CorrectionPlusAltIncl05Str.ToLower()) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Dewa_plus_incl_05, null); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionGreeceIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Greece_incl_05, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionGreeceIncl05Str.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionRLIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.RL_incl_05, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionRLIncl05Str.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.WriteQ2CorrectionLRIncl05Str.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.LR_incl_05, currentActivity.Substring(iPerlCommunicationConstants.WriteQ2CorrectionLRIncl05Str.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.UpdateBothQ2FactorsTestRLOnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestRLDir, null); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.UpdateBothQ2FactorsTestLROnlyStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.UpdateBothQ2FactorsTestLRDir, null); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.UpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.Update, currentActivity.Substring(iPerlCommunicationConstants.UpdateQ2CorrectionsStr.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.ConditnlUpdateQ2CorrectionsStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdate, currentActivity.Substring(iPerlCommunicationConstants.ConditnlUpdateQ2CorrectionsStr.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.ConditnlUpdateQ2CorrRLStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateRL, currentActivity.Substring(iPerlCommunicationConstants.ConditnlUpdateQ2CorrRLStr.Length).Trim()); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.ConditnlUpdateQ2CorrLRStr.ToLower())) error = CalculateAndWriteQ2Corrections(threadID, ihead, wm, currentTest, ref resultStr, Q2CorrType.ConditionalUpdateLR, currentActivity.Substring(iPerlCommunicationConstants.ConditnlUpdateQ2CorrLRStr.Length).Trim()); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.Reset2HzCorrectionStr.ToLower()) error = Reset2HzCorrection(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.Write2HzCorrectionStr.ToLower()) error = Write2HzCorrection(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.GetDefaultQ2CorrectionsStr.ToLower()) error = GetQ2PreCorrectionsFormRest(threadID, ihead, wm, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr); + else if (currentActivity.ToLower() == iPerlCommunicationConstants.DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr); + else if (currentActivity.ToLower().Contains(iPerlCommunicationConstants.SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr); #endif else { @@ -757,7 +722,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication #if IPERL for (id = ConditionID.A; id < ConditionID.Count; id++) { - if (currentActivity.ToLower() == string.Format(SequenceConditionOp.ConditionNameFmt, id).ToLower()) + if (currentActivity.ToLower() == ISequenceConditionOp.GetConditionNameFmt(id).ToLower()) { error = SetIperlCommMilestoneReached(testMethod, id, ref resultStr); break; @@ -846,7 +811,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadConfiguration(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ReadConfiguration(IPerlReader ihead, WaterMeter wm, ref string resultStr) { /// /// The activity is "Read configuration" (this enables the watermeter, resets error flag) @@ -888,15 +853,15 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// iPERL head object /// String passed to caller /// true on success - static CommErr SetTestMode(int threadId, IperlHead ihead, ref string resultStr) + static CommErr SetTestMode(int threadId, IPerlReader ihead, ref string resultStr) { if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; Byte testModeConfig = 0xA0; /// Default value /// - if (multiTestParams[currentActivityStep].Activity.Length > SetTestModeStr.Length) + if (multiTestParams[currentActivityStep].Activity.Length > iPerlCommunicationConstants.SetTestModeStr.Length) { - string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(SetTestModeStr.Length + 1); + string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(iPerlCommunicationConstants.SetTestModeStr.Length + 1); UInt16 byteVal; if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255) { @@ -987,7 +952,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// iPERL head object /// String passed to caller /// true on success - static CommErr SetActiveMode(int threadId, IperlHead ihead, ref string resultStr) + static CommErr SetActiveMode(int threadId, IPerlReader ihead, ref string resultStr) { CommErr error = CommErr.CmdActive; @@ -1038,7 +1003,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadCalibration(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ReadCalibration(IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1072,7 +1037,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadCalibrationV4(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ReadCalibrationV4(IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1106,11 +1071,11 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Read a part of CalibrationStruct afterwards to verify factor was written correctly. /// /// Thread ID - /// IperlHead object + /// IPerlReader object /// Water meter object /// String passed to caller /// true on success - static CommErr WriteCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr WriteCalibrationFactor(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; @@ -1118,13 +1083,13 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Parse calibration factor (1 argument) or calibration factor limits (2 arguments) /// UInt16 newCalibFactor = 0; - if (multiTestParams[currentActivityStep].Activity.Length > WriteCalibrationFactorStr.Length) + if (multiTestParams[currentActivityStep].Activity.Length > iPerlCommunicationConstants.WriteCalibrationFactorStr.Length) { UInt16 factorLimitLo; UInt16 factorLimitHi; UInt16 val; - string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(WriteCalibrationFactorStr.Length + 1); + string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(iPerlCommunicationConstants.WriteCalibrationFactorStr.Length + 1); string[] arguments = calibFactrorStr.Split(new char[] { ' ' }); if (arguments.Length >= 2 && @@ -1241,11 +1206,11 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Read a part of CalibrationStruct afterwards to verify factor was written correctly. /// /// Thread ID - /// IperlHead object + /// IPerlReader object /// Water meter object /// String passed to caller /// true on success - static CommErr WriteCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr WriteCalibrationV4Factors(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; @@ -1254,7 +1219,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// UInt16 newCalibFactor = 0; UInt16 newCalibFactorLNA = 0; - if (multiTestParams[currentActivityStep].Activity.Length > WriteCalibrationV4FactorsStr.Length) + if (multiTestParams[currentActivityStep].Activity.Length > iPerlCommunicationConstants.WriteCalibrationV4FactorsStr.Length) { UInt16 factorLimitLo = 0; UInt16 factorLimitHi = 0; @@ -1265,7 +1230,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication Results.Entities.MeterTestRslt adjustTestRslt = null; Results.Entities.MeterTestRslt lnaAdjustTestRslt = null; - string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(WriteCalibrationV4FactorsStr.Length + 1); + string calibFactrorStr = multiTestParams[currentActivityStep].Activity.Substring(iPerlCommunicationConstants.WriteCalibrationV4FactorsStr.Length + 1); string[] arguments = calibFactrorStr.Split(new char[] { ' ' }); if (arguments.Length == 6) @@ -1438,7 +1403,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr NormalizeCalibrationFactor(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr NormalizeCalibrationFactor(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStruct == null)) return CommErr.CommFailed; @@ -1507,7 +1472,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr NormalizeCalibrationV4Factors(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr NormalizeCalibrationV4Factors(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed || (ihead.CalibrationStructV4 == null)) return CommErr.CommFailed; @@ -1577,7 +1542,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ReadQ2Correction(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1586,7 +1551,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write zero Q2 correction byte[] rdData = null; /// - if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, 2, out rdData)) + if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Q2CorrFactorsAddr, 2, out rdData)) { error = CommErr.None; } @@ -1608,7 +1573,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ResetQ2Correction(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ResetQ2Correction(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { return WriteQ2Corrections(threadId, ihead, wm, ref resultStr, 0, 0); } @@ -1620,7 +1585,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteDefaultQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr WriteDefaultQ2Corrections(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1676,7 +1641,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr WriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr, int factorLR, int factorRL) + static CommErr WriteQ2Corrections(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr, int factorLR, int factorRL) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1685,7 +1650,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write zero Q2 correction byte[] wrData = new byte[2] { (byte)factorLR, (byte)factorRL }; /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Q2CorrFactorsAddr, wrData.Length, wrData)) { wm.Q2CorrRL = ihead.Q2CorrRL = factorRL; wm.Q2CorrLR = ihead.Q2CorrLR = factorLR; @@ -1721,7 +1686,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication } - static CommErr InitOrReadQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr InitOrReadQ2Corrections(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; if (wm.Pruefindex == 0) return CommErr.CommFailed; /// Unknown pruefindex @@ -1785,7 +1750,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr Reset2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr Reset2HzCorrection(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -1794,7 +1759,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write zero Q2 correction byte[] wrData = new byte[1] { 0 }; /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Hz2CorrFactorsAddr, wrData.Length, wrData)) { error = CommErr.None; } @@ -1843,7 +1808,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr CalculateAndWriteQ2Corrections(int threadId, IperlHead ihead, WaterMeter wm, + static CommErr CalculateAndWriteQ2Corrections(int threadId, IPerlReader ihead, WaterMeter wm, Test test, ref string resultStr, Q2CorrType q2CorrType, string restOfLine) { var args = string.IsNullOrEmpty(restOfLine) ? new string[0] : restOfLine.Split(new char[] { ' ' }); @@ -2075,7 +2040,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write R-L Q2 correction factor only /// byte[] wrData = new byte[1] { (byte)q2CorrRL }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrRL, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Q2CorrFactorsAddrRL, wrData.Length, wrData)) { wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL); @@ -2093,7 +2058,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write L-R Q2 correction factor only /// byte[] wrData = new byte[1] { (byte)q2CorrLR }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrLR, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Q2CorrFactorsAddrLR, wrData.Length, wrData)) { wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR); @@ -2106,7 +2071,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Write both Q2 correction factors /// byte[] wrData = new byte[2] { (byte)q2CorrLR, (byte)q2CorrRL }; - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Q2CorrFactorsAddr, wrData.Length, wrData)) { wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL; wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR; @@ -2176,7 +2141,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication } /// - /// Update WaterMeter entity and IperlHead + /// Update WaterMeter entity and IPerlReader /// if (error == CommErr.None) { @@ -2194,7 +2159,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr Write2HzCorrection(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr Write2HzCorrection(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -2214,7 +2179,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF); byte[] wrData = new byte[1] { hz2CorrectionByte }; /// - if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData)) + if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, iPerlCommunicationConstants.Hz2CorrFactorsAddr, wrData.Length, wrData)) { error = CommErr.None; wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor; @@ -2264,7 +2229,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Arrow direction /// String passed to caller /// true on success - static CommErr DewaRework(IperlHead ihead, WaterMeter wm, FlowDir flowDir, ref string resultStr) + static CommErr DewaRework(IPerlReader ihead, WaterMeter wm, FlowDir flowDir, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -2346,15 +2311,15 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr StartTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr StartTestingSealedMeter(IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; Byte testModeConfig = 0xA0; /// Default value /// - if (multiTestParams[currentActivityStep].Activity.Length > StartTestingSealedMetersStr.Length) + if (multiTestParams[currentActivityStep].Activity.Length > iPerlCommunicationConstants.StartTestingSealedMetersStr.Length) { - string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(StartTestingSealedMetersStr.Length + 1); + string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(iPerlCommunicationConstants.StartTestingSealedMetersStr.Length + 1); UInt16 byteVal; if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255) { @@ -2416,7 +2381,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr EndTestingSealedMeter(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr EndTestingSealedMeter(IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (ihead.CommFailed) return CommErr.CommFailed; @@ -2467,7 +2432,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication } } - static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr GetQ2PreCorrectionsFormRest(int threadId, IPerlReader ihead, WaterMeter wm, ref string resultStr) { if (!ProcessData.IsQ2PreCorrectionCalculated) { @@ -2490,11 +2455,11 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication } testMethod.MeterCommMilestone((int)id,true); - resultStr = ISequenceConditionOp.GetConditionNameFmt((int)id); + resultStr = ISequenceConditionOp.GetConditionNameFmt(id); return CommErr.None; } - static CommErr Simulate(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr Simulate(IPerlReader ihead, WaterMeter wm, ref string resultStr) { string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' }); @@ -2566,23 +2531,23 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication { if (iperlHeads[i] == null || iperlHeads[i].Disabled) { - counters[i].BackColor = DisabledColor; + counters[i].BackColor = iPerlCommunicationConstants.DisabledColor; } else { switch (iperlHeads[i].CheckFlowDirection()) { case OptoHeadState.OptoAndDirOK: - counters[i].BackColor = OptoAndDirOKColor; + counters[i].BackColor = iPerlCommunicationConstants.OptoAndDirOKColor; break; case OptoHeadState.DirNok: - counters[i].BackColor = DirNokColor; + counters[i].BackColor = iPerlCommunicationConstants.DirNokColor; break; default: case OptoHeadState.OptoNok: - counters[i].BackColor = OptoNokColor; + counters[i].BackColor = iPerlCommunicationConstants.OptoNokColor; break; } } @@ -2705,7 +2670,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication MenuItem menuItem = (MenuItem)sender; activityLabel.Text = menuItem.Text; List tasks = new List(); - foreach (var iHead in ProcessData.IperlHeads) + foreach (var iHead in ProcessData.IperlHeadsUni) { if (!checkBoxes[iHead.Position - 1].Checked) { @@ -2729,7 +2694,7 @@ namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication await Task.WhenAll(tasks); } - private async Task ProcessTask(IperlHead iHead, object tag) + private async Task ProcessTask(IPerlReader iHead, object tag) { string txt = ""; switch (tag) diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationParams.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationParams.cs new file mode 100644 index 000000000..a312ea89b --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlCommunicationParams.cs @@ -0,0 +1,203 @@ +/// +/// Copyright (c) 2015-2022 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Common; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.Resources; +using System.Collections.Generic; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public class iPerlCommunicationParams : TestParamsBase, IParamsProvider, ITestParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(iPerlCommunicationParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public string Activity; /// Communication activity + public bool SimultWithPrevious; + public bool SimultWithNext; + + public override void InitializeAll() + { + Activity = "Read Configuration"; + SimultWithPrevious = false; + SimultWithNext = false; + } + + + string[] paramNames = new string[] + { + Strings.Activity, + Strings.Simultaneous_with_previous_step, + Strings.Simultaneous_with_next_step, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override ICollection ParamValues(int i) + { + if (i == 0) + { + var retVal = new List(); + retVal.Add(iPerlCommunicationConstants.ReadConfigurationStr); + retVal.Add(string.Format("{0} A0", iPerlCommunicationConstants.SetTestModeStr)); + retVal.Add(string.Format("{0} A4", iPerlCommunicationConstants.SetTestModeStr)); + retVal.Add(iPerlCommunicationConstants.ReadCalibrationStr); + retVal.Add(iPerlCommunicationConstants.ReadCalibrationV4Str); + retVal.Add(iPerlCommunicationConstants.NormalizeCalibrationFactorStr); + retVal.Add(iPerlCommunicationConstants.NormalizeCalibrationV4FactorsStr); + retVal.Add(iPerlCommunicationConstants.GetDefaultQ2CorrectionsStr); + retVal.Add(iPerlCommunicationConstants.ReadQ2CorrectionStr); + retVal.Add(iPerlCommunicationConstants.ResetQ2CorrectionStr); + retVal.Add(iPerlCommunicationConstants.WriteDefaultQ2CorrectionsStr); + retVal.Add(iPerlCommunicationConstants.InitOrReadQ2CorrectionsStr); + retVal.Add(iPerlCommunicationConstants.WriteCalibrationFactorStr); + retVal.Add(iPerlCommunicationConstants.WriteCalibrationV4FactorsStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionAltStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionGreeceStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionRLStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionLRStr); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionAltIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionPlusIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionPlusAltIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionGreeceIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionRLIncl05Str); + retVal.Add(iPerlCommunicationConstants.WriteQ2CorrectionLRIncl05Str); + retVal.Add(iPerlCommunicationConstants.Q2correctedFromCmd + "Qx"); + retVal.Add(iPerlCommunicationConstants.StrictQ2ErrorCheckStr + "Qx"); + retVal.Add(iPerlCommunicationConstants.Q2correctionCheckCmd); + retVal.Add(iPerlCommunicationConstants.IperlCheckCmd); + retVal.Add(iPerlCommunicationConstants.UpdateBothQ2FactorsTestRLOnlyStr); + retVal.Add(iPerlCommunicationConstants.UpdateBothQ2FactorsTestLROnlyStr); + retVal.Add(iPerlCommunicationConstants.UpdateQ2CorrectionsStr); + retVal.Add(iPerlCommunicationConstants.ConditnlUpdateQ2CorrectionsStr); + retVal.Add(iPerlCommunicationConstants.ConditnlUpdateQ2CorrRLStr); + retVal.Add(iPerlCommunicationConstants.ConditnlUpdateQ2CorrLRStr); + retVal.Add("Q2 corrected from Q2adj"); + retVal.Add("Q2 correction check Q2bc Q2ac"); + retVal.Add(iPerlCommunicationConstants.SetActiveModeStr); + retVal.Add("---"); + retVal.Add(iPerlCommunicationConstants.Reset2HzCorrectionStr); + retVal.Add(iPerlCommunicationConstants.Write2HzCorrectionStr); + retVal.Add(iPerlCommunicationConstants.DewaReworkRLStr); + retVal.Add(iPerlCommunicationConstants.DewaReworkLRStr); + retVal.Add(iPerlCommunicationConstants.StartTestingSealedMetersStr); + retVal.Add(iPerlCommunicationConstants.EndTestingSealedMetersStr); + retVal.Add(string.Format("{0} if enabled", iPerlCommunicationConstants.ReadConfigurationStr)); + retVal.Add(string.Format("{0} 80", iPerlCommunicationConstants.SetTestModeStr)); + retVal.Add("iPerl_check prevWorkStep direction q2factors"); + for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++) + { + retVal.Add(ISequenceConditionOp.GetConditionNameFmt(id)); + } + + return retVal; + } + else + { + return new string[] { Strings.yes, Strings.no }; + } + } + + public override string ToString(int i) + { + switch (i) + { + case 0: return Activity; + case 1: return (SimultWithPrevious ? Strings.yes : Strings.no); + case 2: return (SimultWithNext ? Strings.yes : Strings.no); + default: return string.Empty; + } + } + + public CfgUpdateFlags UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: Activity = strValue; return CfgUpdateFlags.None; + case 1: SimultWithPrevious = strValue.ToLower().Equals(Strings.yes.ToLower()); return CfgUpdateFlags.None; + case 2: SimultWithNext = strValue.ToLower().Equals(Strings.yes.ToLower()); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + public bool ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + switch (i) + { + case 0: + return true; + case 1: + case 2: + if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; + break; + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(iPerlCommunicationParams prms) + { + prms.Activity = this.Activity; + prms.SimultWithPrevious = this.SimultWithPrevious; + prms.SimultWithNext = this.SimultWithNext; + } + + public IParamsProvider Clone() + { + iPerlCommunicationParams pars = new iPerlCommunicationParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentTest dbEntity) + { + if (dbEntity == null) return; + try + { + iPerlCommunicationParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as iPerlCommunicationParams; + + testParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + test = dbEntity.Test; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public iPerlCommunicationParams() + { + } + + public iPerlCommunicationParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public iPerlCommunicationParams(ComponentTest testParamsEntity, string componentName, Test test) + { + this.testParamsEntity = testParamsEntity; + this.componentName = componentName; + this.test = test; + } + } +} diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlDataWrite.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlDataWrite.cs new file mode 100644 index 000000000..674403127 --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlDataWrite.cs @@ -0,0 +1,26 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using TBF.Rig.RegisterReaders.iPerlReaderUNI.comminication; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public class iPerlDataWrite + { + public MessageID MessageID; + public StructName StructName; + public int Offset; + public byte[] Data; + public string Description; + + public iPerlDataWrite(MessageID mesageID, StructName structName, int offset, byte[] data, string description) + { + MessageID = mesageID; + StructName = structName; + Offset = offset; + Data = data; + Description = description; + } + } +} diff --git a/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlEnums.cs b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlEnums.cs new file mode 100644 index 000000000..1c3b62351 --- /dev/null +++ b/TBF/Rig/Uni/SharedDialogs/iPerlCommunication/iPerlEnums.cs @@ -0,0 +1,34 @@ +/// +/// Copyright (c) 2017-2021 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TBF.Rig.Uni.SharedDialogs.iPerlCommunication +{ + public enum Q2CorrType + { + None, + Standard, + Dewa, + Greece, + RL, + LR, + Standard_incl_05, + Standard_plus_incl_05, + Dewa_incl_05, + Dewa_plus_incl_05, + Greece_incl_05, + RL_incl_05, + LR_incl_05, + Update, + ConditionalUpdate, + ConditionalUpdateRL, + ConditionalUpdateLR, + UpdateBothQ2FactorsTestRLDir, + UpdateBothQ2FactorsTestLRDir, + Count, + } +} diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index ba2d1e8bc..40b165905 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -33,6 +33,7 @@ true true true + 8 true @@ -1176,9 +1177,13 @@ + + + + UserControl @@ -1195,12 +1200,7 @@ - - Form - - - iPerlCommunicationForm.cs - + Form @@ -1291,6 +1291,7 @@ + @@ -1477,6 +1478,15 @@ + + + + UserControl + + + TestMethodCfgCtrl.cs + + @@ -1897,6 +1907,22 @@ + + + + + + Form + + + iPerlCommunicationForm.cs + + + + + + + @@ -3094,9 +3120,6 @@ IperlHeadTestCtrl.cs - - iPerlCommunicationForm.cs - CycleBeginningForm.cs @@ -3239,6 +3262,9 @@ S640CommForm.cs + + TestMethodCfgCtrl.cs + TestMethodCfgCtrl.cs @@ -3278,6 +3304,9 @@ RegValveCfgCtrl.cs + + iPerlCommunicationForm.cs + CoverTestForm.cs