using Sick.SafetyScanners.DataStructures;
using Sick.SafetyScanners.Helpers;
using System.Text;
namespace Sick.SafetyScanners.DataProcessing;
///
/// Parser for ApplicationName response from COLA2 variable command
/// Thread-safe implementation
///
public sealed class ParseApplicationName
{
///
/// Parses the application name from a TCP sequence (COLA2 response)
/// Matches: ParseApplicationNameData::parseTCPSequence in C++
///
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)
};
}
///
/// Matches: ParseApplicationNameData::readVersionIndicator in C++
///
private string ReadVersionIndicator(ReadOnlySpan span)
{
byte ch = ReadWriteHelper.ReadUint8(span, 0);
return ((char)ch).ToString();
}
///
/// Matches: ParseApplicationNameData::readMajorNumber in C++
///
private byte ReadMajorNumber(ReadOnlySpan span)
{
return ReadWriteHelper.ReadUint8(span, 1);
}
///
/// Matches: ParseApplicationNameData::readMinorNumber in C++
///
private byte ReadMinorNumber(ReadOnlySpan span)
{
return ReadWriteHelper.ReadUint8(span, 2);
}
///
/// Matches: ParseApplicationNameData::readReleaseNumber in C++
///
private byte ReadReleaseNumber(ReadOnlySpan span)
{
return ReadWriteHelper.ReadUint8(span, 3);
}
///
/// Matches: ParseApplicationNameData::readNameLength in C++
///
private uint ReadNameLength(ReadOnlySpan span)
{
return ReadWriteHelper.ReadUint32LittleEndian(span, 4);
}
///
/// Matches: ParseApplicationNameData::readApplicationName in C++
///
private string ReadApplicationName(ReadOnlySpan 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();
}
}