Files @ 24d49dea991a
Branch filter:

Location: protofusion-esp32-template/main/squeeze.c

Ethan Zonca
Add runtime modes and seperate squeezy triggers
#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<SQUEEZABLE_MAX; i++)
        {
            uint32_t millivolts = esp_adc_cal_raw_to_voltage(adc1_get_raw(squeezables[i].adc_channel), &adc1_chars);

            squeezables[i].reading_fast = (ALPHA_FAST * millivolts) + ((1.0-ALPHA_FAST) * squeezables[i].reading_fast);
            squeezables[i].reading_slow = (ALPHA_SLOW * millivolts) + ((1.0-ALPHA_SLOW) * squeezables[i].reading_slow);
            float delta = squeezables[i].reading_fast - squeezables[i].reading_slow;

            //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()
                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;
    }
}