cs-midi/AH/Hardware/Hardware-Types.hpp

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