LCOV - code coverage report
Current view: top level - src/Selectors - ManyButtonsSelector.hpp (source / functions) Hit Total Coverage
Test: 169c36a3797bc662d84b5726f34a3f37d3c58247 Lines: 16 16 100.0 %
Date: 2024-11-09 15:32:27 Functions: 5 7 71.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include "Selector.hpp"
       4             : #include <AH/Containers/ArrayHelpers.hpp>
       5             : #include <AH/Hardware/Button.hpp>
       6             : #include <Def/Def.hpp>
       7             : 
       8             : BEGIN_CS_NAMESPACE
       9             : 
      10             : template <setting_t N, class Callback = EmptySelectorCallback>
      11             : class GenericManyButtonsSelector : public GenericSelector<N, Callback> {
      12             :     using Parent = GenericSelector<N, Callback>;
      13             : 
      14             :   public:
      15           3 :     GenericManyButtonsSelector(Selectable<N> &selectable,
      16             :                                const Callback &callback,
      17             :                                const PinList<N> &buttonPins)
      18             :         : GenericSelector<N, Callback> {selectable, callback},
      19           3 :           buttons(AH::copyAs<AH::Button>(buttonPins)) {}
      20             : 
      21           1 :     void begin() override {
      22           1 :         Parent::begin();
      23           5 :         for (auto &btn : buttons)
      24           4 :             btn.begin();
      25           1 :     }
      26             : 
      27           1 :     void update() override {
      28           1 :         Parent::update();
      29           5 :         for (setting_t i = 0; i < N; i++)
      30           5 :             if (buttons[i].update() == AH::Button::Falling &&
      31           1 :                 buttons[this->get()].getState() != AH::Button::Pressed)
      32           1 :                 this->set(i);
      33           1 :     }
      34             : 
      35             :     void invert() {
      36             :         for (auto &btn : buttons)
      37             :             btn.invert();
      38             :     }
      39             : 
      40             :   private:
      41             :     AH::Array<AH::Button, N> buttons;
      42             : };
      43             : 
      44             : // -------------------------------------------------------------------------- //
      45             : 
      46             : /**
      47             :  * @brief   Selector that reads from @f$ N @f$ buttons.
      48             :  * 
      49             :  * Pressing the @f$ n @f$-th button selects the @f$ n @f$-th setting.
      50             :  * 
      51             :  * @htmlonly 
      52             :  * <object type="image/svg+xml" data="../../selector-multiple-momentary-switches-LED.svg"></object>
      53             :  * @endhtmlonly
      54             :  * 
      55             :  * @ingroup Selectors
      56             :  * 
      57             :  * @tparam  N 
      58             :  *          The number of settings.
      59             :  */
      60             : template <setting_t N>
      61             : class ManyButtonsSelector : public GenericManyButtonsSelector<N> {
      62             :   public:
      63           2 :     ManyButtonsSelector(Selectable<N> &selectable, const PinList<N> &buttonPins)
      64             :         : GenericManyButtonsSelector<N> {
      65             :               selectable,
      66             :               {},
      67             :               buttonPins,
      68           2 :           } {}
      69             : };
      70             : 
      71             : END_CS_NAMESPACE

Generated by: LCOV version 1.15