#pragma once #include "ExtendedInputOutput.hpp" #include #include BEGIN_AH_NAMESPACE class ExtendedIOElement : public UpdatableCRTP { 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 &getAll(); private: const pin_int_t length; const pin_t start; const pin_t end; static pin_t offset; }; END_AH_NAMESPACE