Line data Source code
1 : #pragma once
2 :
3 : #include <AH/Hardware/LEDs/LEDs.hpp>
4 : #include <MIDI_Inputs/MCU/VPotRing.hpp>
5 :
6 : BEGIN_CS_NAMESPACE
7 :
8 : namespace MCU {
9 :
10 : class VPotRingLEDsDriver : public AH::LEDs<11> {
11 : public:
12 1 : VPotRingLEDsDriver(const AH::LEDs<11> &leds) : AH::LEDs<11>(leds) {}
13 :
14 3 : void displayVPot(VPotState v) {
15 3 : this->displayRange(v.getStartOn(), v.getStartOff());
16 3 : }
17 : };
18 :
19 : // -------------------------------------------------------------------------- //
20 :
21 : /**
22 : * @brief A MIDI input element that represents a Mackie Control Universal VPot
23 : * ring and displays it using LEDs.
24 : *
25 : * @ingroup midi-input-elements-leds
26 : */
27 : class VPotRingLEDs : public VPotRing, public VPotRingLEDsDriver {
28 : public:
29 : using Parent = VPotRing;
30 : using Matcher = Parent::Matcher;
31 :
32 : /**
33 : * Constructor.
34 : *
35 : * @param leds
36 : * The pins with LEDs connected.
37 : * @param track
38 : * The track of the VPot. [1, 8]
39 : * @param channelCN
40 : * The MIDI channel [Channel_1, Channel_16] and Cable
41 : * Number [Cable_1, Cable_16].
42 : */
43 : VPotRingLEDs(const PinList<11> &leds, uint8_t track,
44 : MIDIChannelCable channelCN = Channel_1)
45 : : Parent(track, channelCN), VPotRingLEDsDriver(leds) {}
46 :
47 : protected:
48 : void handleUpdate(typename Matcher::Result match) override {
49 : bool newdirty = Parent::handleUpdateImpl(match);
50 : if (newdirty)
51 : updateDisplay();
52 : this->dirty |= newdirty;
53 : }
54 :
55 : void updateDisplay() { this->displayVPot(this->getState()); }
56 :
57 : public:
58 : void begin() override {
59 : Parent::begin();
60 : VPotRingLEDsDriver::begin();
61 : updateDisplay();
62 : }
63 :
64 : void reset() override {
65 : Parent::reset();
66 : updateDisplay();
67 : }
68 : };
69 :
70 : namespace Bankable {
71 :
72 : /**
73 : * @brief A MIDI input element that represents a Mackie Control Universal VPot
74 : * ring and displays its value using LEDs. This version can be banked.
75 : *
76 : * @tparam BankSize
77 : * The number of banks.
78 : *
79 : * @ingroup BankableMIDIInputElementsLEDs
80 : */
81 : template <uint8_t BankSize>
82 : class VPotRingLEDs : public VPotRing<BankSize>, public VPotRingLEDsDriver {
83 : public:
84 : using Parent = VPotRing<BankSize>;
85 : using Matcher = typename Parent::Matcher;
86 :
87 : /**
88 : * Constructor.
89 : *
90 : * @param config
91 : * The bank configuration to use: the bank to add this element to,
92 : * and whether to change the address, channel or cable number.
93 : * @param leds
94 : * The pins with LEDs connected.
95 : * @param track
96 : * The track of the VPot. [1, 8]
97 : * @param channelCN
98 : * The MIDI channel [Channel_1, Channel_16] and Cable
99 : * Number [Cable_1, Cable_16].
100 : */
101 1 : VPotRingLEDs(BankConfig<BankSize> config, const PinList<11> &leds,
102 : uint8_t track, MIDIChannelCable channelCN = Channel_1)
103 1 : : Parent(config, track, channelCN), VPotRingLEDsDriver(leds) {}
104 :
105 : protected:
106 2 : void handleUpdate(typename Matcher::Result match) override {
107 2 : bool newdirty = Parent::handleUpdateImpl(match);
108 2 : if (newdirty)
109 1 : updateDisplay();
110 2 : this->dirty |= newdirty;
111 2 : }
112 :
113 3 : void updateDisplay() { this->displayVPot(this->getState()); }
114 :
115 : public:
116 1 : void begin() override {
117 1 : Parent::begin();
118 1 : VPotRingLEDsDriver::begin();
119 1 : updateDisplay();
120 1 : }
121 :
122 0 : void reset() override {
123 0 : Parent::reset();
124 0 : updateDisplay();
125 0 : }
126 :
127 : protected:
128 1 : void onBankSettingChange() override {
129 1 : Parent::onBankSettingChange();
130 1 : updateDisplay();
131 1 : }
132 : };
133 :
134 : } // namespace Bankable
135 :
136 : } // namespace MCU
137 :
138 : END_CS_NAMESPACE
|