diff --git a/io.hpp b/io.hpp index 5148a18..bdeedec 100644 --- a/io.hpp +++ b/io.hpp @@ -102,6 +102,8 @@ enum class P { D6 = 0x36, D7 = 0x37, #endif + + NONE, }; enum class Bus { @@ -117,6 +119,8 @@ enum class Bus { #ifdef PORT_D_AVAILABLE D = 0x03, #endif + + NONE, }; ////////////////////////////////////////////////////////////////////////// @@ -299,67 +303,76 @@ class Pin { [[gnu::always_inline]] static inline void dir(const Dir dir) { - constexpr auto bus = detail::getBus(pin); - constexpr auto pinBit = detail::getPinBit(pin); + if constexpr (pin != P::NONE) { + constexpr auto bus = detail::getBus(pin); + constexpr auto pinBit = detail::getPinBit(pin); - detail::reg_ptr_t dirRegPtr = detail::getRegPtr(); + detail::reg_ptr_t dirRegPtr = detail::getRegPtr(); - if (dir == Dir::IN) - *dirRegPtr &= ~(1 << pinBit); - else if (dir == Dir::OUT) - *dirRegPtr |= (1 << pinBit); + if (dir == Dir::IN) + *dirRegPtr &= ~(1 << pinBit); + else if (dir == Dir::OUT) + *dirRegPtr |= (1 << pinBit); + } } [[gnu::always_inline]] static inline void pullup(const bool enable) { - constexpr auto bus = detail::getBus(pin); - constexpr auto pinBit = detail::getPinBit(pin); + if constexpr (pin != P::NONE) { + constexpr auto bus = detail::getBus(pin); + constexpr auto pinBit = detail::getPinBit(pin); - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - if (enable) - *portRegPtr |= (1 << pinBit); - else - *portRegPtr &= ~(1 << pinBit); + if (enable) + *portRegPtr |= (1 << pinBit); + else + *portRegPtr &= ~(1 << pinBit); + } } [[gnu::always_inline]] static inline void write(const bool value) { - constexpr auto bus = detail::getBus(pin); - constexpr auto pinBit = detail::getPinBit(pin); + if constexpr (pin != P::NONE) { + constexpr auto bus = detail::getBus(pin); + constexpr auto pinBit = detail::getPinBit(pin); - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - if (value) - *portRegPtr |= (1 << pinBit); - else - *portRegPtr &= ~(1 << pinBit); + if (value) + *portRegPtr |= (1 << pinBit); + else + *portRegPtr &= ~(1 << pinBit); + } } [[gnu::always_inline]] static inline void toggle() { - constexpr auto bus = detail::getBus(pin); - constexpr auto pinBit = detail::getPinBit(pin); + if constexpr (pin != P::NONE) { + constexpr auto bus = detail::getBus(pin); + constexpr auto pinBit = detail::getPinBit(pin); #ifdef HARDWARE_TOGGLE - detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); - *pinRegPtr |= (1 << pinBit); + detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); + *pinRegPtr |= (1 << pinBit); #else - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - *portRegPtr ^= (1 << pinBit); + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + *portRegPtr ^= (1 << pinBit); #endif + } } [[gnu::always_inline]] static inline bool read() { - constexpr auto bus = detail::getBus(pin); - constexpr auto pinBit = detail::getPinBit(pin); + if constexpr (pin != P::NONE) { + constexpr auto bus = detail::getBus(pin); + constexpr auto pinBit = detail::getPinBit(pin); - detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); - - if (*pinRegPtr >> pinBit & 1) - return true; + detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); + if (*pinRegPtr >> pinBit & 1) + return true; + } return false; } @@ -392,46 +405,57 @@ class Port { [[gnu::always_inline]] static inline void dir(const Dir dir) { - detail::reg_ptr_t dirRegPtr = detail::getRegPtr(); + if constexpr (port != Bus::NONE) { + detail::reg_ptr_t dirRegPtr = detail::getRegPtr(); - if (dir == Dir::IN) - *dirRegPtr = 0x00; - else if (dir == Dir::OUT) - *dirRegPtr = 0xFF; + if (dir == Dir::IN) + *dirRegPtr = 0x00; + else if (dir == Dir::OUT) + *dirRegPtr = 0xFF; + } } [[gnu::always_inline]] static inline void pullup(const bool enable) { - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + if constexpr (port != Bus::NONE) { + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - if (enable) - *portRegPtr = 0xFF; - else - *portRegPtr = 0x00; + if (enable) + *portRegPtr = 0xFF; + else + *portRegPtr = 0x00; + } } - [[gnu::always_inline]] static inline void write(const uint8_t value) + [[gnu::always_inline]] static inline void write([[maybe_unused]] const uint8_t value) { - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - *portRegPtr = value; + if constexpr (port != Bus::NONE) { + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + *portRegPtr = value; + } } [[gnu::always_inline]] static inline void invert() { + if constexpr (port != Bus::NONE) { #ifdef HARDWARE_TOGGLE - detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); - *pinRegPtr = 0xFF; + detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); + *pinRegPtr = 0xFF; #else - detail::reg_ptr_t portRegPtr = detail::getRegPtr(); - *portRegPtr = ~(*portRegPtr); + detail::reg_ptr_t portRegPtr = detail::getRegPtr(); + *portRegPtr = ~(*portRegPtr); #endif + } } [[gnu::always_inline]] static inline uint8_t read() { - detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); + if constexpr (port != Bus::NONE) { + detail::reg_ptr_t pinRegPtr = detail::getRegPtr(); - return *pinRegPtr; + return *pinRegPtr; + } + return 0x00; } [[gnu::always_inline]] inline Port &operator=(const uint8_t value)