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, PinMode_t mode) override;
69 void pinModeBuffered(pin_t pin, PinMode_t mode) override;
75 void digitalWrite(pin_t, PinStatus_t) override
76 __attribute__((deprecated)) {}
81 void digitalWriteBuffered(pin_t, PinStatus_t) override
82 __attribute__((deprecated)) {}
90 int digitalRead(pin_t pin) override;
95 int digitalReadBuffered(pin_t pin) override;
103 analog_t analogRead(pin_t pin) override;
108 analog_t analogReadBuffered(pin_t pin) override;
114 void analogWrite(pin_t, analog_t) override
115 __attribute__((deprecated)) {}
120 void analogWriteBuffered(pin_t, analog_t) override
121 __attribute__((deprecated)) {}
127 void begin() override;
133 void updateBufferedOutputs() override {}
139 void updateBufferedInputs() override {}
142 const pin_t analogPin;
143 const Array<pin_t, N> addressPins;
144 const pin_t enablePin;
153 void setMuxAddress(uint8_t address);
161 void prepareReading(uint8_t address);
169 constexpr static auto MUX_ENABLED = LOW;
170 constexpr static auto MUX_DISABLED = HIGH;
179 using CD74HC4067 = AnalogMultiplex<4>;
187 using CD74HC4051 = AnalogMultiplex<3>;
192 void AnalogMultiplex<N>::pinMode(pin_t, PinMode_t mode) {
193 ExtIO::pinMode(analogPin, mode);
197 void AnalogMultiplex<N>::pinModeBuffered(pin_t, PinMode_t mode) {
198 AnalogMultiplex<N>::pinMode(analogPin, mode);
202 int AnalogMultiplex<N>::digitalRead(pin_t pin) {
204 int result = ExtIO::digitalRead(analogPin);
210 int AnalogMultiplex<N>::digitalReadBuffered(pin_t pin) {
211 return AnalogMultiplex<N>::digitalRead(pin);
215 analog_t AnalogMultiplex<N>::analogRead(pin_t pin) {
217 ExtIO::analogRead(analogPin);
218 analog_t result = ExtIO::analogRead(analogPin);
224 analog_t AnalogMultiplex<N>::analogReadBuffered(pin_t pin) {
225 return AnalogMultiplex<N>::analogRead(pin);
229 void AnalogMultiplex<N>::begin() {
230 for (const pin_t &addressPin : addressPins)
231 ExtIO::pinMode(addressPin, OUTPUT);
232 if (enablePin != NO_PIN) {
233 ExtIO::pinMode(enablePin, OUTPUT);
234 ExtIO::digitalWrite(enablePin, MUX_DISABLED);
239 void AnalogMultiplex<N>::setMuxAddress(uint8_t address) {
241 for (const pin_t &addressPin : addressPins) {
242 ExtIO::digitalWrite(addressPin, (address & mask) != 0 ? HIGH : LOW);
245 #if !defined(__AVR__) && defined(ARDUINO)
246 delayMicroseconds(5);
251 void AnalogMultiplex<N>::prepareReading(uint8_t address) {
252 setMuxAddress(address);
253 if (enablePin != NO_PIN)
254 ExtIO::digitalWrite(enablePin, MUX_ENABLED);
258 void AnalogMultiplex<N>::afterReading() {
259 if (enablePin != NO_PIN)
260 ExtIO::digitalWrite(enablePin, MUX_DISABLED);