Refactored pegister pointer code
This commit is contained in:
parent
1bc8a38988
commit
a47e9a1a66
71
io.hpp
71
io.hpp
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user