cs-midi/MIDI_Outputs/Abstract/MIDIButtons.hpp

66 lines
1.8 KiB
C++

#pragma once
#include <AH/Hardware/Button.hpp>
#include <Def/Def.hpp>
#include <MIDI_Outputs/Abstract/MIDIOutputElement.hpp>
BEGIN_CS_NAMESPACE
template <class Sender, uint8_t NumButtons>
class MIDIButtons : public MIDIOutputElement {
protected:
MIDIButtons(const Array<AH::Button, NumButtons> &buttons,
MIDIAddress baseAddress, RelativeMIDIAddress incrementAddress,
const Sender &sender)
: buttons(buttons), baseAddress(baseAddress),
incrementAddress(incrementAddress), sender(sender) {}
public:
void begin() final override {
for (auto &button : buttons)
button.begin();
}
void update() final override {
MIDIAddress address = baseAddress;
for (auto &button : buttons) {
AH::Button::State state = button.update();
if (state == AH::Button::Falling) {
sender.sendOn(address);
} else if (state == AH::Button::Rising) {
sender.sendOff(address);
}
address += incrementAddress;
}
}
AH::Button::State getButtonState(size_t index) const {
return buttons[index].getState();
}
MIDIAddress getBaseAddress() const { return this->baseAddress; }
void setBaseAddressUnsafe(MIDIAddress address) {
this->baseAddress = address;
}
RelativeMIDIAddress getIncrementAddress() const {
return this->incrementAddress;
}
void setIncrementAddressUnsafe(RelativeMIDIAddress address) {
this->incrementAddress = address;
}
void invert() {
for (auto &button : buttons)
button.invert();
}
private:
Array<AH::Button, NumButtons> buttons;
MIDIAddress baseAddress;
RelativeMIDIAddress incrementAddress;
public:
Sender sender;
};
END_CS_NAMESPACE