Line data Source code
1 : #pragma once 2 : 3 : #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp> 4 : #include <MIDI_Inputs/NoteCCKPValue.hpp> 5 : 6 : BEGIN_CS_NAMESPACE 7 : 8 : // -------------------------------------------------------------------------- // 9 : 10 : /// Generic base class for classes that listen for MIDI Note, Control Change and 11 : /// Key Pressure events on a single address and turns on an LED when the value 12 : /// is higher than a threshold. 13 : /// 14 : /// @tparam Type 15 : /// The type of MIDI messages to listen for: 16 : /// - @ref MIDIMessageType::NoteOn 17 : /// - @ref MIDIMessageType::ControlChange 18 : /// - @ref MIDIMessageType::KeyPressure 19 : template <MIDIMessageType Type> 20 : class NoteCCKPLED : public MatchingMIDIInputElement<Type, TwoByteMIDIMatcher> { 21 : public: 22 : using Matcher = TwoByteMIDIMatcher; 23 : using Parent = MatchingMIDIInputElement<Type, Matcher>; 24 : 25 : /// @param ledPin 26 : /// The output pin with the LED connected. 27 : /// @param address 28 : /// The address to listen to. 29 1 : NoteCCKPLED(pin_t ledPin, MIDIAddress address) 30 1 : : Parent(address), ledPin(ledPin) {} 31 : 32 : private: 33 2 : void handleUpdate(typename Matcher::Result match) override { 34 2 : PinStatus_t state = match.value >= threshold ? HIGH : LOW; 35 2 : AH::ExtIO::digitalWrite(ledPin, state); 36 2 : } 37 : 38 : public: 39 : /// Set the pinmode of the LED to OUTPUT. 40 1 : void begin() override { 41 1 : AH::ExtIO::pinMode(ledPin, OUTPUT); 42 1 : AH::ExtIO::digitalWrite(ledPin, LOW); 43 1 : } 44 : 45 : /// Turn off the LED. 46 0 : void reset() override { AH::ExtIO::digitalWrite(ledPin, LOW); } 47 : 48 : /// Get the LED threshold. 49 : uint8_t getThreshold() const { return threshold; } 50 : /// Set the LED threshold. LED will be on if `getValue() >= getThreshold()`. 51 : void setThreshold(uint8_t threshold) { this->threshold = threshold; } 52 : 53 : private: 54 : pin_t ledPin; 55 : uint8_t threshold = 0x01; 56 : }; 57 : 58 : /// Class that listens for MIDI Note events on a single address and turns 59 : /// on an LED when the value is higher than a threshold. 60 : /// @ingroup midi-input-elements-leds 61 : using NoteLED = NoteCCKPLED<MIDIMessageType::NoteOn>; 62 : 63 : /// Class that listens for MIDI Control Change events on a single address and 64 : /// turns on an LED when the value is higher than a threshold. 65 : /// @ingroup midi-input-elements-leds 66 : using CCLED = NoteCCKPLED<MIDIMessageType::ControlChange>; 67 : 68 : /// Class that listens for MIDI Key Pressure events on a single address and 69 : /// turns on an LED when the value is higher than a threshold. 70 : /// @ingroup midi-input-elements-leds 71 : using KPLED = NoteCCKPLED<MIDIMessageType::KeyPressure>; 72 : 73 : using NoteValueLED [[deprecated("Use NoteLED instead")]] = NoteLED; 74 : using CCValueLED [[deprecated("Use CCLED instead")]] = CCLED; 75 : 76 : // -------------------------------------------------------------------------- // 77 : 78 : namespace Bankable { 79 : 80 : /// Generic base class for classes that listen for MIDI Note, Control Change and 81 : /// Key Pressure events on a single address and save their value. This version 82 : /// listens accross multiple banks. 83 : /// 84 : /// @tparam Type 85 : /// The type of MIDI messages to listen for: 86 : /// - @ref MIDIMessageType::NoteOn 87 : /// - @ref MIDIMessageType::ControlChange 88 : /// - @ref MIDIMessageType::KeyPressure 89 : /// @tparam BankSize 90 : /// The number of banks. 91 : template <MIDIMessageType Type, uint8_t BankSize> 92 : class NoteCCKPLED : public NoteCCKPValue<Type, BankSize> { 93 : public: 94 : using Parent = NoteCCKPValue<Type, BankSize>; 95 : using Matcher = typename Parent::Matcher; 96 : 97 : /// @param config 98 : /// The bank configuration to use. 99 : /// @param ledPin 100 : /// The output pin with the LED connected. 101 : /// @param address 102 : /// The base address to listen to. 103 1 : NoteCCKPLED(BankConfig<BankSize> config, pin_t ledPin, MIDIAddress address) 104 1 : : Parent(config, address), ledPin(ledPin) {} 105 : 106 : protected: 107 3 : void handleUpdate(typename Matcher::Result match) override { 108 3 : bool newdirty = Parent::handleUpdateImpl(match); 109 3 : if (newdirty) 110 2 : display(); 111 3 : this->dirty |= newdirty; 112 3 : } 113 : 114 3 : void display() { 115 3 : PinStatus_t state = getValue() >= threshold ? HIGH : LOW; 116 3 : AH::ExtIO::digitalWrite(ledPin, state); 117 3 : } 118 : 119 : public: 120 : /// Set the pinmode of the LED to OUTPUT. 121 1 : void begin() override { 122 1 : AH::ExtIO::pinMode(ledPin, OUTPUT); 123 1 : AH::ExtIO::digitalWrite(ledPin, LOW); 124 1 : } 125 : 126 : /// Reset all values to zero and turn off the LED. 127 0 : void reset() override { 128 0 : Parent::reset(); 129 0 : AH::ExtIO::digitalWrite(ledPin, LOW); 130 0 : } 131 : 132 : using Parent::getValue; 133 : 134 : /// Get the LED threshold. 135 : uint8_t getThreshold() const { return threshold; } 136 : /// Set the LED threshold. LED will be on if `getValue() >= getThreshold()`. 137 : void setThreshold(uint8_t threshold) { this->threshold = threshold; } 138 : 139 : protected: 140 1 : void onBankSettingChange() override { 141 1 : Parent::onBankSettingChange(); 142 1 : display(); 143 1 : } 144 : 145 : private: 146 : pin_t ledPin; 147 : uint8_t threshold = 0x01; 148 : }; 149 : 150 : /// Class that listens for MIDI Note events on a single address and 151 : /// turns on an LED when the value is higher than a threshold. 152 : /// This version listens accross multiple banks. 153 : /// @ingroup BankableMIDIInputElementsLEDs 154 : template <uint8_t BankSize> 155 : using NoteLED = NoteCCKPLED<MIDIMessageType::NoteOn, BankSize>; 156 : 157 : /// Class that listens for MIDI Control Change events on a single address and 158 : /// turns on an LED when the value is higher than a threshold. 159 : /// This version listens accross multiple banks. 160 : /// @ingroup BankableMIDIInputElementsLEDs 161 : template <uint8_t BankSize> 162 : using CCLED = NoteCCKPLED<MIDIMessageType::ControlChange, BankSize>; 163 : 164 : /// Class that listens for MIDI Key Pressure events on a single address and 165 : /// turns on an LED when the value is higher than a threshold. 166 : /// This version listens accross multiple banks. 167 : /// @ingroup BankableMIDIInputElementsLEDs 168 : template <uint8_t BankSize> 169 : using KPLED = NoteCCKPLED<MIDIMessageType::KeyPressure, BankSize>; 170 : 171 : template <uint8_t BankSize> 172 : using NoteValueLED [[deprecated("Use NoteLED instead")]] = NoteLED<BankSize>; 173 : template <uint8_t BankSize> 174 : using CCValueLED [[deprecated("Use CCLED instead")]] = CCLED<BankSize>; 175 : 176 : } // namespace Bankable 177 : 178 : END_CS_NAMESPACE