#include #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= 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 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