diff --git a/include/sta/endian.hpp b/include/sta/endian.hpp new file mode 100644 index 0000000..9f721d9 --- /dev/null +++ b/include/sta/endian.hpp @@ -0,0 +1,219 @@ +#ifndef STA_ENDIAN_HPP +#define STA_ENDIAN_HPP + +#include + +#if !defined(STA_MCU_BIG_ENDIAN) && !defined(STA_MCU_LITTLE_ENDIAN) +# error "Endian-ness unknown. Please specify in " +#endif // !STA_MCU_BIG_ENDIAN && !STA_MCU_LITTLE_ENDIAN + + +/** + * @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(u16 >> 8), \ + static_cast(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(u16), \ + static_cast(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(u32 >> 24), \ + static_cast(u32 >> 16), \ + static_cast(u32 >> 8), \ + static_cast(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(u32), \ + static_cast(u32 >> 8), \ + static_cast(u32 >> 16), \ + static_cast(u32 >> 24) \ + } + + + +#ifdef STA_MCU_LITTLE_ENDIAN + + +/** + * @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 + */ +# define STA_UINT16_TO_BE(u16) STA_UINT16_SWAP_BYTE_ORDER(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 + */ +# define STA_UINT16_TO_LE(u16) (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] + */ +# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_LE(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] + */ +# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_BE(u16) + +/** + * @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 + */ +# define STA_UINT32_TO_BE(u32) STA_UINT32_SWAP_BYTE_ORDER(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 + */ +# define STA_UINT32_TO_LE(u32) (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] + */ +# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_LE(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] + */ +# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_BE(u32) + + +#elif STA_MCU_BIG_ENDIAN + + +/** + * @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 + */ +# define STA_UINT16_TO_BE(u16) (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 + */ +# define STA_UINT16_TO_LE(u16) STA_UINT16_SWAP_BYTE_ORDER(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] + */ +# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_BE(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] + */ +# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_LE(u16) + + +/** + * @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 + */ +# define STA_UINT32_TO_BE(u32) (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 + */ +# define STA_UINT32_TO_LE(u32) STA_UINT32_SWAP_BYTE_ORDER(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] + */ +# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_BE(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] + */ +# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_LE(u32) + + +#endif // STA_MCU_BIG_ENDIAN + + +#endif // STA_ENDIAN_HPP