From 7e28381df5c62897db63d44e665fdbbf9ff76a39 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 14 Aug 2015 11:38:53 +0200 Subject: [PATCH] Working on iPerlCommunication activities required for the production cycle. --- .../iPerlCommunicationForm.cs | 201 +++++++++++++----- .../WaterMeters/iPerl/ConfigStruct.cs | 52 +++++ .../WaterMeters/iPerl/WaterMeter.cs | 11 +- TestBenchFramework/Properties/AssemblyInfo.cs | 4 +- 4 files changed, 208 insertions(+), 60 deletions(-) diff --git a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index 8fa2d0439..57658f8a9 100644 --- a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -393,9 +393,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication wmFound = true; if (wm.DebugLevel == Entities.DebugMode.Normal) { - if (activity.Equals("Read configuration")) ReadConfig(wm, threadId, wmNr); - else if (activity.Equals("Set to test mode")) SetToTestMode(wm, threadId, wmNr); - else if (activity.Equals("Set to active mode")) SetToActiveMode(wm, threadId, wmNr); + if (activity.ToLower().Equals("read configuration")) ReadConfig(wm, threadId, wmNr); + else if (activity.ToLower().Equals("read calibration")) ReadCalibration(wm, threadId, wmNr); + else if (activity.ToLower().Contains("set test mode")) SetToTestMode(wm, threadId, wmNr); + else if (activity.ToLower().Equals("set active mode")) SetToActiveMode(wm, threadId, wmNr); else OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Invalid activity")); } else @@ -412,28 +413,43 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication } } - + /// + /// Read a complete configuration structure of the watermeter + /// + /// Water meter object + /// Thread ID + /// Water meter number 1 .. 40 static void ReadConfig(WaterMeters.iPerl.WaterMeter wm, int threadId, int wmNr) { - bool success = (0 == openPort(wm.RfidComPortNr)); /// Open RFID port + bool success = false; + byte[] config = null; - byte[] cfg = null; - if (success) + if (!wm.Disabled) { - success = false; + success = (0 == openPort(wm.RfidComPortNr)); /// Open RFID port - /// Read configuration - for (int j = 0; j < MaxCommRetries; j++) + if (success) { - if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out cfg, CommTimeout)) { success = true; break; } + success = false; + + /// Read configuration + for (int j = 0; j < MaxCommRetries; j++) + { + if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out config, CommTimeout)) { success = true; break; } + } } + + closePort(); /// Close RFID port } - closePort(); /// Close RFID port - if (success) { - OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, ConfigStruct.FromByteArray(cfg).ToString(1))); + wm.ConfigStruct = ConfigStruct.FromByteArray(config); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, ConfigStruct.FromByteArray(config).ToString(1))); + } + else if (wm.Disabled) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); } else { @@ -441,81 +457,152 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication } } - - static void SetToTestMode(WaterMeters.iPerl.WaterMeter wm, int threadId, int wmNr) + /// + /// Read a complete calibration structure of the watermeter + /// + /// Water meter object + /// Thread ID + /// Water meter number 1 .. 40 + static void ReadCalibration(WaterMeters.iPerl.WaterMeter wm, int threadId, int wmNr) { - bool success = (openPort(wm.RfidComPortNr) == 0); /// Open RFID port + bool success = false; + byte[] calib = null; - if (success) + if (!wm.Disabled) { - success = false; + success = (0 == openPort(wm.RfidComPortNr)); /// Open RFID port - /// Switch to test mode - byte[] cmd = new byte[1] { (byte)7 }; - for (int j = 0; j < MaxCommRetries; j++) + if (success) { - if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { success = true; break; } + success = false; + + /// Read calibration + for (int j = 0; j < MaxCommRetries; j++) + { + if (0 == ReadRequestPort(MessageID.Configuration, 0, CalibrationStruct.Length, out calib, CommTimeout)) { success = true; break; } + } } + + closePort(); /// Close RFID port } - byte[] cfg = null; if (success) { - success = false; - - /// Read configuration - for (int j = 0; j < MaxCommRetries; j++) - { - if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out cfg, CommTimeout)) { success = true; break; } - } + wm.CalibrationStruct = CalibrationStruct.FromByteArray(calib); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Calibration successfully read")); } - - closePort(); /// Close RFID port - - if (success) + else if (wm.Disabled) { - OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, ConfigStruct.FromByteArray(cfg).ToString(1))); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); } else { - OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Cannot switch to test mode")); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Cannot read calibration")); + } + } + + /// + /// 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. + /// + /// Water meter object + /// Thread ID + /// Water meter number 1 .. 40 + static void SetToTestMode(WaterMeters.iPerl.WaterMeter wm, int threadId, int wmNr) + { + bool success = false; + byte[] cfg_0_3 = null; + + if (!wm.Disabled) + { + success = (openPort(wm.RfidComPortNr) == 0); /// Open RFID port + + if (success) + { + success = false; + + /// Switch to test mode + 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 (success) + { + success = false; + + /// Read configuration + for (int j = 0; j < MaxCommRetries; j++) + { + if (0 == ReadRequestPort(MessageID.Configuration, 0, 4, out cfg_0_3, CommTimeout)) { success = true; break; } + } + } + + closePort(); /// Close RFID port + } + + if (success) + { + wm.ConfigStruct.Update(cfg_0_3, 0); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, wm.ConfigStruct.ToString(1))); + } + else if (wm.Disabled) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); + } + else + { + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "'Set test mode' failed")); } } static void SetToActiveMode(WaterMeters.iPerl.WaterMeter wm, int threadId, int wmNr) { - bool success = (openPort(wm.RfidComPortNr) == 0); /// Open RFID port + bool success = false; + byte[] cfg_0_3 = null; - if (success) + if (!wm.Disabled) { - success = false; + success = (openPort(wm.RfidComPortNr) == 0); /// Open RFID port - /// Switch to active mode - byte[] cmd = new byte[1] { (byte)6 }; - for (int j = 0; j < MaxCommRetries; j++) + if (success) { - if (0 == WriteRequestPort(MessageID.Command, 0, 1, cmd, CommTimeout)) { success = true; break; } + success = false; + + /// 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 (success) + { + success = false; + + /// Read configuration + for (int j = 0; j < MaxCommRetries; j++) + { + if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out cfg_0_3, CommTimeout)) { success = true; break; } + } + } + + closePort(); /// Close RFID port } - byte[] cfg = null; if (success) { - success = false; - - /// Read configuration - for (int j = 0; j < MaxCommRetries; j++) - { - if (0 == ReadRequestPort(MessageID.Configuration, 0, ConfigStruct.Length, out cfg, CommTimeout)) { success = true; break; } - } + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, ConfigStruct.FromByteArray(cfg_0_3).ToString(1))); } - - closePort(); /// Close RFID port - - if (success) + else if (wm.Disabled) { - OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, ConfigStruct.FromByteArray(cfg).ToString(1))); + OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled")); } else { diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/ConfigStruct.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/ConfigStruct.cs index 566464fab..b0339e43f 100644 --- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/ConfigStruct.cs +++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/ConfigStruct.cs @@ -77,6 +77,11 @@ namespace TBF.BenchControl.WaterMeters.iPerl return result; } + /// + /// Create a configuration structure from a complete byte array + /// + /// A complete byte array data + /// ConfigStruct or null when byte array was not complete public static ConfigStruct FromByteArray(byte[] data) { if (data.Length != Length) return null; @@ -103,6 +108,53 @@ namespace TBF.BenchControl.WaterMeters.iPerl return result; } + /// + /// Update the configuration structure from an incomplete byte array + /// + /// Byte array data + /// Offset of byte array data in ConfigStruct + /// true when successful, false when data are not appropriate + public bool Update(byte[] data, int offset) + { + if (offset == 0 && data.Length == 2) + { + /// Data containing an iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == 4) + { + /// Data containing an iPerl mode of function + Version = data[0]; + MeterState = (MeterState)data[1]; + return true; + } + else if (offset == 0 && data.Length == Length) + { + /// Data containing a complete ConfigStruct + Version = data[0]; + MeterState = (MeterState)data[1]; + TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2]; + TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6]; + TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10]; + EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]); + PCBNumber[0] = data[16]; + PCBNumber[1] = data[17]; + PCBNumber[2] = data[18]; + PCBNumber[3] = data[19]; + PCBNumber[4] = data[20]; + TestModeConfig = data[21]; + RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22]; + TempCalibration = (UInt16)(data[27] * 256 + data[26]); + AlarmMask = (UInt16)(data[29] * 256 + data[28]); + ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]); + return true; + } + else + return false; + } + public override string ToString() { return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCBNr={6} TestModeCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}", diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs index cc5833930..bc3b4859d 100644 --- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs +++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs @@ -67,12 +67,21 @@ namespace TBF.BenchControl.WaterMeters.iPerl } bool disabled; + /// + /// ConfigStruct of the water meter obtained or updated by iPerlCommunication + /// + public ConfigStruct ConfigStruct; + + /// + /// CalibrationStruct of the water meter obtained or updated by iPerlCommunication + /// + public CalibrationStruct CalibrationStruct; + Boxes.IntBox pulses; Boxes.IntBox refPulses; - /// /// Opto serial port and worker thread related private variables /// diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index ad66d9624..7d3176f4b 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("1.5.75.1")] -[assembly: AssemblyFileVersion("1.5.75.1")] +[assembly: AssemblyVersion("1.5.76.1")] +[assembly: AssemblyFileVersion("1.5.76.1")]