68 lines
2.3 KiB
C++
68 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <AH/Containers/Array.hpp>
|
|
#include <AH/PrintStream/PrintStream.hpp>
|
|
#include <AH/STL/limits>
|
|
#include <AH/Settings/NamespaceSettings.hpp>
|
|
#include <stdint.h>
|
|
|
|
BEGIN_AH_NAMESPACE
|
|
|
|
using analog_t = uint16_t;
|
|
using pin_int_t = uint_fast16_t;
|
|
constexpr pin_int_t NO_PIN_INT =
|
|
(std::numeric_limits<pin_int_t>::max() >> 1) + 1;
|
|
|
|
namespace ExtIO {
|
|
struct pin_t {
|
|
constexpr pin_t() = default;
|
|
constexpr pin_t(pin_int_t pin) : pin(pin) {}
|
|
|
|
pin_int_t pin = NO_PIN_INT;
|
|
|
|
static_assert(std::is_unsigned<decltype(pin)>::value,
|
|
"Error: pin_t should be an unsigned integer type");
|
|
|
|
pin_t &operator+=(pin_int_t b) { this->pin += b; return *this; }
|
|
pin_t &operator++() { ++pin; return *this; }
|
|
pin_t operator++(int) { pin_t t = *this; ++pin; return t; }
|
|
pin_t &operator-=(pin_int_t b) { this->pin -= b; return *this; }
|
|
pin_t &operator--() { --pin; return *this; }
|
|
pin_t operator--(int) { pin_t t = *this; --pin; return t; }
|
|
};
|
|
constexpr inline bool operator==(pin_t a, pin_t b) { return a.pin == b.pin; }
|
|
constexpr inline bool operator<(pin_t a, pin_t b) { return a.pin < b.pin; }
|
|
constexpr inline bool operator<=(pin_t a, pin_t b) { return a.pin <= b.pin; }
|
|
constexpr inline bool operator>(pin_t a, pin_t b) { return a.pin > b.pin; }
|
|
constexpr inline bool operator>=(pin_t a, pin_t b) { return a.pin >= b.pin; }
|
|
constexpr inline bool operator!=(pin_t a, pin_t b) { return !(a == b); }
|
|
constexpr inline pin_int_t operator-(pin_t a, pin_t b) { return a.pin - b.pin; }
|
|
constexpr inline pin_t operator-(pin_t a, pin_int_t b) { return a.pin - b; }
|
|
constexpr inline pin_t operator+(pin_t a, pin_int_t b) { return a.pin + b; }
|
|
constexpr inline pin_t operator+(pin_int_t a, pin_t b) { return a + b.pin; }
|
|
constexpr inline pin_t operator*(pin_t a, pin_int_t b) { return a.pin * b; }
|
|
constexpr inline pin_t operator*(pin_int_t a, pin_t b) { return a * b.pin; }
|
|
inline Print &operator<<(Print &os, pin_t p) {
|
|
using AH::operator<<;
|
|
return os << +p.pin;
|
|
}
|
|
#ifndef ARDUINO
|
|
inline std::ostream &operator<<(std::ostream &os, pin_t p) {
|
|
return os << +p.pin;
|
|
}
|
|
#endif
|
|
} // namespace ExtIO
|
|
|
|
using ExtIO::pin_t;
|
|
|
|
#ifdef NO_PIN
|
|
#undef NO_PIN
|
|
#endif
|
|
|
|
constexpr pin_t NO_PIN {};
|
|
|
|
template <size_t N>
|
|
using PinList = Array<pin_t, N>;
|
|
|
|
END_AH_NAMESPACE
|