/** * @file * @brief Helper macros for managing endian handling. */ #ifndef STA_CORE_ENDIAN_HPP #define STA_CORE_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 /** * @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(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) \ } /** * @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