Changeset - 45c4b4d15fc5
[Not reviewed]
default
0 4 0
Ethan Zonca - 8 months ago 2024-09-28 13:14:57
ez@ethanzonca.com
Add squeeze sensing. Update chase to only do one rep.
4 files changed with 22 insertions and 6 deletions:
0 comments (0 inline, 0 general)
main/CMakeLists.txt
Show inline comments
 
idf_component_register(SRCS "main.c" "wifi.c" "usb_cdc.c" "can.c" "display.c" "display_gui.c" "osc_control.c" "ledstrip.c"
 
idf_component_register(SRCS "main.c" "wifi.c" "usb_cdc.c" "can.c" "display.c" "display_gui.c" "osc_control.c" "ledstrip.c" "squeeze.c"
 
                       INCLUDE_DIRS .)
main/ledstrip.c
Show inline comments
 
@@ -5,244 +5,252 @@
 
#include "esp_log.h"
 
#include "esp_err.h"
 
#include "ledstrip.h"
 
#include "esp_log.h"
 

	
 

	
 

	
 
// Settings
 
#define LED_STRIP_GPIO  11
 
#define LED_STRIP_NUM_LEDS 250
 
#define LED_STRIP_RMT_FREQ_HZ  (10 * 1000 * 1000)
 
static const char *TAG = "ledstrip";
 

	
 
// Private Prototypes
 
static uint8_t process_effect_rainbow(void);
 
static uint8_t process_effect_singlechase(void);
 
static uint8_t process_effect_cauldron(void);
 

	
 
// Private variables
 
static led_strip_handle_t led_strip;
 
static effect_t current_effect = EFFECT_NONE;
 
static led_mode_t mode = LEDMODE_AUTO;
 

	
 
// Initialize WS2812 strip
 
void ledstrip_init(void)
 
{
 
    // LED strip general initialization, according to your led board design
 
    led_strip_config_t strip_config = {
 
        .strip_gpio_num = LED_STRIP_GPIO,
 
        .max_leds = LED_STRIP_NUM_LEDS,
 
        .led_pixel_format = LED_PIXEL_FORMAT_GRB,
 
        .led_model = LED_MODEL_WS2812,
 
        .flags.invert_out = false,
 
    };
 

	
 
    // LED strip backend configuration: RMT
 
    led_strip_rmt_config_t rmt_config = {
 
        .clk_src = RMT_CLK_SRC_DEFAULT,
 
        .resolution_hz = LED_STRIP_RMT_FREQ_HZ,
 
        .flags.with_dma = true,               // DMA feature is available on ESP target like ESP32-S3
 
    };
 

	
 
    // LED Strip object handle
 
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
 
    ESP_LOGI(TAG, "Created LED strip object with RMT backend");
 
}
 

	
 

	
 
// From OSC for testing
 
static float modifier = 0.0;
 
void ledstrip_set_modifier(float frac)
 
{
 
    modifier = frac;
 
}
 

	
 

	
 
void ledstrip_set_effect(effect_t effect)
 
{
 
  mode = LEDMODE_AUTO;
 
  current_effect = effect;
 
}
 

	
 

	
 
// Set entire strip to RGB value
 
void ledstrip_set(uint32_t r, uint32_t g, uint32_t b)
 
{
 
    mode = LEDMODE_MANUAL;
 
    for (int i = 0; i < LED_STRIP_NUM_LEDS; i++) {
 
        ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, g, r, b));
 
    }
 
    led_strip_refresh(led_strip);
 
}
 

	
 
// Run effect and refresh strip
 
void ledstrip_refresh(void)
 
{
 
  for(;;)
 
  {
 
    if(mode == LEDMODE_MANUAL)
 
    {
 
        // do nothing
 
    }
 

	
 
    else
 
    {
 
      switch(current_effect)
 
      {
 

	
 
        case EFFECT_RAINBOW:
 
        {
 
          if(process_effect_rainbow() & 0x01)
 
            led_strip_refresh(led_strip);
 
        } break;
 
        
 
        case EFFECT_SINGLECHASE:
 
        {
 
          if(process_effect_singlechase() & 0x01)
 
          uint8_t ret = process_effect_singlechase();
 
          if(ret & 0x01)
 
            led_strip_refresh(led_strip);
 
          // Chase complete, return to manual mode
 
          if(ret & 0x02)
 
            current_effect = EFFECT_NONE;
 

	
 
        } break;
 

	
 
        case EFFECT_CAULDRON:
 
        {
 
          if(process_effect_cauldron() & 0x01)
 
            led_strip_refresh(led_strip);
 
        } break;
 

	
 
        case EFFECT_NONE:
 
        default:
 
        {
 
          ledstrip_set(10,10,10);
 
          led_strip_refresh(led_strip);
 
        } break;
 
      }
 
    }
 

	
 
    // TODO: DelayUntil
 
    vTaskDelay(pdMS_TO_TICKS(10));
 
  }
 
}
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 
static uint8_t   effect = -1;
 
static uint8_t   effects = 120;
 
static uint16_t  effStep;
 
static unsigned long effStart;
 

	
 
static void __reset(void)
 
{
 
    effStep = 0;
 
    effect = (effect + 1) % effects;
 
    effStart = xTaskGetTickCount() * portTICK_PERIOD_MS;
 
}
 

	
 

	
 

	
 
static uint8_t process_effect_rainbow(void) {
 
    // Strip ID: 0 - Effect: Rainbow - LEDS: 120
 
    // Steps: 60 - Delay: 20
 
    // Colors: 3 (255.0.0, 0.255.0, 0.0.255)
 
    // Options: rainbowlen=60, toLeft=true, 
 
  if((xTaskGetTickCount() * portTICK_PERIOD_MS) - effStart < 20 * (effStep)) return 0x00;
 
  float factor1, factor2;
 
  uint16_t ind;
 
  for(uint16_t j=0;j<LED_STRIP_NUM_LEDS;j++) {
 
    ind = effStep + j * 1;
 
    switch((int)((ind % 60) / 20)) {
 
      case 0: factor1 = 1.0 - ((float)(ind % 60 - 0 * 20) / 20);
 
              factor2 = (float)((int)(ind - 0) % 60) / 20;
 
            //   strip_0.strip.setPixelColor(j, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2);
 
                ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 255 * factor1 + 0 * factor2, modifier * 0 * factor1 + 255 * factor2, modifier * 0 * factor1 + 0 * factor2));
 

	
 
              break;
 
      case 1: factor1 = 1.0 - ((float)(ind % 60 - 1 * 20) / 20);
 
              factor2 = (float)((int)(ind - 20) % 60) / 20;
 
              ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 0 * factor1 + 0 * factor2, modifier * 255 * factor1 + 0 * factor2, modifier * 0 * factor1 + 255 * factor2));
 
              break;
 
      case 2: factor1 = 1.0 - ((float)(ind % 60 - 2 * 20) / 20);
 
              factor2 = (float)((int)(ind - 40) % 60) / 20;
 
              ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 0 * factor1 + 255 * factor2, modifier * 0 * factor1 + 0 * factor2, modifier * 255 * factor1 + 0 * factor2));
 
              break;
 
    }
 
  }
 
  if(effStep >= 60) {__reset(); return 0x03; }
 
  else effStep++;
 
  return 0x01;
 
}
 

	
 

	
 

	
 
static uint32_t countloc = 0;
 
static uint8_t process_effect_singlechase(void) {
 
  if((xTaskGetTickCount() * portTICK_PERIOD_MS) - effStart < 20 * (effStep)) return 0x00;
 

	
 
  float intensity = (float)countloc / (float)LED_STRIP_NUM_LEDS;
 
  for(uint16_t j=0;j<LED_STRIP_NUM_LEDS;j++) {
 
    if(j == countloc)
 
    {
 
      ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, 255, 255 * (1.0-intensity), 255 * (1.0-intensity)));
 
    }
 
    else
 
      ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, 0,0,0));
 
  }
 
  countloc = (countloc + 1) % LED_STRIP_NUM_LEDS;
 

	
 
  return 0x01;
 
  if(countloc == 0)
 
    return 0b11;
 
  else
 
    return 0b01;
 
}
 

	
 

	
 

	
 

	
 
//127, 122
 

	
 
// static uint32_t countloc = 0;
 
float intensity = 1.0f;
 
uint8_t intensity_up = 0;
 
uint8_t modmod = 0;
 
uint32_t last_modmod = 0;
 

	
 
static uint8_t process_effect_cauldron(void) {
 
  if((xTaskGetTickCount() * portTICK_PERIOD_MS) - effStart < 20 * (effStep)) return 0x00;
 

	
 
  if(intensity_up)
 
  {
 
    intensity += 0.01f;
 
    if(intensity > 0.98f)
 
      intensity_up = 0;
 
  }
 
  else
 
  {
 
    intensity -= 0.01f;
 
    if(intensity < 0.7f)
 
      intensity_up = 1;
 
  }
 
  // ESP_LOGI(TAG, "Friggn intensity %f", intensity);
 

	
 
  if((xTaskGetTickCount() * portTICK_PERIOD_MS) - last_modmod > 25)
 
  {
 
    last_modmod = (xTaskGetTickCount() * portTICK_PERIOD_MS);
 
    modmod +=1;
 
  }
 

	
 
  for(uint16_t j=0;j<LED_STRIP_NUM_LEDS;j++) {
 
    
 
      float posmod = (float)((j)%10) / 5.0f;
 
      posmod /= 1.0;
 
      posmod += 0.0;
 
        // ESP_LOGI(TAG, "Friggn intensity %f", posmod);
 

	
 

	
 
      ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, 255 * (intensity), 120 * (intensity) * posmod, 0));
 
    
 
    //  ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, 0,0,0));
 
  }
 
  //countloc = (countloc + 1) % LED_STRIP_NUM_LEDS;
 

	
 
  return 0x01;
 
}
main/main.c
Show inline comments
 
//
 
// Protofusion ESP32S3 Template
 
//
 

	
 
#include <stdint.h>
 
#include "freertos/FreeRTOS.h"
 
#include "freertos/task.h"
 
#include "freertos/event_groups.h"
 
#include "esp_system.h"
 
#include "esp_event.h"
 
#include "esp_log.h"
 
#include "nvs_flash.h"
 
#include "sdkconfig.h"
 
#include "osc_control.h"
 
#include "wifi.h"
 
// #include "usb_cdc.h"
 
#include "can.h"
 
#include "display.h"
 
#include "squeeze.h"
 
#include "ledstrip.h"
 
#include "display_gui.h"
 

	
 

	
 
// Private variables
 
static const char *TAG = "main";
 

	
 

	
 
// Application entry point
 
void app_main(void)
 
{
 
    // Initialize usb-cdc interface
 
    // usb_cdc_init();
 

	
 
    // Initialize NVS
 
    esp_err_t ret = nvs_flash_init();
 
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
 
        ESP_ERROR_CHECK(nvs_flash_erase());
 
        ret = nvs_flash_init();
 
    }
 
    ESP_ERROR_CHECK(ret);
 

	
 
    // Initialize display
 
    display_init();
 
    display_gui_homescreen();
 

	
 
    // Connect to wifi
 
    wifi_init();
 

	
 
    ledstrip_init();
 

	
 

	
 
    // Initialize OSC
 
    osc_init();
 

	
 
    squeeze_init();
 

	
 
    // Initialize canbus
 
    //can_init();
 

	
 
    // Start tasks
 
    xTaskCreatePinnedToCore(ledstrip_refresh,    "ledstrip_refresh", 4096, NULL, 10, NULL, 1);
 
    xTaskCreatePinnedToCore(display_gui_process, "display_gui_process", 4096, NULL, 10, NULL, 1);
 

	
 

	
 
    while(1)
 
    {
 
        vTaskDelay(pdMS_TO_TICKS(100));
 
    }
 

	
 
}
main/osc_control.c
Show inline comments
 
#include "osc_control.h"
 
#include <stdlib.h>
 
#include <esp_event.h>
 
#include <esp_log.h>
 
#include <esp_wifi.h>
 
#include "display.h"
 
#include <esp_osc.h>
 
#include "ledstrip.h"
 

	
 
#define WIFI_SSID ""
 
#define WIFI_PASS ""
 

	
 
#define OSC_ADDRESS ""
 
#define OSC_PORT 0
 

	
 
static const char *TAG = "osc_control";
 

	
 
esp_osc_client_t client;
 

	
 
static void sender()
 
{
 
  // select targets
 
  esp_osc_target_t targets[2] = {
 
      esp_osc_target("127.0.0.1", 9000),
 
      esp_osc_target(OSC_ADDRESS, OSC_PORT),
 
  };
 

	
 
  for(;;) {
 
    // delay
 
    vTaskDelay(1000 / portTICK_PERIOD_MS);
 

	
 
    // send messages
 
    for (size_t i = 0; i < 2; i++) {
 
      esp_osc_send(&client, &targets[i], "test", "ihfdsb", 42, (int64_t)84, 3.14f, 6.28, "foo", 3, "bar");
 
    }
 
  }
 
}
 

	
 
static uint8_t r_man = 0;
 
static uint8_t g_man = 0;
 
static uint8_t b_man = 0;
 

	
 

	
 
static bool callback(const char *topic, const char *format, esp_osc_value_t *values)
 
{
 
  // log message
 
  ESP_LOGI(TAG, "got message: %s (%s)", topic, format);
 

	
 

	
 
  char out[512] = {0};
 
  snprintf(out, 128, "topic: %s\nformat: %s\n", topic, format);
 

	
 
  for (size_t i = 0; i < strlen(format); i++) 
 
  {
 
    switch (format[i])
 
    {
 
      case 'i':
 
      {
 
        snprintf(out+strlen(out), 128-strlen(out), "Value: %ld", values[i].i);
 
        ESP_LOGI(TAG, "==> i: %ld", values[i].i);
 
        if(strcmp(topic, "/led_effect") == 0)
 
        {
 
          ledstrip_set_effect(values[i].i);
 
        }
 
      } break;
 

	
 
      case 'h':
 
      {
 
        ESP_LOGI(TAG, "==> h: %lld", values[i].h);
 
      }  break;
 

	
 
      case 'f':
 
      {
 
        if(values[i].f > 1.0)
 
          values[i].f = 1.0;
 
        if(values[i].f < 0.0)
 
          values[i].f = 0.0;
 

	
 
        snprintf(out+strlen(out), 128-strlen(out), "Value: %f", values[i].f);
 
        ESP_LOGI(TAG, "==> f: %f", values[i].f);
 
        
 
        if(strcmp(topic, "/led_modifier") == 0)
 
        {
 
          ledstrip_set_modifier(values[i].f);
 
        }
 
        else if(strcmp(topic, "/led_manual_r") == 0)
 
        {
 
          r_man = values[i].f * 255.0;
 
          ledstrip_set(r_man, g_man, b_man);
 
          ledstrip_set(g_man, r_man, b_man);
 
        }
 
        else if(strcmp(topic, "/led_manual_g") == 0)
 
        {
 
          g_man = values[i].f * 255.0;
 
          ledstrip_set(r_man, g_man, b_man);
 
          ledstrip_set(g_man, r_man, b_man);
 
        }
 
        else if(strcmp(topic, "/led_manual_b") == 0)
 
        {
 
          b_man = values[i].f * 255.0;
 
          ledstrip_set(r_man, g_man, b_man);
 
          ledstrip_set(g_man, r_man, b_man);
 
        }
 
      } break;
 

	
 
      case 'd':
 
      {
 
        ESP_LOGI(TAG, "==> d: %f", values[i].d);
 
      } break;
 

	
 
      case 's':
 
      {
 
        ESP_LOGI(TAG, "==> s: %s", values[i].s);
 
      }  break;
 

	
 
      case 'b':
 
      {
 
        ESP_LOGI(TAG, "==> b: %.*s (%d)", values[i].bl, values[i].b, values[i].bl);
 
        break;
 
      }
 

	
 
    }
 
  }
 

	
 
  display_update_text(out);
 

	
 
  return true;
 
}
 

	
 
static void receiver() {
 
  for (;;) {
 
    // receive messages
 
    esp_osc_receive(&client, callback);
 
  }
 
}
 

	
 
static void restarter() {
 
  for (;;) {
 
    // delay
 
    vTaskDelay(5000 / portTICK_PERIOD_MS);
 

	
 
    // restart client
 
    esp_osc_init(&client, 1024, 9000);
 
  }
 
}
 

	
 

	
 
void osc_init() {
 
  // prepare client
 
  esp_osc_init(&client, 1024, 5005);
 

	
 
  // create tasks
 
  //xTaskCreatePinnedToCore(sender, "sender", 4096, NULL, 10, NULL, 1);
 
  xTaskCreatePinnedToCore(receiver, "receiver", 4096, NULL, 10, NULL, 1);
 
  //xTaskCreatePinnedToCore(restarter, "restarter", 4096, NULL, 10, NULL, 1);
 
}
 
\ No newline at end of file
0 comments (0 inline, 0 general)