/** * @file * @brief Helper macros for managing endian handling. */ #ifndef STA_ENDIAN_HPP #define STA_ENDIAN_HPP /** * @defgroup staCoreEndian Endian * @ingroup staCore * @brief Endian handling. */ #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 * * @ingroup staCoreEndian */ #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 * * @ingroup staCoreEndian */ #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] * * @ingroup staCoreEndian */ #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] * * @ingroup staCoreEndian */ #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] * * @ingroup staCoreEndian */ #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] * * @ingroup staCoreEndian */ #define STA_UINT32_TO_BYTES_LE(u32) \ { \ static_cast(u32), \ static_cast(u32 >> 8), \ static_cast(u32 >> 16), \ static_cast(u32 >> 24) \ } /** * @defe 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) #elif 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_ENDIAN_HPP