diff --git a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index a2c539f5f..304dbb6fe 100644 --- a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -15,6 +15,19 @@ using TBF.BenchControl.WaterMeters.iPerl; namespace TBF.BenchControl.TestMethods.iPerlCommunication { + public enum CommErr + { + None = 0, + Disabled, + OpenPort, + Read, + Write, + CmdActive, + CmdTest, + Verify, + } + + public partial class iPerlCommunicationForm : Form, GenericDevices.IHasCompleted { private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm)); @@ -99,8 +112,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication #endregion DLL_Interface - const int CommTimeout = 500; - const int MaxCommRetries = 3; + const int CommTimeout = 250; + const int MaxCommRetries = 5; const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled" const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig' @@ -436,28 +449,28 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication wmFound = true; if (wm.DebugLevel == Entities.DebugMode.Normal) { - bool success; + CommErr error; string resultStr = string.Empty; - if (activity.ToLower().Contains(ReadConfigurationStr.ToLower())) success = ReadConfiguration(wm, ref resultStr); - else if (activity.ToLower().Contains(SetTestModeStr.ToLower())) success = SetTestMode(wm, ref resultStr); - else if (activity.ToLower().Equals(SetActiveModeStr.ToLower())) success = SetActiveMode(wm, ref resultStr); - else if (activity.ToLower().Equals(ReadCalibrationStr.ToLower())) success = ReadCalibration(wm, ref resultStr); - else if (activity.ToLower().Equals(WriteCalibrationFactorStr.ToLower())) success = WriteCalibrationFactor(wm, ref resultStr); - else if (activity.ToLower().Equals(ResetQ2CorrectionStr.ToLower())) success = ResetQ2Correction(wm, ref resultStr); - else if (activity.ToLower().Equals(WriteQ2CorrectionStr.ToLower())) success = WriteQ2Correction(wm, ref resultStr); + if (activity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(wm, ref resultStr); + else if (activity.ToLower().Contains(SetTestModeStr.ToLower())) error = SetTestMode(wm, ref resultStr); + else if (activity.ToLower().Equals(SetActiveModeStr.ToLower())) error = SetActiveMode(wm, ref resultStr); + else if (activity.ToLower().Equals(ReadCalibrationStr.ToLower())) error = ReadCalibration(wm, ref resultStr); + else if (activity.ToLower().Equals(WriteCalibrationFactorStr.ToLower())) error = WriteCalibrationFactor(wm, ref resultStr); + else if (activity.ToLower().Equals(ResetQ2CorrectionStr.ToLower())) error = ResetQ2Correction(wm, ref resultStr); + else if (activity.ToLower().Equals(WriteQ2CorrectionStr.ToLower())) error = WriteQ2Correction(wm, ref resultStr); else { - success = true; + error = CommErr.None; resultStr = "Invalid activity"; } - if (success) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, resultStr)); - else if (wm.Disabled) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); + if (error == CommErr.None) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, resultStr)); + else if (wm.Disabled || error == CommErr.Disabled) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); else { - OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, activity + " failed !!!")); - rfidDataLogger.ErrorFormat("Group={0}, Port={1}, {2} failed !!!", currentGroup, currentPort, activity); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, string.Format("{0} failed ({1}) !!!", activity, error))); + rfidDataLogger.ErrorFormat("Group={0}, Port={1}, {2} failed ({3}) !!!", currentGroup, currentPort, activity, error); wm.Disabled = true; } } @@ -482,7 +495,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool ReadConfiguration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr ReadConfiguration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { /// /// The activity is "Read configuration" (this enables the watermeter, resets error flag) @@ -493,11 +506,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication wm.Disabled = false; } - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = false; + CommErr error = CommErr.Read; /// Read configuration byte[] config = null; @@ -505,7 +518,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication { if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out config, CommTimeout)) { - success = true; + error = CommErr.None; wm.ConfigStruct = ConfigStruct.FromByteArray(config); resultStr = wm.ConfigStruct.ToString(1); break; @@ -514,7 +527,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication closePort(); /// Close RFID port - return success; + return error; } @@ -527,9 +540,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool SetTestMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr SetTestMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; Byte testModeConfig = 0xA0; /// Default value /// @@ -546,73 +559,76 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication if (wm.ConfigStruct.MeterState == MeterState.Test && wm.ConfigStruct.TestModeConfig == testModeConfig) { /// Already in the correct test mode - return true; + return CommErr.None; } /// Communication necessary - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = true; + CommErr error = CommErr.None; - if (success && (wm.ConfigStruct.TestModeConfig != testModeConfig) && (wm.ConfigStruct.MeterState != MeterState.Active)) + if (error==CommErr.None && (wm.ConfigStruct.TestModeConfig != testModeConfig) && (wm.ConfigStruct.MeterState != MeterState.Active)) { /// Switch to Active mode in order to change TestModeConfig - success = false; + error = CommErr.CmdActive; byte[] cmd = new byte[1] { (byte)6 }; for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; } } } - if (success && (wm.ConfigStruct.TestModeConfig != testModeConfig)) + if (error == CommErr.None && (wm.ConfigStruct.TestModeConfig != testModeConfig)) { /// Change the TestModeConfig if necessary - success = false; + error = CommErr.Write; byte[] tstMdCfg = new byte[1] { testModeConfig }; for (int j = 0; j < MaxCommRetries; j++) { if (0 == WriteRequestPort(MessageID.Configuration, 21, 1, tstMdCfg, CommTimeout)) { wm.ConfigStruct.Update(21, tstMdCfg); - success = true; + error = CommErr.None; break; } } } - if (success) + if (error == CommErr.None) { /// Switch to test mode - success = false; + error = CommErr.CmdTest; byte[] cmd = new byte[1] { (byte)7 }; for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; } } } /// Now the meter should be in the Test mode ... verify - if (success) + if (error == CommErr.None) { /// Verify the configuration - success = false; + error = CommErr.Verify; byte[] cfg_0_3 = null; for (int j = 0; j < MaxCommRetries; j++) { if (0 == ReadRequestPort(MessageID.Configuration, 0, 4, out cfg_0_3, CommTimeout)) { wm.ConfigStruct.Update(0, cfg_0_3); - success = (wm.ConfigStruct.MeterState == MeterState.Test); - if (success) resultStr = wm.ConfigStruct.ToString(1); - break; + if (wm.ConfigStruct.MeterState == MeterState.Test) + { + error = CommErr.None; + resultStr = wm.ConfigStruct.ToString(1); + break; + } } } } closePort(); /// Close RFID port - return success; + return error; } @@ -623,24 +639,24 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool SetActiveMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr SetActiveMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; - - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (wm.Disabled) return CommErr.Disabled; - bool success = false; + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port + + CommErr error = CommErr.CmdActive; /// Switch to active mode byte[] cmd = new byte[1] { (byte)6 }; for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; } } - if (success) + if (error == CommErr.None) { - success = false; + error = CommErr.Verify; /// Read configuration byte[] cfg_0_3 = null; @@ -649,16 +665,19 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication if (0 == ReadRequestPort(MessageID.Configuration, 0, 4, out cfg_0_3, CommTimeout)) { wm.ConfigStruct.Update(0, cfg_0_3); - success = (wm.ConfigStruct.MeterState == MeterState.Active); - if (success) resultStr = wm.ConfigStruct.ToString(1); - break; + if (wm.ConfigStruct.MeterState == MeterState.Active) + { + error = CommErr.None; + resultStr = wm.ConfigStruct.ToString(1); + break; + } } } } closePort(); /// Close RFID port - return success; + return error; } @@ -668,13 +687,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool ReadCalibration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr ReadCalibration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = false; + CommErr error = CommErr.Read; /// Read calibration byte[] calib = null; @@ -682,7 +701,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication { if (0 == ReadRequestPort(MessageID.Calibration, 0, CalibrationStruct.Length, out calib, CommTimeout)) { - success = true; + error = CommErr.None; wm.CalibrationStruct = CalibrationStruct.FromByteArray(calib); resultStr = wm.CalibrationStruct.ToString(); break; @@ -691,7 +710,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication closePort(); /// Close RFID port - return success; + return error; } @@ -702,13 +721,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool WriteCalibrationFactor(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr WriteCalibrationFactor(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = false; + CommErr error = CommErr.Write; UInt16 factor = wm.CalibrationFactor; /// Original calibration factor @@ -717,12 +736,12 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication byte[] data = new byte[2] { (byte)(newCalFactor & 0x00FF), (byte)((newCalFactor >> 8) & 0x00FF) }; for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.Calibration, 2, 2, data, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.Calibration, 2, 2, data, CommTimeout)) { error = CommErr.None; break; } } - if (success) + if (error == CommErr.None) { - success = false; + error = CommErr.Verify; /// Read calibration byte[] calib_2_3 = null; @@ -730,7 +749,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication { if (0 == ReadRequestPort(MessageID.Calibration, 2, 2, out calib_2_3, CommTimeout)) { - success = true; + error = CommErr.None; wm.CalibrationStruct.Update(calib_2_3, 2); resultStr = wm.CalibrationStruct.ToString(); break; @@ -740,7 +759,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication closePort(); /// Close RFID port - return success; + return error; } @@ -754,13 +773,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool ResetQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr ResetQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = false; + CommErr error = CommErr.Write; /// Write zero Q2 correction Byte q2CorrRFlow = 0; @@ -769,12 +788,12 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { error = CommErr.None; break; } } - if (success) + if (error == CommErr.None) { - success = false; + error = CommErr.Verify; /// Read calibration byte[] rdData = null; @@ -783,7 +802,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication if ((0 == ReadRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, CommTimeout)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0)) { - success = true; + error = CommErr.None; resultStr = "Q2 correction factors reset to 0"; break; } @@ -792,7 +811,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication closePort(); /// Close RFID port - return success; + return error; } @@ -803,13 +822,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication /// Water meter object /// String passed to caller /// true on success - static bool WriteQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) + static CommErr WriteQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr) { - if (wm.Disabled) return false; + if (wm.Disabled) return CommErr.Disabled; - if (OpenPort(wm.RfidComPortNr) != 0) return false; /// Open RFID port + if (OpenPort(wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port - bool success = false; + CommErr error = CommErr.Write; /// Write Q2 corrections Byte q2CorrRFlow = 0; @@ -818,12 +837,12 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication for (int j = 0; j < MaxCommRetries; j++) { - if (0 == WriteRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { success = true; break; } + if (0 == WriteRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { error = CommErr.None; break; } } - if (success) + if (error == CommErr.None) { - success = false; + error = CommErr.Verify; /// Read calibration byte[] rdData = null; @@ -832,7 +851,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication if ((0 == ReadRequestPort(MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, CommTimeout)) && (rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrRFlow)) { - success = true; + error = CommErr.None; resultStr = string.Format("Q2 correction factors set: RightFlow = {0}, LeftFlow = {1}", q2CorrRFlow, q2CorrRFlow); break; @@ -840,7 +859,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication } } - return success; + return error; }