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 8 : case IncrDecrButtons::Nothing: break; 29 : case IncrDecrButtons::IncrementShort: // fallthrough 30 : case IncrDecrButtons::IncrementLong: // fallthrough 31 5 : case IncrDecrButtons::IncrementHold: this->increment(wrap); break; 32 : case IncrDecrButtons::DecrementShort: // fallthrough 33 : case IncrDecrButtons::DecrementLong: // fallthrough 34 5 : case IncrDecrButtons::DecrementHold: this->decrement(wrap); break; 35 1 : case IncrDecrButtons::Reset: this->reset(); break; 36 0 : default: break; 37 : } 38 19 : } 39 : 40 : #ifdef AH_INDIVIDUAL_BUTTON_INVERT 41 : void invert() { buttons.invert(); } 42 : #endif 43 : 44 : AH::IncrementDecrementButtons::State getButtonsState() const { 45 : return buttons.getState(); 46 : } 47 : 48 : private: 49 : AH::IncrementDecrementButtons buttons; 50 : Wrap wrap; 51 : }; 52 : 53 : // -------------------------------------------------------------------------- // 54 : 55 : /** 56 : * @brief Selector with two buttons (one to increment, one to decrement). 57 : * 58 : * Pressing two buttons simultaneously resets to the default setting. 59 : * 60 : * @htmlonly 61 : * <object type="image/svg+xml" data="../../selector-increment-decrement-LED.svg"></object> 62 : * @endhtmlonly 63 : * 64 : * @ingroup Selectors 65 : * 66 : * @tparam N 67 : * The number of settings. 68 : */ 69 : template <setting_t N> 70 6 : class IncrementDecrementSelector : public GenericIncrementDecrementSelector<N> { 71 : public: 72 6 : IncrementDecrementSelector(Selectable<N> &selectable, 73 : const AH::IncrementDecrementButtons &buttons, 74 : Wrap wrap = Wrap::Wrap) 75 6 : : GenericIncrementDecrementSelector<N>{ 76 6 : selectable, 77 6 : {}, 78 6 : buttons, 79 6 : wrap, 80 12 : } {} 81 : }; 82 : 83 : END_CS_NAMESPACE