#include "driver/adc.h" #include "esp_adc_cal.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "squeeze.h" // Private variables static const char *TAG = "squeeze"; esp_adc_cal_characteristics_t adc1_chars; static squeezable_t squeezables[SQUEEZABLE_MAX] = {0}; // Private prototypes static void squeeze_process(void); void squeeze_init(void) { // ADC1 chan0 is PIN1 adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_12); squeezables[SQUEEZABLE_HEART].adc_channel = ADC1_CHANNEL_0; // ADC1 chan1 is GPIO2 adc1_config_channel_atten(ADC1_CHANNEL_1, ADC_ATTEN_DB_12); squeezables[SQUEEZABLE_BRAIN].adc_channel = ADC1_CHANNEL_1; esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars); xTaskCreatePinnedToCore(squeeze_process, "squeeze", 1024*2, NULL, 10, NULL, 1); } static void squeeze_process(void) { for(;;) { for(uint8_t i=0; i 4.0 && squeezables[i].delta_last < 4.0) { ESP_LOGI(TAG, "Trigger at delta %g", delta); // set flag, consumed on read by squeeze_triggered() squeezables[i].triggered_flag = 1; } squeezables[i].delta_last = delta; } vTaskDelay(10 / portTICK_PERIOD_MS); } } float squeeze_value(squeezable_id_t id) { return squeezables[id].reading_fast; } uint8_t squeeze_triggered(squeezable_id_t id) { if(squeezables[id].triggered_flag == 1) { // consume squeezables[id].triggered_flag = 0; return 1; } else { return 0; } }