8#include "ExtendedInputOutput.hpp"
283 template <
class FRet,
class... FArgs,
class Fallback>
284 FRet __attribute__((always_inline))
292 return static_cast<FRet
>(0);
356 else if (dataPin.
element !=
nullptr && clockPin.
element !=
nullptr) {
357 const auto dataEl = dataPin.
element;
359 const auto clockEl = clockPin.
element;
361 for (uint8_t i = 0; i < 8; i++) {
362 uint8_t mask = bitOrder == LSBFIRST ? (1 << i) : (1 << (7 - i));
363 dataEl->digitalWrite(dataPinN, (val & mask) ?
HIGH :
LOW);
364 clockEl->digitalWrite(clockPinN,
HIGH);
365 clockEl->digitalWrite(clockPinN,
LOW);
370 for (uint8_t i = 0; i < 8; i++) {
371 uint8_t mask = bitOrder == LSBFIRST ? (1 << i) : (1 << (7 - i));
constexpr PinStatus_t LOW
AH::function_traits< decltype(::digitalWrite)>::argument_t< 0 > ArduinoPin_t
constexpr PinStatus_t HIGH
AH::function_traits< decltype(::pinMode)>::argument_t< 1 > PinMode_t
AH::function_traits< decltype(::digitalWrite)>::argument_t< 1 > PinStatus_t
uint16_t analog_t
The type returned from analogRead and similar functions.
constexpr pin_t NO_PIN
A special pin number that indicates an unused or invalid pin.
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
#define BEGIN_AH_NAMESPACE
#define AH_DIAGNOSTIC_POP()
#define AH_DIAGNOSTIC_WERROR()
An abstract base class for Extended Input/Output elements.
pin_t getStart() const
Get the smallest global extended IO pin number that belongs to this extended IO element.
ExtendedIOElement(ExtendedIOElement &&)=default
Move constructor.
virtual void updateBufferedInputs()=0
Read the physical state into the input buffers.
ExtendedIOElement(const ExtendedIOElement &)=delete
Copying not allowed.
virtual void updateBufferedOutputs()=0
Write the internal state to the physical outputs.
pin_t pin(pin_t pin) const
Get the extended IO pin number of a given physical pin of this extended IO element.
pin_t getLength() const
Get the number of pins this IO element has.
virtual void analogWriteBuffered(pin_t pin, analog_t val)=0
Write an analog (or PWM) value to the software buffer given pin.
virtual analog_t analogRead(pin_t pin)
Read the analog value of the given pin.
virtual PinStatus_t digitalReadBuffered(pin_t pin)=0
Read the state of the given pin from the software buffer.
pin_t operator[](pin_t pin) const
Get the extended IO pin number of a given physical pin of this extended IO element.
virtual void digitalWriteBuffered(pin_t pin, PinStatus_t state)=0
Set the output of a given pin in the software buffer.
virtual void pinMode(pin_t pin, PinMode_t mode)
Set the mode of a given pin.
ExtendedIOElement & operator=(const ExtendedIOElement &)=delete
Copying not allowed.
virtual void begin()=0
Initialize the extended IO element.
ExtendedIOElement(pin_t length)
Create an ExtendedIOElement with the given number of pins.
static DoublyLinkedList< ExtendedIOElement > & getAll()
Get the list of all Extended IO elements.
virtual void analogWrite(pin_t pin, analog_t val)
Write an analog (or PWM) value to the given pin.
static void updateAllBufferedOutputs()
Write the internal states to the physical outputs for all extended IO elements.
pin_t getEnd() const
Get the largest global extended IO pin number that belongs to this extended IO element.
ExtendedIOElement & operator=(ExtendedIOElement &&)=delete
Move assignment.
static void beginAll()
Initialize all extended IO elements.
virtual void digitalWrite(pin_t pin, PinStatus_t state)
Set the output of the given pin to the given state.
virtual void pinModeBuffered(pin_t pin, PinMode_t mode)=0
Set the mode of a given pin in the software buffer.
static void updateAllBufferedInputs()
Read the physical state into the input buffers for all extended IO elements.
virtual analog_t analogReadBuffered(pin_t pin)=0
Read the analog value of the given pin from the software buffer.
virtual PinStatus_t digitalRead(pin_t pin)
Read the state of the given pin.
A super class for object that have to be updated regularly.
Array< decltype(F{}(U{})), N > apply(const Array< U, N > &src, F f)
Apply a function to all elements of the array and return a copy.
void analogWriteBuffered(pin_t pin, analog_t val)
A buffered ExtIO version of the Arduino function.
bool isNativePin(pin_t pin)
Check if the given pin number is a real Arduino pin number, and not an ExtIO pin number.
void pinModeBuffered(pin_t pin, PinMode_t mode)
A buffered ExtIO version of the Arduino function.
ExtendedIOElement * getIOElementOfPin(pin_t pin)
Find the IO element of a given extended IO pin number.
void digitalWriteBuffered(pin_t pin, PinStatus_t val)
A buffered ExtIO version of the Arduino function.
void analogWrite(pin_t pin, analog_t val)
An ExtIO version of the Arduino function.
void pinMode(pin_t pin, PinMode_t mode)
An ExtIO version of the Arduino function.
PinStatus_t digitalReadBuffered(pin_t pin)
A buffered ExtIO version of the Arduino function.
analog_t analogRead(pin_t pin)
An ExtIO version of the Arduino function.
analog_t analogReadBuffered(pin_t pin)
A buffered ExtIO version of the Arduino function.
PinStatus_t digitalRead(pin_t pin)
An ExtIO version of the Arduino function.
void shiftOut(pin_t dataPin, pin_t clockPin, BitOrder_t bitOrder, uint8_t val)
An ExtIO version of the Arduino function.
void digitalWrite(pin_t pin, PinStatus_t val)
An ExtIO version of the Arduino function.
A namespace with alternatives to the standard Arduino IO functions that can be used with extended IO ...
PinStatus_t digitalRead(CachedExtIOPin pin)
An ExtIO version of the Arduino function.
analog_t analogRead(CachedExtIOPin pin)
An ExtIO version of the Arduino function.
ArduinoPin_t arduino_pin_cast(T t)
ExtendedIOElement * element
CachedExtIOPin(pin_t pin)