tbf/TestBenchFramework/BenchControl/Operations/ReadMoreRegistersOp.cs
2014-07-31 17:04:09 +02:00

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();
}
}
}
}