using System; using log4net; using TBF.BenchControl; 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; /// /// Events: eventDone (default=Event.ReadRegisterDone) or Event.Error /// /// Register reader reference /// Reference to the water meter register state in pulses 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()); } /// /// Events: eventDone (default=Event.ReadRegisterDone) or Event.Error /// /// Register reader reference /// Reference to the water meter register state in pulses 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()); } /// Start this operation public void Start() { for (int i = 0; i < readersCount; i++) { if (readRegOps[i] != null) readRegOps[i].Start(); } } /// Run this operation 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].N; if (iRefPulses != null) { iRefPulses[i] = refPulses[i].N; } 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; } /// Stop this operation public void Stop() { for (int i = 0; i < readersCount; i++) { if (readRegOps[i] != null) readRegOps[i].Stop(); } } } }