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.MagFlux.DataPackages.EventArguments; namespace Xylem.Common.Hardware.WaterMeter.MagFlux.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; private String _sensorIdMask; private String _uniqueIdMask; /// public override event EventHandler OnRecordIsDecoded; /// /// Set decoding mask for streaming protocol, wipes out all not matching records: /// - PcbIdMask equals the sensor serial no /// - UniqueIdMask /// /// /// /// true if decoding was successful and data has been validated /// /// - Initial. /// /// /// - Changed from PcbId to SensorId. /// public void SetDecodingMask(String sensorIdMask, String uniqueIdMask) { _sensorIdMask = sensorIdMask; _uniqueIdMask = uniqueIdMask; } /// protected override void DecodeRecord(IPortDataEventArgs dataArgs) { var data = (String)dataArgs.GetData(); //Data decoding _streamingDecode = new StreamingDecoder(_ignoreCorruptedData); _streamingDecode.SetDecodingMask(_sensorIdMask, _uniqueIdMask); _streamingDecode.DecodeMsg(data); //Event for new data if (_streamingDecode.DataMagFlux != null) { _streamingDecode.DataMagFlux.SyncMarkRecord = dataArgs.GetSyncMarkRecord(); _streamingDecode.DataMagFlux.ReceivedTime = dataArgs.GetReceivedTime(); if (_streamingDecode.DataMagFlux.IsValid) { OnRecordIsDecoded?.Invoke(this, new MagFluxFlowDataEventArgs { NewData = _streamingDecode.DataMagFlux, RawData = data }); } else if (!_ignoreCorruptedData) { OnRecordIsDecoded?.Invoke(this, new MagFluxFlowDataEventArgs { NewData = _streamingDecode.DataMagFlux, RawData = data }); } } //toDo: handle trashy telegrams } /// public StreamingProtocol(String ident, Boolean ignoreCorruptedData = true) : base(ident) { _ignoreCorruptedData = ignoreCorruptedData; } } }