Line data Source code
1 : #pragma once
2 :
3 : #include <AH/Hardware/Button.hpp>
4 : #include <Banks/BankableAddresses.hpp>
5 : #include <Def/Def.hpp>
6 : #include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
7 :
8 : BEGIN_CS_NAMESPACE
9 :
10 : namespace Bankable {
11 :
12 : /**
13 : * @brief An abstract class for momentary push buttons that send MIDI events.
14 : *
15 : * The button is debounced.
16 : *
17 : * @see Button
18 : */
19 : template <class BankAddress, class Sender>
20 : class MIDIButton : public MIDIOutputElement {
21 : public:
22 : /**
23 : * @brief Construct a new bankable MIDIButton.
24 : *
25 : * @param bankAddress
26 : * The bankable MIDI address to send to.
27 : * @param pin
28 : * The digital input pin with the button connected.
29 : * The internal pull-up resistor will be enabled.
30 : * @param sender
31 : * The MIDI sender to use.
32 : */
33 12 : MIDIButton(BankAddress bankAddress, pin_t pin, const Sender &sender)
34 12 : : address(bankAddress), button(pin), sender(sender) {}
35 :
36 6 : void begin() override { button.begin(); }
37 26 : void update() override {
38 26 : AH::Button::State state = button.update();
39 26 : if (state == AH::Button::Falling) {
40 7 : address.lock();
41 7 : sender.sendOn(address.getActiveAddress());
42 19 : } else if (state == AH::Button::Rising) {
43 7 : sender.sendOff(address.getActiveAddress());
44 7 : address.unlock();
45 : }
46 26 : }
47 :
48 : /// @see @ref AH::Button::invert()
49 : void invert() { button.invert(); }
50 :
51 : AH::Button::State getButtonState() const { return button.getState(); }
52 :
53 : protected:
54 : BankAddress address;
55 : AH::Button button;
56 :
57 : public:
58 : Sender sender;
59 : };
60 :
61 : } // namespace Bankable
62 :
63 : END_CS_NAMESPACE
|