staubli_driver_ros2 main
ROS2 control driver for Staubli robots
Loading...
Searching...
No Matches
serialization.hpp
Go to the documentation of this file.
1// Copyright 2025 ICUBE Laboratory, University of Strasbourg
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// Author: Thibault Poignonec (thibault.poignonec@gmail.fr)
16
17#ifndef STAUBLI_ROBOT_DRIVER__COMMUNICATION__SERIALIZATION_HPP_
18#define STAUBLI_ROBOT_DRIVER__COMMUNICATION__SERIALIZATION_HPP_
19
20#include <cstdint>
21#include <vector>
22#include <array>
23#include <string>
24#include <cstring>
25
26
27// Ensure code is compiled on a little-endian system
28#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__)
29 #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
30 #error "This code requires a little-endian system"
31 #endif
32#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)
33 #if __BYTE_ORDER != __LITTLE_ENDIAN
34 #error "This code requires a little-endian system"
35 #endif
36#elif defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN)
37 #if _BYTE_ORDER != _LITTLE_ENDIAN
38 #error "This code requires a little-endian system"
39 #endif
40#else
41 #error "Unknown endianness, cannot determine if system is little-endian"
42#endif
43
44namespace staubli_robot_driver {
45
46// Serialization specializations
47
48// size_t serialize_type(const bool& value, uint8_t* buffer)
49// {
50// buffer[0] = value ? 0xFF : 0x00;
51// return sizeof(uint8_t);
52// }
53
54inline size_t serialize_type(const uint8_t& value, uint8_t* buffer)
55{
56 buffer[0] = value;
57 return sizeof(value);
58}
59
60inline size_t serialize_type(const uint16_t& value, uint8_t* buffer)
61{
62 memcpy(buffer, &value, sizeof(value));
63 return sizeof(value);
64}
65
66inline size_t serialize_type(const uint32_t& value, uint8_t* buffer)
67{
68 memcpy(buffer, &value, sizeof(value));
69 return sizeof(value);
70}
71
72inline size_t serialize_type(const float& value, uint8_t* buffer)
73{
74 memcpy(buffer, &value, sizeof(value));
75 return sizeof(value);
76}
77
79inline size_t serialize_type(const double& value, uint8_t* buffer)
80{
81 float value_float = static_cast<float>(value);
82 return serialize_type(value_float, buffer);
83}
84
85// Deserialization specializations
86
87// size_t deserialize_type(const uint8_t* buffer, bool& value)
88// {
89// value = buffer[0] != 0;
90// return sizeof(uint8_t);
91// }
92
93inline size_t deserialize_type(const uint8_t* buffer, uint8_t& value)
94{
95 value = buffer[0];
96 return sizeof(value);
97}
98
99inline size_t deserialize_type(const uint8_t* buffer, uint16_t& value)
100{
101 memcpy(&value, buffer, sizeof(value));
102 return sizeof(value);
103}
104
105inline size_t deserialize_type(const uint8_t* buffer, uint32_t& value)
106{
107 memcpy(&value, buffer, sizeof(value));
108 return sizeof(value);
109}
110
111inline size_t deserialize_type(const uint8_t* buffer, float& value)
112{
113 memcpy(&value, buffer, sizeof(value));
114 return sizeof(value);
115}
116
118inline size_t deserialize_type(const uint8_t* buffer, double& value)
119{
120 float value_float;
121 size_t bytes_read = deserialize_type(buffer, value_float);
122 value = static_cast<double>(value_float);
123 return bytes_read;
124}
125
126// Array serialization/deserialization
127
137template<typename T, std::size_t N>
138size_t serialize_array(const std::array<T, N>& arr, uint8_t* buffer)
139{
140 size_t offset = 0;
141 for (const auto& item : arr) {
142 offset += serialize_type(item, buffer + offset);
143 }
144 return offset;
145}
146
156template<typename T, std::size_t N>
157size_t deserialize_array(const uint8_t* buffer, std::array<T, N>& arr)
158{
159 size_t offset = 0;
160 for (auto& item : arr) {
161 offset += deserialize_type(buffer + offset, item);
162 }
163 return offset;
164}
165
166} // namespace staubli_robot_driver
167
168#endif // STAUBLI_ROBOT_DRIVER__COMMUNICATION__SERIALIZATION_HPP_
Definition messages.hpp:23
size_t deserialize_type(const uint8_t *buffer, uint8_t &value)
Definition serialization.hpp:93
size_t serialize_array(const std::array< T, N > &arr, uint8_t *buffer)
Serialize an array of type T into a byte buffer.
Definition serialization.hpp:138
size_t deserialize_array(const uint8_t *buffer, std::array< T, N > &arr)
Deserialize an array of type T from a byte buffer.
Definition serialization.hpp:157
size_t serialize_type(const uint8_t &value, uint8_t *buffer)
Definition serialization.hpp:54