Line data Source code
1 : #pragma once 2 : 3 : #include "Selector.hpp" 4 : #include <AH/Hardware/IncrementDecrementButtons.hpp> 5 : 6 : BEGIN_CS_NAMESPACE 7 : 8 : template <setting_t N, class Callback = EmptySelectorCallback> 9 7 : class GenericIncrementDecrementSelector : public GenericSelector<N, Callback> { 10 : using Parent = GenericSelector<N, Callback>; 11 : 12 : public: 13 7 : GenericIncrementDecrementSelector( 14 : Selectable<N> &selectable, const Callback &callback, 15 : const AH::IncrementDecrementButtons &buttons, Wrap wrap = Wrap::Wrap) 16 14 : : GenericSelector<N, Callback>{selectable, callback}, buttons{buttons}, 17 21 : wrap{wrap} {} 18 : 19 5 : void begin() override { 20 5 : Parent::begin(); 21 5 : buttons.begin(); 22 5 : } 23 : 24 19 : void update() override { 25 19 : Parent::update(); 26 : using IncrDecrButtons = AH::IncrementDecrementButtons; 27 19 : switch (buttons.update()) { 28 5 : case IncrDecrButtons::Increment: this->increment(wrap); break; 29 5 : case IncrDecrButtons::Decrement: this->decrement(wrap); break; 30 1 : case IncrDecrButtons::Reset: this->reset(); break; 31 8 : case IncrDecrButtons::Nothing: break; 32 0 : default: break; 33 : } 34 19 : } 35 : 36 : #ifdef INDIVIDUAL_BUTTON_INVERT 37 : void invert() { buttons.invert(); } 38 : #endif 39 : 40 : AH::IncrementDecrementButtons::State getButtonsState() const { 41 : return buttons.getState(); 42 : } 43 : 44 : private: 45 : AH::IncrementDecrementButtons buttons; 46 : Wrap wrap; 47 : }; 48 : 49 : // -------------------------------------------------------------------------- // 50 : 51 : /** 52 : * @brief Selector with two buttons (one to increment, one to decrement). 53 : * 54 : * Pressing two buttons simultaneously resets to the default setting. 55 : * 56 : * @htmlonly 57 : * <object type="image/svg+xml" data="../../selector-increment-decrement-LED.svg"></object> 58 : * @endhtmlonly 59 : * 60 : * @ingroup Selectors 61 : * 62 : * @tparam N 63 : * The number of settings. 64 : */ 65 : template <setting_t N> 66 6 : class IncrementDecrementSelector : public GenericIncrementDecrementSelector<N> { 67 : public: 68 6 : IncrementDecrementSelector(Selectable<N> &selectable, 69 : const AH::IncrementDecrementButtons &buttons, 70 : Wrap wrap = Wrap::Wrap) 71 6 : : GenericIncrementDecrementSelector<N>{ 72 6 : selectable, 73 : {}, 74 6 : buttons, 75 6 : wrap, 76 12 : } {} 77 : }; 78 : 79 : END_CS_NAMESPACE