37 constexpr std::uint16_t VERSION_SEGMENT_DEPTHMAP = 0x0002u;
40 constexpr std::uint16_t VERSION_SEGMENT_DEVICESTATUS = 0x0001u;
43 constexpr std::uint16_t VERSION_SEGMENT_ROI = 0x0001u;
46 constexpr std::uint16_t VERSION_SEGMENT_LOCALIOS = 0x0001u;
49 constexpr std::uint16_t VERSION_SEGMENT_FIELDINFORMATION = 0x0001u;
52 constexpr std::uint16_t VERSION_SEGMENT_LOGICSIGNALS = 0x0001u;
55 constexpr std::uint16_t VERSION_SEGMENT_IMU = 0x0001u;
58 constexpr std::uint16_t DISTANCE_MAP_FILTERED_FLAG = 1u << 0;
61 constexpr std::uint16_t INTRUDED_PIXEL_STATE_VALID_FLAG = 1u << 1;
64 constexpr std::uint16_t DATA_STREAM_THROTTLED_FLAG = 1u << 2;
69 , m_distanceByteDepth(0u)
70 , m_intensityByteDepth(0u)
71 , m_stateByteDepth(0u)
94 auto tXMLError = xmlTree.
Parse(xmlString.c_str());
97 std::printf(
"Reading XML tree in BLOB failed.");
104 bool oParseOk =
true;
109 if (ptDataSetsTree != 0)
114 if (ptDataSetsTree != 0)
116 auto const* ptHasNodeOrZero = ptDataSetsTree->
FirstChildElement(
"DataSetDepthMap");
146 auto const* ptDataStreamTree = ptDataSetsTree->
FirstChildElement(
"DataSetDepthMap");
148 if (ptDataStreamTree != 0)
150 ptDataStreamTree = ptDataStreamTree->
FirstChildElement(
"FormatDescriptionDepthMap");
153 if (ptDataStreamTree != 0)
163 if (oParseOk and (ptDataStreamTree != 0))
166 if (ptWidthElem != 0)
179 auto const* ptHeightElem = ptDataStreamTree->FirstChildElement(
"Height");
180 if (ptHeightElem != 0)
197 auto const* ptCameraToWorldTransform =
198 ptDataStreamTree->FirstChildElement(
"CameraToWorldTransform");
199 if (ptCameraToWorldTransform != 0)
201 auto const* ptMatrixEntry = ptCameraToWorldTransform->FirstChildElement();
202 for (
auto idx = 0; idx < 4 * 4; ++idx)
205 ptMatrixEntry = ptMatrixEntry->NextSiblingElement();
207 ((idx < 4 * 4 - 1) and (ptMatrixEntry == 0)))
231 auto getDoubleEntry = [&](
const std::vector<char const*>& path,
double* target) {
232 auto const* ptEntry = ptDataStreamTree;
233 for (
auto* part : path)
237 ptEntry = ptEntry->FirstChildElement(part);
243 tXMLError = ptEntry->QueryDoubleText(target);
272 auto getText = [&](
char const* name) {
273 if (ptDataStreamTree == 0)
278 auto const* ptEntry = ptDataStreamTree->FirstChildElement(name);
281 return ptEntry->GetText();
341 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
342 itBuf +=
sizeof(uint32_t);
346 const uint32_t dataSize = length - 8u;
347 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
350 if (crc32 != crc32Calculated)
352 std::printf(
"Malformed data, CRC32 checksum in data segment depth map does not match.\n");
358 if ((length +
sizeof(uint32_t)) != size)
361 "Malformed data, length in data segment depth map header does not match package size.\n");
367 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
370 if (length != lengthCopy)
372 std::printf(
"Malformed data, length of data segment depth map header does not match data "
380 itBuf +=
sizeof(uint64_t);
382 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
383 itBuf +=
sizeof(uint16_t);
385 if (version != VERSION_SEGMENT_DEPTHMAP)
387 std::printf(
"Unsupported version of data segment Depthmap\n");
393 m_frameNum = readUnalignLittleEndian<uint32_t>(&*itBuf);
394 itBuf +=
sizeof(uint32_t);
397 itBuf +=
sizeof(uint8_t);
399 m_flags = readUnalignLittleEndian<uint16_t>(&*itBuf);
400 itBuf +=
sizeof(uint16_t);
404 if (numBytesDistance != 0)
408 itBuf += numBytesDistance;
414 if (numBytesIntensity != 0)
418 itBuf += numBytesIntensity;
424 if (numBytesState != 0)
427 memcpy(&
m_stateMap[0], &*itBuf, numBytesState);
428 itBuf += numBytesState;
441 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
442 itBuf +=
sizeof(uint32_t);
446 const uint32_t dataSize = length - 8u;
447 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
450 if (crc32 != crc32Calculated)
452 std::printf(
"Malformed data, CRC32 checksum of data segment ROI does not match.\n");
458 if ((length +
sizeof(uint32_t)) != size)
460 std::printf(
"Malformed data, length of data segment ROI does not match package size.\n");
466 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
469 if (length != lengthCopy)
471 std::printf(
"Malformed data, length does not match ROI data segment size.\n");
478 itBuf +=
sizeof(uint64_t);
480 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
481 itBuf +=
sizeof(uint16_t);
483 if (version != VERSION_SEGMENT_ROI)
485 std::printf(
"Unsupported version of data segment ROI\n");
499 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
500 itBuf +=
sizeof(uint32_t);
504 const uint32_t dataSize = length - 8u;
505 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
508 if (crc32 != crc32Calculated)
510 std::printf(
"Malformed data, CRC32 checksum of data segment Device Status does not match.\n");
516 if ((length +
sizeof(uint32_t)) != size)
518 std::printf(
"Malformed data, length of Device Status header does not match package size.\n");
524 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
527 if (length != lengthCopy)
529 std::printf(
"Malformed data, length does not match Device Status data segment size.\n");
536 itBuf +=
sizeof(uint64_t);
538 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
539 itBuf +=
sizeof(uint16_t);
541 if (version != VERSION_SEGMENT_DEVICESTATUS)
543 std::printf(
"Unsupported version of data segment Device Status\n");
557 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
558 itBuf +=
sizeof(uint32_t);
562 const uint32_t dataSize = length - 8u;
563 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
566 if (crc32 != crc32Calculated)
568 std::printf(
"Malformed data, CRC32 checksum of data segment Device Status does not match.\n");
574 if ((length +
sizeof(uint32_t)) != size)
576 std::printf(
"Malformed data, length of Device Status header does not match package size.\n");
582 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
585 if (length != lengthCopy)
587 std::printf(
"Malformed data, length does not match Local I/Os data segment size.\n");
594 itBuf +=
sizeof(uint64_t);
596 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
597 itBuf +=
sizeof(uint16_t);
599 if (version != VERSION_SEGMENT_LOCALIOS)
601 std::printf(
"Unsupported version of data segment Local IO\n");
614 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
615 itBuf +=
sizeof(uint32_t);
619 const uint32_t dataSize = length - 8u;
620 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
623 if (crc32 != crc32Calculated)
626 "Malformed data, CRC32 checksum of data segment Field Information does not match.\n");
632 if ((length +
sizeof(uint32_t)) != size)
635 "Malformed data, length of data segment Field Information does not match package size.\n");
641 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
644 if (length != lengthCopy)
646 std::printf(
"Malformed data, length does not match Field Information data segment size.\n");
654 itBuf +=
sizeof(uint64_t);
656 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
657 itBuf +=
sizeof(uint16_t);
659 if (version != VERSION_SEGMENT_FIELDINFORMATION)
661 std::printf(
"Unsupported version of data segment Field Information\n");
675 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
677 itBuf +=
sizeof(uint32_t);
681 const uint32_t dataSize = length - 8u;
682 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
685 if (crc32 != crc32Calculated)
687 std::printf(
"Malformed data, CRC32 checksum of data segment Logic Signals does not match.\n");
693 if ((length +
sizeof(uint32_t)) != size)
696 "Malformed data, length of data segment Logic Signals does not match package size.\n");
702 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
705 if (length != lengthCopy)
707 std::printf(
"Malformed data, length does not match Logic Signals data segment size.\n");
714 itBuf +=
sizeof(uint64_t);
716 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
717 itBuf +=
sizeof(uint16_t);
719 if (version != VERSION_SEGMENT_LOGICSIGNALS)
721 std::printf(
"Unsupported version of data segment Logic Signals \n");
735 const uint32_t length = readUnalignLittleEndian<uint32_t>(&*itBuf);
737 itBuf +=
sizeof(uint32_t);
741 const uint32_t dataSize = length - 8u;
742 const uint32_t crc32 = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize));
745 if (crc32 != crc32Calculated)
747 std::printf(
"Malformed data, CRC32 checksum of data segment IMU does not match.\n");
753 if ((length +
sizeof(uint32_t)) != size)
755 std::printf(
"Malformed data, length of data segment IMU does not match package size.\n");
761 const uint32_t lengthCopy = readUnalignLittleEndian<uint32_t>(&*(itBuf + dataSize + 4));
764 if (length != lengthCopy)
766 std::printf(
"Malformed data, length does not match IMU data segment size.\n");
773 itBuf +=
sizeof(uint64_t);
775 const uint16_t version = readUnalignLittleEndian<uint16_t>(&*itBuf);
776 itBuf +=
sizeof(uint16_t);
778 if (version != VERSION_SEGMENT_IMU)
780 std::printf(
"Unsupported version of data segment IMU \n");
819 return (
m_flags & DISTANCE_MAP_FILTERED_FLAG);
824 return (
m_flags & INTRUDED_PIXEL_STATE_VALID_FLAG);