cs-midi/AH/Hardware/ExtendedInputOutput/ExtendedIOElement.hpp

72 lines
2.1 KiB
C++

#pragma once
#include "ExtendedInputOutput.hpp"
#include <AH/Containers/Updatable.hpp>
#include <AH/Hardware/Hardware-Types.hpp>
BEGIN_AH_NAMESPACE
class ExtendedIOElement : public UpdatableCRTP<ExtendedIOElement> {
protected:
ExtendedIOElement(pin_int_t length);
ExtendedIOElement(const ExtendedIOElement &) = delete;
ExtendedIOElement &operator=(const ExtendedIOElement &) = delete;
ExtendedIOElement(ExtendedIOElement &&) = default;
ExtendedIOElement &operator=(ExtendedIOElement &&) = delete;
public:
virtual void pinMode(pin_int_t pin, PinMode_t mode) {
pinModeBuffered(pin, mode);
updateBufferedOutputs();
}
virtual void pinModeBuffered(pin_int_t pin, PinMode_t mode) = 0;
virtual void digitalWrite(pin_int_t pin, PinStatus_t state) {
digitalWriteBuffered(pin, state);
updateBufferedOutputs();
}
virtual void digitalWriteBuffered(pin_int_t pin, PinStatus_t state) = 0;
virtual PinStatus_t digitalRead(pin_int_t pin) {
updateBufferedInputs();
return digitalReadBuffered(pin);
}
virtual PinStatus_t digitalReadBuffered(pin_int_t pin) = 0;
virtual void analogWrite(pin_int_t pin, analog_t val) {
analogWriteBuffered(pin, val);
updateBufferedOutputs();
}
virtual void analogWriteBuffered(pin_int_t pin, analog_t val) = 0;
virtual analog_t analogRead(pin_int_t pin) {
updateBufferedInputs();
return analogReadBuffered(pin);
}
virtual analog_t analogReadBuffered(pin_int_t pin) = 0;
virtual void begin() = 0;
static void beginAll();
virtual void updateBufferedOutputs() = 0;
static void updateAllBufferedOutputs();
virtual void updateBufferedInputs() = 0;
static void updateAllBufferedInputs();
pin_t pin(pin_int_t pin) const;
pin_t operator[](pin_int_t pin) const;
pin_int_t getLength() const;
pin_t getEnd() const;
pin_t getStart() const;
static DoublyLinkedList<ExtendedIOElement> &getAll();
private:
const pin_int_t length;
const pin_t start;
const pin_t end;
static pin_t offset;
};
END_AH_NAMESPACE