Make use of C++ standard library
This commit is contained in:
parent
bf94ebaac1
commit
5407e94337
42
io.hpp
42
io.hpp
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/sfr_defs.h>
|
#include <avr/sfr_defs.h>
|
||||||
@ -188,20 +188,20 @@ static constexpr uintptr_t PORT_D_INPUT_REG_ADDR = 0;
|
|||||||
static constexpr auto getBus(const P pin)
|
static constexpr auto getBus(const P pin)
|
||||||
{
|
{
|
||||||
// Upper 4 bits of pin encode which port this pin is on
|
// Upper 4 bits of pin encode which port this pin is on
|
||||||
const auto port = static_cast<uint8_t>(pin) >> 4 & 0x0F;
|
const auto port = static_cast<std::uint8_t>(pin) >> 4 & 0x0F;
|
||||||
return static_cast<Bus>(port);
|
return static_cast<Bus>(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto getPinBit(const P pin)
|
static constexpr auto getPinBit(const P pin)
|
||||||
{
|
{
|
||||||
// Lower 4 bits of pin encode which pin bit it is
|
// Lower 4 bits of pin encode which pin bit it is
|
||||||
const auto pinBit = static_cast<uint8_t>(pin) & 0x0F;
|
const auto pinBit = static_cast<std::uint8_t>(pin) & 0x0F;
|
||||||
return pinBit;
|
return pinBit;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto getDDR(const Bus bus)
|
static constexpr auto getDDR(const Bus bus)
|
||||||
{
|
{
|
||||||
switch (static_cast<uint8_t>(bus)) {
|
switch (static_cast<std::uint8_t>(bus)) {
|
||||||
case 0: // Bus::A
|
case 0: // Bus::A
|
||||||
return PORT_A_DIR_REG_ADDR;
|
return PORT_A_DIR_REG_ADDR;
|
||||||
case 1: // Bus::B
|
case 1: // Bus::B
|
||||||
@ -215,7 +215,7 @@ static constexpr auto getDDR(const Bus bus)
|
|||||||
|
|
||||||
static constexpr auto getPORT(const Bus bus)
|
static constexpr auto getPORT(const Bus bus)
|
||||||
{
|
{
|
||||||
switch (static_cast<uint8_t>(bus)) {
|
switch (static_cast<std::uint8_t>(bus)) {
|
||||||
case 0: // Bus::A
|
case 0: // Bus::A
|
||||||
return PORT_A_OUTPUT_REG_ADDR;
|
return PORT_A_OUTPUT_REG_ADDR;
|
||||||
case 1: // Bus::B
|
case 1: // Bus::B
|
||||||
@ -229,7 +229,7 @@ static constexpr auto getPORT(const Bus bus)
|
|||||||
|
|
||||||
static constexpr auto getPIN(const Bus bus)
|
static constexpr auto getPIN(const Bus bus)
|
||||||
{
|
{
|
||||||
switch (static_cast<uint8_t>(bus)) {
|
switch (static_cast<std::uint8_t>(bus)) {
|
||||||
case 0: // Bus::A
|
case 0: // Bus::A
|
||||||
return PORT_A_INPUT_REG_ADDR;
|
return PORT_A_INPUT_REG_ADDR;
|
||||||
case 1: // Bus::B
|
case 1: // Bus::B
|
||||||
@ -241,7 +241,7 @@ static constexpr auto getPIN(const Bus bus)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
using reg_ptr_t = volatile uint8_t *;
|
using reg_ptr_t = volatile std::uint8_t *;
|
||||||
|
|
||||||
template <uintptr_t Address>
|
template <uintptr_t Address>
|
||||||
static inline reg_ptr_t getRegPtr()
|
static inline reg_ptr_t getRegPtr()
|
||||||
@ -249,7 +249,7 @@ static inline reg_ptr_t getRegPtr()
|
|||||||
return reinterpret_cast<reg_ptr_t>(Address);
|
return reinterpret_cast<reg_ptr_t>(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <template <P, uint8_t> typename Func, P pin, P... pins>
|
template <template <P, std::uint8_t> typename Func, P pin, P... pins>
|
||||||
struct CallHelper {
|
struct CallHelper {
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
[[gnu::always_inline]] static inline void call(Args... args)
|
[[gnu::always_inline]] static inline void call(Args... args)
|
||||||
@ -259,7 +259,7 @@ struct CallHelper {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <template <P, uint8_t> typename Func, P pin>
|
template <template <P, std::uint8_t> typename Func, P pin>
|
||||||
struct CallHelper<Func, pin> {
|
struct CallHelper<Func, pin> {
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
[[gnu::always_inline]] static inline void call(Args... args)
|
[[gnu::always_inline]] static inline void call(Args... args)
|
||||||
@ -270,7 +270,7 @@ struct CallHelper<Func, pin> {
|
|||||||
|
|
||||||
template <template <P> typename Func, P pin, P... pins>
|
template <template <P> typename Func, P pin, P... pins>
|
||||||
struct ReadCallHelper {
|
struct ReadCallHelper {
|
||||||
[[gnu::always_inline]] static inline uint8_t call()
|
[[gnu::always_inline]] static inline std::uint8_t call()
|
||||||
{
|
{
|
||||||
return Func<pin>::call() << sizeof...(pins) | ReadCallHelper<Func, pins...>::call();
|
return Func<pin>::call() << sizeof...(pins) | ReadCallHelper<Func, pins...>::call();
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ struct ReadCallHelper {
|
|||||||
|
|
||||||
template <template <P> typename Func, P pin>
|
template <template <P> typename Func, P pin>
|
||||||
struct ReadCallHelper<Func, pin> {
|
struct ReadCallHelper<Func, pin> {
|
||||||
[[gnu::always_inline]] static inline uint8_t call()
|
[[gnu::always_inline]] static inline std::uint8_t call()
|
||||||
{
|
{
|
||||||
return Func<pin>::call();
|
return Func<pin>::call();
|
||||||
}
|
}
|
||||||
@ -427,7 +427,7 @@ class Port {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] static inline void write([[maybe_unused]] const uint8_t value)
|
[[gnu::always_inline]] static inline void write([[maybe_unused]] const std::uint8_t value)
|
||||||
{
|
{
|
||||||
if constexpr (port != Bus::NONE) {
|
if constexpr (port != Bus::NONE) {
|
||||||
auto portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
auto portRegPtr = detail::getRegPtr<detail::getPORT(port)>();
|
||||||
@ -448,7 +448,7 @@ class Port {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] static inline uint8_t read()
|
[[gnu::always_inline]] static inline std::uint8_t read()
|
||||||
{
|
{
|
||||||
if constexpr (port != Bus::NONE) {
|
if constexpr (port != Bus::NONE) {
|
||||||
auto pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
|
auto pinRegPtr = detail::getRegPtr<detail::getPIN(port)>();
|
||||||
@ -457,13 +457,13 @@ class Port {
|
|||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] inline Port &operator=(const uint8_t value)
|
[[gnu::always_inline]] inline Port &operator=(const std::uint8_t value)
|
||||||
{
|
{
|
||||||
write(value);
|
write(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] inline operator uint8_t() const
|
[[gnu::always_inline]] inline operator std::uint8_t() const
|
||||||
{
|
{
|
||||||
return read();
|
return read();
|
||||||
}
|
}
|
||||||
@ -474,7 +474,7 @@ class Port {
|
|||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
template <P pin, uint8_t offset>
|
template <P pin, std::uint8_t offset>
|
||||||
struct Callers {
|
struct Callers {
|
||||||
[[gnu::always_inline]] static void call(const Dir dir)
|
[[gnu::always_inline]] static void call(const Dir dir)
|
||||||
{
|
{
|
||||||
@ -486,7 +486,7 @@ struct Callers {
|
|||||||
Pin<pin>::pullup(enable);
|
Pin<pin>::pullup(enable);
|
||||||
};
|
};
|
||||||
|
|
||||||
[[gnu::always_inline]] static void call(const uint8_t value)
|
[[gnu::always_inline]] static void call(const std::uint8_t value)
|
||||||
{
|
{
|
||||||
Pin<pin>::write(value >> offset & 1);
|
Pin<pin>::write(value >> offset & 1);
|
||||||
};
|
};
|
||||||
@ -531,7 +531,7 @@ class VirtPort {
|
|||||||
detail::CallHelper<detail::Callers, pins...>::call(enable);
|
detail::CallHelper<detail::Callers, pins...>::call(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] static inline void write(const uint8_t value)
|
[[gnu::always_inline]] static inline void write(const std::uint8_t value)
|
||||||
{
|
{
|
||||||
detail::CallHelper<detail::Callers, pins...>::call(value);
|
detail::CallHelper<detail::Callers, pins...>::call(value);
|
||||||
}
|
}
|
||||||
@ -541,18 +541,18 @@ class VirtPort {
|
|||||||
detail::CallHelper<detail::Callers, pins...>::call();
|
detail::CallHelper<detail::Callers, pins...>::call();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] static inline uint8_t read()
|
[[gnu::always_inline]] static inline std::uint8_t read()
|
||||||
{
|
{
|
||||||
return detail::ReadCallHelper<detail::readCaller, pins...>::call();
|
return detail::ReadCallHelper<detail::readCaller, pins...>::call();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] inline VirtPort &operator=(const uint8_t value)
|
[[gnu::always_inline]] inline VirtPort &operator=(const std::uint8_t value)
|
||||||
{
|
{
|
||||||
write(value);
|
write(value);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] inline operator uint8_t() const
|
[[gnu::always_inline]] inline operator std::uint8_t() const
|
||||||
{
|
{
|
||||||
return read();
|
return read();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user