LCOV - code coverage report
Current view: top level - src/AH/Hardware - Button.hpp (source / functions) Coverage Total Hit
Test: 73449d9b107c772cf65493691543348214e5d5eb Lines: 100.0 % 5 5
Test Date: 2026-06-06 17:44:35 Functions: 100.0 % 3 3
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* ✔ */
       2              : 
       3              : #pragma once
       4              : 
       5              : #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
       6              : #include <AH/Settings/SettingsWrapper.hpp>
       7              : 
       8              : BEGIN_AH_NAMESPACE
       9              : 
      10              : /**
      11              :  * @brief   A class for reading and debouncing buttons and switches.
      12              :  * 
      13              :  * @ingroup AH_HardwareUtils
      14              :  */
      15              : class Button {
      16              :   public:
      17              :     /**
      18              :      * @brief   Construct a new Button object.
      19              :      * 
      20              :      * **This constructor should not be used.**  
      21              :      * It is just a way to easily create arrays of buttons, and initializing
      22              :      * them later.
      23              :      */
      24           12 :     Button() : pin(NO_PIN) {}
      25              : 
      26              :     /**
      27              :      * @brief   Construct a new Button object.
      28              :      *
      29              :      * @param   pin
      30              :      *          The digital pin to read from. The internal pull-up resistor
      31              :      *          will be enabled when `begin` is called.
      32              :      */
      33              :     Button(pin_t pin);
      34              :     /// @copydoc Button(pin_t)
      35           32 :     Button(ArduinoPin_t pin) : Button(pin_t(pin)) {}
      36              : 
      37              :     /// @brief   Initialize (enable the internal pull-up resistor).
      38              :     void begin();
      39              : 
      40              :     /**
      41              :      * @brief   Invert the input state of this button
      42              :      *          (button pressed is `HIGH` instead of `LOW`).
      43              :      */
      44              :     void invert();
      45              : 
      46              :     /// @brief   An enumeration of the different states a button can be in.
      47              :     enum State {
      48              :         Pressed = 0b00,  ///< Input went from low to low   (0,0)
      49              :         Released = 0b11, ///< Input went from high to high (1,1)
      50              :         Falling = 0b10,  ///< Input went from high to low  (1,0)
      51              :         Rising = 0b01    ///< Input went from low to high  (0,1)
      52              :     };
      53              : 
      54              :     /**
      55              :      * @brief   Read the button and return its new state.
      56              :      *
      57              :      * The button is debounced, the debounce time can be set in
      58              :      * Settings.hpp: #BUTTON_DEBOUNCE_TIME.
      59              :      *
      60              :      * ```
      61              :      * Debounce time: ├────┤
      62              :      *
      63              :      * Raw input:
      64              :      *    HIGH  ──────┐      ┌──────┐ ┌─┐      ┌─┐ ┌──────┐ ┌────────
      65              :      *    LOW         └──────┘      └─┘ └──────┘ └─┘      └─┘
      66              :      *                ├────┤ ├────┤ ├─┼─┼────┤ ├─┼─┼────┤ ├─┼────┤
      67              :      *
      68              :      * Debounced output:
      69              :      *    HIGH  ──────┐      ┌──────┐          ┌──────────┐      ┌───
      70              :      *    LOW         └──────┘      └──────────┘          └──────┘
      71              :      *
      72              :      * States:
      73              :      *    HIGH  ────────────────┐                  ┌─────────────────
      74              :      *    LOW                   └──────────────────┘
      75              :      *            Released   Falling   Pressed   Rising
      76              :      * ```
      77              :      *
      78              :      * @return  The state of the button, either Button::Pressed,
      79              :      *          Button::Released, Button::Falling or Button::Rising.
      80              :      */
      81              :     State update();
      82              : 
      83              :     /**
      84              :      * @brief   Get the state of the button, without updating it.
      85              :      *          Returns the same value as the last call to @ref update.
      86              :      *
      87              :      * @return  The state of the button, either Button::Pressed,
      88              :      *          Button::Released, Button::Falling or Button::Rising.
      89              :      */
      90              :     State getState() const;
      91              : 
      92              :     /// @brief   Return the name of the state as a string.
      93              :     static FlashString_t getName(State state);
      94              : 
      95              :     /// Return the time point (in milliseconds) when the button last bounced.
      96              :     unsigned long previousBounceTime() const;
      97              : 
      98              :     /// Return the time (in milliseconds) that the button has been stable for,
      99              :     /// compared to the given time point.
     100              :     unsigned long stableTime(unsigned long now) const;
     101              : 
     102              :     /// Return the time (in milliseconds) that the button has been stable for.
     103              :     unsigned long stableTime() const;
     104              : 
     105              :     /**
     106              :      * @brief   Set the debounce time for all Button%s.
     107              :      * 
     108              :      * @note    This function affects **all** Button objects.
     109              :      * 
     110              :      * @param   debounceTime
     111              :      *          The new debounce time in milliseconds.
     112              :      */
     113              :     static void
     114              :     setDebounceTime(unsigned long debounceTime = BUTTON_DEBOUNCE_TIME);
     115              : 
     116              :     /**
     117              :      * @brief   Get the debounce time.
     118              :      * @return  The debounce time in milliseconds.
     119              :      * @see     setDebounceTime
     120              :      */
     121              :     static unsigned long getDebounceTime();
     122              : 
     123              :   private:
     124              :     pin_t pin;
     125              : 
     126              :     struct InternalState {
     127          111 :         InternalState()
     128          111 :             : debounced(0b11), bouncing(true), prevInput(HIGH), invert(false),
     129          111 :               prevBounceTime(0) {}
     130              :         uint8_t debounced : 2;
     131              :         bool bouncing : 1;
     132              :         bool prevInput : 1;
     133              :         bool invert : 1;
     134              :         unsigned long prevBounceTime;
     135              :     } state;
     136              : 
     137              :     /// Edit this in Settings.hpp
     138              :     /// @see    BUTTON_DEBOUNCE_TIME
     139              :     static unsigned long debounceTime;
     140              : };
     141              : 
     142              : END_AH_NAMESPACE
        

Generated by: LCOV version 2.4-beta