yarp-devices
Loading...
Searching...
No Matches
CanUtils.hpp
1// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
2
3#ifndef __CAN_UTILS_HPP__
4#define __CAN_UTILS_HPP__
5
6#include <cmath>
7#include <cstddef>
8#include <cstdint>
9
10#include <string>
11#include <type_traits>
12
13#include "CanMessage.hpp"
14
17{
18
23std::string msgToStr(std::uint8_t id, std::uint16_t cob, std::size_t len, const std::uint8_t * data);
24
29std::string msgToStr(std::size_t len, const std::uint8_t * data);
30
35inline std::string msgToStr(std::uint16_t cobId, std::size_t len, const std::uint8_t * data)
36{ return msgToStr(cobId & 0x7F, cobId & 0xFF80, len, data); }
37
42inline std::string msgToStr(const can_message & msg)
43{ return msgToStr(msg.id & 0x7F, msg.id & 0xFF80, msg.len, msg.data); }
44
51template<typename T_int, typename T_frac>
52void encodeFixedPoint(double value, T_int * integer, T_frac * fractional)
53{
54 static_assert(std::is_integral_v<T_int> && std::is_integral_v<T_frac>, "Integral required.");
55 static_assert(std::is_unsigned_v<T_frac>, "Unsigned fractional type required.");
56 double _int;
57 *fractional = std::round(std::modf(value, &_int) * (1 << 8 * sizeof(T_frac)));
58 *integer = static_cast<T_int>(_int);
59}
60
67template<typename T_int, typename T_frac>
68double decodeFixedPoint(T_int integer, T_frac fractional)
69{
70 static_assert(std::is_integral_v<T_int> && std::is_integral_v<T_frac>, "Integral required.");
71 static_assert(std::is_unsigned_v<T_frac>, "Unsigned fractional type required.");
72 double frac = static_cast<double>(fractional) / (1 << 8 * sizeof(T_frac));
73 return integer + (integer >= 0 ? frac : -frac);
74}
75
76} // namespace roboticslab::CanUtils
77
78#endif // __CAN_UTILS_HPP__
std::string msgToStr(std::uint8_t id, std::uint16_t cob, std::size_t len, const std::uint8_t *data)
Create a string representation of the given CAN message details.
Definition CanUtils.cpp:27
void encodeFixedPoint(double value, T_int *integer, T_frac *fractional)
Obtain a fixed-point representation given a float value.
Definition CanUtils.hpp:52
double decodeFixedPoint(T_int integer, T_frac fractional)
Obtain a float representation of a fixed-point value.
Definition CanUtils.hpp:68
Contains CAN-related utilities.
Definition CanUtils.hpp:17
Proxy CAN message structure.
Definition CanMessage.hpp:20