18#include "led_strip_rmt_encoder.h"
20static const char *TAG =
"led_rmt_encoder";
24 rmt_encoder_t *bytes_encoder;
25 rmt_encoder_t *copy_encoder;
27 rmt_symbol_word_t reset_code;
28} rmt_led_strip_encoder_t;
30static 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)
32 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
33 rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
34 rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;
35 rmt_encode_state_t session_state = 0;
36 rmt_encode_state_t state = 0;
37 size_t encoded_symbols = 0;
38 switch (led_encoder->state) {
40 encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);
41 if (session_state & RMT_ENCODING_COMPLETE) {
42 led_encoder->state = 1;
44 if (session_state & RMT_ENCODING_MEM_FULL) {
45 state |= RMT_ENCODING_MEM_FULL;
50 encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code,
51 sizeof(led_encoder->reset_code), &session_state);
52 if (session_state & RMT_ENCODING_COMPLETE) {
53 led_encoder->state = 0;
54 state |= RMT_ENCODING_COMPLETE;
56 if (session_state & RMT_ENCODING_MEM_FULL) {
57 state |= RMT_ENCODING_MEM_FULL;
63 return encoded_symbols;
66static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)
68 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
69 rmt_del_encoder(led_encoder->bytes_encoder);
70 rmt_del_encoder(led_encoder->copy_encoder);
75static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)
77 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
78 rmt_encoder_reset(led_encoder->bytes_encoder);
79 rmt_encoder_reset(led_encoder->copy_encoder);
80 led_encoder->state = 0;
87 esp_err_t ret = ESP_OK;
89 ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG,
"invalid argument");
90 ESP_GOTO_ON_FALSE(config->
led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG,
"invalid led model");
95 if (!has_encoder_timings) {
97 if (config->
led_model == LED_MODEL_SK6812) {
105 }
else if (config->
led_model == LED_MODEL_WS2812) {
113 }
else if (config->
led_model == LED_MODEL_WS2811) {
122 return ESP_ERR_INVALID_ARG;
128 return rmt_new_led_strip_encoder_with_timings(&timing_config, ret_encoder);
131 return ESP_ERR_INVALID_ARG;
135esp_err_t rmt_new_led_strip_encoder_with_timings(
const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder) {
136 esp_err_t ret = ESP_OK;
138 rmt_led_strip_encoder_t *led_encoder = NULL;
139 ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG,
"invalid argument");
141 led_encoder = calloc(1,
sizeof(rmt_led_strip_encoder_t));
142 ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG,
"no mem for led strip encoder");
143 led_encoder->base.encode = rmt_encode_led_strip;
144 led_encoder->base.del = rmt_del_led_strip_encoder;
145 led_encoder->base.reset = rmt_led_strip_encoder_reset;
148 rmt_bytes_encoder_config_t bytes_encoder_config = {
164 ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG,
"create bytes encoder failed");
165 rmt_copy_encoder_config_t copy_encoder_config = {};
166 ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG,
"create copy encoder failed");
170 led_encoder->reset_code = (rmt_symbol_word_t) {
172 .duration0 = reset_ticks,
174 .duration1 = reset_ticks,
177 *ret_encoder = &led_encoder->base;
181 if (led_encoder->bytes_encoder) {
182 rmt_del_encoder(led_encoder->bytes_encoder);
184 if (led_encoder->copy_encoder) {
185 rmt_del_encoder(led_encoder->copy_encoder);
Type of led strip encoder configuration.
led_strip_encoder_timings_t timings
LED strip encoder timings.