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);