laatzen/Common/Hardware/WaterMeter/Genesis/Protocols/StreamingProtocol/StreamingProtocol.cs

107 lines
4.0 KiB
C#
Raw Normal View History

2021-10-01 09:09:20 +00:00
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;
2021-10-01 09:09:20 +00:00
namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
{
/// <inheritdoc />
/// <summary>
2023-03-10 07:41:21 +00:00
/// Layer between <see cref="StreamingDecoder" /> CRC16CCITT handler and Events
2021-10-01 09:09:20 +00:00
/// 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)
2021-10-01 09:09:20 +00:00
{
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
});
}
}
2021-10-01 09:09:20 +00:00
//toDo: handle trashy telegrams
}
/// <inheritdoc />
public StreamingProtocol(String ident, Boolean ignoreCorruptedData = true) : base(ident)
{
_ignoreCorruptedData = ignoreCorruptedData;
}
}
}