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