cs-midi/Selectors/LEDs/SelectorLEDs.hpp

219 lines
6.0 KiB
C++

#pragma once
#include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
#include <Def/Def.hpp>
#include <Selectors/Selector.hpp>
BEGIN_CS_NAMESPACE
template <setting_t N>
class SelectorLEDsCallback {
public:
SelectorLEDsCallback(const PinList<N> &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<N> 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 <Selectors/EncoderSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief EncoderSelector
* This version displays the setting using LEDs.
* @details @copydetails EncoderSelector
* @ingroup SelectorsLEDs
*/
template <setting_t N>
class EncoderSelectorLEDs
: public GenericEncoderSelector<N, SelectorLEDsCallback<N>> {
public:
EncoderSelectorLEDs(Selectable<N> &selectable,
const EncoderSwitchPinList &pins,
const PinList<N> &ledPins, int8_t pulsesPerStep = 4,
Wrap wrap = Wrap::Wrap)
: GenericEncoderSelector<N, SelectorLEDsCallback<N>> {
selectable, {ledPins}, pins, pulsesPerStep, wrap,
} {}
};
END_CS_NAMESPACE
// -------------------------------------------------------------------------- //
#include <Selectors/IncrementDecrementSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief IncrementDecrementSelector
* This version displays the setting using LEDs.
* @details @copydetails IncrementDecrementSelector
* @ingroup SelectorsLEDs
*/
template <setting_t N>
class IncrementDecrementSelectorLEDs
: public GenericIncrementDecrementSelector<N, SelectorLEDsCallback<N>> {
public:
IncrementDecrementSelectorLEDs(Selectable<N> &selectable,
const AH::IncrementDecrementButtons &buttons,
const PinList<N> &ledPins,
Wrap wrap = Wrap::Wrap)
: GenericIncrementDecrementSelector<N, SelectorLEDsCallback<N>> {
selectable,
{ledPins},
buttons,
wrap,
} {}
};
END_CS_NAMESPACE
// -------------------------------------------------------------------------- //
#include <Selectors/IncrementSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief IncrementSelector
* This version displays the setting using LEDs.
* @details @copydetails IncrementSelector
* @ingroup SelectorsLEDs
*/
template <setting_t N>
class IncrementSelectorLEDs
: public GenericIncrementSelector<N, SelectorLEDsCallback<N>> {
public:
IncrementSelectorLEDs(Selectable<N> &selectable, const AH::Button &button,
const PinList<N> &ledPins)
: GenericIncrementSelector<N, SelectorLEDsCallback<N>> {
selectable, {ledPins}, button} {}
};
END_CS_NAMESPACE
// -------------------------------------------------------------------------- //
#include <Selectors/ManyButtonsSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief ManyButtonsSelector
* This version displays the setting using LEDs.
* @details @copydetails ManyButtonsSelector
* @ingroup SelectorsLEDs
*/
template <setting_t N>
class ManyButtonsSelectorLEDs
: public GenericManyButtonsSelector<N, SelectorLEDsCallback<N>> {
public:
ManyButtonsSelectorLEDs(Selectable<N> &selectable,
const PinList<N> &buttonPins,
const PinList<N> &ledPins)
: GenericManyButtonsSelector<N, SelectorLEDsCallback<N>> {
selectable,
{ledPins},
buttonPins,
} {}
};
END_CS_NAMESPACE
// -------------------------------------------------------------------------- //
#include <Selectors/ProgramChangeSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief ProgramChangeSelector
* This version displays the setting using LEDs.
* @details @copydetails ProgramChangeSelector
* @ingroup SelectorsLEDs
*/
template <setting_t N>
class ProgramChangeSelectorLEDs
: public GenericProgramChangeSelector<N, SelectorLEDsCallback<N>> {
public:
ProgramChangeSelectorLEDs(Selectable<N> &selectable,
MIDIChannelCable address,
const PinList<N> &ledPins)
: GenericProgramChangeSelector<N, SelectorLEDsCallback<N>> {
selectable,
{ledPins},
address,
} {}
};
END_CS_NAMESPACE
// -------------------------------------------------------------------------- //
#include <Selectors/SwitchSelector.hpp>
BEGIN_CS_NAMESPACE
/**
* @brief @copybrief SwitchSelector
* This version displays the setting using LEDs.
* @details @copydetails SwitchSelector
* @ingroup SelectorsLEDs
*/
class SwitchSelectorLED
: public GenericSwitchSelector<SelectorSingleLEDCallback> {
public:
SwitchSelectorLED(Selectable<2> &selectable, const AH::Button &button,
pin_t ledPin)
: GenericSwitchSelector<SelectorSingleLEDCallback> {
selectable,
{ledPin},
button,
} {}
};
END_CS_NAMESPACE