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