34 constexpr
size_t BLOB_SIZE_MAX = 3000u * 1024u;
41 constexpr
size_t MAX_UDP_BLOB_PACKET_SIZE = 1500u - (20u + 8u);
48 constexpr
size_t MAX_TCP_BLOB_PACKET_SIZE = 1500u - (20u + 20u);
52 constexpr uint8_t PSEUDO_CHECKSUM = 0x45u;
58 constexpr int32_t BLOB_HEADER_SIZE = 11;
67 uint16_t fragmentNumber;
70 uint32_t sourceIpAddress;
72 uint16_t sourcePortNumber;
73 uint32_t destIpAddress;
74 uint16_t destPortNumber;
75 uint16_t protocolVersion;
90 uint16_t protocolVersion;
93 uint16_t numberOfSegments;
98 constexpr uint8_t UDP_PROTOCOL_VERSION = 0x0001u;
101 constexpr uint8_t PACKET_TYPE_DATA = 0x62u;
104 constexpr uint8_t FLAG_LAST_FRAGMENT = (1u << 7);
107 constexpr uint32_t BLOB_DATA_START = 0x02020202u;
110 constexpr uint8_t BLOB_DATA_PROTOCOL_VERSION = 0x0001u;
113 constexpr uint8_t BLOB_DATA_BLOB_ID = 0x0001u;
119 : m_dataHandler(dataHandler)
176 int32_t receiveSize{0};
179 receiveSize =
m_pTransportUdp->recv(receiveBuffer, MAX_UDP_BLOB_PACKET_SIZE);
185 std::printf(
"Blob data receive timeout\n");
190 if (0u == receiveSize)
193 std::printf(
"Blob connection closed\n");
198 receiveBuffer.resize(receiveSize);
205 int32_t receiveSize{0};
212 std::printf(
"Receive Failed\n");
217 if (0u == receiveSize)
220 std::printf(
"Connection closed\n");
226 receiveBuffer.resize(receiveSize);
234 udpProtocolData = {0u, 0u, 0u,
false};
237 UdpDataHeader* pUdpHeader =
reinterpret_cast<UdpDataHeader*
>(buffer.data());
239 const uint16_t protocolVersion = readUnalignBigEndian<uint16_t>(&pUdpHeader->protocolVersion);
240 if (protocolVersion != UDP_PROTOCOL_VERSION)
243 std::printf(
"Received unknown protocol version of UDP header: %d.\n", protocolVersion);
248 #ifdef ENABLE_CRC_CHECK_UDP_FRAGMENT
249 const uint32_t udpDataSize =
250 static_cast<uint16_t
>(buffer.size()) -
static_cast<uint16_t
>(
sizeof(uint32_t));
251 const uint32_t crc32 = readUnalignBigEndian<uint32_t>(buffer.data() + udpDataSize);
253 const uint32_t crc32Calculated =
256 if (crc32 != crc32Calculated)
258 std::printf(
"Malformed data, CRC32C checksum does not match.\n");
264 if (pUdpHeader->packetType != PACKET_TYPE_DATA)
267 std::printf(
"Received unknown packet type: %d\n.", pUdpHeader->packetType);
273 const uint16_t fragmentLength = readUnalignBigEndian<uint16_t>(&pUdpHeader->dataLength);
275 const uint16_t receivedLength =
static_cast<uint16_t
>(buffer.size()) -
276 static_cast<uint16_t
>(
sizeof(UdpDataHeader)) -
277 static_cast<uint16_t
>(
sizeof(uint32_t));
278 if (fragmentLength != receivedLength)
281 std::printf(
"Received unexpected packet length. Expected length: %d, Received length: %d\n.",
290 udpProtocolData.
blobNumber = readUnalignBigEndian<uint16_t>(&pUdpHeader->packetNumber);
291 udpProtocolData.
fragmentNumber = readUnalignBigEndian<uint16_t>(&pUdpHeader->fragmentNumber);
293 udpProtocolData.
isLastFragment = (0u != (pUdpHeader->flags & FLAG_LAST_FRAGMENT));
300 std::vector<uint8_t> receiveBuffer;
301 bool foundBlobStart{
false};
302 lastFragment =
false;
304 while (!foundBlobStart)
322 if (udpProtocolData.fragmentNumber == 0U)
327 m_blobDataBuffer.data(), &receiveBuffer[
sizeof(UdpDataHeader)], udpProtocolData.dataLength);
329 if (udpProtocolData.isLastFragment)
336 foundBlobStart =
true;
341 return foundBlobStart;
346 int32_t receiveSize = 0;
353 if (receiveSize == BLOB_HEADER_SIZE)
359 if (receiveSize == BLOB_HEADER_SIZE && blobCounter == 2)
362 BlobDataHeader* pBlobHeader =
363 reinterpret_cast<BlobDataHeader*
>(receiveBufferPacketSize.data());
365 const uint32_t blobDataStartBytes = readUnalignBigEndian<uint32_t>(&pBlobHeader->blobStart);
366 if (blobDataStartBytes == BLOB_DATA_START)
383 bool blobHeaderValid{
true};
386 BlobDataHeader* pBlobHeader =
reinterpret_cast<BlobDataHeader*
>(
m_blobDataBuffer.data());
389 const uint32_t blobDataStartBytes = readUnalignBigEndian<uint32_t>(&pBlobHeader->blobStart);
390 if (blobDataStartBytes != BLOB_DATA_START)
393 std::printf(
"Received unknown Blob data start bytes: %d.\n", blobDataStartBytes);
395 blobHeaderValid =
false;
399 const uint16_t protocolVersion = readUnalignBigEndian<uint16_t>(&pBlobHeader->protocolVersion);
400 if (protocolVersion != BLOB_DATA_PROTOCOL_VERSION)
402 std::printf(
"Received unknown protocol version: %d.\n", protocolVersion);
404 blobHeaderValid =
false;
408 const uint8_t packetType = pBlobHeader->packetType;
409 if (packetType != PACKET_TYPE_DATA)
411 std::printf(
"Received unknown packet type: %d\n.", packetType);
413 blobHeaderValid =
false;
417 const uint16_t blobId = readUnalignBigEndian<uint16_t>(&pBlobHeader->blobId);
419 if (blobId != BLOB_DATA_BLOB_ID)
421 std::printf(
"Received unknown Blob ID: %d\n.", blobId);
423 blobHeaderValid =
false;
429 m_numSegments = readUnalignBigEndian<uint16_t>(&pBlobHeader->numberOfSegments);
430 std::cout <<
'\n' <<
"Number of Segments: " <<
m_numSegments <<
" ";
435 uint32_t blobDataPos =
sizeof(BlobDataHeader);
436 for (uint32_t segmentCounter = 0u; segmentCounter <
m_numSegments; segmentCounter++)
440 blobDataPos +=
sizeof(uint32_t);
444 blobDataPos +=
sizeof(uint32_t);
450 m_offsetSegment.push_back(readUnalignBigEndian<uint32_t>(&pBlobHeader->blobLength) - 3u);
453 return blobHeaderValid;
458 bool blobHeaderValid{
true};
461 BlobDataHeader* pBlobHeader =
reinterpret_cast<BlobDataHeader*
>(
m_blobDataBuffer.data());
464 const uint32_t blobDataStartBytes = readUnalignBigEndian<uint32_t>(&pBlobHeader->blobStart);
465 if (blobDataStartBytes != BLOB_DATA_START)
468 std::printf(
"Received unknown Blob data start bytes: %d.\n", blobDataStartBytes);
470 blobHeaderValid =
false;
474 const uint16_t protocolVersion = readUnalignBigEndian<uint16_t>(&pBlobHeader->protocolVersion);
475 if (protocolVersion != BLOB_DATA_PROTOCOL_VERSION)
477 std::printf(
"Received unknown protocol version: %d.\n", protocolVersion);
479 blobHeaderValid =
false;
483 const uint8_t packetType = pBlobHeader->packetType;
484 if (packetType != PACKET_TYPE_DATA)
486 std::printf(
"Received unknown packet type: %d\n.", packetType);
488 blobHeaderValid =
false;
492 const uint16_t blobId = readUnalignBigEndian<uint16_t>(&pBlobHeader->blobId);
494 if (blobId != BLOB_DATA_BLOB_ID)
496 std::printf(
"Received unknown Blob ID: %d\n.", blobId);
498 blobHeaderValid =
false;
504 m_numSegments = readUnalignBigEndian<uint16_t>(&pBlobHeader->numberOfSegments);
510 uint32_t blobDataPos =
sizeof(BlobDataHeader);
511 for (uint32_t segmentCounter = 0u; segmentCounter <
m_numSegments; segmentCounter++)
515 blobDataPos +=
sizeof(uint32_t);
519 blobDataPos +=
sizeof(uint32_t);
525 m_offsetSegment.push_back(readUnalignBigEndian<uint32_t>(&pBlobHeader->blobLength) - 3u);
528 return blobHeaderValid;
533 uint32_t currentSegment{0};
537 uint32_t beginOfBlobData =
sizeof(BlobDataHeader) - 2 *
sizeof(uint16_t);
544 if (dataSetsActive.hasDataSetDepthMap)
548 size_t binarySegmentSize =
550 auto beginOfDataSegmentDepthMapIter =
552 if (!
m_dataHandler->parseBinaryData(beginOfDataSegmentDepthMapIter, binarySegmentSize))
559 if (dataSetsActive.hasDataSetDeviceStatus)
563 size_t segmentSizeDeviceStatus =
565 auto beginOfDataSegmentDeviceStatusIter =
568 if (!
m_dataHandler->parseDeviceStatusData(beginOfDataSegmentDeviceStatusIter,
569 segmentSizeDeviceStatus))
576 if (dataSetsActive.hasDataSetROI)
581 auto beginOfDataSegmentRoiIter =
583 if (!
m_dataHandler->parseRoiData(beginOfDataSegmentRoiIter, segmentSizeROI))
590 if (dataSetsActive.hasDataSetLocalIOs)
594 size_t segmentSizeLocalIOs =
596 auto beginOfDataSegmentLocalIOsIter =
598 if (!
m_dataHandler->parseLocalIOsData(beginOfDataSegmentLocalIOsIter, segmentSizeLocalIOs))
604 if (dataSetsActive.hasDataSetFieldInfo)
608 size_t segmentSizeFieldInformation =
610 auto beginOfDataSegmentFieldInformationIter =
613 if (!
m_dataHandler->parseFieldInformationData(beginOfDataSegmentFieldInformationIter,
614 segmentSizeFieldInformation))
620 if (dataSetsActive.hasDataSetLogicSignals)
624 size_t segmentSizeLogicSignals =
626 auto beginOfDataSegmentLogicSignalsIter =
628 if (!
m_dataHandler->parseLogicSignalsData(beginOfDataSegmentLogicSignalsIter,
629 segmentSizeLogicSignals))
635 if (dataSetsActive.hasDataSetIMU)
640 auto beginOfDataSegmentIMUIter =
642 if (!
m_dataHandler->parseIMUData(beginOfDataSegmentIMUIter, segmentSizeIMU))
663 std::vector<uint8_t> receiveBuffer;
664 uint16_t expectedFragmentNumber{0u};
665 bool blobDataComplete{
false};
666 bool lastFragment{
false};
676 blobDataComplete = lastFragment;
677 while (!blobDataComplete)
679 expectedFragmentNumber++;
697 std::printf(
"Unexpected Blob Number: expected value: %d, received value: %d\n",
699 udpProtocolData.blobNumber);
704 if (expectedFragmentNumber != udpProtocolData.fragmentNumber)
708 std::printf(
"Unexpected fragment number: expected value: %d, received value: %d\n",
709 expectedFragmentNumber,
710 udpProtocolData.fragmentNumber);
719 blobDataBufferEnd, &receiveBuffer[
sizeof(UdpDataHeader)], udpProtocolData.dataLength);
721 if (udpProtocolData.isLastFragment)
723 blobDataComplete =
true;
730 if (blobDataComplete)
744 std::vector<uint8_t> receiveBuffer;
745 bool blobDataComplete{
false};
746 int32_t receiveSize = 0;
750 if ((receiveBufferPacketSize.size() == BLOB_HEADER_SIZE))
753 BlobDataHeader* pBlobHeader =
reinterpret_cast<BlobDataHeader*
>(receiveBufferPacketSize.data());
756 const uint32_t blobDataStartBytes = readUnalignBigEndian<uint32_t>(&pBlobHeader->blobStart);
757 if (blobDataStartBytes == BLOB_DATA_START)
761 memcpy(
m_blobDataBuffer.data(), &receiveBufferPacketSize[0], BLOB_HEADER_SIZE);
765 while (!blobDataComplete)
770 if (receiveSize > 0 && receiveSize != BLOB_HEADER_SIZE)
776 memcpy(blobDataBufferEnd, &receiveBuffer[0], receiveSize);
779 if ((receiveSize == BLOB_HEADER_SIZE))
782 BlobDataHeader* pBlobHeader =
reinterpret_cast<BlobDataHeader*
>(receiveBuffer.data());
785 const uint32_t blobDataStartBytes = readUnalignBigEndian<uint32_t>(&pBlobHeader->blobStart);
786 if (blobDataStartBytes == BLOB_DATA_START)
789 receiveBufferPacketSize.resize(BLOB_HEADER_SIZE);
790 memcpy(receiveBufferPacketSize.data(), &receiveBuffer[0], BLOB_HEADER_SIZE);
792 blobDataComplete = 1;
800 memcpy(blobDataBufferEnd, &receiveBuffer[0], receiveSize);
808 if (blobDataComplete)