UMRT Arm Firmware Library
utils.hpp
Go to the documentation of this file.
1 
6 #ifndef UMRT_ARM_FIRMWARE_LIB_UTILS_HPP
7 #define UMRT_ARM_FIRMWARE_LIB_UTILS_HPP
8 
9 #include <cstdint>
10 #include <string>
11 #include <vector>
12 
26 inline std::vector<uint8_t> pack_32(const uint32_t integer) {
27  return {
28  static_cast<uint8_t>(integer & 0xFF), // bits [7, 0]
29  static_cast<uint8_t>(integer >> 8 & 0xFF), // bits [15, 8]
30  static_cast<uint8_t>(integer >> 16 & 0xFF), // bits [23, 16]
31  static_cast<uint8_t>(integer >> 24 & 0xFF) // bits [31, 24]
32  };
33 }
34 
48 inline std::vector<uint8_t> pack_32_big(const uint32_t integer) {
49  return {
50  static_cast<uint8_t>(integer >> 24 & 0xFF), // bits [31, 24]
51  static_cast<uint8_t>(integer >> 16 & 0xFF), // bits [23, 16]
52  static_cast<uint8_t>(integer >> 8 & 0xFF), // bits [15, 8]
53  static_cast<uint8_t>(integer & 0xFF) // bits [7, 0]
54  };
55 }
56 
70 inline std::vector<uint8_t> pack_24_big(const uint32_t integer) {
71  return {
72  static_cast<uint8_t>(integer >> 16 & 0xFF), // bits [23, 16]
73  static_cast<uint8_t>(integer >> 8 & 0xFF), // bits [15, 8]
74  static_cast<uint8_t>(integer & 0xFF) // bits [7, 0]
75  };
76 }
77 
91 inline std::vector<uint8_t> pack_16(const uint16_t integer) {
92  return {
93  static_cast<uint8_t>(integer & 0xFF), // bits [7, 0]
94  static_cast<uint8_t>(integer >> 8 & 0xFF) // bits [15, 8]
95  };
96 }
97 
111 inline std::vector<uint8_t> pack_16_big(const uint16_t integer) {
112  return {
113  static_cast<uint8_t>(integer >> 8 & 0xFF), // bits [15, 8]
114  static_cast<uint8_t>(integer & 0xFF) // bits [7, 0]
115  };
116 }
117 
133  return {
134  static_cast<uint8_t>(pack[0] & 0x7F),
135  static_cast<uint8_t>((pack[0] & 0x80) >> 7),
136  static_cast<uint8_t>(pack[1] & 0x7F),
137  static_cast<uint8_t>((pack[1] & 0x80) >> 7),
138  static_cast<uint8_t>(pack[2] & 0x7F),
139  static_cast<uint8_t>((pack[2] & 0x80) >> 7),
140  static_cast<uint8_t>(pack[3] & 0x7F),
141  static_cast<uint8_t>((pack[3] & 0x80) >> 7),
142  };
143 }
144 
152 
168  return {
169  static_cast<uint8_t>(pack[0] & 0x7F),
170  static_cast<uint8_t>((pack[0] & 0x80) >> 7),
171  static_cast<uint8_t>(pack[1] & 0x7F),
172  static_cast<uint8_t>((pack[1] & 0x80) >> 7),
173  static_cast<uint8_t>(pack[2] & 0x7F),
174  static_cast<uint8_t>((pack[2] & 0x80) >> 7),
175  static_cast<uint8_t>(pack[3] & 0x7F),
176  static_cast<uint8_t>((pack[3] & 0x80) >> 7),
177  };
178 }
179 
187 
199 inline std::vector<uint8_t> firmatify_8(const uint8_t val) {
200  return { static_cast<uint8_t>(val & 0x7F), static_cast<uint8_t>((val & 0x80) >> 7) };
201 }
202 
209 inline uint32_t decode_32(const std::vector<uint8_t>::const_iterator& data) {
210  return data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
211 }
212 
219 inline uint32_t decode_32(const std::vector<uint8_t>& data) { return decode_32(data.cbegin()); }
220 
228  return data[3] | data[2] << 8 | data[1] << 16 | data[0] << 24;
229 }
230 
237 inline uint32_t decode_32_big(const std::vector<uint8_t>& data) { return decode_32_big(data.cbegin()); }
238 
245 inline uint16_t decode_16(const std::vector<uint8_t>::const_iterator& data) {
246  return static_cast<uint16_t>(data[0]) | static_cast<uint16_t>(data[1] << 8);
247 }
248 
255 inline uint16_t decode_16(const std::vector<uint8_t>& data) { return decode_16(data.cbegin()); }
256 
264  return static_cast<uint16_t>(data[1]) | static_cast<uint16_t>(data[0] << 8);
265 }
266 
273 inline uint16_t decode_16_big(const std::vector<uint8_t>& data) { return decode_16_big(data.cbegin()); }
274 
282  return { str.cbegin(), str.cend() };
283 }
284 
292  return { data.cbegin(), data.cend() };
293 }
294 
295 #endif //UMRT_ARM_FIRMWARE_LIB_UTILS_HPP
T cbegin(T... args)
T cend(T... args)
std::vector< uint8_t > pack_16_big(const uint16_t integer)
Packs a 16-bit integer into a vector of 8-bit integers, in big-endian format.
Definition: utils.hpp:111
std::vector< uint8_t > pack_32(const uint32_t integer)
Packs a 32-bit integer into a vector of 8-bit integers, in little-endian format.
Definition: utils.hpp:26
std::vector< uint8_t > firmatify_32(const std::vector< uint8_t >::const_iterator &pack)
Converts a packed byte vector to the 7-bit packets Firmata receives.
Definition: utils.hpp:132
std::vector< uint8_t > pack_16(const uint16_t integer)
Packs a 16-bit integer into a vector of 8-bit integers, in little-endian format.
Definition: utils.hpp:91
std::vector< uint8_t > firmatify_8(const uint8_t val)
Converts an 8-bit integer to the two 7-bit packets Firmata uses.
Definition: utils.hpp:199
uint32_t decode_32_big(const std::vector< uint8_t >::const_iterator &data)
Reconstructs a big-endian byte vector into a 32-bit integer.
Definition: utils.hpp:227
std::vector< uint8_t > encode_string(const std::string &str)
Packs an std::string into a vector of 8-bit integers, in little-endian format.
Definition: utils.hpp:281
uint16_t decode_16(const std::vector< uint8_t >::const_iterator &data)
Reconstructs a little-endian byte vector into a 16-bit integer.
Definition: utils.hpp:245
uint16_t decode_16_big(const std::vector< uint8_t >::const_iterator &data)
Reconstructs a big-endian byte vector into a 16-bit integer.
Definition: utils.hpp:263
uint32_t decode_32(const std::vector< uint8_t >::const_iterator &data)
Reconstructs a little-endian byte vector into a 32-bit integer.
Definition: utils.hpp:209
std::vector< uint8_t > pack_24_big(const uint32_t integer)
Packs a 24-bit integer into a vector of 8-bit integers, in big-endian format.
Definition: utils.hpp:70
std::string decode_string(const std::vector< uint8_t > &data)
Decodes a little-endian byte vector into an std::string.
Definition: utils.hpp:291
std::vector< uint8_t > pack_32_big(const uint32_t integer)
Packs a 32-bit integer into a vector of 8-bit integers, in big-endian format.
Definition: utils.hpp:48
std::vector< uint8_t > firmatify_16(const std::vector< uint8_t >::const_iterator &pack)
Converts a packed byte vector to the 7-bit packets Firmata receives.
Definition: utils.hpp:167