CoLaBProtocolHandler.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 {
30 }
31 
33 
34 bool CoLaBProtocolHandler::openSession(uint8_t /*sessionTimeout secs*/)
35 {
36  // we don't have a session id byte in CoLaB protocol. Nothing to do here.
37  return true;
38 }
39 
41 {
42  // we don't have a session id byte in CoLaB protocol. Nothing to do here.
43 }
44 
46 {
47  //
48  // convert cola cmd to vector buffer and add/fill header
49  //
50 
51  std::vector<std::uint8_t> buffer;
52  buffer = cmd.getBuffer();
53 
54  // insert magic bytes
55  const uint8_t MAGIC_BYTE = 0x02;
56  // inserts 8 bytes at front (Magic Bytes and length)
57  auto it = buffer.begin();
58  for (uint8_t i = 0; i < 8; i++)
59  {
60  it = buffer.insert(it, MAGIC_BYTE);
61  }
62  // Overwrite length
63  *reinterpret_cast<uint32_t*>(&buffer[4]) =
64  nativeToBigEndian(static_cast<uint32_t>(buffer.size()) - 8);
65 
66  // Add checksum to end
67  buffer.insert(buffer.end(), calculateChecksum(buffer));
68 
69  //
70  // send to socket
71  //
72 
73  m_rTransport.send(buffer);
74  buffer.clear();
75 
76  //
77  // get response
78  //
79 
80  size_t stxRecv = 0;
81 
82  while (stxRecv < 4)
83  {
84  if (m_rTransport.recv(buffer, 1) < 1)
85  {
86  break;
87  }
88  if (0x02 == buffer[0])
89  {
90  stxRecv++;
91  }
92  else
93  {
94  stxRecv = 0;
95  }
96  }
97  buffer.clear();
98 
99  if (stxRecv == 4)
100  {
101  // get length
102  m_rTransport.read(buffer, sizeof(uint32_t));
103  const uint32_t length = readUnalignBigEndian<uint32_t>(buffer.data()) +
104  1; // packetlength is only the data without STx, Packet Length and
105  // Checksum, add Checksum to get end of data
106  buffer.clear();
107  m_rTransport.read(buffer, length);
108  }
109 
110  CoLaCommand response(buffer);
111  return response;
112 }
113 
114 uint8_t CoLaBProtocolHandler::calculateChecksum(const std::vector<uint8_t>& buffer)
115 {
116  uint8_t checksum = 0;
117  for (size_t i = 8; i < buffer.size(); i++)
118  {
119  checksum ^= buffer[i];
120  }
121  return checksum;
122 }
123 
124 } // namespace visionary
visionary::nativeToBigEndian
T nativeToBigEndian(T x)
Definition: VisionaryEndian.h:164
VisionaryEndian.h
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::ITransport::recv
virtual int recv(std::vector< std::uint8_t > &buffer, std::size_t maxBytesToReceive)=0
visionary::CoLaBProtocolHandler::openSession
bool openSession(uint8_t sessionTimeout)
Definition: CoLaBProtocolHandler.cpp:34
visionary::CoLaBProtocolHandler::m_rTransport
ITransport & m_rTransport
Definition: CoLaBProtocolHandler.h:42
visionary::CoLaBProtocolHandler::CoLaBProtocolHandler
CoLaBProtocolHandler(ITransport &rTransport)
Definition: CoLaBProtocolHandler.cpp:27
visionary::CoLaBProtocolHandler::~CoLaBProtocolHandler
~CoLaBProtocolHandler()
Definition: CoLaBProtocolHandler.cpp:32
visionary::CoLaCommand::getBuffer
const std::vector< uint8_t > & getBuffer()
Get the binary data buffer.
Definition: CoLaCommand.cpp:93
visionary::CoLaBProtocolHandler::closeSession
void closeSession()
Definition: CoLaBProtocolHandler.cpp:40
visionary::CoLaBProtocolHandler::calculateChecksum
uint8_t calculateChecksum(const std::vector< uint8_t > &buffer)
Definition: CoLaBProtocolHandler.cpp:114
CoLaBProtocolHandler.h
visionary::ITransport
Definition: ITransport.h:31
visionary::CoLaBProtocolHandler::send
CoLaCommand send(CoLaCommand cmd)
Definition: CoLaBProtocolHandler.cpp:45


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