CoLaParameterWriter.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include "CoLaParameterWriter.h"
7 
8 #include "MD5.h"
9 #include "VisionaryEndian.h"
10 
11 #include <algorithm> // for min
12 #include <cstring> // for strlen
13 #include <limits> // for int max
14 
15 namespace visionary {
16 
17 CoLaParameterWriter::CoLaParameterWriter(CoLaCommandType::Enum type, const char* name) : m_type(type), m_name(name)
18 {
20 }
21 
23 
25 {
26  m_buffer.push_back(static_cast<uint8_t>(sInt));
27  return *this;
28 }
29 
31 {
32  m_buffer.push_back(uSInt);
33  return *this;
34 }
35 
37 {
38  const int16_t bigEndianValue = nativeToBigEndian(integer);
39  m_buffer.insert(m_buffer.end(),
40  reinterpret_cast<const uint8_t*>(&bigEndianValue),
41  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 2);
42  return *this;
43 }
44 
46 {
47  const uint16_t bigEndianValue = nativeToBigEndian(uInt);
48  m_buffer.insert(m_buffer.end(),
49  reinterpret_cast<const uint8_t*>(&bigEndianValue),
50  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 2);
51  return *this;
52 }
53 
55 {
56  const int32_t bigEndianValue = nativeToBigEndian(dInt);
57  m_buffer.insert(m_buffer.end(),
58  reinterpret_cast<const uint8_t*>(&bigEndianValue),
59  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 4);
60  return *this;
61 }
62 
64 {
65  const uint32_t bigEndianValue = nativeToBigEndian(uDInt);
66  m_buffer.insert(m_buffer.end(),
67  reinterpret_cast<const uint8_t*>(&bigEndianValue),
68  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 4);
69  return *this;
70 }
71 
73 {
74  const float bigEndianValue = nativeToBigEndian(real);
75  m_buffer.insert(m_buffer.end(),
76  reinterpret_cast<const uint8_t*>(&bigEndianValue),
77  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 4);
78  return *this;
79 }
80 
82 {
83  const double bigEndianValue = nativeToBigEndian(lReal);
84  m_buffer.insert(m_buffer.end(),
85  reinterpret_cast<const uint8_t*>(&bigEndianValue),
86  reinterpret_cast<const uint8_t*>(&bigEndianValue) + 8);
87  return *this;
88 }
89 
91 {
92  *this << static_cast<uint8_t>(boolean);
93  return *this;
94 }
95 
97 {
98  uint32_t valueUDInt = 0;
99 
100  const unsigned char* byteData = MD5(str).getDigest();
101 
102  // 128 bit to 32 bit using XOR
103  int byte0 = byteData[0] ^ byteData[4] ^ byteData[8] ^ byteData[12];
104  int byte1 = byteData[1] ^ byteData[5] ^ byteData[9] ^ byteData[13];
105  int byte2 = byteData[2] ^ byteData[6] ^ byteData[10] ^ byteData[14];
106  int byte3 = byteData[3] ^ byteData[7] ^ byteData[11] ^ byteData[15];
107  valueUDInt = static_cast<uint32_t>(byte0 | (byte1 << 8) | (byte2 << 16) | (byte3 << 24));
108 
109  // Add as UDInt, it is already big endian
110  parameterUDInt(valueUDInt);
111 
112  return *this;
113 }
114 
116 {
117  // Add length of string
118  const size_t slen = str.length();
119  const size_t max_slen = std::numeric_limits<uint16_t>::max();
120  const size_t efflen = std::min(slen, max_slen);
121  parameterUInt(static_cast<uint16_t>(efflen));
122 
123  // Add string
124  m_buffer.insert(
125  m_buffer.end(), str.begin(), str.begin() + static_cast<std::string::iterator::difference_type>(efflen));
126 
127  return *this;
128 }
129 
131 {
132  m_buffer.insert(m_buffer.end(), str, str + std::strlen(str));
133  return *this;
134 }
135 
137 {
138  return parameterSInt(sInt);
139 }
140 
142 {
143  return parameterUSInt(uSInt);
144 }
145 
147 {
148  return parameterInt(integer);
149 }
150 
152 {
153  return parameterUInt(uInt);
154 }
155 
157 {
158  return parameterDInt(dInt);
159 }
160 
162 {
163  return parameterUDInt(uDInt);
164 }
165 
167 {
168  return parameterReal(real);
169 }
170 
172 {
173  return parameterLReal(lReal);
174 }
175 
177 {
178  return parameterBool(boolean);
179 }
180 
182 {
183  // Copy buffer
184  std::vector<uint8_t> buffer = m_buffer;
185 
186  return CoLaCommand(buffer);
187 }
188 
190 {
191  // Write command type
192  switch (type)
193  {
195  *this << "sRN ";
196  break;
198  *this << "sRA ";
199  break;
201  *this << "sWN ";
202  break;
204  *this << "sWA ";
205  break;
207  *this << "sMN ";
208  break;
210  *this << "sAN ";
211  break;
213  *this << "sFA";
214  break;
215  default:
216  return;
217  }
218 
219  // Write command name
220  *this << name << " ";
221 }
222 
223 } // namespace visionary
visionary::CoLaParameterWriter::operator<<
CoLaParameterWriter & operator<<(const char *str)
Add a string parameter, must be null-terminated.
Definition: CoLaParameterWriter.cpp:130
visionary::CoLaParameterWriter::parameterUSInt
CoLaParameterWriter & parameterUSInt(const uint8_t uSInt)
Add a unsigned short (8-bit, range [0, 255]).
Definition: CoLaParameterWriter.cpp:30
visionary::CoLaParameterWriter::parameterInt
CoLaParameterWriter & parameterInt(const int16_t integer)
Add a signed int (16-bit).
Definition: CoLaParameterWriter.cpp:36
VisionaryEndian.h
visionary
Definition: MD5.cpp:44
visionary::CoLaParameterWriter
Builder for constructing CoLaCommands.
Definition: CoLaParameterWriter.h:19
visionary::CoLaCommand
Definition: CoLaCommand.h:17
visionary::CoLaParameterWriter::parameterBool
CoLaParameterWriter & parameterBool(const bool boolean)
Add a boolean as a byte, with 0 representing false, and 1 representing true.
Definition: CoLaParameterWriter.cpp:90
visionary::CoLaParameterWriter::CoLaParameterWriter
CoLaParameterWriter(CoLaCommandType::Enum type, const char *name)
Construct a new CoLaParameterWriter.
Definition: CoLaParameterWriter.cpp:17
visionary::CoLaCommandType::WRITE_VARIABLE
@ WRITE_VARIABLE
Definition: CoLaCommandType.h:18
CoLaParameterWriter.h
MD5.h
visionary::CoLaParameterWriter::parameterFlexString
CoLaParameterWriter & parameterFlexString(const std::string &str)
Add a string as a flex string.
Definition: CoLaParameterWriter.cpp:115
visionary::nativeToBigEndian
T nativeToBigEndian(const T &val)
Definition: VisionaryEndian.h:296
visionary::CoLaCommandType::READ_VARIABLE
@ READ_VARIABLE
Definition: CoLaCommandType.h:16
visionary::CoLaParameterWriter::m_buffer
std::vector< uint8_t > m_buffer
Definition: CoLaParameterWriter.h:24
visionary::CoLaParameterWriter::parameterUDInt
CoLaParameterWriter & parameterUDInt(const uint32_t uDInt)
Add an unsigned double int (32-bit, range [0, 4294967295]).
Definition: CoLaParameterWriter.cpp:63
visionary::CoLaParameterWriter::m_type
CoLaCommandType::Enum m_type
Definition: CoLaParameterWriter.h:22
visionary::CoLaCommandType::WRITE_VARIABLE_RESPONSE
@ WRITE_VARIABLE_RESPONSE
Definition: CoLaCommandType.h:19
visionary::MD5
Definition: MD5.h:52
visionary::MD5::getDigest
const unsigned char * getDigest() const
Definition: MD5.cpp:357
visionary::CoLaCommandType::METHOD_INVOCATION
@ METHOD_INVOCATION
Definition: CoLaCommandType.h:20
visionary::CoLaCommandType::READ_VARIABLE_RESPONSE
@ READ_VARIABLE_RESPONSE
Definition: CoLaCommandType.h:17
visionary::CoLaParameterWriter::parameterSInt
CoLaParameterWriter & parameterSInt(const int8_t sInt)
Add a signed short (8-bit, range [-128, 127]).
Definition: CoLaParameterWriter.cpp:24
visionary::CoLaCommandType::Enum
Enum
Definition: CoLaCommandType.h:12
visionary::CoLaParameterWriter::parameterUInt
CoLaParameterWriter & parameterUInt(const uint16_t uInt)
Add a unsigned int (16-bit, range [0, 65535]).
Definition: CoLaParameterWriter.cpp:45
visionary::CoLaParameterWriter::~CoLaParameterWriter
~CoLaParameterWriter()
visionary::CoLaParameterWriter::parameterLReal
CoLaParameterWriter & parameterLReal(const double lReal)
Add a IEEE-754 double precision (64-bit).
Definition: CoLaParameterWriter.cpp:81
visionary::CoLaCommandType::COLA_ERROR
@ COLA_ERROR
Definition: CoLaCommandType.h:22
visionary::CoLaParameterWriter::m_name
const char * m_name
Definition: CoLaParameterWriter.h:23
visionary::CoLaParameterWriter::parameterReal
CoLaParameterWriter & parameterReal(const float real)
Add a IEEE-754 single precision (32-bit).
Definition: CoLaParameterWriter.cpp:72
visionary::CoLaCommandType::METHOD_RETURN_VALUE
@ METHOD_RETURN_VALUE
Definition: CoLaCommandType.h:21
visionary::CoLaParameterWriter::parameterPasswordMD5
CoLaParameterWriter & parameterPasswordMD5(const std::string &str)
Add the given password as a UDInt, using MD5 hashing.
Definition: CoLaParameterWriter.cpp:96
visionary::CoLaParameterWriter::writeHeader
void writeHeader(CoLaCommandType::Enum type, const char *name)
Definition: CoLaParameterWriter.cpp:189
visionary::CoLaParameterWriter::parameterDInt
CoLaParameterWriter & parameterDInt(const int32_t dInt)
Add an signed double int (32-bit).
Definition: CoLaParameterWriter.cpp:54
visionary::CoLaParameterWriter::build
const CoLaCommand build()
Definition: CoLaParameterWriter.cpp:181


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:38:05