Implement empty/unused pin and port

This commit is contained in:
BlackMark 2022-05-28 15:41:26 +02:00
parent 37b8f77fd3
commit d89322bdaa

128
io.hpp
View File

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