using System; using Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments; using Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore; using Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.EventArguments; using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments; namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol { /// /// /// Layer between CRC16CCITT handler and Events /// block trashy telegrams /// public class StreamingProtocol : BaseProtocol { /// /// Decode data and hold results /// private StreamingDecoder _streamingDecode; private readonly Boolean _ignoreCorruptedData; /// public override event EventHandler OnRecordIsDecoded; /// protected override void DecodeRecord(IPortDataEventArgs dataArgs) { var data = (String)dataArgs.GetData(); //Data decoding _streamingDecode = new StreamingDecoder(_ignoreCorruptedData); _streamingDecode.DecodeMsg(data); //Event for new data if (_streamingDecode.DataFlowTest != null) { _streamingDecode.DataFlowTest.SyncMarkRecord = dataArgs.GetSyncMarkRecord(); _streamingDecode.DataFlowTest.ReceivedTime = dataArgs.GetReceivedTime(); if (_streamingDecode.DataFlowTest.IsValid) { OnRecordIsDecoded?.Invoke(this, new FlowDataEventArgs { NewData = _streamingDecode.DataFlowTest, RawData = data }); } else if (!_ignoreCorruptedData) { OnRecordIsDecoded?.Invoke(this, new FlowDataEventArgs { NewData = _streamingDecode.DataFlowTest, RawData = data }); } } else if (_streamingDecode.DataCalib != null) { _streamingDecode.DataCalib.SyncMarkRecord = dataArgs.GetSyncMarkRecord(); _streamingDecode.DataCalib.ReceivedTime = dataArgs.GetReceivedTime(); if (_streamingDecode.DataCalib.IsValid) { OnRecordIsDecoded?.Invoke(this, new CalibDataEventArgs { CalibChl = _streamingDecode.DataCalib, RawData = data }); } else if (!_ignoreCorruptedData) { OnRecordIsDecoded?.Invoke(this, new CalibDataEventArgs { CalibChl = _streamingDecode.DataCalib, RawData = data }); } } else if (_streamingDecode.DataBendDetectTest != null) { _streamingDecode.DataBendDetectTest.SyncMarkRecord = dataArgs.GetSyncMarkRecord(); _streamingDecode.DataBendDetectTest.ReceivedTime = dataArgs.GetReceivedTime(); if (_streamingDecode.DataBendDetectTest.IsValid) { OnRecordIsDecoded?.Invoke(this, new BendDetectDataEventArgs { NewData = _streamingDecode.DataBendDetectTest, RawData = data }); } else if (!_ignoreCorruptedData) { OnRecordIsDecoded?.Invoke(this, new BendDetectDataEventArgs { NewData = _streamingDecode.DataBendDetectTest, RawData = data }); } } //toDo: handle trashy telegrams } /// public StreamingProtocol(String ident, Boolean ignoreCorruptedData = true) : base(ident) { _ignoreCorruptedData = ignoreCorruptedData; } } }