#pragma once #include #include #include #include BEGIN_CS_NAMESPACE template class MIDIIncrementDecrementButtons : public MIDIOutputElement { protected: MIDIIncrementDecrementButtons(const AH::IncrementDecrementButtons &buttons, MIDIAddress address, uint8_t multiplier, MIDIAddress resetAddress, const RelativeSender &relativeSender, const ResetSender &resetSender) : buttons(buttons), address(address), multiplier(multiplier), resetAddress(resetAddress), relativeSender(relativeSender), resetSender(resetSender) {} public: void begin() override { buttons.begin(); } void update() override { using IncrDecrButtons = AH::IncrementDecrementButtons; switch (buttons.update()) { case IncrDecrButtons::Nothing: break; case IncrDecrButtons::IncrementShort: case IncrDecrButtons::IncrementLong: case IncrDecrButtons::IncrementHold: send(multiplier, address); break; case IncrDecrButtons::DecrementShort: case IncrDecrButtons::DecrementLong: case IncrDecrButtons::DecrementHold: send(-multiplier, address); break; case IncrDecrButtons::Reset: reset(); break; default: break; } } void send(long delta, MIDIAddress address) { relativeSender.send(delta, address); } void reset() { if (resetAddress) { resetSender.sendOn(resetAddress); resetSender.sendOff(resetAddress); } } void invert() { buttons.invert(); } AH::IncrementDecrementButtons::State getButtonsState() const { return buttons.getState(); } MIDIAddress getAddress() const { return this->address; } void setAddress(MIDIAddress address) { this->address = address; } MIDIAddress getResetAddress() const { return this->resetAddress; } void setResetAddress(MIDIAddress address) { this->resetAddress = address; } private: AH::IncrementDecrementButtons buttons; MIDIAddress address; uint8_t multiplier; MIDIAddress resetAddress; public: RelativeSender relativeSender; ResetSender resetSender; }; END_CS_NAMESPACE