VisionaryDataStream.cpp
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
20 // -- END LICENSE BLOCK ------------------------------------------------
21 
22 #include <cstring>
23 #include <stdio.h>
24 
27 
28 namespace visionary {
29 
30 VisionaryDataStream::VisionaryDataStream(std::shared_ptr<VisionaryData> dataHandler)
31  : m_dataHandler(dataHandler)
32 {
33 }
34 
36 
37 bool VisionaryDataStream::open(const std::string& hostname, std::uint16_t port)
38 {
39  m_pTransport = nullptr;
40 
41  std::unique_ptr<TcpSocket> pTransport(new TcpSocket());
42 
43  if (pTransport->connect(hostname, port) != 0)
44  {
45  return false;
46  }
47 
48  m_pTransport = std::move(pTransport);
49 
50  return true;
51 }
52 
54 {
55  if (m_pTransport)
56  {
57  m_pTransport->shutdown();
58  m_pTransport = nullptr;
59  }
60 }
61 
63 {
64  size_t elements = 0;
65  std::vector<std::uint8_t> buffer;
66 
67  while (elements < 4)
68  {
69  if (m_pTransport->read(buffer, 1) < 1)
70  {
71  return false;
72  }
73  if (0x02 == buffer[0])
74  {
75  elements++;
76  }
77  else
78  {
79  elements = 0;
80  }
81  }
82 
83  return true;
84 }
85 
87 {
88  if (!syncCoLa())
89  {
90  return false;
91  }
92 
93  std::vector<uint8_t> buffer;
94 
95  // Read package length
96  if (m_pTransport->read(buffer, sizeof(uint32_t)) < (int)sizeof(uint32_t))
97  {
98  std::printf("Received less than the required 4 package length bytes.\n");
99  return false;
100  }
101 
102  const uint32_t packageLength = readUnalignBigEndian<uint32_t>(buffer.data());
103 
104  // Receive the frame data
105  int remainingBytesToReceive = packageLength;
106  m_pTransport->read(buffer, remainingBytesToReceive);
107 
108  // Check that protocol version and packet type are correct
109  const uint16_t protocolVersion = readUnalignBigEndian<uint16_t>(buffer.data());
110  const uint8_t packetType = readUnalignBigEndian<uint8_t>(buffer.data() + 2);
111  if (protocolVersion != 0x001)
112  {
113  std::printf("Received unknown protocol version %d.\n", protocolVersion);
114  return false;
115  }
116  if (packetType != 0x62)
117  {
118  std::printf("Received unknown packet type %d\n.", packetType);
119  return false;
120  }
121 
122  return parseSegmentBinaryData(buffer.begin() + 3); // Skip protocolVersion and packetType
123 }
124 
125 bool VisionaryDataStream::parseSegmentBinaryData(std::vector<uint8_t>::iterator itBuf)
126 {
127  bool result = false;
128  std::vector<uint8_t>::iterator itBufSegment = itBuf;
129 
130  //-----------------------------------------------
131  // Extract informations in Segment-Binary-Data
132  // const uint16_t blobID = readUnalignBigEndian<uint16_t>(&*itBufSegment);
133  itBufSegment += sizeof(uint16_t);
134  const uint16_t numSegments = readUnalignBigEndian<uint16_t>(&*itBufSegment);
135  itBufSegment += sizeof(uint16_t);
136 
137  // offset and changedCounter, 4 bytes each per segment
138  std::vector<uint32_t> offset(numSegments);
139  std::vector<uint32_t> changeCounter(numSegments);
140  for (int i = 0; i < numSegments; i++)
141  {
142  offset[i] = readUnalignBigEndian<uint32_t>(&*itBufSegment);
143  itBufSegment += sizeof(uint32_t);
144  changeCounter[i] = readUnalignBigEndian<uint32_t>(&*itBufSegment);
145  itBufSegment += sizeof(uint32_t);
146  }
147 
148  //-----------------------------------------------
149  // First segment contains the XML Metadata
150  std::string xmlSegment((itBuf + offset[0]), (itBuf + offset[1]));
151  if (m_dataHandler->parseXML(xmlSegment, changeCounter[0]))
152  {
153  //-----------------------------------------------
154  // Second segment contains Binary data
155  size_t binarySegmentSize = offset[2] - offset[1];
156  result = m_dataHandler->parseBinaryData((itBuf + offset[1]), binarySegmentSize);
157  }
158  return result;
159 }
160 
161 } // namespace visionary
VisionaryEndian.h
visionary::VisionaryDataStream::syncCoLa
bool syncCoLa() const
Definition: VisionaryDataStream.cpp:62
visionary::VisionaryDataStream::getNextFrame
bool getNextFrame()
Definition: VisionaryDataStream.cpp:86
visionary::VisionaryDataStream::VisionaryDataStream
VisionaryDataStream(std::shared_ptr< VisionaryData > dataHandler)
Definition: VisionaryDataStream.cpp:30
visionary
Definition: AuthenticationLegacy.h:25
VisionaryDataStream.h
visionary::VisionaryDataStream::close
void close()
Definition: VisionaryDataStream.cpp:53
visionary::VisionaryDataStream::~VisionaryDataStream
~VisionaryDataStream()
Definition: VisionaryDataStream.cpp:35
visionary::VisionaryDataStream::parseSegmentBinaryData
bool parseSegmentBinaryData(const std::vector< uint8_t >::iterator itBuf)
Definition: VisionaryDataStream.cpp:125
visionary::VisionaryDataStream::m_pTransport
std::unique_ptr< TcpSocket > m_pTransport
Definition: VisionaryDataStream.h:65
visionary::VisionaryDataStream::m_dataHandler
std::shared_ptr< VisionaryData > m_dataHandler
Definition: VisionaryDataStream.h:64
visionary::VisionaryDataStream::open
bool open(const std::string &hostname, std::uint16_t port)
Definition: VisionaryDataStream.cpp:37
visionary::TcpSocket
Definition: TcpSocket.h:50


sick_safevisionary_base
Author(s):
autogenerated on Sat Oct 21 2023 02:24:26