82 lines
2.4 KiB
C#
82 lines
2.4 KiB
C#
using Sick.SafetyScanners.DataStructures;
|
|
using Sick.SafetyScanners.Helpers;
|
|
|
|
namespace Sick.SafetyScanners.DataProcessing;
|
|
|
|
/// <summary>
|
|
/// Parser for MonitoringCaseData response from COLA2 variable command
|
|
/// Thread-safe implementation
|
|
/// </summary>
|
|
public sealed class ParseMonitoringCaseData
|
|
{
|
|
/// <summary>
|
|
/// Parses the monitoring case data from a TCP sequence (COLA2 response)
|
|
/// Matches: ParseMonitoringCaseData::parseTCPSequence in C++
|
|
/// </summary>
|
|
public MonitoringCaseData ParseTcpSequence(PacketBuffer buffer)
|
|
{
|
|
var span = buffer.GetBufferSpan();
|
|
bool valid = IsValid(span);
|
|
|
|
if (!valid)
|
|
{
|
|
return new MonitoringCaseData
|
|
{
|
|
IsValid = false
|
|
};
|
|
}
|
|
|
|
var indices = new List<ushort>(8);
|
|
var fieldsValid = new List<bool>(8);
|
|
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
indices.Add(ReadFieldIndex(span, i));
|
|
fieldsValid.Add(ReadFieldValid(span, i));
|
|
}
|
|
|
|
return new MonitoringCaseData
|
|
{
|
|
IsValid = true,
|
|
MonitoringCaseNumber = ReadMonitoringCaseNumber(span),
|
|
FieldIndices = indices,
|
|
FieldsValid = fieldsValid
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Matches: ParseMonitoringCaseData::isValid in C++
|
|
/// </summary>
|
|
private bool IsValid(ReadOnlySpan<byte> span)
|
|
{
|
|
byte byteValue = ReadWriteHelper.ReadUint8(span, 0);
|
|
return byteValue == 'R' || byteValue == 'Y';
|
|
}
|
|
|
|
/// <summary>
|
|
/// Matches: ParseMonitoringCaseData::readMonitoringCaseNumber in C++
|
|
/// </summary>
|
|
private ushort ReadMonitoringCaseNumber(ReadOnlySpan<byte> span)
|
|
{
|
|
return ReadWriteHelper.ReadUint16LittleEndian(span, 6);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Matches: ParseMonitoringCaseData::readFieldIndex in C++
|
|
/// </summary>
|
|
private ushort ReadFieldIndex(ReadOnlySpan<byte> span, int index)
|
|
{
|
|
return ReadWriteHelper.ReadUint16LittleEndian(span, 158 + (index * 4));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Matches: ParseMonitoringCaseData::readFieldValid in C++
|
|
/// </summary>
|
|
private bool ReadFieldValid(ReadOnlySpan<byte> span, int index)
|
|
{
|
|
byte byteValue = ReadWriteHelper.ReadUint8(span, 157 + (index * 4));
|
|
return (byteValue & (0x01 << 0)) != 0;
|
|
}
|
|
}
|
|
|