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