Skip to content

Commit d5e7d18

Browse files
committed
Add serializing for missing types
1 parent 173e3c3 commit d5e7d18

2 files changed

Lines changed: 206 additions & 2 deletions

File tree

include/ur_client_library/comm/package_serializer.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@
3030
#define UR_CLIENT_LIBRARY_PACKAGE_SERIALIZER_H_INCLUDED
3131

3232
#include <endian.h>
33+
#include <cstdint>
3334
#include <cstring>
35+
#include <string>
36+
37+
#include "ur_client_library/types.h"
3438

3539
namespace urcl
3640
{
@@ -71,6 +75,7 @@ class PackageSerializer
7175
*/
7276
static size_t serialize(uint8_t* buffer, double val)
7377
{
78+
static_assert(sizeof(double) == sizeof(uint64_t), "Unexpected double size");
7479
size_t size = sizeof(double);
7580
uint64_t inner;
7681
std::memcpy(&inner, &val, size);
@@ -79,6 +84,25 @@ class PackageSerializer
7984
return size;
8085
}
8186

87+
/*!
88+
* \brief A serialization method for float values.
89+
*
90+
* \param buffer The buffer to write the serialization into.
91+
* \param val The value to serialize.
92+
*
93+
* \returns Size in byte of the serialization.
94+
*/
95+
static size_t serialize(uint8_t* buffer, float val)
96+
{
97+
static_assert(sizeof(float) == sizeof(uint32_t), "Unexpected float size");
98+
size_t size = sizeof(float);
99+
uint32_t inner;
100+
std::memcpy(&inner, &val, size);
101+
inner = encode(inner);
102+
std::memcpy(buffer, &inner, size);
103+
return size;
104+
}
105+
82106
/*!
83107
* \brief A serialization method for strings.
84108
*
@@ -98,6 +122,24 @@ class PackageSerializer
98122
return val.size();
99123
}
100124

125+
/*!
126+
* \brief A serialization method for std::arrays (works for urcl::vector6d_t, etc).
127+
*
128+
* \param buffer The buffer to write the serialization into.
129+
* \param val The string to serialize.
130+
*
131+
* \returns Size in byte of the serialization.
132+
*/
133+
template <typename T, size_t N>
134+
static size_t serialize(uint8_t* buffer, const std::array<T, N>& val)
135+
{
136+
for (size_t i = 0; i < N; ++i)
137+
{
138+
serialize(buffer + i * sizeof(T), val[i]);
139+
}
140+
return N * sizeof(T);
141+
}
142+
101143
private:
102144
template <typename T>
103145
static T encode(T val)

tests/test_package_serializer.cpp

Lines changed: 164 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,26 @@ TEST(package_serializer, serialize_int32)
6969
{
7070
uint8_t buffer[sizeof(int32_t)];
7171
size_t expected_size = sizeof(int32_t);
72-
size_t actual_size = comm::PackageSerializer::serialize<int32_t>(buffer, 2341);
72+
size_t actual_size = comm::PackageSerializer::serialize<int32_t>(buffer, -2341);
73+
74+
EXPECT_EQ(expected_size, actual_size);
75+
int32_t val;
76+
std::memcpy(&val, buffer, sizeof(int32_t));
77+
int32_t decoded = be32toh(val);
78+
EXPECT_EQ(decoded, -2341);
79+
80+
uint8_t expected_buffer[] = { 0xFF, 0xFF, 0xF6, 0xDB };
81+
for (unsigned int i = 0; i < actual_size; ++i)
82+
{
83+
EXPECT_EQ(expected_buffer[i], buffer[i]);
84+
}
85+
}
86+
87+
TEST(package_serializer, serialize_uint32)
88+
{
89+
uint8_t buffer[sizeof(uint32_t)];
90+
size_t expected_size = sizeof(uint32_t);
91+
size_t actual_size = comm::PackageSerializer::serialize<uint32_t>(buffer, 2341);
7392

7493
EXPECT_EQ(expected_size, actual_size);
7594

@@ -80,9 +99,152 @@ TEST(package_serializer, serialize_int32)
8099
}
81100
}
82101

102+
TEST(package_serializer, serialize_int16)
103+
{
104+
uint8_t buffer[sizeof(int16_t)];
105+
size_t expected_size = sizeof(int16_t);
106+
size_t actual_size = comm::PackageSerializer::serialize<int16_t>(buffer, -2341);
107+
108+
EXPECT_EQ(expected_size, actual_size);
109+
110+
uint8_t expected_buffer[] = { 0xF6, 0xDB };
111+
for (unsigned int i = 0; i < actual_size; ++i)
112+
{
113+
EXPECT_EQ(expected_buffer[i], buffer[i]);
114+
}
115+
}
116+
117+
TEST(package_serializer, serialize_uint16)
118+
{
119+
uint8_t buffer[sizeof(uint16_t)];
120+
size_t expected_size = sizeof(uint16_t);
121+
size_t actual_size = comm::PackageSerializer::serialize<uint16_t>(buffer, 2341);
122+
123+
EXPECT_EQ(expected_size, actual_size);
124+
125+
uint8_t expected_buffer[] = { 0x09, 0x25 };
126+
for (unsigned int i = 0; i < actual_size; ++i)
127+
{
128+
EXPECT_EQ(expected_buffer[i], buffer[i]);
129+
}
130+
}
131+
132+
TEST(package_serializer, serialize_vector6d)
133+
{
134+
vector6d_t target{ 1.0, 3.14, 42, -2.345, 2.0, 0 };
135+
uint8_t buffer[sizeof(vector6d_t)];
136+
size_t expected_size = sizeof(vector6d_t);
137+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
138+
139+
EXPECT_EQ(expected_size, actual_size);
140+
141+
for (size_t i = 0; i < target.size(); ++i)
142+
{
143+
uint64_t tmp;
144+
std::memcpy(&tmp, &buffer[i * sizeof(double)], sizeof(double));
145+
uint64_t decoded = be64toh(tmp);
146+
double decoded_double;
147+
std::memcpy(&decoded_double, &decoded, sizeof(double));
148+
EXPECT_DOUBLE_EQ(decoded_double, target[i]);
149+
}
150+
}
151+
152+
TEST(package_serializer, serialize_vector3d)
153+
{
154+
vector3d_t target{ 1.0, 3.14, -42 };
155+
uint8_t buffer[sizeof(vector3d_t)];
156+
size_t expected_size = sizeof(vector3d_t);
157+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
158+
159+
EXPECT_EQ(expected_size, actual_size);
160+
161+
for (size_t i = 0; i < target.size(); ++i)
162+
{
163+
uint64_t tmp;
164+
std::memcpy(&tmp, &buffer[i * sizeof(double)], sizeof(double));
165+
uint64_t decoded = be64toh(tmp);
166+
double decoded_double;
167+
std::memcpy(&decoded_double, &decoded, sizeof(double));
168+
EXPECT_DOUBLE_EQ(decoded_double, target[i]);
169+
}
170+
}
171+
172+
TEST(package_serializer, serialize_vector6int32)
173+
{
174+
vector6int32_t target{ 1, 0, -42 };
175+
uint8_t buffer[sizeof(target)];
176+
size_t expected_size = sizeof(target);
177+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
178+
179+
EXPECT_EQ(expected_size, actual_size);
180+
181+
for (size_t i = 0; i < target.size(); ++i)
182+
{
183+
int32_t tmp;
184+
std::memcpy(&tmp, &buffer[i * sizeof(int32_t)], sizeof(int32_t));
185+
int32_t decoded = be32toh(tmp);
186+
EXPECT_DOUBLE_EQ(decoded, target[i]);
187+
}
188+
}
189+
190+
TEST(package_serializer, serialize_vector6uint32)
191+
{
192+
vector6uint32_t target{ 1, 0, 42 };
193+
uint8_t buffer[sizeof(target)];
194+
size_t expected_size = sizeof(target);
195+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
196+
197+
EXPECT_EQ(expected_size, actual_size);
198+
199+
for (size_t i = 0; i < target.size(); ++i)
200+
{
201+
uint32_t tmp;
202+
std::memcpy(&tmp, &buffer[i * sizeof(uint32_t)], sizeof(uint32_t));
203+
uint32_t decoded = be32toh(tmp);
204+
EXPECT_DOUBLE_EQ(decoded, target[i]);
205+
}
206+
}
207+
208+
TEST(package_serializer, serialize_float)
209+
{
210+
float target = -2.345f;
211+
uint8_t buffer[sizeof(target)];
212+
size_t expected_size = sizeof(target);
213+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
214+
215+
EXPECT_EQ(expected_size, actual_size);
216+
217+
uint32_t tmp;
218+
std::memcpy(&tmp, &buffer, sizeof(uint32_t));
219+
uint32_t decoded = be32toh(tmp);
220+
float decoded_float;
221+
std::memcpy(&decoded_float, &decoded, sizeof(float));
222+
EXPECT_DOUBLE_EQ(decoded_float, target);
223+
}
224+
225+
TEST(package_serializer, serialize_bool)
226+
{
227+
bool target = false;
228+
uint8_t buffer[sizeof(target)];
229+
size_t expected_size = sizeof(target);
230+
size_t actual_size = comm::PackageSerializer::serialize(buffer, target);
231+
232+
EXPECT_EQ(expected_size, actual_size);
233+
234+
bool decoded_bool;
235+
std::memcpy(&decoded_bool, &buffer, sizeof(uint8_t));
236+
EXPECT_DOUBLE_EQ(decoded_bool, target);
237+
238+
target = false;
239+
actual_size = comm::PackageSerializer::serialize(buffer, target);
240+
EXPECT_EQ(expected_size, actual_size);
241+
std::memcpy(&decoded_bool, &buffer, sizeof(uint8_t));
242+
EXPECT_DOUBLE_EQ(decoded_bool, target);
243+
}
244+
83245
int main(int argc, char* argv[])
84246
{
85247
::testing::InitGoogleTest(&argc, argv);
86248

87249
return RUN_ALL_TESTS();
88-
}
250+
}

0 commit comments

Comments
 (0)