void app_main(void)
{
BaseType_t ret_val = 0;
// ESP_LOG configuration
#if ESP_LOG_RANK >= 2
esp_log_level_set(TAG, ESP_LOG_DEBUG);
ESP_LOGD(TAG, "debug message");
#endif
// Initialize buffers
init_buffer();
// Load parameters
init_params();
// Initialize OLED
oled_init();
// Initialize monitor
// Must avoid IO_MUX conflicts with I2S STD driver
// If using PCNT to count pulses such as MCLK, ensure i2s_init() is done first
init_monitor();
// Init I2S before USB for stable output clocking
i2s_init();
// Init TinyUSB core
usb_init();
// Start TinyUSB task
ret_val = xTaskCreatePinnedToCore(usb_task, "ForTinyUSB", TASK_TINYUSB_STACKSIZE, NULL, TASK_TINYUSB_PRIORITY, NULL, TASK_TINYUSB_CORE);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "usb_task");
#if (TRANSFER_MODEL & TRANSFER_TASK_DUAL) || (TRANSFER_MODEL & TRANSFER_TASK_I2S_CALLBACK)
// Start UAC Read task
ret_val = xTaskCreatePinnedToCore(uac_read_task, "ForUacRead", TASK_UAC_READ_STACKSIZE, NULL, TASK_UAC_READ_PRIORITY,
NULL, TASK_UAC_READ_CORE);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "uac_read_task");
#endif
#if (TRANSFER_MODEL & TRANSFER_TASK_DUAL) || (TRANSFER_MODEL & TRANSFER_TASK_UAC_CALLBACK) || (TRANSFER_MODEL & TRANSFER_TASK_DUAL_CALLBACK)
// Start I2S Write task
ret_val = xTaskCreatePinnedToCore(i2s_write_task, "ForI2sWrite", TASK_I2S_WRITE_STACKSIZE, NULL, TASK_I2S_WRITE_PRIORITY, NULL, TASK_I2S_WRITE_CORE);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "i2s_write_task");
#endif
#if (TRANSFER_MODEL & TRANSFER_TASK_SINGLE)
// Start DDC task
ret_val = xTaskCreatePinnedToCore(ddc_task, "ForDDC", TASK_SPEAKER_STACKSIZE, NULL, TASK_SPEAKER_PRIORITY, NULL, TASK_SPEAKER_CORE);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "ddc_task");
#endif
#if (TRANSFER_MODEL&TRANSFER_MSCLK_GPTIMER)
// Start Monitor task
ret_val = xTaskCreatePinnedToCore(monitor_task_gpt, "ForTimer", TASK_GPTIMER_STACKSIZE, NULL, TASK_GPTIMER_PRIORITY, &g_monitor_task_handle, TASK_GPTIMER_CORE);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "monitor_task_gpt");
#endif
// Start OLED task
ret_val = xTaskCreatePinnedToCore(display_task, "ForOLED", 4096, NULL, 1, NULL, 1);
ESP_LOGI(TAG, "%s to create %s", ret_val == pdPASS?"Succeeded":"Failed", "display_task");
// Configure user button action
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << MODE_CHANGE_PIN),
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_NEGEDGE // interrupt on press (HIGH→LOW)
};
gpio_config(&io_conf);
// Install interrupt service
gpio_install_isr_service(0);
gpio_isr_handler_add(MODE_CHANGE_PIN, modechange_isr_handler, NULL);
ESP_LOGI(TAG, "%s to start %s", ret_val == pdPASS?"Succeeded":"Failed", "modechange_isr_handler");
// Notify that the application has started
g_app_started = true;