From 2abdd7be0cc77d23ba36734704ef48cca84cf56f Mon Sep 17 00:00:00 2001 From: rkcf Date: Tue, 21 Feb 2023 05:57:42 -0600 Subject: [PATCH] Feat: add ADC callback on conversion done Refs: #4 --- src/main/esp32_eurorack_generic.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/esp32_eurorack_generic.c b/src/main/esp32_eurorack_generic.c index 84ff232..bd39c74 100644 --- a/src/main/esp32_eurorack_generic.c +++ b/src/main/esp32_eurorack_generic.c @@ -1,10 +1,14 @@ #include +#include "esp_attr.h" #include "esp_err.h" #include "esp_log.h" #include "esp_adc/adc_cali.h" #include "esp_adc/adc_cali_scheme.h" #include "esp_adc/adc_continuous.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/portmacro.h" #include "hal/adc_types.h" /* ADC input pins */ @@ -19,10 +23,20 @@ static adc_channel_t channel[4] = {ADC_CHANNEL_3, ADC_CHANNEL_5, ADC_CHANNEL_8, /* ADC handles */ static adc_continuous_handle_t adc_handle; static adc_cali_handle_t adc_cali_handle; +static TaskHandle_t adc_task_handle; static const char *TAG = "EERG"; +/* ADC conversion finished callback */ +static bool IRAM_ATTR adc_conv_cb(adc_continuous_handle_t handle, const adc_continuous_evt_data_t *edata, void *user_data) +{ + BaseType_t mustYield = pdFALSE; + /* Send notification to handler task */ + vTaskNotifyGiveFromISR(adc_task_handle, &mustYield); + return (mustYield == pdTRUE); +} + /* Deinitializes ADC handles */ static void adc_cleanup(void) { @@ -75,6 +89,12 @@ static void adc_cont_init(void) } adc_config.adc_pattern = adc_pattern; ESP_ERROR_CHECK(adc_continuous_config(adc_handle, & adc_config)); + + /* Configure callbacks */ + adc_continuous_evt_cbs_t cbs = { + .on_conv_done = adc_conv_cb + }; + ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(adc_handle, &cbs, NULL)); } void app_main(void) @@ -85,6 +105,7 @@ void app_main(void) /* Initialize continuous driver */ adc_cont_init(); /* Start the continuous driver */ + adc_task_handle = xTaskGetCurrentTaskHandle(); ESP_ERROR_CHECK(adc_continuous_start(adc_handle)); /* Cleanup ADC */