Changeset - 24d49dea991a
[Not reviewed]
tip default
0 6 0
Ethan Zonca - 8 months ago 2024-10-07 22:33:30
ez@ethanzonca.com
Add runtime modes and seperate squeezy triggers
6 files changed with 88 insertions and 34 deletions:
0 comments (0 inline, 0 general)
main/flash.c
Show inline comments
 
@@ -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)
 
{
main/flash.h
Show inline comments
 
#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);
 

	
main/main.c
Show inline comments
 
@@ -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();
main/osc_control.c
Show inline comments
 
@@ -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)
main/squeeze.c
Show inline comments
 
@@ -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<SQUEEZABLE_MAX; i++)
 
        {
 
            uint32_t millivolts = esp_adc_cal_raw_to_voltage(adc1_get_raw(squeezables[i].adc_channel), &adc1_chars);
 

	
 
        //ESP_LOGI(TAG, "ADC read %lu fast=%g slow=%g delta=%g", millivolts, reading_fast, reading_slow, delta);
 
            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;
 

	
 
        if(delta > 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
main/squeeze.h
Show inline comments
 
#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
0 comments (0 inline, 0 general)