Files
Denso/srcs/RobotNet10/RobotApp/Communication/Sick.SafetyScanners/DataProcessing/ParseMonitoringCaseData.cs
2026-07-03 16:31:37 +07:00

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