sta-core/include/sta/endian.hpp
2023-02-02 22:22:14 +01:00

199 lines
5.2 KiB
C++

/**
* @file
* @brief Helper macros for managing endian handling.
*/
#ifndef STA_CORE_ENDIAN_HPP
#define STA_CORE_ENDIAN_HPP
#include <sta/config.hpp>
#if !defined(STA_MCU_BIG_ENDIAN) && !defined(STA_MCU_LITTLE_ENDIAN)
# error "Endian-ness unknown. Please specify in <sta/config.hpp>"
#endif // !STA_MCU_BIG_ENDIAN && !STA_MCU_LITTLE_ENDIAN
/**
* @defgroup sta_core_endian Endian
* @ingroup sta_core
* @brief Endian handling.
* @{
*/
/**
* @brief Get 16-bit value with swapped byte order.
*
* @param u16 16-bit input value
* @return 16-bit value w/ swapped byte order
*/
#define STA_UINT16_SWAP_BYTE_ORDER(u16) \
( \
((u16 & 0x00FF) << 8) \
| ((u16 & 0xFF00) >> 8) \
)
/**
* @brief Get 32-bit value with swapped byte order.
*
* @param u32 32-bit input value
* @return 32-bit value w/ swapped byte order
*/
#define STA_UINT32_SWAP_BYTE_ORDER(u32) \
( \
((u32 & 0x000000FF) << 24) \
| ((u32 & 0x0000FF00) << 8) \
| ((u32 & 0x00FF0000) >> 8) \
| ((u32 & 0xFF000000) >> 24) \
)
/**
* @brief Get initializer list for byte array with big-endian byte order from 16-bit value.
*
* @param u16 16-bit input value
* @return Initializer list for uint8_t[2]
*/
#define STA_UINT16_TO_BYTES_BE(u16) \
{ \
static_cast<uint8_t>(u16 >> 8), \
static_cast<uint8_t>(u16) \
}
/**
* @brief Get initializer list for byte array with little-endian byte order from 16-bit value.
*
* @param u16 16-bit input value
* @return Initializer list for uint8_t[2]
*/
#define STA_UINT16_TO_BYTES_LE(u16) \
{ \
static_cast<uint8_t>(u16), \
static_cast<uint8_t>(u16 >> 8) \
}
/**
* @brief Get initializer list for byte array with big-endian byte order from 32-bit value.
*
* @param u32 32-bit input value
* @return Initializer list for uint8_t[4]
*/
#define STA_UINT32_TO_BYTES_BE(u32) \
{ \
static_cast<uint8_t>(u32 >> 24), \
static_cast<uint8_t>(u32 >> 16), \
static_cast<uint8_t>(u32 >> 8), \
static_cast<uint8_t>(u32) \
}
/**
* @brief Get initializer list for byte array with little-endian byte order from 32-bit value.
*
* @param u32 32-bit input value
* @return Initializer list for uint8_t[4]
*/
#define STA_UINT32_TO_BYTES_LE(u32) \
{ \
static_cast<uint8_t>(u32), \
static_cast<uint8_t>(u32 >> 8), \
static_cast<uint8_t>(u32 >> 16), \
static_cast<uint8_t>(u32 >> 24) \
}
/**
* @def STA_UINT16_TO_BE(u16)
* @brief Convert 16-bit value to big-endian byte order.
*
* @param u16 16-bit input value
* @return 16-bit value w/ big-endian byte order
*/
/**
* @def STA_UINT16_TO_LE(u16)
* @brief Convert 16-bit value to little-endian byte order.
*
* @param u16 16-bit input value
* @return 16-bit value w/ little-endian byte order
*/
/**
* @def STA_UINT16_TO_BYTES(u16)
* @brief Get initializer list for byte array w/ MCU byte order from 16-bit value.
*
* @param u16 16-bit input value
* @return Initializer list for uint8_t[2]
*/
/**
* @def STA_UINT16_TO_BYTES_SWAP(u16)
* @brief Get initializer list for byte array w/ swapped MCU byte order from 16-bit value.
*
* @param u16 16-bit input value
* @return Initializer list for uint8_t[2]
*/
/**
* @def STA_UINT32_TO_BE(u32)
* @brief Convert 32-bit value to big-endian byte order.
*
* @param u32 32-bit input value
* @return 32-bit value w/ big-endian byte order
*/
/**
* @def STA_UINT32_TO_LE(u32)
* @brief Convert 32-bit value to little-endian byte order.
*
* @param u32 32-bit input value
* @return 32-bit value w/ little-endian byte order
*/
/**
* @def STA_UINT32_TO_BYTES(u32)
* @brief Get initializer list for byte array from 32-bit value.
*
* @param u32 32-bit input value
* @return Initializer list for uint8_t[4]
*/
/**
* @def STA_UINT32_TO_BYTES_SWAP(u32)
* @brief Get initializer list for byte array w/ swapped byte order from 32-bit value.
*
* @param u32 32-bit input value
* @return Initializer list for uint8_t[4]
*/
/** @} */
#ifdef STA_MCU_LITTLE_ENDIAN
# define STA_UINT16_TO_BE(u16) STA_UINT16_SWAP_BYTE_ORDER(u16)
# define STA_UINT16_TO_LE(u16) (u16)
# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_LE(u16)
# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_BE(u16)
# define STA_UINT32_TO_BE(u32) STA_UINT32_SWAP_BYTE_ORDER(u32)
# define STA_UINT32_TO_LE(u32) (u32)
# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_LE(u32)
# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_BE(u32)
#else // STA_MCU_BIG_ENDIAN
# define STA_UINT16_TO_BE(u16) (u16)
# define STA_UINT16_TO_LE(u16) STA_UINT16_SWAP_BYTE_ORDER(u16)
# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_BE(u16)
# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_LE(u16)
# define STA_UINT32_TO_BE(u32) (u32)
# define STA_UINT32_TO_LE(u32) STA_UINT32_SWAP_BYTE_ORDER(u32)
# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_BE(u32)
# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_LE(u32)
#endif // STA_MCU_BIG_ENDIAN
#endif // STA_CORE_ENDIAN_HPP