Refactored pegister pointer code

This commit is contained in:
BlackMark 2019-08-10 13:32:35 +02:00
parent 1bc8a38988
commit a47e9a1a66

71
io.hpp
View File

@ -262,63 +262,64 @@ class Pin {
static inline void dir(const Dir dir) FORCE_INLINE static inline void dir(const Dir dir) FORCE_INLINE
{ {
constexpr auto bus = detail::getBus(pin); constexpr auto bus = detail::getBus(pin);
constexpr auto dirReg = detail::getDDR(bus);
constexpr auto pinBit = detail::getPinBit(pin); constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *dirRegPtr = detail::getRegPtr<detail::getDDR(bus)>();
if (dir == Dir::IN) if (dir == Dir::IN)
*detail::getRegPtr<dirReg>() &= ~(1 << pinBit); *dirRegPtr &= ~(1 << pinBit);
else if (dir == Dir::OUT) else if (dir == Dir::OUT)
*detail::getRegPtr<dirReg>() |= (1 << pinBit); *dirRegPtr |= (1 << pinBit);
} }
static inline void pullup(const bool enable) FORCE_INLINE static inline void pullup(const bool enable) FORCE_INLINE
{ {
constexpr auto bus = detail::getBus(pin); constexpr auto bus = detail::getBus(pin);
constexpr auto portReg = detail::getPORT(bus);
constexpr auto pinBit = detail::getPinBit(pin); constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
if (enable) if (enable)
*detail::getRegPtr<portReg>() |= (1 << pinBit); *portRegPtr |= (1 << pinBit);
else else
*detail::getRegPtr<portReg>() &= ~(1 << pinBit); *portRegPtr &= ~(1 << pinBit);
} }
static inline void write(const bool value) FORCE_INLINE static inline void write(const bool value) FORCE_INLINE
{ {
constexpr auto bus = detail::getBus(pin); constexpr auto bus = detail::getBus(pin);
constexpr auto portReg = detail::getPORT(bus);
constexpr auto pinBit = detail::getPinBit(pin); constexpr auto pinBit = detail::getPinBit(pin);
volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
if (value) if (value)
*detail::getRegPtr<portReg>() |= (1 << pinBit); *portRegPtr |= (1 << pinBit);
else else
*detail::getRegPtr<portReg>() &= ~(1 << pinBit); *portRegPtr &= ~(1 << pinBit);
} }
static inline void toggle() FORCE_INLINE static inline void toggle() FORCE_INLINE
{ {
constexpr auto bus = detail::getBus(pin);
constexpr auto pinBit = detail::getPinBit(pin);
#ifdef HARDWARE_TOGGLE #ifdef HARDWARE_TOGGLE
constexpr auto bus = detail::getBus(pin); volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
constexpr auto pinReg = detail::getPIN(bus); *pinRegPtr |= (1 << pinBit);
constexpr auto pinBit = detail::getPinBit(pin);
*detail::getRegPtr<pinReg>() |= (1 << pinBit);
#else #else
constexpr auto bus = detail::getBus(pin); volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
constexpr auto portReg = detail::getPORT(bus); *portRegPtr ^= (1 << pinBit);
constexpr auto pinBit = detail::getPinBit(pin);
*detail::getRegPtr<pinReg>() ^= (1 << pinBit);
#endif #endif
} }
static inline bool read() FORCE_INLINE static inline bool read() FORCE_INLINE
{ {
constexpr auto bus = detail::getBus(pin); constexpr auto bus = detail::getBus(pin);
constexpr auto pinReg = detail::getPIN(bus);
constexpr auto pinBit = detail::getPinBit(pin); constexpr auto pinBit = detail::getPinBit(pin);
if (*detail::getRegPtr<pinReg>() >> pinBit & 1) volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
if (*pinRegPtr >> pinBit & 1)
return true; return true;
return false; return false;
@ -353,49 +354,49 @@ class Port {
static inline void dir(const Dir dir) FORCE_INLINE static inline void dir(const Dir dir) FORCE_INLINE
{ {
constexpr auto dirReg = detail::getDDR(port); volatile uint8_t *dirRegPtr = detail::getRegPtr<detail::getDDR(port)>();
if (dir == Dir::IN) if (dir == Dir::IN)
*detail::getRegPtr<dirReg>() = 0x00; *dirRegPtr = 0x00;
else if (dir == Dir::OUT) else if (dir == Dir::OUT)
*detail::getRegPtr<dirReg>() = 0xFF; *dirRegPtr = 0xFF;
} }
static inline void pullup(const bool enable) FORCE_INLINE static inline void pullup(const bool enable) FORCE_INLINE
{ {
constexpr auto portReg = detail::getPORT(port); volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
if (enable) if (enable)
*detail::getRegPtr<portReg>() = 0xFF; *portRegPtr = 0xFF;
else else
*detail::getRegPtr<portReg>() = 0x00; *portRegPtr = 0x00;
} }
static inline void write(const uint8_t value) FORCE_INLINE static inline void write(const uint8_t value) FORCE_INLINE
{ {
constexpr auto portReg = detail::getPORT(port); volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
*detail::getRegPtr<portReg>() = value; *portRegPtr = value;
} }
static inline void invert() FORCE_INLINE static inline void invert() FORCE_INLINE
{ {
#ifdef HARDWARE_TOGGLE #ifdef HARDWARE_TOGGLE
constexpr auto pinReg = detail::getPIN(port); volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
*detail::getRegPtr<pinReg>() = 0xFF; *pinRegPtr = 0xFF;
#else #else
constexpr auto portReg = detail::getPORT(port); volatile uint8_t *portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
*detail::getRegPtr<portReg>() = ~(*portReg); *portRegPtr = ~(*portRegPtr);
#endif #endif
} }
static inline uint8_t read() FORCE_INLINE static inline uint8_t read() FORCE_INLINE
{ {
constexpr auto pinReg = detail::getPIN(port); volatile uint8_t *pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
return *detail::getRegPtr<pinReg>(); return *pinRegPtr;
} }
inline Port &operator=(const uint8_t value) FORCE_INLINE inline Port &operator=(const uint8_t value) FORCE_INLINE