/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using log4net; using TBF.Boxes; namespace TBF.BenchControl.Elde.RegisterReader { public class ReadRegisterOp : IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(ReadRegisterOp)); public override string ToString() { return string.Format("ReadRegisterOp({0})", reader.Name); } /// Set by the constructor readonly RegisterReader reader; IntBox pulses; int lastPulses; bool lastPulsesValid; IntBox refPulses; /// /// Events: Event.ReadRegisterDone or Event.Error /// /// Register reader reference /// Reference to a field with the water meter pulses public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses) { this.reader = reader as RegisterReader; if (reader == null) throw new ArgumentNullException("reader is null or it is not Elde"); this.pulses = pulses; lastPulsesValid = false; log.Debug(this.ToString()); } /// /// Events: Event.ReadRegisterDone or Event.Error /// /// Register reader reference /// Reference to a Box with the water meter pulses /// Reference to a Box with the reference flow meter pulses synchronized with the water meter public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses, ref IntBox refPulses) : this(reader, ref pulses) { this.refPulses = refPulses; log.Debug(this.ToString()); } private void ReadPulses() { if (!lastPulsesValid) { lastPulses = (int)reader.ControlBoard.WMeterPulses(reader.Position); lastPulsesValid = true; } else { UInt16 lowerWord = reader.ControlBoard.WMeterPulses(reader.Position); int uncorrected = (int)(((uint)lastPulses & 0xFFFF0000) | lowerWord); if (Math.Abs(uncorrected - lastPulses) <= Int16.MaxValue) { lastPulses = uncorrected; } else if (Math.Abs(uncorrected + 65536 - lastPulses) <= Int16.MaxValue) { lastPulses = uncorrected + 65536; } else if (Math.Abs(uncorrected - 65536 - lastPulses) <= Int16.MaxValue) { lastPulses = uncorrected - 65536; } } pulses.Val = lastPulses; if (refPulses != null) { refPulses.Val = (int)reader.ControlBoard.EtPulses(reader.Position); } } /// Start this operation public void Start() { ReadPulses(); } /// Run this operation /// eventDone public Event Run() { ReadPulses(); return Event.ReadRegisterDone; } /// Stop this operation public void Stop() { } } }