136 lines
3.6 KiB
C#
136 lines
3.6 KiB
C#
using System;
|
|
using log4net;
|
|
using TBF.BenchControl;
|
|
using TBF.Boxes;
|
|
|
|
namespace TBF.BenchControl.Operations
|
|
{
|
|
public class ReadMoreRegistersOp : IOperation
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(ReadMoreRegistersOp));
|
|
public override string ToString() { return string.Format("ReadAllRegistersOp()"); }
|
|
|
|
/// Set by the constructor
|
|
int readersCount;
|
|
int[] iPulses;
|
|
int[] iRefPulses;
|
|
IntBox[] pulses;
|
|
IntBox[] refPulses;
|
|
IOperation[] readRegOps;
|
|
Event[] events;
|
|
|
|
/// <summary>
|
|
/// Events: eventDone (default=Event.ReadRegisterDone) or Event.Error
|
|
/// </summary>
|
|
/// <param name="register">Register reader reference</param>
|
|
/// <param name="pulses">Reference to the water meter register state in pulses</param>
|
|
public ReadMoreRegistersOp(GenericDevices.IRegisterReader[] readers, ref int[] iPulses)
|
|
{
|
|
if (readers == null) throw new ArgumentNullException("readers");
|
|
|
|
readersCount = readers.Length;
|
|
|
|
if (iPulses == null || iPulses.Length != readersCount)
|
|
{
|
|
throw new ArgumentException("iPulses");
|
|
}
|
|
this.iPulses = iPulses;
|
|
|
|
pulses = new IntBox[Program.WMsCount];
|
|
|
|
readRegOps = new IOperation[readersCount];
|
|
for (int i = 0; i < readersCount; i++)
|
|
{
|
|
pulses[i] = new IntBox(iPulses[i]);
|
|
|
|
if (readers[i] != null)
|
|
{
|
|
readRegOps[i] = readers[i].ReadRegisterOp(ref pulses[i]);
|
|
}
|
|
}
|
|
log.Debug(this.ToString());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Events: eventDone (default=Event.ReadRegisterDone) or Event.Error
|
|
/// </summary>
|
|
/// <param name="register">Register reader reference</param>
|
|
/// <param name="pulses">Reference to the water meter register state in pulses</param>
|
|
public ReadMoreRegistersOp(GenericDevices.IRegisterReader[] readers, ref int[] iPulses, ref int[] iRefPulses)
|
|
: this(readers, ref iPulses)
|
|
{
|
|
if (readers == null) throw new ArgumentNullException("readers");
|
|
|
|
readersCount = readers.Length;
|
|
|
|
if (iPulses == null || iPulses.Length != readersCount ||
|
|
iRefPulses == null || iRefPulses.Length != readersCount)
|
|
{
|
|
throw new ArgumentException("iPulses or iRefPulses");
|
|
}
|
|
this.iPulses = iPulses;
|
|
this.iRefPulses = iRefPulses;
|
|
|
|
pulses = new IntBox[Program.WMsCount];
|
|
refPulses = new IntBox[Program.WMsCount];
|
|
|
|
readRegOps = new IOperation[readersCount];
|
|
for (int i = 0; i < readersCount; i++)
|
|
{
|
|
pulses[i] = new IntBox(iPulses[i]);
|
|
refPulses[i] = new IntBox(iRefPulses[i]);
|
|
|
|
if (readers[i] != null)
|
|
{
|
|
readRegOps[i] = readers[i].ReadRegisterOp(ref pulses[i], ref refPulses[i]);
|
|
}
|
|
}
|
|
log.Debug(this.ToString());
|
|
}
|
|
|
|
/// <summary>Start this operation</summary>
|
|
public void Start()
|
|
{
|
|
for (int i = 0; i < readersCount; i++)
|
|
{
|
|
if (readRegOps[i] != null) readRegOps[i].Start();
|
|
}
|
|
}
|
|
|
|
/// <summary>Run this operation</summary>
|
|
public Event Run()
|
|
{
|
|
bool allDone = true;
|
|
bool anyError = false;
|
|
|
|
for (int i = 0; i < readersCount; i++)
|
|
{
|
|
if (readRegOps[i] != null)
|
|
{
|
|
Event evnt = readRegOps[i].Run();
|
|
iPulses[i] = pulses[i].Val;
|
|
if (iRefPulses != null)
|
|
{
|
|
iRefPulses[i] = refPulses[i].Val;
|
|
}
|
|
if (evnt == Event.Error) anyError = true;
|
|
if (evnt != Event.ReadRegisterDone) allDone = false;
|
|
}
|
|
}
|
|
|
|
if (anyError) return Event.Error;
|
|
if (allDone) return Event.ReadAllRegistersDone;
|
|
return Event.None;
|
|
}
|
|
|
|
/// <summary>Stop this operation</summary>
|
|
public void Stop()
|
|
{
|
|
for (int i = 0; i < readersCount; i++)
|
|
{
|
|
if (readRegOps[i] != null) readRegOps[i].Stop();
|
|
}
|
|
}
|
|
}
|
|
}
|