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