LED_shit/main/led_strip/led_strip.c
2025-11-04 21:33:28 +00:00

66 lines
2.0 KiB
C

#include "led_strip.h"
#include "esp_log.h"
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static const char *TAG = "led_strip";
struct led_strip_t {
uint32_t length;
uint8_t *buffer;
rmt_channel_handle_t channel;
uint32_t resolution;
};
typedef struct {
uint8_t g;
uint8_t r;
uint8_t b;
} __attribute__((packed)) grb_pixel_t;
esp_err_t led_strip_new_rmt_device(const led_strip_config_t *config, led_strip_handle_t *ret_strip) {
if (!config || !ret_strip) return ESP_ERR_INVALID_ARG;
led_strip_handle_t strip = calloc(1, sizeof(struct led_strip_t));
if (!strip) return ESP_ERR_NO_MEM;
strip->length = config->strip_length;
strip->resolution = config->resolution_hz;
strip->channel = config->rmt_channel;
strip->buffer = calloc(strip->length, sizeof(grb_pixel_t));
if (!strip->buffer) {
free(strip);
return ESP_ERR_NO_MEM;
}
*ret_strip = strip;
ESP_LOGI(TAG, "Novo LED strip criado (%lu LEDs)", (unsigned long)strip->length);
return ESP_OK;
}
esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint8_t red, uint8_t green, uint8_t blue) {
if (!strip || index >= strip->length) return ESP_ERR_INVALID_ARG;
grb_pixel_t *pixels = (grb_pixel_t *)strip->buffer;
pixels[index].g = green;
pixels[index].r = red;
pixels[index].b = blue;
return ESP_OK;
}
esp_err_t led_strip_refresh(led_strip_handle_t strip) {
if (!strip) return ESP_ERR_INVALID_ARG;
// Envia os dados via RMT
rmt_transmit_config_t tx_conf = { .loop_count = 0 };
ESP_ERROR_CHECK(rmt_transmit(strip->channel, NULL, strip->buffer, strip->length * sizeof(grb_pixel_t), &tx_conf));
ESP_ERROR_CHECK(rmt_tx_wait_all_done(strip->channel, portMAX_DELAY));
return ESP_OK;
}
esp_err_t led_strip_clear(led_strip_handle_t strip) {
if (!strip) return ESP_ERR_INVALID_ARG;
memset(strip->buffer, 0, strip->length * sizeof(grb_pixel_t));
return led_strip_refresh(strip);
}