diff --git a/main/flash.c b/main/flash.c --- a/main/flash.c +++ b/main/flash.c @@ -28,6 +28,11 @@ void flash_init(void) } +runtime_t flash_get_runtime(void) +{ + return RUNTIME_BUCKET; +} + // Write k/v to flash void flash_write(char* key, int32_t val) { diff --git a/main/flash.h b/main/flash.h --- a/main/flash.h +++ b/main/flash.h @@ -1,7 +1,16 @@ #ifndef _FLASH_H #define _FLASH_H +typedef enum __runtime +{ + RUNTIME_BUCKET = 0, + RUNTIME_STRIPDRIVE, + + RUNTIME_MAX +} runtime_t; + void flash_init(void); +runtime_t flash_get_runtime(void); void flash_write(char* key, int32_t val); int32_t flash_read(char* key); diff --git a/main/main.c b/main/main.c --- a/main/main.c +++ b/main/main.c @@ -21,6 +21,7 @@ #include "display_gui.h" + // Private variables static const char *TAG = "main"; @@ -53,7 +54,9 @@ void app_main(void) ledstrip_init(); - squeeze_init(); + // Initialize squeeze sensing for bucket only + if(flash_get_runtime() == RUNTIME_BUCKET) + squeeze_init(); // Initialize OSC osc_init(); diff --git a/main/osc_control.c b/main/osc_control.c --- a/main/osc_control.c +++ b/main/osc_control.c @@ -153,9 +153,17 @@ static void osc_send() for (;;) { - if(squeeze_triggered()) + if(squeeze_triggered(SQUEEZABLE_HEART)) { - ESP_LOGI(TAG, "trig that squeeze"); + ESP_LOGI(TAG, "trig that squeeze - heart"); + + esp_osc_send(&client, &target, "/squeeze_trig", "i", 1); + } + + + if(squeeze_triggered(SQUEEZABLE_BRAIN)) + { + ESP_LOGI(TAG, "trig that squeeze - brain"); esp_osc_send(&client, &target, "/squeeze_trig", "i", 1); } @@ -163,7 +171,8 @@ static void osc_send() if(xTaskGetTickCount()*portTICK_PERIOD_MS - last_tx > 150) { last_tx = xTaskGetTickCount() * portTICK_PERIOD_MS; - esp_osc_send(&client, &target, "/squeeze_value", "f", squeeze_value()); + esp_osc_send(&client, &target, "/squeeze_value", "f", squeeze_value(SQUEEZABLE_BRAIN)); + esp_osc_send(&client, &target, "/squeeze_value2", "f", squeeze_value(SQUEEZABLE_HEART)); } if(xTaskGetTickCount()*portTICK_PERIOD_MS - last_discover > 1000) 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 diff --git a/main/squeeze.h b/main/squeeze.h --- a/main/squeeze.h +++ b/main/squeeze.h @@ -1,9 +1,35 @@ #ifndef _SQUEEZE_H #define _SQUEEZE_H + + +// Definitions +#define ALPHA_FAST 0.02f +#define ALPHA_SLOW 0.005f + +// Private variables +typedef struct squeezable_ +{ + uint32_t adc_channel; + float reading_fast; + float reading_slow; + float delta_last; + uint8_t triggered_flag; + +} squeezable_t; + +typedef enum squeezable_id_ +{ + SQUEEZABLE_HEART = 0, + SQUEEZABLE_BRAIN, + SQUEEZABLE_MAX +} squeezable_id_t; + + void squeeze_init(void); -float squeeze_value(void); -uint8_t squeeze_triggered(void); +float squeeze_value(squeezable_id_t id); +uint8_t squeeze_triggered(squeezable_id_t id); + #endif \ No newline at end of file