Implement empty/unused pin and port
This commit is contained in:
parent
37b8f77fd3
commit
d89322bdaa
128
io.hpp
128
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::getDDR(bus)>();
|
||||
detail::reg_ptr_t dirRegPtr = detail::getRegPtr<detail::getDDR(bus)>();
|
||||
|
||||
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::getPORT(bus)>();
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
|
||||
|
||||
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::getPORT(bus)>();
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
|
||||
|
||||
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<detail::getPIN(bus)>();
|
||||
*pinRegPtr |= (1 << pinBit);
|
||||
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
|
||||
*pinRegPtr |= (1 << pinBit);
|
||||
#else
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
|
||||
*portRegPtr ^= (1 << pinBit);
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(bus)>();
|
||||
*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<detail::getPIN(bus)>();
|
||||
|
||||
if (*pinRegPtr >> pinBit & 1)
|
||||
return true;
|
||||
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(bus)>();
|
||||
|
||||
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<detail::getDDR(port)>();
|
||||
if constexpr (port != Bus::NONE) {
|
||||
detail::reg_ptr_t dirRegPtr = detail::getRegPtr<detail::getDDR(port)>();
|
||||
|
||||
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<detail::getPORT(port)>();
|
||||
if constexpr (port != Bus::NONE) {
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
||||
|
||||
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<detail::getPORT(port)>();
|
||||
*portRegPtr = value;
|
||||
if constexpr (port != Bus::NONE) {
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
||||
*portRegPtr = value;
|
||||
}
|
||||
}
|
||||
|
||||
[[gnu::always_inline]] static inline void invert()
|
||||
{
|
||||
if constexpr (port != Bus::NONE) {
|
||||
#ifdef HARDWARE_TOGGLE
|
||||
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
|
||||
*pinRegPtr = 0xFF;
|
||||
detail::reg_ptr_t pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
|
||||
*pinRegPtr = 0xFF;
|
||||
#else
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
||||
*portRegPtr = ~(*portRegPtr);
|
||||
detail::reg_ptr_t portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
||||
*portRegPtr = ~(*portRegPtr);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
[[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)
|
||||
|
Loading…
Reference in New Issue
Block a user