8 #include "ExtendedInputOutput.hpp" 
   44     AnalogMultiplex(pin_t analogPin, const Array<pin_t, N> &addressPins,
 
   45                     pin_t enablePin = NO_PIN)
 
   46         : analogPin(analogPin), addressPins(addressPins), enablePin(enablePin) {
 
   64     void pinMode(pin_t pin, uint8_t mode) override;
 
   70     void digitalWrite(pin_t, uint8_t) override 
 
   71         __attribute__((deprecated)) {}         
 
   79     int digitalRead(pin_t pin) override;
 
   87     analog_t analogRead(pin_t pin) override;
 
   93     void analogWrite(pin_t, analog_t) override 
 
   94         __attribute__((deprecated)) {}         
 
  100     void begin() override;
 
  106     void update() override {} 
 
  109     const pin_t analogPin;
 
  110     const Array<pin_t, N> addressPins;
 
  111     const pin_t enablePin;
 
  120     void setMuxAddress(uint8_t address);
 
  128     void prepareReading(uint8_t address);
 
  136     constexpr static uint8_t MUX_ENABLED = LOW;
 
  137     constexpr static uint8_t MUX_DISABLED = HIGH;
 
  146 using CD74HC4067 = AnalogMultiplex<4>;
 
  154 using CD74HC4051 = AnalogMultiplex<3>;
 
  159 void AnalogMultiplex<N>::pinMode(pin_t, uint8_t mode) {
 
  160     ExtIO::pinMode(analogPin, mode);
 
  164 int AnalogMultiplex<N>::digitalRead(pin_t pin) {
 
  166     int result = ExtIO::digitalRead(analogPin);
 
  172 analog_t AnalogMultiplex<N>::analogRead(pin_t pin) {
 
  174     ExtIO::analogRead(analogPin); 
 
  175     analog_t result = ExtIO::analogRead(analogPin);
 
  181 void AnalogMultiplex<N>::begin() {
 
  182     for (const pin_t &addressPin : addressPins)
 
  183         ExtIO::pinMode(addressPin, OUTPUT);
 
  184     if (enablePin != NO_PIN) {
 
  185         ExtIO::pinMode(enablePin, OUTPUT);
 
  186         ExtIO::digitalWrite(enablePin, MUX_DISABLED);
 
  191 void AnalogMultiplex<N>::setMuxAddress(uint8_t address) {
 
  193     for (const pin_t &addressPin : addressPins) {
 
  194         ExtIO::digitalWrite(addressPin, (address & mask) != 0);
 
  197 #if !defined(__AVR__) && !defined(__x86_64__)
 
  198     delayMicroseconds(5);
 
  203 void AnalogMultiplex<N>::prepareReading(uint8_t address) {
 
  204     setMuxAddress(address);
 
  205     if (enablePin != NO_PIN)
 
  206         ExtIO::digitalWrite(enablePin, MUX_ENABLED);
 
  210 void AnalogMultiplex<N>::afterReading() {
 
  211     if (enablePin != NO_PIN)
 
  212         ExtIO::digitalWrite(enablePin, MUX_DISABLED);