diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/OptoReceivedEventArgs.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/OptoReceivedEventArgs.cs
new file mode 100644
index 000000000..9122d300b
--- /dev/null
+++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/OptoReceivedEventArgs.cs
@@ -0,0 +1,20 @@
+///
+/// Copyright (c) 2015 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace TBF.BenchControl.WaterMeters.iPerl
+{
+ public class OptoReceivedEventArgs : EventArgs
+ {
+ public string Data;
+
+ public OptoReceivedEventArgs(string data)
+ {
+ this.Data = data;
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
index da14726c8..a4c68bcce 100644
--- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
+++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
@@ -3,21 +3,26 @@
///
using System;
using System.Collections.Generic;
+using System.IO.Ports;
+using System.Threading;
using log4net;
using TBF.BenchControl;
+using TBF.BenchControl.Generic;
namespace TBF.BenchControl.WaterMeters.iPerl
{
///
/// This component = instance of this class is a placeholder for a combined main watermeter
///
- public class WaterMeter : ComponentBase, GenericDevices.IWaterMeter, GenericDevices.IRegisterReader, IOperation
+ public class WaterMeter : ComponentBase, IDevice, GenericDevices.IWaterMeter, GenericDevices.IRegisterReader, IOperation
{
private static readonly ILog log = LogManager.GetLogger(typeof(WaterMeter));
public override string ToString() { return string.Format("iPerl({0})", Cfg.ToString(1)); }
+
readonly WaterMeterCfg iPerlCfg;
+
public float PulsesPerLtr { get { return iPerlCfg.ProcParams.PulsesPerLtr; } }
/// WaterMeter producer
@@ -78,6 +83,20 @@ namespace TBF.BenchControl.WaterMeters.iPerl
}
+ public void Initialize()
+ {
+ optoSerialPort = new SerialPort(string.Format("COM{0}", iPerlCfg.OptoComPortNr),
+ 9600, Parity.None, 8, StopBits.One);
+ optoSerialPort.Handshake = Handshake.None;
+ optoSerialPort.Open();
+ optoPortOpen = true;
+
+ stopWorkerThread = false;
+ workerThread = new Thread(Worker);
+ workerThread.Start();
+ return;
+ }
+
///
/// Events: Event.ReadRegisterDone, Event.Error
///
@@ -141,5 +160,50 @@ namespace TBF.BenchControl.WaterMeters.iPerl
pulses.Val = 1;
refPulses.Val = 2;
}
+
+
+ ///
+ /// Measurement serial port and worker thread related private variables
+ ///
+ private SerialPort optoSerialPort;
+ private bool optoPortOpen;
+ private Thread workerThread;
+ private bool stopWorkerThread;
+
+
+ void Worker()
+ {
+ while (!stopWorkerThread)
+ {
+ Thread.Sleep(250);
+ if (stopWorkerThread) break;
+ int nrBytes = optoSerialPort.BytesToRead;
+ if (nrBytes > 0)
+ {
+ char[] buffer = new char[nrBytes];
+ optoSerialPort.Read(buffer, 0, nrBytes);
+ string s = new string(buffer);
+ OnOptoReceived(this, new OptoReceivedEventArgs(s));
+ }
+ else
+ {
+ OnOptoReceived(this, new OptoReceivedEventArgs("."));
+ }
+ }
+ }
+
+
+ ///
+ /// Called from the state machine when a test is selected and UI needs to be updated.
+ ///
+ public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
+ {
+ if (OptoReceivedHandler == null) return;
+ try { OptoReceivedHandler(sender, args); }
+ catch (Exception) { }
+ }
+
+ public event EventHandler OptoReceivedHandler;
+
}
}
diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj
index 6a6805fd0..6657ba1e8 100644
--- a/TestBenchFramework/TBF.csproj
+++ b/TestBenchFramework/TBF.csproj
@@ -302,6 +302,7 @@
iPerlCommunicationForm.cs
+