Line data Source code
1 : #pragma once
2 :
3 : #include <AH/STL/utility> // std::forward
4 : #include <Def/Def.hpp>
5 : #include <Def/TypeTraits.hpp>
6 : #include <MIDI_Outputs/Abstract/EncoderState.hpp>
7 : #include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
8 :
9 : #ifdef ARDUINO
10 : #include <Submodules/Encoder/AHEncoder.hpp>
11 : #else
12 : #include <Encoder.h> // Mock
13 : #endif
14 :
15 : BEGIN_CS_NAMESPACE
16 :
17 : /**
18 : * @brief An abstract class for rotary encoders that send MIDI events.
19 : */
20 : template <class Enc, class Sender>
21 : class GenericMIDIRotaryEncoder : public MIDIOutputElement {
22 : public:
23 : /**
24 : * @brief Construct a new MIDIRotaryEncoder.
25 : *
26 : * @todo Documentation
27 : */
28 13 : GenericMIDIRotaryEncoder(Enc &&encoder, MIDIAddress address,
29 : int16_t speedMultiply, uint8_t pulsesPerStep,
30 : const Sender &sender)
31 13 : : encoder(std::forward<Enc>(encoder)), address(address),
32 26 : encstate(speedMultiply, pulsesPerStep), sender(sender) {}
33 :
34 0 : void begin() override { begin_if_possible(encoder); }
35 :
36 32 : void update() override {
37 32 : auto encval = encoder.read();
38 32 : if (int16_t delta = encstate.update(encval)) {
39 29 : sender.send(delta, address);
40 : }
41 32 : }
42 :
43 : void setSpeedMultiply(int16_t speedMultiply) {
44 : encstate.setSpeedMultiply(speedMultiply);
45 : }
46 : int16_t getSpeedMultiply() const { return encstate.getSpeedMultiply(); }
47 :
48 : /// Get the MIDI address.
49 : MIDIAddress getAddress() const { return this->address; }
50 : /// Set the MIDI address.
51 : void setAddress(MIDIAddress address) { this->address = address; }
52 :
53 : int16_t resetPositionOffset() {
54 : auto encval = encoder.read();
55 : return encstate.update(encval);
56 : }
57 :
58 : private:
59 : Enc encoder;
60 : MIDIAddress address;
61 : EncoderState<decltype(encoder.read())> encstate;
62 :
63 : public:
64 : Sender sender;
65 : };
66 :
67 : template <class Sender>
68 : using MIDIRotaryEncoder = GenericMIDIRotaryEncoder<AHEncoder, Sender>;
69 :
70 : template <class Sender>
71 : using BorrowedMIDIRotaryEncoder = GenericMIDIRotaryEncoder<AHEncoder &, Sender>;
72 :
73 : END_CS_NAMESPACE
|