CoLa2ProtocolHandler.cpp
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
20 // -- END LICENSE BLOCK ------------------------------------------------
21 
24 
25 namespace visionary {
26 
28  : m_rTransport(rTransport)
29  , m_ReqID(0)
30  , m_sessionID(0)
31 {
32 }
33 
35 
36 bool CoLa2ProtocolHandler::openSession(uint8_t sessionTimeout /*secs*/)
37 {
38  // TODO: request session id and open session
39  std::vector<std::uint8_t> buffer = createCoLa2Header();
40  buffer.push_back('O'); // Open Session
41  buffer.push_back('x');
42  buffer.push_back(sessionTimeout); // sessionTimeout secs timeout
43 
44  // set length of client ID (flex string)
45  buffer.insert(buffer.end(), {0, 0});
46  *reinterpret_cast<uint16_t*>(&buffer[19]) = nativeToColaByteOrder<uint16_t>(2u);
47 
48  // set client ID
49  buffer.insert(buffer.end(), {'E', 'x'}); // Example flexstring, max 32 bytes
50 
51  // Overwrite length
52  *reinterpret_cast<uint32_t*>(&buffer[4]) =
53  nativeToBigEndian(static_cast<uint32_t>(buffer.size()) - 8);
54 
55  //
56  // send to socket
57  //
58 
59  m_rTransport.send(buffer);
60  buffer.clear();
61 
62  //
63  // get response
64  //
65 
66  m_rTransport.read(buffer, sizeof(uint32_t));
67  // check for magic bytes
68  const std::vector<uint8_t> MagicBytes = {0x02, 0x02, 0x02, 0x02};
69  bool result = std::equal(MagicBytes.begin(), MagicBytes.end(), buffer.begin());
70  if (result)
71  {
72  // get length
73  m_rTransport.read(buffer, sizeof(uint32_t));
74  const uint32_t length = readUnalignBigEndian<uint32_t>(buffer.data());
75  m_rTransport.read(buffer, length);
76  }
77  else
78  {
79  // drop invalid data
80  buffer.clear();
81  }
82  CoLaCommand response(buffer);
83 
84  m_sessionID = readUnalignBigEndian<uint32_t>(buffer.data() + 2);
85  return true;
86 }
87 
89 {
90  // TODO: close session
91 }
92 
94 {
95  return ++m_ReqID;
96 }
97 
98 std::vector<std::uint8_t> CoLa2ProtocolHandler::createCoLa2Header()
99 {
100  std::vector<std::uint8_t> header;
101 
102  // insert magic bytes
103  const uint8_t MAGIC_BYTE = 0x02;
104  // inserts 8 bytes at front (Magic Bytes and length)
105  for (uint8_t i = 0; i < 8; i++)
106  {
107  header.push_back(MAGIC_BYTE);
108  }
109  // add HubCntr
110  header.push_back(0); // TBD
111 
112  // add NoC
113  header.push_back(0); // TBD
114 
115  // add SockIdx0
116  // header.insert(header.end(), { 0, 0, 0, 1 }); // TBD
117 
118  // add SessionID
119  header.insert(header.end(), {0, 0, 0, 0});
120  *reinterpret_cast<uint32_t*>(&header[10]) = nativeToBigEndian(static_cast<uint32_t>(m_sessionID));
121  // add ReqID
122  header.insert(header.end(), {0, 0});
123  *reinterpret_cast<uint16_t*>(&header[14]) = nativeToBigEndian(static_cast<uint16_t>(getReqId()));
124 
125  return header;
126 }
127 
129 {
130  //
131  // convert cola cmd to vector buffer and add/fill header
132  //
133 
134  std::vector<std::uint8_t> buffer;
135  buffer = cmd.getBuffer();
136 
137  std::vector<std::uint8_t> header = createCoLa2Header();
138 
139  buffer.erase(buffer.begin()); // remove 's' from CoLaCommand buffer, not used in CoLa2
140  buffer.insert(buffer.begin(), header.begin(), header.end());
141  header.clear();
142 
143  // Overwrite length
144  *reinterpret_cast<uint32_t*>(&buffer[4]) =
145  nativeToBigEndian(static_cast<uint32_t>(buffer.size()) - 8);
146 
147  // Add checksum to end
148  // buffer.insert(buffer.end(), calculateChecksum(buffer));
149 
150  //
151  // send to socket
152  //
153 
154  m_rTransport.send(buffer);
155  buffer.clear();
156 
157  //
158  // get response
159  //
160 
161  m_rTransport.read(buffer, sizeof(uint32_t));
162  // check for magic bytes
163  const std::vector<uint8_t> MagicBytes = {0x02, 0x02, 0x02, 0x02};
164  bool result = std::equal(MagicBytes.begin(), MagicBytes.end(), buffer.begin());
165  if (result)
166  {
167  // get length
168  m_rTransport.read(buffer, sizeof(uint32_t));
169  const uint32_t length = readUnalignBigEndian<uint32_t>(buffer.data());
170  m_rTransport.read(buffer, length);
171  }
172  else
173  {
174  // drop invalid data
175  buffer.clear();
176  }
177  buffer.erase(buffer.begin(), buffer.begin() + 8); // drop header
178  buffer.insert(buffer.begin(), 's'); // insert 's'
179  CoLaCommand response(buffer);
180  return response;
181 }
182 
183 uint8_t CoLa2ProtocolHandler::calculateChecksum(const std::vector<uint8_t>& buffer)
184 {
185  uint8_t checksum = 0;
186  for (size_t i = 8; i < buffer.size(); i++)
187  {
188  checksum ^= buffer[i];
189  }
190  return checksum;
191 }
192 
193 } // namespace visionary
visionary::nativeToBigEndian
T nativeToBigEndian(T x)
Definition: VisionaryEndian.h:164
visionary::CoLa2ProtocolHandler::m_sessionID
uint32_t m_sessionID
Definition: CoLa2ProtocolHandler.h:44
VisionaryEndian.h
visionary::CoLa2ProtocolHandler::~CoLa2ProtocolHandler
~CoLa2ProtocolHandler()
Definition: CoLa2ProtocolHandler.cpp:34
visionary::ITransport::send
virtual int send(const std::vector< std::uint8_t > &buffer)=0
visionary::ITransport::read
virtual int read(std::vector< std::uint8_t > &buffer, std::size_t nBytesToReceive)=0
visionary
Definition: AuthenticationLegacy.h:25
visionary::CoLaCommand
Definition: CoLaCommand.h:32
visionary::CoLa2ProtocolHandler::closeSession
void closeSession()
Definition: CoLa2ProtocolHandler.cpp:88
visionary::CoLa2ProtocolHandler::openSession
bool openSession(uint8_t sessionTimeout)
Definition: CoLa2ProtocolHandler.cpp:36
visionary::CoLa2ProtocolHandler::send
CoLaCommand send(CoLaCommand cmd)
Definition: CoLa2ProtocolHandler.cpp:128
CoLa2ProtocolHandler.h
visionary::CoLa2ProtocolHandler::getReqId
uint16_t getReqId()
Definition: CoLa2ProtocolHandler.cpp:93
visionary::CoLaCommand::getBuffer
const std::vector< uint8_t > & getBuffer()
Get the binary data buffer.
Definition: CoLaCommand.cpp:93
visionary::CoLa2ProtocolHandler::calculateChecksum
uint8_t calculateChecksum(const std::vector< uint8_t > &buffer)
Definition: CoLa2ProtocolHandler.cpp:183
visionary::CoLa2ProtocolHandler::CoLa2ProtocolHandler
CoLa2ProtocolHandler(ITransport &rTransport)
Definition: CoLa2ProtocolHandler.cpp:27
visionary::CoLa2ProtocolHandler::createCoLa2Header
std::vector< std::uint8_t > createCoLa2Header()
Definition: CoLa2ProtocolHandler.cpp:98
visionary::CoLa2ProtocolHandler::m_ReqID
uint16_t m_ReqID
Definition: CoLa2ProtocolHandler.h:43
visionary::ITransport
Definition: ITransport.h:31
visionary::CoLa2ProtocolHandler::m_rTransport
ITransport & m_rTransport
Definition: CoLa2ProtocolHandler.h:42


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