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