Files @ 54d6639e1b4b
Branch filter:

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

Ethan Zonca
Cleanup ledstrip implementation
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
8645339bec1e
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
8645339bec1e
8645339bec1e
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
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
54d6639e1b4b
91735168ee75
91735168ee75
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
54d6639e1b4b
91735168ee75
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
8645339bec1e
8645339bec1e
91735168ee75
91735168ee75
91735168ee75
54d6639e1b4b
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
8645339bec1e
54d6639e1b4b
54d6639e1b4b
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
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
91735168ee75
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "led_strip.h"
#include "esp_log.h"
#include "esp_err.h"


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


// Private Prototypes
static uint8_t strip0_loop0func();
static uint8_t strip0_loop0_eff0();


// Private variables
static led_strip_handle_t led_strip;


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


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


// Run effect and refresh strip
void ledstrip_refresh(void)
{
  if(strip0_loop0func() & 0x01)
    led_strip_refresh(led_strip);
}




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

typedef struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
} loop_t;

loop_t strip0loop0 = 
{
    .currentTime = 0,
    .currentChild = 0,
    .childs = 1,
    .timeBased = false,
    .cycles = 1,
};




static uint8_t strip0_loop0func() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}


static uint8_t strip0_loop0_eff0() {
    // 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<120;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;
}