#pragma once #include #include #include BEGIN_CS_NAMESPACE template class SelectorLEDsCallback { public: SelectorLEDsCallback(const PinList &ledPins) : ledPins(ledPins) {} /// Initialize. void begin() { for (pin_t pin : ledPins) { AH::ExtIO::pinMode(pin, OUTPUT); AH::ExtIO::digitalWrite(pin, LOW); } } /// Refresh, called periodically. void update() {} /// Called when the setting changes. void update(setting_t oldSetting, setting_t newSetting) { AH::ExtIO::digitalWrite(ledPins[oldSetting], LOW); AH::ExtIO::digitalWrite(ledPins[newSetting], HIGH); } private: PinList ledPins; }; class SelectorSingleLEDCallback { public: SelectorSingleLEDCallback(pin_t ledPin) : ledPin(ledPin) {} /// Initialize. void begin() { AH::ExtIO::pinMode(ledPin, OUTPUT); } /// Refresh, called periodically. void update() {} /// Called when the setting changes. void update(setting_t oldSetting, setting_t newSetting) { (void)oldSetting; AH::ExtIO::digitalWrite(ledPin, newSetting == 0 ? LOW : HIGH); } private: pin_t ledPin; }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief EncoderSelector * This version displays the setting using LEDs. * @details @copydetails EncoderSelector * @ingroup SelectorsLEDs */ template class EncoderSelectorLEDs : public GenericEncoderSelector> { public: EncoderSelectorLEDs(Selectable &selectable, const EncoderSwitchPinList &pins, const PinList &ledPins, int8_t pulsesPerStep = 4, Wrap wrap = Wrap::Wrap) : GenericEncoderSelector> { selectable, {ledPins}, pins, pulsesPerStep, wrap, } {} }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief IncrementDecrementSelector * This version displays the setting using LEDs. * @details @copydetails IncrementDecrementSelector * @ingroup SelectorsLEDs */ template class IncrementDecrementSelectorLEDs : public GenericIncrementDecrementSelector> { public: IncrementDecrementSelectorLEDs(Selectable &selectable, const AH::IncrementDecrementButtons &buttons, const PinList &ledPins, Wrap wrap = Wrap::Wrap) : GenericIncrementDecrementSelector> { selectable, {ledPins}, buttons, wrap, } {} }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief IncrementSelector * This version displays the setting using LEDs. * @details @copydetails IncrementSelector * @ingroup SelectorsLEDs */ template class IncrementSelectorLEDs : public GenericIncrementSelector> { public: IncrementSelectorLEDs(Selectable &selectable, const AH::Button &button, const PinList &ledPins) : GenericIncrementSelector> { selectable, {ledPins}, button} {} }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief ManyButtonsSelector * This version displays the setting using LEDs. * @details @copydetails ManyButtonsSelector * @ingroup SelectorsLEDs */ template class ManyButtonsSelectorLEDs : public GenericManyButtonsSelector> { public: ManyButtonsSelectorLEDs(Selectable &selectable, const PinList &buttonPins, const PinList &ledPins) : GenericManyButtonsSelector> { selectable, {ledPins}, buttonPins, } {} }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief ProgramChangeSelector * This version displays the setting using LEDs. * @details @copydetails ProgramChangeSelector * @ingroup SelectorsLEDs */ template class ProgramChangeSelectorLEDs : public GenericProgramChangeSelector> { public: ProgramChangeSelectorLEDs(Selectable &selectable, MIDIChannelCable address, const PinList &ledPins) : GenericProgramChangeSelector> { selectable, {ledPins}, address, } {} }; END_CS_NAMESPACE // -------------------------------------------------------------------------- // #include BEGIN_CS_NAMESPACE /** * @brief @copybrief SwitchSelector * This version displays the setting using LEDs. * @details @copydetails SwitchSelector * @ingroup SelectorsLEDs */ class SwitchSelectorLED : public GenericSwitchSelector { public: SwitchSelectorLED(Selectable<2> &selectable, const AH::Button &button, pin_t ledPin) : GenericSwitchSelector { selectable, {ledPin}, button, } {} }; END_CS_NAMESPACE