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 +