2015-07-31 08:45:50 +00:00
|
|
|
|
///
|
|
|
|
|
|
/// Copyright (c) 2015 Sensus Metering Systems
|
|
|
|
|
|
///
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
2015-07-31 17:45:10 +00:00
|
|
|
|
using System.IO.Ports;
|
|
|
|
|
|
using System.Threading;
|
2015-07-31 08:45:50 +00:00
|
|
|
|
using log4net;
|
|
|
|
|
|
using TBF.BenchControl;
|
2015-07-31 17:45:10 +00:00
|
|
|
|
using TBF.BenchControl.Generic;
|
2015-07-31 08:45:50 +00:00
|
|
|
|
|
|
|
|
|
|
namespace TBF.BenchControl.WaterMeters.iPerl
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// This component = instance of this class is a placeholder for a combined main watermeter
|
|
|
|
|
|
/// </summary>
|
2015-07-31 17:45:10 +00:00
|
|
|
|
public class WaterMeter : ComponentBase, IDevice, GenericDevices.IWaterMeter, GenericDevices.IRegisterReader, IOperation
|
2015-07-31 08:45:50 +00:00
|
|
|
|
{
|
|
|
|
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(WaterMeter));
|
|
|
|
|
|
public override string ToString() { return string.Format("iPerl({0})", Cfg.ToString(1)); }
|
|
|
|
|
|
|
|
|
|
|
|
readonly WaterMeterCfg iPerlCfg;
|
|
|
|
|
|
|
2015-08-01 19:20:22 +00:00
|
|
|
|
public int RfidComPortNr { get { return iPerlCfg.RfidComPortNr; } }
|
|
|
|
|
|
public int Group { get { return iPerlCfg.Group; } }
|
2015-07-31 17:45:10 +00:00
|
|
|
|
|
2015-07-31 08:45:50 +00:00
|
|
|
|
public float PulsesPerLtr { get { return iPerlCfg.ProcParams.PulsesPerLtr; } }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>WaterMeter producer</summary>
|
|
|
|
|
|
public string Producer { get { return iPerlCfg.ProcParams.Producer; } }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>Nominal water flow in [m3/h]</summary>
|
|
|
|
|
|
public float Qn { get { return iPerlCfg.ProcParams.Qn; } }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>WaterMeter approval information or signature</summary>
|
|
|
|
|
|
public string ApprovalInfo { get { return iPerlCfg.ProcParams.ApprovalInfo; } }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>Metrological class</summary>
|
|
|
|
|
|
public string MetrologicalClass { get { return iPerlCfg.ProcParams.MetrologicalClass; } }
|
|
|
|
|
|
|
|
|
|
|
|
/// Properties set by the Begin and the End form
|
|
|
|
|
|
public string SerialNr
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return serialNr; }
|
|
|
|
|
|
set { serialNr = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
string serialNr;
|
|
|
|
|
|
|
|
|
|
|
|
public string EndState
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return endState; }
|
|
|
|
|
|
set { endState = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
string endState;
|
|
|
|
|
|
|
|
|
|
|
|
public string BeginState
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return beginState; }
|
|
|
|
|
|
set { beginState = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
string beginState;
|
|
|
|
|
|
|
|
|
|
|
|
public bool Disabled
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return disabled; }
|
|
|
|
|
|
set { disabled = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
bool disabled;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Boxes.IntBox pulses;
|
|
|
|
|
|
Boxes.IntBox refPulses;
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-08-01 19:20:22 +00:00
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Opto serial port and worker thread related private variables
|
|
|
|
|
|
///
|
|
|
|
|
|
private SerialPort optoSerialPort;
|
|
|
|
|
|
private bool optoPortOpen;
|
|
|
|
|
|
private Thread workerThread;
|
|
|
|
|
|
private bool stopWorkerThread;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public WaterMeter()
|
2015-07-31 08:45:50 +00:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public WaterMeter(WaterMeterCfg cfg)
|
|
|
|
|
|
: base(cfg)
|
|
|
|
|
|
{
|
|
|
|
|
|
iPerlCfg = cfg;
|
|
|
|
|
|
log.Debug(this.ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-07-31 17:45:10 +00:00
|
|
|
|
public void Initialize()
|
|
|
|
|
|
{
|
2015-08-01 19:20:22 +00:00
|
|
|
|
if (DebugLevel == Entities.DebugMode.Normal)
|
|
|
|
|
|
{
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void RunDeviceBefore()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void RunDeviceAfter()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopDevice()
|
|
|
|
|
|
{
|
2015-08-11 06:50:32 +00:00
|
|
|
|
if (DebugLevel == Entities.DebugMode.Normal)
|
|
|
|
|
|
{
|
|
|
|
|
|
stopWorkerThread = true;
|
|
|
|
|
|
workerThread.Join(2000);
|
|
|
|
|
|
optoSerialPort.Close();
|
|
|
|
|
|
optoPortOpen = false;
|
|
|
|
|
|
}
|
2015-07-31 17:45:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-07-31 08:45:50 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Events: Event.ReadRegisterDone, Event.Error
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="pulses">Reference to a variable for the water meter pulses</param>
|
|
|
|
|
|
/// <returns>ReadWaterMeter instance reference casted to IOperaton</returns>
|
|
|
|
|
|
public IOperation ReadRegisterOp(ref Boxes.IntBox pulses)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.pulses = pulses;
|
|
|
|
|
|
return this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Events: Event.ReadRegisterDone, Event.Error
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="pulses">Reference to a variable for the water meter pulses</param>
|
|
|
|
|
|
/// <param name="pulses">Reference to a variable for the related reference flowmeter pulses</param>
|
|
|
|
|
|
/// <returns>Reference to operation object instance</returns>
|
|
|
|
|
|
public IOperation ReadRegisterOp(ref Boxes.IntBox pulses, ref Boxes.IntBox refPulses)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.pulses = pulses;
|
|
|
|
|
|
this.refPulses = refPulses;
|
|
|
|
|
|
return this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Events: ReadReferenceDone, Error
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="pulses">Reference to a variable for the water meter pulses</param>
|
|
|
|
|
|
/// <returns>Reference to operation object instance</returns>
|
|
|
|
|
|
public IOperation ReadReferenceForRegisterOp(ref Boxes.IntBox pulses, ref Boxes.IntBox refPulses)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.pulses = pulses;
|
|
|
|
|
|
this.refPulses = refPulses;
|
|
|
|
|
|
return this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>Start this operation</summary>
|
|
|
|
|
|
public void Start()
|
|
|
|
|
|
{
|
|
|
|
|
|
ReadPulses();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>Run this operation</summary>
|
|
|
|
|
|
/// <returns>eventDone</returns>
|
|
|
|
|
|
public Event Run()
|
|
|
|
|
|
{
|
|
|
|
|
|
ReadPulses();
|
|
|
|
|
|
return Event.ReadRegisterDone;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>Stop this operation</summary>
|
|
|
|
|
|
public void Stop()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ReadPulses()
|
|
|
|
|
|
{
|
|
|
|
|
|
/// Do something meaningfull here
|
|
|
|
|
|
pulses.Val = 1;
|
|
|
|
|
|
refPulses.Val = 2;
|
|
|
|
|
|
}
|
2015-07-31 17:45:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
{
|
2015-08-01 19:20:22 +00:00
|
|
|
|
//OnOptoReceived(this, new OptoReceivedEventArgs("."));
|
2015-07-31 17:45:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Called from the state machine when a test is selected and UI needs to be updated.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (OptoReceivedHandler == null) return;
|
|
|
|
|
|
try { OptoReceivedHandler(sender, args); }
|
|
|
|
|
|
catch (Exception) { }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public event EventHandler<OptoReceivedEventArgs> OptoReceivedHandler;
|
|
|
|
|
|
|
2015-07-31 08:45:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|