#ifndef BUTTON_DIGITAL_H #define BUTTON_DIGITAL_H #include "button.h" #include "hal.h" /* * Button -- Real hardware implementation (digital read). * * Reads a physical pushbutton connected to a digital pin. * Supports both wiring configurations: * * Active-low (most common, use INPUT_PULLUP): * Pin -> Button -> GND * Reads LOW when pressed, HIGH when released. * Set active_low = true (default). * * Active-high (external pull-down resistor): * Pin -> Button -> VCC, with pull-down to GND * Reads HIGH when pressed, LOW when released. * Set active_low = false. * * Wiring (active-low, no external resistor needed): * Digital pin -> one leg of button * GND -> other leg of button * Set pin mode to INPUT_PULLUP in your sketch. * * Note: This implementation does NOT debounce. If your application * needs debounce (most do), implement it in your app logic -- that * way you can test it with the mock and simulator. */ class ButtonDigital : public Button { public: /// Create a button on the given digital pin. /// active_low: true if pressed reads LOW (default, use with INPUT_PULLUP). ButtonDigital(Hal* hal, uint8_t pin, bool active_low = true) : hal_(hal) , pin_(pin) , active_low_(active_low) {} bool isPressed() override { int state = hal_->digitalRead(pin_); return active_low_ ? (state == LOW) : (state == HIGH); } int readState() override { return hal_->digitalRead(pin_); } private: Hal* hal_; uint8_t pin_; bool active_low_; }; #endif // BUTTON_DIGITAL_H