diff --git a/src/app_task.cpp b/src/app_task.cpp index 89f12dd..c736963 100644 --- a/src/app_task.cpp +++ b/src/app_task.cpp @@ -1,5 +1,7 @@ #include "app_task.h" #include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" AppTask::AppTask(LedStub* led, SwitchStub* sw, UsbMidiTransport* midi) : led_driver(led), switch_driver(sw), midi_transport(midi) { @@ -23,9 +25,82 @@ void AppTask::begin() { process_midi_event(event); }); + // Auto-run layout test on boot (no serial needed) + run_layout_test(); + Serial.println("[APP] Controller ready"); } +void AppTask::run_layout_test() { + Serial.println("[APP] Running layout identification test..."); + + // Test 1: Launchpad X (notes 36-45, ch1) + Serial.println("[APP] Layout 1: Launchpad X (notes 36-45, ch1)"); + for (uint8_t i = 0; i < NUM_PADS; i++) { + MidiEvent event; + event.type = MidiEvent::NOTE_ON; + event.channel = 1; + event.data1 = 36 + i; + event.data2 = 64; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(1500)); + event.type = MidiEvent::NOTE_OFF; + event.data2 = 0; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(300)); + } + + // Test 2: Launchpad Mini (notes 0-9, ch1) + Serial.println("[APP] Layout 2: Launchpad Mini (notes 0-9, ch1)"); + for (uint8_t i = 0; i < NUM_PADS; i++) { + MidiEvent event; + event.type = MidiEvent::NOTE_ON; + event.channel = 1; + event.data1 = i; + event.data2 = 64; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(1500)); + event.type = MidiEvent::NOTE_OFF; + event.data2 = 0; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(300)); + } + + // Test 3: Channel 2 (notes 36-45) + Serial.println("[APP] Layout 3: Channel 2 flashing (notes 36-45, ch2)"); + for (uint8_t i = 0; i < NUM_PADS; i++) { + MidiEvent event; + event.type = MidiEvent::NOTE_ON; + event.channel = 2; + event.data1 = 36 + i; + event.data2 = 64; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(1500)); + event.type = MidiEvent::NOTE_OFF; + event.data2 = 0; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(300)); + } + + // Test 4: Channel 3 (notes 36-45) + Serial.println("[APP] Layout 4: Channel 3 pulsing (notes 36-45, ch3)"); + for (uint8_t i = 0; i < NUM_PADS; i++) { + MidiEvent event; + event.type = MidiEvent::NOTE_ON; + event.channel = 3; + event.data1 = 36 + i; + event.data2 = 64; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(1500)); + event.type = MidiEvent::NOTE_OFF; + event.data2 = 0; + process_midi_event(event); + vTaskDelay(pdMS_TO_TICKS(300)); + } + + Serial.println("[APP] Layout test complete - observe which lit your pads"); +} + void AppTask::update() { for (uint8_t i = 0; i < NUM_PADS; i++) { bool is_pressed = switch_driver->is_pressed(i);