mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/sta-core.git
synced 2025-06-12 01:25:59 +00:00
Add endian handling helpers
This commit is contained in:
parent
e8cbdf261c
commit
867d884d67
219
include/sta/endian.hpp
Normal file
219
include/sta/endian.hpp
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
#ifndef STA_ENDIAN_HPP
|
||||||
|
#define STA_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
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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) \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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
|
Loading…
x
Reference in New Issue
Block a user