tone-generator/port.hpp

70 lines
1.1 KiB
C++

#pragma once
#include "util.hpp"
namespace port {
struct Drain {
uint8_t mask;
uint8_t imask;
volatile uint8_t* mode;
volatile uint8_t* in;
inline Drain(unsigned pin) AW_IN {
mask = digitalPinToBitMask(pin);
mode = portModeRegister(digitalPinToPort(pin));
in = portInputRegister(digitalPinToPort(pin));
imask = ~mask;
}
inline void set(uint8_t b) AW_IN {
if(b) {
*mode &= imask;
} else {
*mode |= mask;
}
}
inline uint8_t get() AW_IN {
return *in & mask;
}
};
struct Input {
uint8_t mask;
uint8_t imask;
volatile uint8_t* in;
inline Input(unsigned pin) AW_IN {
mask = digitalPinToBitMask(pin);
in = portInputRegister(digitalPinToPort(pin));
imask = ~mask;
}
inline uint8_t get() AW_IN {
return *in & mask;
}
};
struct Output {
uint8_t mask;
uint8_t imask;
volatile uint8_t* out;
inline Output(unsigned pin) AW_IN {
mask = digitalPinToBitMask(pin);
out = portOutputRegister(digitalPinToPort(pin));
imask = ~mask;
}
inline void set(uint8_t b) AW_IN {
if(b) {
*out |= mask;
} else {
*out &= imask;
}
}
};
};