update led to use led_strip component
This commit is contained in:
parent
684d2e0964
commit
a57f5de6bc
@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.16.0)
|
cmake_minimum_required(VERSION 3.16.0)
|
||||||
|
|
||||||
set(COMPONENT_DIRS $ENV{IDF_PATH}/components ./lib ./src)
|
set(COMPONENT_DIRS $ENV{IDF_PATH}/components $ENV{IDF_PATH}/../idf-extra-components/led_strip ./lib ./src)
|
||||||
|
|
||||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||||
project(rx_esp32)
|
project(rx_esp32)
|
||||||
|
|||||||
9
rx_esp32/dependencies.lock
Normal file
9
rx_esp32/dependencies.lock
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
dependencies:
|
||||||
|
idf:
|
||||||
|
component_hash: null
|
||||||
|
source:
|
||||||
|
type: idf
|
||||||
|
version: 5.2.2
|
||||||
|
manifest_hash: 25da577a782e8f239c184378e32f45cca356a1cf3257d50b4f7446629da3faa1
|
||||||
|
target: esp32c6
|
||||||
|
version: 1.0.0
|
||||||
@ -10,7 +10,7 @@ idf_component_register(
|
|||||||
./led.c
|
./led.c
|
||||||
./commands.c
|
./commands.c
|
||||||
INCLUDE_DIRS "./"
|
INCLUDE_DIRS "./"
|
||||||
PRIV_REQUIRES
|
PRIV_REQUIRES
|
||||||
cli
|
cli led_strip
|
||||||
spi_flash driver nvs_flash esp_wifi
|
spi_flash driver nvs_flash esp_wifi
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,146 +1,47 @@
|
|||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "driver/rmt_tx.h"
|
#include "led_strip.h"
|
||||||
#include "driver/rmt_types.h"
|
|
||||||
#include "driver/rmt_encoder.h"
|
|
||||||
#include "driver/gpio.h"
|
|
||||||
|
|
||||||
typedef struct {
|
#define BUILDIN_LED_GPIO 8
|
||||||
rmt_encoder_t base;
|
|
||||||
rmt_encoder_t *bytes_encoder;
|
|
||||||
rmt_encoder_t *copy_encoder;
|
|
||||||
int state;
|
|
||||||
rmt_symbol_word_t reset_code;
|
|
||||||
} rmt_led_strip_encoder_t;
|
|
||||||
|
|
||||||
rmt_channel_handle_t led_rmt_channel;
|
led_strip_handle_t led_strip;
|
||||||
rmt_led_strip_encoder_t led_enc;
|
|
||||||
|
|
||||||
static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_encode_state_t session_state = 0;
|
|
||||||
rmt_encode_state_t state = 0;
|
|
||||||
size_t encoded_symbols = 0;
|
|
||||||
switch (led_encoder->state) {
|
|
||||||
case 0: // send RGB data
|
|
||||||
encoded_symbols += led_encoder->bytes_encoder->encode(led_encoder->bytes_encoder, channel, primary_data, data_size, &session_state);
|
|
||||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
|
||||||
led_encoder->state = 1; // switch to next state when current encoding session finished
|
|
||||||
}
|
|
||||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
|
||||||
state |= RMT_ENCODING_MEM_FULL;
|
|
||||||
goto out; // yield if there's no free space for encoding artifacts
|
|
||||||
}
|
|
||||||
// fall-through
|
|
||||||
case 1: // send reset code
|
|
||||||
encoded_symbols += led_encoder->copy_encoder->encode(led_encoder->copy_encoder, channel, &led_encoder->reset_code,
|
|
||||||
sizeof(led_encoder->reset_code), &session_state);
|
|
||||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
|
||||||
led_encoder->state = 0; // back to the initial encoding session
|
|
||||||
state |= RMT_ENCODING_COMPLETE;
|
|
||||||
}
|
|
||||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
|
||||||
state |= RMT_ENCODING_MEM_FULL;
|
|
||||||
goto out; // yield if there's no free space for encoding artifacts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
*ret_state = state;
|
|
||||||
return encoded_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_del_encoder(led_encoder->bytes_encoder);
|
|
||||||
rmt_del_encoder(led_encoder->copy_encoder);
|
|
||||||
free(led_encoder);
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_encoder_reset(led_encoder->bytes_encoder);
|
|
||||||
rmt_encoder_reset(led_encoder->copy_encoder);
|
|
||||||
led_encoder->state = 0;
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void led_init_encoder()
|
|
||||||
{
|
|
||||||
led_enc.base.encode = rmt_encode_led_strip;
|
|
||||||
led_enc.base.del = rmt_del_led_strip_encoder;
|
|
||||||
led_enc.base.reset = rmt_led_strip_encoder_reset;
|
|
||||||
|
|
||||||
rmt_bytes_encoder_config_t bytes_encoder_config;
|
|
||||||
// different led strip might have its own timing requirements, following parameter is for WS2812
|
|
||||||
bytes_encoder_config = (rmt_bytes_encoder_config_t) {
|
|
||||||
.bit0 = {
|
|
||||||
.level0 = 1,
|
|
||||||
.duration0 = 0.3, // T0H=0.3us
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = 0.9, // T0L=0.9us
|
|
||||||
},
|
|
||||||
.bit1 = {
|
|
||||||
.level0 = 1,
|
|
||||||
.duration0 = 0.9, // T1H=0.9us
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = 0.3, // T1L=0.3us
|
|
||||||
},
|
|
||||||
.flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0
|
|
||||||
};
|
|
||||||
|
|
||||||
rmt_new_bytes_encoder(&bytes_encoder_config, &led_enc.bytes_encoder);
|
|
||||||
rmt_copy_encoder_config_t copy_encoder_config = {};
|
|
||||||
rmt_new_copy_encoder(©_encoder_config, &led_enc.copy_encoder);
|
|
||||||
|
|
||||||
uint32_t reset_ticks = 10 /*MHz*/ * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5
|
|
||||||
led_enc.reset_code = (rmt_symbol_word_t) {
|
|
||||||
.level0 = 0,
|
|
||||||
.duration0 = reset_ticks,
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = reset_ticks,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void led_init(void)
|
void led_init(void)
|
||||||
{
|
{
|
||||||
/* LED strip initialization with the GPIO and pixels number */
|
// LED strip general initialization, according to your led board design
|
||||||
rmt_tx_channel_config_t rmt_chan_config = {
|
led_strip_config_t strip_config = {
|
||||||
.clk_src = RMT_CLK_SRC_DEFAULT,
|
.strip_gpio_num = BUILDIN_LED_GPIO, // The GPIO that connected to the LED strip's data line
|
||||||
.gpio_num = 8,
|
.max_leds = 1, // The number of LEDs in the strip,
|
||||||
.mem_block_symbols = 48,
|
.led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip
|
||||||
.resolution_hz = 10 * 1000 * 1000, // 10 MHz
|
.led_model = LED_MODEL_WS2812, // LED strip model
|
||||||
.trans_queue_depth = 4,
|
.flags.invert_out = false, // whether to invert the output signal
|
||||||
.flags.with_dma = false,
|
|
||||||
.flags.invert_out = false,
|
|
||||||
};
|
};
|
||||||
rmt_new_tx_channel(&rmt_chan_config, &led_rmt_channel);
|
|
||||||
led_init_encoder();
|
// LED strip backend configuration: RMT
|
||||||
|
led_strip_rmt_config_t rmt_config = {
|
||||||
|
#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
|
||||||
|
.rmt_channel = 0,
|
||||||
|
#else
|
||||||
|
.clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption
|
||||||
|
.resolution_hz = 10 * 1000 * 1000, // RMT counter clock frequency
|
||||||
|
.flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED Strip object handle
|
||||||
|
led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip);
|
||||||
|
|
||||||
led_setRGB(0, 0, 0);
|
led_setRGB(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_deinit(void)
|
void led_deinit(void)
|
||||||
{
|
{
|
||||||
rmt_del_channel(led_rmt_channel);
|
led_strip_del(led_strip);
|
||||||
rmt_del_encoder(&led_enc.base);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_setRGB(uint8_t r, uint8_t g, uint8_t b)
|
void led_setRGB(uint8_t r, uint8_t g, uint8_t b)
|
||||||
{
|
{
|
||||||
rmt_transmit_config_t tx_conf = {
|
led_strip_set_pixel(led_strip, 0, r, g, b);
|
||||||
.loop_count = 0,
|
led_strip_refresh(led_strip);
|
||||||
};
|
|
||||||
uint8_t pixel[] = {g, r, b};
|
|
||||||
|
|
||||||
rmt_enable(led_rmt_channel);
|
|
||||||
rmt_transmit(led_rmt_channel, &(led_enc.base), pixel, 3, &tx_conf);
|
|
||||||
rmt_tx_wait_all_done(led_rmt_channel, -1);
|
|
||||||
rmt_disable(led_rmt_channel);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user