diff --git a/Config/Entities/Test.cs b/Config/Entities/Test.cs index 817f55a1d..9d6c2ac17 100644 --- a/Config/Entities/Test.cs +++ b/Config/Entities/Test.cs @@ -115,6 +115,10 @@ namespace Config.Entities result.Qto = Qto; result.Volume = Volume; result.TstTime = TstTime; + result.Method = Method; + result.ErrLimLo = ErrLimLo; + result.ErrLimHi = ErrLimHi; + result.Uncertainty = Uncertainty; result.Repeats = Repeats; result.DoDraining = DoDraining; result.DoZeroing = DoZeroing; @@ -129,10 +133,6 @@ namespace Config.Entities result.TimeFlow2Mass = TimeFlow2Mass; result.TimePump2StartV = TimePump2StartV; result.TimeStop2Mass = TimeStop2Mass; - result.Method = Method; - result.ErrLimLo = ErrLimLo; - result.ErrLimHi = ErrLimHi; - result.Uncertainty = Uncertainty; result.TolerRed = TolerRed; result.RedType = RedType; result.FeedingPath = FeedingPath; diff --git a/TestBenchFramework/BenchControl/Network/Camera/CLP1611/Camera.cs b/TestBenchFramework/BenchControl/Network/Camera/CLP1611/Camera.cs index 5e5942d95..597f9f417 100644 --- a/TestBenchFramework/BenchControl/Network/Camera/CLP1611/Camera.cs +++ b/TestBenchFramework/BenchControl/Network/Camera/CLP1611/Camera.cs @@ -34,6 +34,7 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 string.IsNullOrEmpty(sdCardVer) ? "not detected" : sdCardVer); } + const string ClpUserName = "tbf"; const string ClpPassword = "C1ern4V0d4"; @@ -93,55 +94,39 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 } ScpCommand scpCommand; + + const int UdpPortBase = 20000; /// Port base for all UDP protocols + /// /// MJpeg RTP protocol support /// - const int RtpUdpPortBase = 20000; int rtpUdpLocalPort; UdpClient rtpUdpClient; Thread rtpListenerThread; static bool stopRtpListenerFlag; + /// + /// RTCP protocol (reserved) + /// + int rtcpUdpLocalPort; + + /// + /// Measurement results protocol + /// + int msrmntUdpLocalPort; + UdpClient msrmntUdpClient; + Thread msrmntListenerThread; + static bool stopMsrmntListenerFlag; + + /// /// ROI related parameters /// - IList roiParams; - long cameraTimeMs; - int[] result; + RoisAndResults roisAndResults; /// - public void ClearRoiParams() { roiParams.Clear(); } - public int RegisterRoi(string rParams) - { - this.roiParams.Add(rParams); - int newHandle = this.roiParams.Count; - result = new int[newHandle]; - return newHandle; - } - /// - public int GetResult(int roiHandle, out long timeMs) - { - timeMs = cameraTimeMs; - - if (roiHandle > 0 && roiHandle <= roiParams.Count) - { - return result[roiHandle - 1]; - } - - return 0; - } - - - - /// - /// UDP Port number for 'MeasurementOp' - /// - const int UdpPortRangeStart = 13800; - const int UdpPortRangeEnd = 13850; - static int nextUdpPortNr = UdpPortRangeStart; - public static int GetNextUdpPortNr() { return nextUdpPortNr++; } - /// - readonly int measurementUdpPortNr; - UdpClient measurementListener; + public void ClearRoiParams() { roisAndResults.ClearRoiParams(); } + public int RegisterRoi(string roiParams) { return roisAndResults.RegisterRoi(roiParams); } + public int GetResult(int roiHandle, out long timeMs) { return roisAndResults.GetResult(roiHandle, out timeMs); } public Camera() {} @@ -156,9 +141,7 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 Telnet = null; terminalDlg = null; - measurementUdpPortNr = GetNextUdpPortNr(); - - roiParams = new List(); + roisAndResults = new RoisAndResults(); /// object for measurement results, writes/reads to/from this object are locked running = false; @@ -202,17 +185,17 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 terminalDlg.Show(); } - Telnet.MeasurementDataReceivedHandler += delegate(object sender, MeasuredDataEventArgs msrmtData) - { - if (Program.MainWnd.InvokeRequired) - { - Program.MainWnd.Invoke(new EventHandler(OnMeasurementDataReceived), sender, msrmtData); - } - else - { - OnMeasurementDataReceived(sender, msrmtData); - } - }; + //Telnet.MeasurementDataReceivedHandler += delegate(object sender, MeasuredDataEventArgs msrmtData) + //{ + // if (Program.MainWnd.InvokeRequired) + // { + // Program.MainWnd.Invoke(new EventHandler(OnMeasurementDataReceived), sender, msrmtData); + // } + // else + // { + // OnMeasurementDataReceived(sender, msrmtData); + // } + //}; Telnet.Enqueue(new Telnet.Command(Network.Telnet.CmdAction.CONNECT, ipAddress.ToString(), 10, 30)); @@ -224,8 +207,13 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 scpThread = new Thread(new ThreadStart(ScpWorker)); scpThread.Start(); - rtpUdpLocalPort = RtpUdpPortBase + 2 * cameraIdx; + rtpUdpLocalPort = UdpPortBase + 4 * cameraIdx; + rtcpUdpLocalPort = UdpPortBase + 4 * cameraIdx + 1; + msrmntUdpLocalPort = UdpPortBase + 4 * cameraIdx + 2; + StartRtpListener(NetAdapter.IPAddress, rtpUdpLocalPort); + StartMsrmntListener(NetAdapter.IPAddress, msrmntUdpLocalPort); + running = true; @@ -233,9 +221,6 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 } else { - rtpUdpLocalPort = RtpUdpPortBase + 2 * cameraIdx; - StartRtpListener(NetAdapter.IPAddress, rtpUdpLocalPort); - UiBridge.Bridge.OnCameraInfo(this.cameraIdx, string.Format("{0} s/n {1} was not detected", Name, CameraCfg.HardwareAddress)); log.FatalFormat("'{0}' with address {1} not detected", Name, CameraCfg.HardwareAddress); } @@ -245,6 +230,7 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 { stopScpThreadFlag = true; stopRtpListenerFlag = true; + stopMsrmntListenerFlag = true; if (Telnet != null) { @@ -253,28 +239,26 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 } if (scpThread != null) scpThread.Join(500); - if (rtpListenerThread != null) rtpListenerThread.Join(200); + if (running && (rtpListenerThread != null)) rtpListenerThread.Join(200); + if (running && (msrmntListenerThread != null)) msrmntListenerThread.Join(200); - if (rtpUdpClient != null) + if (running && rtpUdpClient != null) { rtpUdpClient.Close(); rtpUdpClient = null; } + if (running && msrmntUdpClient != null) + { + msrmntUdpClient.Close(); + msrmntUdpClient = null; + } + running = false; } - public void RunDeviceBefore() - { - } - - public void RunDeviceAfter() - { -// if (running) -// { -// Console.WriteLine("Time={0} IP={1} scp={2}", StateMachine.Time, IPAddress, scpConnected ? "connected" : "disconnected"); -// } - } + public void RunDeviceBefore() { } + public void RunDeviceAfter() { } #region Configuration Change Handling @@ -530,7 +514,7 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 } catch (Exception exc) { - string msg = string.Format("Exception in the listener thread: {0}", exc.Message); + string msg = string.Format("Exception in MJpeg RTP listener thread: {0}", exc.Message); log.Error(msg); } } @@ -539,6 +523,97 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 } + + private void StartMsrmntListener(IPAddress localIP, int localPort) + { + msrmntUdpClient = new UdpClient(new IPEndPoint(localIP, localPort)); + + msrmntListenerThread = new Thread(new ThreadStart(MsrmntListener)); + msrmntListenerThread.Start(); + } + + void MsrmntListener() + { + StringBuilder toBeProcessed = new StringBuilder(); + int[] angles = new int[RoisAndResults.MaxRegisteredRois]; + + while (!stopMsrmntListenerFlag) + { + try + { + IPEndPoint endpoint = null; + Byte[] data = msrmntUdpClient.Receive(ref endpoint); + + toBeProcessed.Append(Encoding.ASCII.GetString(data, 0, data.Length)); + log.DebugFormat("MeasurementUdpListener() ... toBeProcessed = {0}", toBeProcessed); + + while (true) + { + int from = toBeProcessed.ToString().IndexOf('['); + if (from < 0) break; + + int len = toBeProcessed.ToString(from + 1, toBeProcessed.Length - from - 1).IndexOf(']'); + if (len < 0) break; + + string[] pulsesArr = toBeProcessed.ToString(from + 1, len).Split(new char[] { ';' }); + + bool fmtError = false; + long timeMs; + if ((pulsesArr.Length >= 2) && + (pulsesArr.Length <= RoisAndResults.MaxRegisteredRois + 1) && + long.TryParse(pulsesArr[0], out timeMs)) + { + for (int i = 1; i < pulsesArr.Length; i++) + { + int val; + if (int.TryParse(pulsesArr[i], out val)) + { + angles[i - 1] = Math.Abs(val); /// TODO: pozerat CW/CCW a podla toho dat +/- + } + else + { + fmtError = true; + } + } + + if (!fmtError) roisAndResults.SetResults(timeMs, angles); + } + + toBeProcessed.Remove(0, from + len + 2); + } + } + catch (Exception exc) + { + string msg = string.Format("Exception in the measurement listener thread: {0}", exc.Message); + log.Error(msg); + } + } + + return; + } + + + //public void OnMeasurementDataReceived(object sender, MeasuredDataEventArgs msrmtData) + //{ + // string[] pulsesArr = msrmtData.MeasuredData.Split(new char[] { ';' }); + + // uint uiVal; + // if (result != null && result.Length + 1 == pulsesArr.Length && uint.TryParse(pulsesArr[0], out uiVal)) + // { + // cameraTimeMs = (long)uiVal; + + // for (int i = 0; i < result.Length; i++) + // { + // int val; + // if (int.TryParse(pulsesArr[i + 1], out val)) + // { + // result[i] = Math.Abs(val); + // } + // } + // } + //} + + public IOperation LiveStreamOp(bool hiRes) { int wid = hiRes ? 1280 : 640; @@ -560,7 +635,6 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 { if (Telnet != null) { - //new MeasurementOp(this, NetAdapter.IPAddress.ToString(), measurementUdpPortNr, roiParams); return this; } else @@ -571,14 +645,17 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 string command; bool measurementCommandSent; - bool connectionEstablished; public void Start() { /// Prepare the telent command StringBuilder sb = new StringBuilder(); - foreach (var s in roiParams) sb.AppendFormat(" {0}", s); + for (int i = 1; i <= roisAndResults.RegisteredRoisCount; i++) + { + sb.Append(" "); + sb.Append(roisAndResults.GetRoiParams(i)); + } int logImagesArg; switch (CameraCfg.TestImagesMode) @@ -598,13 +675,12 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 command = string.Format("clp/Measurement -udp {0} {1}{2}{3} 1 7 0 0 {4}", NetAdapter.IPAddress, - measurementUdpPortNr, + msrmntUdpLocalPort, (CameraCfg.TestImagesMode == TestImagesMode.LoadImages) ? (" -l " + CameraCfg.TestImagesCount.ToString()) : string.Empty, sb, logImagesArg); measurementCommandSent = false; - connectionEstablished = false; /// If ready send (=enqueue) the command if (Telnet.State == TelnetClient.TelnetState.Inactive) @@ -625,10 +701,7 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 measurementCommandSent = true; } } - else if (!connectionEstablished) - { - connectionEstablished = true; - } + return Event.None; } @@ -639,75 +712,5 @@ namespace TBF.BenchControl.Network.Camera.CLP1611 Telnet.Enqueue(new Telnet.Command(CmdAction.SEND_COMMAND, TelnetClient.Q_Command)); } } - - - public void OnMeasurementDataReceived(object sender, MeasuredDataEventArgs msrmtData) - { - string[] pulsesArr = msrmtData.MeasuredData.Split(new char[] { ';' }); - - uint uiVal; - if (result != null && result.Length + 1 == pulsesArr.Length && uint.TryParse(pulsesArr[0], out uiVal)) - { - cameraTimeMs = (long)uiVal; - - for (int i = 0; i < result.Length; i++) - { - int val; - if (int.TryParse(pulsesArr[i + 1], out val)) - { - result[i] = Math.Abs(val); - } - } - } - } - - - void MeasurementUdpListener() - { - StringBuilder toBeProcessed = new StringBuilder(); - IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, measurementUdpPortNr); - - try - { - while (true) - { - byte[] byteArray = measurementListener.Receive(ref ipEndPoint); - toBeProcessed.Append(Encoding.ASCII.GetString(byteArray, 0, byteArray.Length)); - log.DebugFormat("MeasurementUdpListener() ... toBeProcessed = {0}", toBeProcessed); - - while (true) - { - int from = toBeProcessed.ToString().IndexOf('['); - if (from < 0) break; - - int len = toBeProcessed.ToString(from + 1, toBeProcessed.Length - from - 1).IndexOf(']'); - if (len < 0) break; - - string[] pulsesArr = toBeProcessed.ToString(from + 1, len).Split(new char[] { ';' }); - - uint uiVal; - if (result != null && result.Length + 1 == pulsesArr.Length && uint.TryParse(pulsesArr[0], out uiVal)) - { -// cameraTimeMs = (long)uiVal; - - for (int i = 0; i < result.Length; i++) - { - int val; - if (int.TryParse(pulsesArr[i + 1], out val)) - { -// result[i] = Math.Abs(val); - } - } - } - - toBeProcessed.Remove(0, from + len + 2); - } - } - } - catch - { - log.FatalFormat("Camera : MeasurementUdpListener() thread failed"); - } - } } } diff --git a/TestBenchFramework/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs b/TestBenchFramework/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs new file mode 100644 index 000000000..131df5c90 --- /dev/null +++ b/TestBenchFramework/BenchControl/Network/Camera/CLP1611/RoisAndResults.cs @@ -0,0 +1,91 @@ +/// +/// Copyright (c) 2017 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; + +namespace TBF.BenchControl.Network.Camera.CLP1611 +{ + public class RoisAndResults + { + public const int MaxRegisteredRois = 4; /// Max. count of registered (and measured) ROI-s + + public long CameraTimeMs; + public int[] Angles; + + private IList roiParams; + public int RegisteredRoisCount { get { return roiParams.Count; } } + + + public RoisAndResults() + { + Angles = new int[MaxRegisteredRois]; + roiParams = new List(); + } + + + public void ClearRoiParams() + { + lock (this) + { + roiParams.Clear(); + } + } + + public int RegisterRoi(string roiParam) + { + lock (this) + { + if (this.roiParams.Count >= MaxRegisteredRois) return 0; + + this.roiParams.Add(roiParam); + return this.roiParams.Count; /// return a handle 1 .. MaxRegisteredRois + } + } + + public string GetRoiParams(int roiHandle) + + { + lock (this) + { + if (roiHandle > 0 && roiHandle <= roiParams.Count) + { + return roiParams[roiHandle - 1]; + } + else + { + return string.Empty; + } + } + } + + public void SetResults(long timeMs, int[] angles) + { + lock (this) + { + CameraTimeMs = timeMs; + for (int i = 0; i < Math.Min(angles.Length, Angles.Length); i++) + { + Angles[i] = angles[i]; + } + } + } + + public int GetResult(int roiHandle, out long timeMs) + { + lock (this) + { + if (roiHandle > 0 && roiHandle <= roiParams.Count) + { + timeMs = CameraTimeMs; + return Angles[roiHandle - 1]; + } + else + { + timeMs = 0; + return 0; + } + } + } + } +} diff --git a/TestBenchFramework/BenchControl/Network/Camera/Roi/Roi.cs b/TestBenchFramework/BenchControl/Network/Camera/Roi/Roi.cs index 18da29001..78309cc43 100644 --- a/TestBenchFramework/BenchControl/Network/Camera/Roi/Roi.cs +++ b/TestBenchFramework/BenchControl/Network/Camera/Roi/Roi.cs @@ -97,7 +97,14 @@ namespace TBF.BenchControl.Network.Camera.Roi /// public void RegisterRoiToCamera() { - roiHandle = Camera.RegisterRoi(string.Format("-roi 1 {0} {1} {2} bkgnd.bmp", RoiX.Val, RoiY.Val, RoiCfg.RoiParams)); + if (RoiCfg.DebugLevel == DebugMode.Simulate) + { + roiHandle = Camera.RegisterRoi(string.Format("-roi 1 300 200 134 134 66 66 20 66 0 0 360 360 1 50 0 0 270 0 bkgnd.bmp")); + } + else + { + roiHandle = Camera.RegisterRoi(string.Format("-roi 1 {0} {1} {2} bkgnd.bmp", RoiX.Val, RoiY.Val, RoiCfg.RoiParams)); + } } @@ -169,13 +176,15 @@ namespace TBF.BenchControl.Network.Camera.Roi public IOperation RoiDetectionOp() { - if (NetCamera != null) + if (NetCamera != null && RoiCfg.DebugLevel != DebugMode.Simulate) { imgFileNamePrefix = Path.Combine(Program.TempImagesDir, string.Format("{0}-{1}-", RoiCfg.Name, StateMachine.Time)); return new RoiDetectionOp(this, NetCamera, imgFileNamePrefix, RoiX, RoiY, RoiWid, RoiHgh); } else - return null; + { + return null; /// When NetCamera == null or ROI is in simulation mode + } } diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index 24f331de5..759e7ed24 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.17.719.1")] -[assembly: AssemblyFileVersion("2.17.719.1")] +[assembly: AssemblyVersion("2.17.720.1")] +[assembly: AssemblyFileVersion("2.17.720.1")] diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index ec417b679..0bd54414c 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -655,6 +655,7 @@ +