107 lines
4.0 KiB
C#
107 lines
4.0 KiB
C#
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
|
|
{
|
|
/// <inheritdoc />
|
|
/// <summary>
|
|
/// Layer between <see cref="StreamingDecoder" /> CRC16CCITT handler and Events
|
|
/// block trashy telegrams
|
|
/// </summary>
|
|
public class StreamingProtocol : BaseProtocol
|
|
{
|
|
|
|
/// <summary>
|
|
/// Decode data and hold results
|
|
/// </summary>
|
|
private StreamingDecoder _streamingDecode;
|
|
private readonly Boolean _ignoreCorruptedData;
|
|
|
|
/// <inheritdoc />
|
|
public override event EventHandler<BaseDataEventArgs> OnRecordIsDecoded;
|
|
|
|
|
|
/// <inheritdoc />
|
|
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
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public StreamingProtocol(String ident, Boolean ignoreCorruptedData = true) : base(ident)
|
|
{
|
|
_ignoreCorruptedData = ignoreCorruptedData;
|
|
}
|
|
}
|
|
} |