Files
loopy_midi_controller/include/led_stub.h
T
ash c20f1dec2c Add visual MIDI type indicators
- SysEx: ALL LEDs flash white 200ms
- Note: LED 0 flashes red 100ms
- CC: LED 1 flashes green 100ms
- Helps diagnose what MIDI arrives without serial
2026-06-25 22:39:37 +00:00

60 lines
1.7 KiB
C++

#pragma once
#include <cstdint>
class LedStub {
public:
virtual ~LedStub() {}
virtual void begin() = 0;
virtual void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity) = 0;
virtual void clear_all() = 0;
virtual void set_led_brightness(uint8_t brightness) = 0;
virtual void flash_activity() {}
virtual void flash_sysex() {}
virtual void flash_all(uint8_t r, uint8_t g, uint8_t b, uint16_t duration) {}
virtual void flash_one(uint8_t index, uint8_t r, uint8_t g, uint8_t b, uint16_t duration) {}
virtual void update() {}
virtual uint8_t note_to_index(uint8_t note) {
return note;
}
};
struct LedState {
uint8_t note;
uint8_t channel;
uint8_t velocity;
uint32_t timestamp;
bool active;
};
class PixelStompMux;
class DefaultLedStub : public LedStub {
private:
static const uint8_t NUM_LEDS = 10;
LedState led_states[NUM_LEDS];
bool initialized;
uint32_t activity_off_time = 0;
uint8_t saved_r = 0, saved_g = 0, saved_b = 0;
uint8_t sysex_saved_r[10] = {0}, sysex_saved_g[10] = {0}, sysex_saved_b[10] = {0};
bool sysex_flash_active = false;
uint32_t heartbeat_time = 0;
uint8_t heartbeat_phase = 0;
public:
DefaultLedStub();
void begin() override;
void set_led_state(uint8_t note, uint8_t channel, uint8_t velocity) override;
void clear_all() override;
void set_led_brightness(uint8_t brightness) override;
void flash_activity() override;
void flash_sysex() override;
void flash_all(uint8_t r, uint8_t g, uint8_t b, uint16_t duration) override;
void flash_one(uint8_t index, uint8_t r, uint8_t g, uint8_t b, uint16_t duration) override;
void update() override;
void set_mux(PixelStompMux* mux);
};