diff --git a/main/squeeze.c b/main/squeeze.c --- a/main/squeeze.c +++ b/main/squeeze.c @@ -3,12 +3,14 @@ #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" - #include "squeeze.h" -static const char *TAG = "squeeze"; +// 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); @@ -18,57 +20,57 @@ 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); } -// Definitions -#define ALPHA_FAST 0.02f -#define ALPHA_SLOW 0.005f - -// Private variables -static float reading_fast = 0.0f; -static float reading_slow = 0.0f; -static float delta_last = 0.0f; -static uint8_t triggered_flag = 0; - static void squeeze_process(void) { for(;;) { - uint32_t millivolts = esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_0), &adc1_chars); - reading_fast = (ALPHA_FAST * millivolts) + ((1.0-ALPHA_FAST) * reading_fast); - reading_slow = (ALPHA_SLOW * millivolts) + ((1.0-ALPHA_SLOW) * reading_slow); - float delta = reading_fast - reading_slow; + for(uint8_t i=0; i 4.0 && delta_last < 4.0) - { - ESP_LOGI(TAG, "Trigger at delta %g", delta); + //ESP_LOGI(TAG, "ADC read %lu fast=%g slow=%g delta=%g", millivolts, reading_fast, reading_slow, delta); + + if(delta > 4.0 && squeezables[i].delta_last < 4.0) + { + ESP_LOGI(TAG, "Trigger at delta %g", delta); - // set flag, consumed on read by squeeze_triggered() - triggered_flag = 1; + // set flag, consumed on read by squeeze_triggered() + squeezables[i].triggered_flag = 1; + } + squeezables[i].delta_last = delta; } - delta_last = delta; vTaskDelay(10 / portTICK_PERIOD_MS); } } -float squeeze_value(void) +float squeeze_value(squeezable_id_t id) { - return reading_fast; + return squeezables[id].reading_fast; } -uint8_t squeeze_triggered(void) +uint8_t squeeze_triggered(squeezable_id_t id) { - if(triggered_flag == 1) + if(squeezables[id].triggered_flag == 1) { // consume - triggered_flag = 0; + squeezables[id].triggered_flag = 0; return 1; } else