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

90 lines
2.8 KiB
C#

using Sick.SafetyScanners.DataStructures;
using Sick.SafetyScanners.Helpers;
using System.Text;
namespace Sick.SafetyScanners.DataProcessing;
/// <summary>
/// Parser for ApplicationName response from COLA2 variable command
/// Thread-safe implementation
/// </summary>
public sealed class ParseApplicationName
{
/// <summary>
/// Parses the application name from a TCP sequence (COLA2 response)
/// Matches: ParseApplicationNameData::parseTCPSequence in C++
/// </summary>
public ApplicationName ParseTcpSequence(PacketBuffer buffer)
{
var span = buffer.GetBufferSpan();
return new ApplicationName
{
VersionCVersion = ReadVersionIndicator(span),
VersionMajorVersionNumber = ReadMajorNumber(span),
VersionMinorVersionNumber = ReadMinorNumber(span),
VersionReleaseNumber = ReadReleaseNumber(span),
NameLength = ReadNameLength(span),
Name = ReadApplicationName(span)
};
}
/// <summary>
/// Matches: ParseApplicationNameData::readVersionIndicator in C++
/// </summary>
private string ReadVersionIndicator(ReadOnlySpan<byte> span)
{
byte ch = ReadWriteHelper.ReadUint8(span, 0);
return ((char)ch).ToString();
}
/// <summary>
/// Matches: ParseApplicationNameData::readMajorNumber in C++
/// </summary>
private byte ReadMajorNumber(ReadOnlySpan<byte> span)
{
return ReadWriteHelper.ReadUint8(span, 1);
}
/// <summary>
/// Matches: ParseApplicationNameData::readMinorNumber in C++
/// </summary>
private byte ReadMinorNumber(ReadOnlySpan<byte> span)
{
return ReadWriteHelper.ReadUint8(span, 2);
}
/// <summary>
/// Matches: ParseApplicationNameData::readReleaseNumber in C++
/// </summary>
private byte ReadReleaseNumber(ReadOnlySpan<byte> span)
{
return ReadWriteHelper.ReadUint8(span, 3);
}
/// <summary>
/// Matches: ParseApplicationNameData::readNameLength in C++
/// </summary>
private uint ReadNameLength(ReadOnlySpan<byte> span)
{
return ReadWriteHelper.ReadUint32LittleEndian(span, 4);
}
/// <summary>
/// Matches: ParseApplicationNameData::readApplicationName in C++
/// </summary>
private string ReadApplicationName(ReadOnlySpan<byte> span)
{
uint nameLength = ReadWriteHelper.ReadUint32LittleEndian(span, 4);
var nameBuilder = new StringBuilder((int)nameLength);
for (uint i = 0; i < nameLength; i++)
{
byte ch = ReadWriteHelper.ReadUint8(span, 8 + (int)i);
nameBuilder.Append((char)ch);
}
return nameBuilder.ToString();
}
}