Added reg_ptr_t type for cleaner code

This commit is contained in:
BlackMark 2019-08-10 13:36:50 +02:00
parent a47e9a1a66
commit 661bbfea7e

30
io.hpp
View File

@ -236,10 +236,12 @@ static constexpr auto getPIN(const Bus bus)
}
}
using reg_ptr_t = volatile uint8_t *;
template <uintptr_t Address>
static inline volatile uint8_t *getRegPtr()
static inline reg_ptr_t getRegPtr()
{
return reinterpret_cast<volatile uint8_t *>(Address);
return reinterpret_cast<reg_ptr_t>(Address);
}
} // namespace detail
@ -264,7 +266,7 @@ class Pin {
constexpr auto bus = detail::getBus(pin);
constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *dirRegPtr = detail::getRegPtr<detail::getDDR(bus)>();
detail::reg_ptr_t dirRegPtr = detail::getRegPtr<detail::getDDR(bus)>();
if (dir == Dir::IN)
*dirRegPtr &= ~(1 << pinBit);
@ -277,7 +279,7 @@ class Pin {
constexpr auto bus = detail::getBus(pin);
constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
if (enable)
*portRegPtr |= (1 << pinBit);
@ -290,7 +292,7 @@ class Pin {
constexpr auto bus = detail::getBus(pin);
constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
if (value)
*portRegPtr |= (1 << pinBit);
@ -304,10 +306,10 @@ class Pin {
constexpr auto pinBit = detail::getPinBit(pin);
#ifdef HARDWARE_TOGGLE
volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
*pinRegPtr |= (1 << pinBit);
#else
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
*portRegPtr ^= (1 << pinBit);
#endif
}
@ -317,7 +319,7 @@ class Pin {
constexpr auto bus = detail::getBus(pin);
constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
if (*pinRegPtr >> pinBit & 1)
return true;
@ -354,7 +356,7 @@ class Port {
static inline void dir(const Dir dir) FORCE_INLINE
{
volatile uint8_t *dirRegPtr = detail::getRegPtr<detail::getDDR(port)>();
detail::reg_ptr_t dirRegPtr = detail::getRegPtr<detail::getDDR(port)>();
if (dir == Dir::IN)
*dirRegPtr = 0x00;
@ -364,7 +366,7 @@ class Port {
static inline void pullup(const bool enable) FORCE_INLINE
{
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
if (enable)
*portRegPtr = 0xFF;
@ -374,7 +376,7 @@ class Port {
static inline void write(const uint8_t value) FORCE_INLINE
{
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
*portRegPtr = value;
}
@ -382,11 +384,11 @@ class Port {
static inline void invert() FORCE_INLINE
{
#ifdef HARDWARE_TOGGLE
volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
*pinRegPtr = 0xFF;
#else
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
*portRegPtr = ~(*portRegPtr);
#endif
@ -394,7 +396,7 @@ class Port {
static inline uint8_t read() FORCE_INLINE
{
volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
return *pinRegPtr;
}