14typedef enum : uint8_t {
22static inline uint64_t CAN_apply_bswap(uint64_t raw, bswap_width_t bswap_width) {
23 switch (bswap_width) {
25 return __builtin_bswap16((uint16_t)raw);
27 return __builtin_bswap32((uint32_t)raw);
29 return __builtin_bswap64(raw);
36static inline uint64_t CAN_load_payload_u64(
const uint8_t *data, uint8_t len) {
38 memcpy(&payload, data, len);
43static inline void CAN_store_payload_u64(uint8_t *dest, uint64_t payload, uint8_t len) {
44 memcpy(dest, &payload, len);
48static inline uint64_t CAN_pack_raw_signal(
53 bswap_width_t bswap_width
56 raw = CAN_apply_bswap(raw, bswap_width);
57 payload |= (raw & mask) << bit_shift;
62static inline uint64_t CAN_unpack_raw_signal(
66 bswap_width_t bswap_width
68 uint64_t raw = (payload >> bit_shift) & mask;
69 return CAN_apply_bswap(raw, bswap_width);
73static inline int64_t CAN_sign_extend_raw(uint64_t raw, uint8_t bit_length) {
74 if (bit_length == 0) {
77 if (bit_length >= 64) {
81 uint8_t shift = 64U - bit_length;
82 return (int64_t)(raw << shift) >> shift;
86static inline uint64_t CAN_float32_to_raw(
float value) {
88 memcpy(&raw, &value,
sizeof(raw));
93static inline float CAN_raw_to_float32(uint64_t raw) {
94 uint32_t bits = (uint32_t)raw;
96 memcpy(&value, &bits,
sizeof(value));