diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 987237bbf..9be284307 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("3.9.3085.1")] -[assembly: AssemblyFileVersion("3.9.3085.1")] +[assembly: AssemblyVersion("3.9.3091.1")] +[assembly: AssemblyFileVersion("3.9.3091.1")] diff --git a/TBF/Rig/GenericDevices/ITestMethodSmart.cs b/TBF/Rig/GenericDevices/ITestMethodSmart.cs index b7cb466f2..7971a0598 100644 --- a/TBF/Rig/GenericDevices/ITestMethodSmart.cs +++ b/TBF/Rig/GenericDevices/ITestMethodSmart.cs @@ -4,7 +4,7 @@ /// * mark test method from smart family devices /// * (this Test method is used for devices that support smart reader) /// - public interface ITestMethodSmart + public interface ITestMethodSmart : ITestMethod { } diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs index 46188a1a3..d9f2219d6 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Common; using GenesisCordonelInterface.API; @@ -25,6 +26,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { await BuildConnectionAsync(genesidHead).ConfigureAwait(false); } + public async Task BuildConnectionAsync(GenesisSmartReader genesidHead) { if (genesidHead == null) @@ -32,6 +34,21 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication bool simulation = genesidHead.DebugLevel == DebugMode.Simulate; + //No simulation + var bridge = genesidHead.CommInterfaceBridge; + if (bridge == null) + throw new InvalidOperationException($"CommInterfaceBridge is null. Head: {genesidHead.GetSlotNr}"); + + //Check if exist and connected + PublicModels.GciSlotInfo gciSlotInfo = await bridge.GetSlotAsync(genesidHead.GetSlotNr); + + if (gciSlotInfo == null && gciSlotInfo.IsConnected) + { + log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} already exist and connected!"); + return; + } + + //Unconnected - do connection var request = new PublicModels.GciInitSlotRequest { SlotId = genesidHead.GetSlotNr, @@ -53,24 +70,23 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} initializing... Request: {request}"); - var bridge = genesidHead.CommInterfaceBridge; - if (bridge == null) - throw new InvalidOperationException("CommInterfaceBridge is null."); + + + var initResult = await ExecuteWithRetryAsync( + () => bridge.InitSlotAsync(request), + r => r.Success, + $"InitSlotAsync({genesidHead.GetSlotNr})"); - var initResult = await WithTimeout( - bridge.InitSlotAsync(request), - TimeSpan.FromSeconds(15), - "InitSlotAsync timeout"); log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} initialized. Result: {initResult}"); if (initResult == null) throw new InvalidOperationException("InitSlotAsync returned null."); - var updateResult = await WithTimeout( - bridge.UpdateSlotAsync(request), - TimeSpan.FromSeconds(15), - "UpdateSlotAsync timeout"); + var updateResult = await ExecuteWithRetryAsync( + () => bridge.UpdateSlotAsync(request), + r => r.Success, + $"UpdateSlotAsync({genesidHead.GetSlotNr})"); log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} updated! Result: {updateResult}"); @@ -80,6 +96,57 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication slotDefined = true; } + private async Task ExecuteWithRetryAsync( + Func> action, + Func successCondition, + string operationName, + int maxRetries = 5, + int timeoutSeconds = 30, + int delayMs = 1000) + { + using var cts = new CancellationTokenSource( TimeSpan.FromSeconds(timeoutSeconds)); + + Exception lastException = null; + + for (int attempt = 1; attempt <= maxRetries; attempt++) + { + if (cts.IsCancellationRequested) + { + throw new TimeoutException( $"{operationName} timeout after {timeoutSeconds} seconds."); + } + + try + { + log.Debug($"{operationName} attempt {attempt}/{maxRetries}"); + + T result = await action(); + + if (result == null) + throw new InvalidOperationException( + $"{operationName} returned null."); + + if (successCondition(result)) + { + log.Debug($"{operationName} success."); + return result; + } + + log.Debug($"{operationName} failed. Success condition not met."); + } + catch (Exception ex) + { + lastException = ex; + log.Error($"{operationName} failed on attempt {attempt}/{maxRetries}", ex); + } + + await Task.Delay(delayMs, cts.Token); + } + + throw new InvalidOperationException( + $"{operationName} failed after {maxRetries} attempts.", + lastException); + } + private static async Task WithTimeout( Task task, TimeSpan timeout, @@ -102,12 +169,25 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication public void CloseConnection() { - genesisHead?.CommInterfaceBridge?.DisconnectAsync(genesisHead.GetSlotNr); + Task.Run(CloseConnectionAsync) + .GetAwaiter() + .GetResult(); + return; + } + + public async Task CloseConnectionAsync() + { + log.Debug("CloseConnectionAsync called for iHead: " + genesisHead); + await genesisHead?.CommInterfaceBridge?.DisconnectAsync(genesisHead.GetSlotNr)!; + log.Debug("DisconnectAsync completed for iHead: " + genesisHead); + await genesisHead?.CommInterfaceBridge?.CleanSlotAsync(genesisHead.GetSlotNr)!; + log.Debug("CleanSlotAsync completed for iHead: " + genesisHead); DisposeSlot(); // if (serialDriver != null) // serialDriver.CloseConnection(); // serialDriver = null; + return true; } private bool isConnected = false; @@ -122,7 +202,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { try { - log.Debug("ReadRequest_PCB called for iHead: " + genesisHead); + log.Debug("ReadRequest_PCBAsync called for iHead: " + genesisHead); if (genesisHead == null) return string.Empty; @@ -133,27 +213,26 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.CommInterfaceBridge == null) return string.Empty; - if (!IsSlotDefined) - { - await BuildConnectionAsync(genesisHead); - } + + await BuildConnectionAsync(genesisHead); + if (genesisHead.DebugLevel == DebugMode.Simulate) { - log.Debug("ReadRequest_PCB() - Simulated response"); + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - Simulated response"); return "-OK Simulated PCB-"; } GciBridge gciBridge = genesisHead.CommInterfaceBridge; - log.Debug("ReadRequest_PCB() - GciBridge created"); + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - GciBridge created"); gciBridge.GciBridgeCfg.EnableExternalAccess = true; gciBridge.GciBridgeCfg.EnableGuiAccess = false; gciBridge.Initialize(); - log.Debug("ReadRequest_PCB() - GciBridge initialized"); + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - GciBridge initialized"); RadioService headService = new RadioService(gciBridge); @@ -185,13 +264,18 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } catch (Exception ex) { - log.Error("ReadRequest_PCBAsync() - Exception:", ex); + log.Error($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - Exception:", ex); return ex.Message; } } public string ReadRequest_PCB() { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("ReadRequest_PCB() - Simulated response"); + return "Simulated PCB-123"; + } return Task.Run(() => ReadRequest_PCBAsync(genesisHead)) .GetAwaiter() .GetResult(); @@ -227,10 +311,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.CommInterfaceBridge == null) return false; - if (!IsSlotDefined) - { - await BuildConnectionAsync(genesisHead); - } + await BuildConnectionAsync(genesisHead); + if (genesisHead.DebugLevel == DebugMode.Simulate) { @@ -306,11 +388,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.CommInterfaceBridge == null) return false; - - if (!IsSlotDefined) - { - await BuildConnectionAsync(genesisHead); - } + + await BuildConnectionAsync(genesisHead); if (genesisHead.DebugLevel == DebugMode.Simulate) { @@ -383,7 +462,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.DebugLevel == DebugMode.Simulate) { isTestModeSuccessful = true; - return "-OK Simulated response-"; + return "-OK SetTestMode Simulated response-"; } try @@ -399,6 +478,17 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } } + /// + /// Set Active mode + /// + /// + /// + public bool TurnOffRadio() + { + return Task.Run(CloseConnectionAsync) + .GetAwaiter() + .GetResult(); + } /// @@ -439,6 +529,33 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } + /// + /// TurnOffRadio - string response + /// + /// + /// + /// + public string TurnOffRadio(ref bool isTestModeSuccessful) + { + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + isTestModeSuccessful = true; + return "-OK TurnOffRadio Simulated response-"; + } + + try + { + bool turnOffRadio = TurnOffRadio(); + isTestModeSuccessful = turnOffRadio; + return turnOffRadio ? "TurnOffRadio - OK" : "TurnOffRadio - FAILED"; + } + catch (Exception ex) + { + log.Error("SetActiveMode() - Exception:" + ex.StackTrace); + return "Set Active Mode - Exception"; + } + } + /// /// Set Active mode - string response /// @@ -450,7 +567,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.DebugLevel == DebugMode.Simulate) { isTestModeSuccessful = true; - return "-OK Simulated response-"; + return "-OK SetActiveMode Simulated response-"; } try @@ -514,11 +631,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.CommInterfaceBridge == null) return false; - - if (!IsSlotDefined) - { - await BuildConnectionAsync(genesisHead); - } + + await BuildConnectionAsync(genesisHead); if (genesisHead.DebugLevel == DebugMode.Simulate) { @@ -591,7 +705,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication public void Dispose() { - CloseConnection(); + CloseConnectionAsync(); } /// diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs index 881f5231a..cc5e984f0 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs @@ -144,20 +144,22 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication token.ThrowIfCancellationRequested(); - log.Debug("LoginByPasswordAsync( Slot: {0}) - set password to: " + txtPassword.Substring(0, 4) + "************"); + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - set password to: " + txtPassword.Substring(0, 4) + "************"); var gciSetPasswordResult = await _bridge.SetPasswordAsync(slotId,txtPassword, token); - log.Debug("LoginByPasswordAsync( Slot: {0}) - SetPasswordAsync Result: " + gciSetPasswordResult); + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - SetPasswordAsync Result: " + gciSetPasswordResult); + // LOGIN log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - START LOGIN"); - + var gciSlotInfo = await _bridge.GetSlotAsync(slotId); + log.Debug($"LoginByPasswordAsync( Checked before Login() Slot: {slotId}) - START LOGIN Slot: {gciSlotInfo}"); GenesisCordonelInterface.API.PublicModels.GciLoginResult result = await _bridge.LoginAsync(slotId, token); - log.Debug($"LoginByPasswordAsync( Slot: {slotId}) Result: " + result); - + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - END LOGIN, Success: {result.Success}"); + // ~ LOGIN return result; } - public async Task ReadRequest_PCBAsync( GenesisSmartReader head) + public async Task ReadRequest_PCBAsync( GenesisSmartReader head, bool bReload = false) { log.Debug("ReadRequest_PCB called for iHead: " + head); @@ -174,8 +176,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication try { // CONNECT ONLY IF NEEDED - var connectResult = - await EnsureConnectedAsync(head); + var connectResult = await EnsureConnectedAsync(head); if (!connectResult.IsConnected) { @@ -183,24 +184,42 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } log.Debug($"ReadRequest_PCB() connect - {connectResult.Message}"); - + + //Check if exist PCB + if (!bReload) + { + var gciSlotInfo = await head.CommInterfaceBridge.GetSlotAsync(head.GetSlotNr); + + if (gciSlotInfo == null && gciSlotInfo.Success && string.IsNullOrEmpty(gciSlotInfo.PcbId)) + { + log.Debug( + $"BuildConnection() - SlotNr: {head.GetSlotNr} already exist PCB: {gciSlotInfo.PcbId}"); + return new ReadPcbResult + { + IsConnected = gciSlotInfo.IsConnected, + IsValidPcb = true, + PcbId = gciSlotInfo.PcbId, + Message = "PCB already exist." + }; + } + } // PCB READ LOOP string validPcbId = null; int maxAttempts = 5; DateTime startTime = DateTime.UtcNow; - TimeSpan maxDuration = TimeSpan.FromSeconds(10); + TimeSpan maxDuration = TimeSpan.FromSeconds(30); //LOOP for (int attempt = 1; attempt <= maxAttempts; attempt++) { if (DateTime.UtcNow - startTime > maxDuration) { - log.Debug("ReadRequest_PCB() - PCB max duration exceeded"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) - PCB max duration exceeded"); break; } - log.Debug($"ReadRequest_PCB() - PCB attempt {attempt}/{maxAttempts}"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) - PCB attempt {attempt}/{maxAttempts}"); var pcbTask = head.CommInterfaceBridge.GetPcbIdAsync(head.GetSlotNr); var timeoutTaskPcb = Task.Delay(TimeSpan.FromSeconds(5)); var completedTaskPcb = await Task.WhenAny(pcbTask, timeoutTaskPcb); @@ -217,13 +236,13 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { if (resultPCB == null) { - log.Debug($"ReadRequest_PCB() PCB attempt {attempt} - result is null"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - result is null"); continue; } if (!resultPCB.Success) { - log.Debug($"ReadRequest_PCB() PCB attempt {attempt} - Success=false"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - Success=false"); continue; } @@ -231,7 +250,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (string.IsNullOrWhiteSpace(pcbId)) { - log.Debug($"ReadRequest_PCB() PCB attempt {attempt} - PCB empty"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - PCB empty"); continue; } @@ -239,12 +258,12 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (pcbId.Length != 9) { - log.Debug( $"ReadRequest_PCB() PCB attempt {attempt} - Invalid PCB length: '{pcbId}', len={pcbId.Length}"); + log.Debug( $"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - Invalid PCB length: '{pcbId}', len={pcbId.Length}"); continue; } validPcbId = pcbId; - log.Debug($"ReadRequest_PCB() PCB valid: {validPcbId}"); + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB valid: {validPcbId}"); break; } } diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs index 93192875f..cabdc1f84 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs @@ -40,6 +40,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations public void Destroy() { + if(Head != null && Head.OptoHeadTest != null) + { + Head.OptoHeadTest.CloseConnection(); + } + stopWorkerThread = true; if (optoThread != null) { diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs index fafa75950..8b840aa06 100644 --- a/TBF/Rig/TbfComponents.cs +++ b/TBF/Rig/TbfComponents.cs @@ -195,9 +195,9 @@ namespace TBF.Rig new TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters.Factory(), new TestMethods.FlyingStartTankCollection.Single.Factory(), new TestMethods.FlyingStartTankCollection.Compound.Factory(), - //new TestMethods.GenesisCommunication.GenesisHead.Factory(), + new TestMethods.GenesisCommunication.Factory(),//GenesisTestMethod - inserted/ into IperlCommunication new TestMethods.GrabImage.Factory(), - new TestMethods.iPerlCommunication.TestMethodFactory(), /// iPerlCommunication + //new TestMethods.iPerlCommunication.TestMethodFactory(), /// iPerlCommunication new TestMethods.LeakTest.Factory(), new TestMethods.LiveStream.Factory(), new TestMethods.ManualEntry.Factory(), diff --git a/TBF/Rig/TestMethods/GenesisCommunication/TestMethod.cs b/TBF/Rig/TestMethods/GenesisCommunication/TestMethod.cs index aad87d9c1..0a2564cf5 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/TestMethod.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/TestMethod.cs @@ -16,7 +16,7 @@ using iPerlCommunicationSeq = TBF.Rig.TestMethods.iPerlCommunication.iPerlCommun namespace TBF.Rig.TestMethods.GenesisCommunication { - public class TestMethod : SmartComponentBase, ISimultTestMethod, ISequenceCondition, ISessionDataMngmnt, ITestMethodSmart + public class TestMethod : SmartComponentBase, ISimultTestMethod, ISequenceCondition, ISessionDataMngmnt, ITestMethodSmart { private static readonly ILog log = LogManager.GetLogger(typeof(TestMethod)); protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); diff --git a/TBF/Rig/TestMethods/iPerlCommunication/CommCompletedEventArgs.cs b/TBF/Rig/TestMethods/iPerlCommunication/CommCompletedEventArgs.cs index b0bec23db..d61e7370e 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/CommCompletedEventArgs.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/CommCompletedEventArgs.cs @@ -3,6 +3,7 @@ /// Author: Milan Hanajík /// using System; +using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; namespace TBF.Rig.TestMethods.iPerlCommunication { @@ -10,12 +11,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { public int ThreadId; public int WMNr0; /// 0-based water meter position - public iPerlHead.IperlHead Ihead; + public GenesisSmartReader Ihead; public Results.Entities.WaterMeter Wm; public string CommMessage; public CommErr CommErr; - public CommCompletedEventArgs(int threadId, int wmNr0, iPerlHead.IperlHead ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) + public CommCompletedEventArgs(int threadId, int wmNr0, GenesisSmartReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) { this.ThreadId = threadId; this.WMNr0 = wmNr0; diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index 5777725d2..f39d2d558 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -20,10 +20,16 @@ using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; using Results.Entities; using static Sensus.iPerl.NfcHandler.MCI_Protocol; using System.Threading.Tasks; +using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; using TBF.Rig.TestMethods.GenesisCommunication; using TBF.Rig.TestMethods.iPerlCommunication.communication; using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.diagnosticLed; using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.protocolCommons; +using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; +using CommunicationInterface = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.CommunicationInterface; +using ConfigStruct = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.ConfigStruct; +using MessageID = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.MessageID; +using MeterType = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.MeterType; namespace TBF.Rig.TestMethods.iPerlCommunication { @@ -190,7 +196,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication static int[] ckbIndex; static bool[] ckbState; - static IList iperlHeads; + static IList genesisHeads; static IList waterMeterPositions0; /// keeps original 0-based indices in RegisterReaders list static int commonWMType; @@ -327,21 +333,21 @@ namespace TBF.Rig.TestMethods.iPerlCommunication StartForceCloseHandler(); - iperlHeads = new List(); + genesisHeads = new List(); waterMeterPositions0 = new List(); /// for (int wmPos = 0; wmPos < ProcessData.RegisterReaders.Length; wmPos++) { - IperlHead iperlHead = ProcessData.RegisterReaders[wmPos] as IperlHead; + GenesisSmartReader genesisSmartReader = ProcessData.RegisterReaders[wmPos] as GenesisSmartReader; - if (iperlHead != null) + if (genesisSmartReader != null) { - iperlHeads.Add(iperlHead); + genesisHeads.Add(genesisSmartReader); waterMeterPositions0.Add(wmPos); } } - WaterMetersCount = iperlHeads.Count; + WaterMetersCount = genesisHeads.Count; ShuffleTextBoxes(WaterMetersCount, ProcessData.LineSize); /// @@ -354,7 +360,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// group numbers are >=1, lastGroup == 0 means there is no group lastGroup = 0; - foreach (var iPerl in iPerlCommunicationForm.iperlHeads) + foreach (var iPerl in iPerlCommunicationForm.genesisHeads) { if (iPerl.Group > lastGroup) lastGroup = iPerl.Group; } @@ -369,7 +375,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } muxBrdOrGroup14Nrs = new List(); - foreach (var iPerl in iPerlCommunicationForm.iperlHeads) + foreach (var iPerl in iPerlCommunicationForm.genesisHeads) { if (!muxBrdOrGroup14Nrs.Contains(iPerl.MuxBoardNrOrGroup14)) muxBrdOrGroup14Nrs.Add(iPerl.MuxBoardNrOrGroup14); } @@ -451,7 +457,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication textBoxesCount = wmsCount; } - int count = checkBoxesEditMode ? textBoxesCount : Math.Min(textBoxesCount, iperlHeads.Count); + int count = checkBoxesEditMode ? textBoxesCount : Math.Min(textBoxesCount, genesisHeads.Count); for (int j = 0; j < count; j++) { labels[j].Text = (j + 1).ToString(); @@ -511,7 +517,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { labels[i].Visible = counters[i].Visible = messages[i].Visible = checkBoxes[i].Visible = true; - if (!checkBoxesEditMode && (iperlHeads[i] == null || iperlHeads[i].Disabled)) + if (!checkBoxesEditMode && (genesisHeads[i] == null || genesisHeads[i].Disabled)) { /// iPerl position i+1 is disabled checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = false; @@ -539,7 +545,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Regular activity (not a checkbox edit mode invoked from TBF menu) /// Reset opto-data indication - for (int i = 0; i < iperlHeads.Count; i++) + for (int i = 0; i < genesisHeads.Count; i++) { counters[i].BackColor = OptoNokColor; } @@ -640,12 +646,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { /// Start processing of opto-datastreams from all iPERL-s int count = 0; - for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) + for (int wmNr0 = 0; wmNr0 < genesisHeads.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]; + GenesisSmartReader ihead = genesisHeads[wmNr0]; if (ihead != null && wm != null && !wm.Disabled) { @@ -683,9 +689,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication { bool wmFound = false; - for (int wmNr0 = 0; wmNr0 < iperlHeads.Count; wmNr0++) + for (int wmNr0 = 0; wmNr0 < genesisHeads.Count; wmNr0++) { - IperlHead ihead = iperlHeads[wmNr0]; + GenesisSmartReader ihead = genesisHeads[wmNr0]; if ((ihead.Group == group) && (threadIx < muxBrdOrGroup14Nrs.Count) && (ihead.MuxBoardNrOrGroup14 == muxBrdOrGroup14Nrs[threadIx])) { wmFound = true; @@ -808,23 +814,24 @@ namespace TBF.Rig.TestMethods.iPerlCommunication } } - private CommErr ReadSerialNr(int threadId, IperlHead ihead, ref string resultStr) + private CommErr ReadSerialNr(int threadId, GenesisSmartReader ihead, ref string resultStr) { log.Debug("ReadSerialNr threadId=" + threadId + ", ihead=" + ihead.ToString()); if (ihead.ConfigStruct == null) { log.Debug("ConfigStruct is null - created new in ReadSerialNr()"); - ihead.ConfigStruct = new ConfigStruct(); + ihead.ConfigStruct = new TBF.Rig.RegisterReaders.GenesisRegReader.implementations.ConfigStruct(); } if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; //I will do communication to meter now CommErr error = CommErr.Read; - if (ihead.OptoHeadTest.ReadSerialNr()) + var result = ihead.OptoHeadTest.ReadRequest_PCB(); + if (string.IsNullOrEmpty(result)) { log.Debug("ReadSerialNr successful"); - resultStr = string.Format($"Serial No: {ihead.OptoHeadTest.ReadRequest_PCB()}"); + resultStr = string.Format($"Serial No: {result}"); error = CommErr.None; } else @@ -835,7 +842,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return error; } - private CommErr SetIdleMode(int threadId, IperlHead ihead, ref string resultStr) + private CommErr SetIdleMode(int threadId, GenesisSmartReader ihead, ref string resultStr) { log.Debug("SetActiveMode threadId=" + threadId); CommErr error = CommErr.CmdActive; @@ -871,7 +878,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static CommErr ReadConfiguration(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr ReadConfiguration(GenesisSmartReader ihead, WaterMeter wm, ref string resultStr) { // TODO BUMI in clasic case we need to read most of data - see ConfigStruct @@ -929,13 +936,13 @@ namespace TBF.Rig.TestMethods.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, GenesisSmartReader ihead, ref string resultStr) { log.Debug("SetTestMode threadId=" + threadId + ", ihead=" + ihead.ToString()); if (ihead.ConfigStruct == null) { log.Debug("ConfigStruct is null - created new in SetTestMode()"); - ihead.ConfigStruct = new ConfigStruct(); + ihead.ConfigStruct = new TBF.Rig.RegisterReaders.GenesisRegReader.implementations.ConfigStruct(); } if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; @@ -988,7 +995,7 @@ namespace TBF.Rig.TestMethods.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, GenesisSmartReader ihead, ref string resultStr) { log.Debug("SetActiveMode threadId=" + threadId); CommErr error = CommErr.CmdActive; @@ -2476,7 +2483,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication return CommErr.None; } - static CommErr Simulate(IperlHead ihead, WaterMeter wm, ref string resultStr) + static CommErr Simulate(GenesisSmartReader ihead, WaterMeter wm, ref string resultStr) { string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' }); @@ -2544,15 +2551,16 @@ namespace TBF.Rig.TestMethods.iPerlCommunication /// /// Update opto-communication indication /// - for (int i = 0; i < iperlHeads.Count; i++) + for (int i = 0; i < genesisHeads.Count; i++) { - if (iperlHeads[i] == null || iperlHeads[i].Disabled) + if (genesisHeads[i] == null || genesisHeads[i].Disabled) { counters[i].BackColor = DisabledColor; } else { - switch (iperlHeads[i].CheckFlowDirection()) + counters[i].BackColor = OptoAndDirOKColor; + /*switch (genesisHeads[i].CheckFlowDirection()) { case OptoHeadState.OptoAndDirOK: counters[i].BackColor = OptoAndDirOKColor; @@ -2566,7 +2574,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication case OptoHeadState.OptoNok: counters[i].BackColor = OptoNokColor; break; - } + }*/ } } @@ -2657,15 +2665,15 @@ namespace TBF.Rig.TestMethods.iPerlCommunication tstRslt.MassOfEvapWater = 0; tstRslt.TestTime += testTime; /// [s] total communication time of all tests - for (int i = 0; i < iperlHeads.Count; i++) + for (int i = 0; i < genesisHeads.Count; i++) { Results.Entities.MeterTestRslt meterRslt = ProcessData.BatchRslts.GetMeterTestRslt(test.Name, waterMeterPositions0[i], CompoundMeterId.Single); - if (meterRslt != null && iperlHeads[i] != null) + if (meterRslt != null && genesisHeads[i] != null) { - meterRslt.WaterMeter.SerialNr = iperlHeads[i].SerialNr; - meterRslt.Passed = (!iperlHeads[i].CommFailed && !iperlHeads[i].Disabled); + meterRslt.WaterMeter.SerialNr = genesisHeads[i].SerialNr; + meterRslt.Passed = (!genesisHeads[i].CommFailed && !genesisHeads[i].Disabled); meterRslt.TestDone = true; } } @@ -2687,7 +2695,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication MenuItem menuItem = (MenuItem)sender; activityLabel.Text = menuItem.Text; List tasks = new List(); - foreach (var iHead in ProcessData.IperlHeads) + foreach (var iHead in ProcessData.SmartHeadsUni) { if (!checkBoxes[iHead.Position - 1].Checked) { @@ -2698,27 +2706,30 @@ namespace TBF.Rig.TestMethods.iPerlCommunication 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 - })); - + if (iHead is GenesisSmartReader genesisHead) + { + string result = await ProcessTask(genesisHead, 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) + private async Task ProcessTask(GenesisSmartReader iHead, object tag) { string txt = ""; bool success = false; switch (tag) { case "ReadPCB": - txt = iHead.OptoHeadTest.ReadRequest_PCB(); + txt = iHead.OptoHeadTest.ReadRequest_PCB(); break; case "WriteRequestPort_u8_Customer_Text": txt = "Not Supported NOW!";//OpticalHeadTest.WriteRequestPort_u8_Customer_Text(iHead); @@ -2733,7 +2744,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication txt = iHead.OptoHeadTest.SetActiveMode(ref success); break; case "TurnOffRadio": - txt = "Not Supported NOW!";//OpticalHeadTest.TurnOffRadio(iHead); + txt = iHead.OptoHeadTest.TurnOffRadio(ref success); break; case "SetProductionMode": txt = "Not Supported NOW!";//OpticalHeadTest.SetProductionMode(iHead); diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll index c12c9e354..bc6b582a3 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll differ diff --git a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll index bacac228e..b79d5611f 100644 Binary files a/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll and b/packages/Common/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll differ diff --git a/packages/Common/Xylem.Common.Logic.ServiceCore.dll b/packages/Common/Xylem.Common.Logic.ServiceCore.dll index c52ebdbf2..294b39a61 100644 Binary files a/packages/Common/Xylem.Common.Logic.ServiceCore.dll and b/packages/Common/Xylem.Common.Logic.ServiceCore.dll differ diff --git a/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe b/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe index 98c5497b7..be97f7275 100644 Binary files a/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe and b/packages/Common/Xylem.Common.Ui.GenesisToolBox.exe differ diff --git a/packages/Common/XylemCommonUiLegacyGenCtl.dll b/packages/Common/XylemCommonUiLegacyGenCtl.dll index a4b0fccc9..b7a9339f5 100644 Binary files a/packages/Common/XylemCommonUiLegacyGenCtl.dll and b/packages/Common/XylemCommonUiLegacyGenCtl.dll differ