3#ifndef __CAN_UTILS_HPP__
4#define __CAN_UTILS_HPP__
13#include "CanMessage.hpp"
23std::string
msgToStr(std::uint8_t
id, std::uint16_t cob, std::size_t len,
const std::uint8_t * data);
29std::string
msgToStr(std::size_t len,
const std::uint8_t * data);
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); }
43{
return msgToStr(msg.id & 0x7F, msg.id & 0xFF80, msg.len, msg.data); }
51template<
typename T_
int,
typename T_frac>
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.");
57 *fractional = std::round(std::modf(value, &_int) * (1 << 8 *
sizeof(T_frac)));
58 *integer =
static_cast<T_int
>(_int);
67template<
typename T_
int,
typename T_frac>
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);
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