Files @ 24d49dea991a
Branch filter:

Location: protofusion-esp32-template/main/ledstrip.c - annotation

Ethan Zonca
Add runtime modes and seperate squeezy triggers
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
e4270e6d9529
e4270e6d9529
e4270e6d9529
8645339bec1e
91735168ee75
54d6639e1b4b
54d6639e1b4b
64275d7d6618
54d6639e1b4b
91735168ee75
8645339bec1e
54d6639e1b4b
64275d7d6618
64275d7d6618
64275d7d6618
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
e4270e6d9529
64275d7d6618
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
8645339bec1e
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
e4270e6d9529
e4270e6d9529
64275d7d6618
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
54d6639e1b4b
91735168ee75
91735168ee75
64275d7d6618
54d6639e1b4b
64275d7d6618
91735168ee75
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
64275d7d6618
e4270e6d9529
64275d7d6618
e4270e6d9529
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
e4270e6d9529
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
45c4b4d15fc5
45c4b4d15fc5
64275d7d6618
45c4b4d15fc5
45c4b4d15fc5
45c4b4d15fc5
45c4b4d15fc5
64275d7d6618
e4270e6d9529
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
e4270e6d9529
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
64275d7d6618
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
e4270e6d9529
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
e4270e6d9529
64275d7d6618
e4270e6d9529
91735168ee75
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
e4270e6d9529
91735168ee75
45c4b4d15fc5
45c4b4d15fc5
45c4b4d15fc5
45c4b4d15fc5
e4270e6d9529
e4270e6d9529
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
64275d7d6618
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "led_strip.h"
#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:
        {
          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;

  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;
}