using Sick.SafetyScanners.DataStructures; using Sick.SafetyScanners.Helpers; namespace Sick.SafetyScanners.DataProcessing; /// /// Parser for ConfigMetadata response from COLA2 variable command /// Thread-safe implementation /// public sealed class ParseConfigMetadata { /// /// Parses the config metadata from a TCP sequence (COLA2 response) /// Matches: ParseConfigMetadata::parseTCPSequence in C++ /// public ConfigMetadata ParseTcpSequence(PacketBuffer buffer) { var span = buffer.GetBufferSpan(); return new ConfigMetadata { VersionCVersion = ReadVersionIndicator(span), VersionMajorVersionNumber = ReadMajorNumber(span), VersionMinorVersionNumber = ReadMinorNumber(span), VersionReleaseNumber = ReadReleaseNumber(span), ModificationTimeDate = ReadModificationTimeDate(span), ModificationTimeTime = ReadModificationTimeTime(span), TransferTimeDate = ReadTransferTimeDate(span), TransferTimeTime = ReadTransferTimeTime(span), AppChecksum = ReadAppChecksum(span), OverallChecksum = ReadOverallChecksum(span), IntegrityHash = ReadIntegrityHash(span) }; } /// /// Matches: ParseConfigMetadata::readVersionIndicator in C++ /// private string ReadVersionIndicator(ReadOnlySpan span) { byte ch = ReadWriteHelper.ReadUint8(span, 0); return ((char)ch).ToString(); } /// /// Matches: ParseConfigMetadata::readMajorNumber in C++ /// private byte ReadMajorNumber(ReadOnlySpan span) { return ReadWriteHelper.ReadUint8(span, 1); } /// /// Matches: ParseConfigMetadata::readMinorNumber in C++ /// private byte ReadMinorNumber(ReadOnlySpan span) { return ReadWriteHelper.ReadUint8(span, 2); } /// /// Matches: ParseConfigMetadata::readReleaseNumber in C++ /// private byte ReadReleaseNumber(ReadOnlySpan span) { return ReadWriteHelper.ReadUint8(span, 3); } private ushort ReadModificationTimeDate(ReadOnlySpan span) { return ReadWriteHelper.ReadUint16LittleEndian(span, 4); } private uint ReadModificationTimeTime(ReadOnlySpan span) { return ReadWriteHelper.ReadUint32LittleEndian(span, 8); } private ushort ReadTransferTimeDate(ReadOnlySpan span) { return ReadWriteHelper.ReadUint16LittleEndian(span, 12); } private uint ReadTransferTimeTime(ReadOnlySpan span) { return ReadWriteHelper.ReadUint32LittleEndian(span, 16); } private uint ReadAppChecksum(ReadOnlySpan span) { return ReadWriteHelper.ReadUint32BigEndian(span, 36); } private uint ReadOverallChecksum(ReadOnlySpan span) { return ReadWriteHelper.ReadUint32BigEndian(span, 52); } private IReadOnlyList ReadIntegrityHash(ReadOnlySpan span) { var result = new List(4); for (int i = 0; i < 4; i++) { uint value = ReadWriteHelper.ReadUint32LittleEndian(span, 68 + (i * 4)); result.Add(value); } return result; } }