ESP-IDF Firmware
Firmware architecture and call graph
Loading...
Searching...
No Matches
led_strip_rmt_encoder.c File Reference
#include "esp_check.h"
#include "led_strip_rmt_encoder.h"
Include dependency graph for led_strip_rmt_encoder.c:

Go to the source code of this file.

Data Structures

struct  rmt_led_strip_encoder_t

Functions

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)
static esp_err_t rmt_del_led_strip_encoder (rmt_encoder_t *encoder)
static esp_err_t rmt_led_strip_encoder_reset (rmt_encoder_t *encoder)
esp_err_t rmt_new_led_strip_encoder (const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder)
 Create RMT encoder for encoding LED strip pixels into RMT symbols.

Variables

static const char * TAG = "led_rmt_encoder"

Function Documentation

◆ rmt_del_led_strip_encoder()

esp_err_t rmt_del_led_strip_encoder ( rmt_encoder_t * encoder)
static

Definition at line 56 of file led_strip_rmt_encoder.c.

57{
58 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
59 rmt_del_encoder(led_encoder->bytes_encoder);
60 rmt_del_encoder(led_encoder->copy_encoder);
61 free(led_encoder);
62 return ESP_OK;
63}
#define ESP_OK
Definition esp_err.h:23

References rmt_led_strip_encoder_t::bytes_encoder, rmt_led_strip_encoder_t::copy_encoder, and ESP_OK.

Referenced by rmt_new_led_strip_encoder().

Here is the caller graph for this function:

◆ rmt_encode_led_strip()

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 )
static

Definition at line 20 of file led_strip_rmt_encoder.c.

21{
22 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
23 rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
24 rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;
25 rmt_encode_state_t session_state = 0;
26 rmt_encode_state_t state = 0;
27 size_t encoded_symbols = 0;
28 switch (led_encoder->state) {
29 case 0: // send RGB data
30 encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);
31 if (session_state & RMT_ENCODING_COMPLETE) {
32 led_encoder->state = 1; // switch to next state when current encoding session finished
33 }
34 if (session_state & RMT_ENCODING_MEM_FULL) {
35 state |= RMT_ENCODING_MEM_FULL;
36 goto out; // yield if there's no free space for encoding artifacts
37 }
38 // fall-through
39 case 1: // send reset code
40 encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code,
41 sizeof(led_encoder->reset_code), &session_state);
42 if (session_state & RMT_ENCODING_COMPLETE) {
43 led_encoder->state = 0; // back to the initial encoding session
44 state |= RMT_ENCODING_COMPLETE;
45 }
46 if (session_state & RMT_ENCODING_MEM_FULL) {
47 state |= RMT_ENCODING_MEM_FULL;
48 goto out; // yield if there's no free space for encoding artifacts
49 }
50 }
51out:
52 *ret_state = state;
53 return encoded_symbols;
54}

References rmt_led_strip_encoder_t::bytes_encoder, rmt_led_strip_encoder_t::copy_encoder, rmt_led_strip_encoder_t::reset_code, and rmt_led_strip_encoder_t::state.

Referenced by rmt_new_led_strip_encoder().

Here is the caller graph for this function:

◆ rmt_led_strip_encoder_reset()

esp_err_t rmt_led_strip_encoder_reset ( rmt_encoder_t * encoder)
static

Definition at line 65 of file led_strip_rmt_encoder.c.

66{
67 rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
68 rmt_encoder_reset(led_encoder->bytes_encoder);
69 rmt_encoder_reset(led_encoder->copy_encoder);
70 led_encoder->state = 0;
71 return ESP_OK;
72}

References rmt_led_strip_encoder_t::bytes_encoder, rmt_led_strip_encoder_t::copy_encoder, ESP_OK, and rmt_led_strip_encoder_t::state.

Referenced by rmt_new_led_strip_encoder().

Here is the caller graph for this function:

◆ rmt_new_led_strip_encoder()

esp_err_t rmt_new_led_strip_encoder ( const led_strip_encoder_config_t * config,
rmt_encoder_handle_t * ret_encoder )

Create RMT encoder for encoding LED strip pixels into RMT symbols.

Parameters
[in]configEncoder configuration
[out]ret_encoderReturned encoder handle
Returns
  • ESP_ERR_INVALID_ARG for any invalid arguments
  • ESP_ERR_NO_MEM out of memory when creating led strip encoder
  • ESP_OK if creating encoder successfully

Definition at line 74 of file led_strip_rmt_encoder.c.

75{
76 esp_err_t ret = ESP_OK;
77 rmt_led_strip_encoder_t *led_encoder = NULL;
78 ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
79 ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led model");
80 led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t));
81 ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder");
82 led_encoder->base.encode = rmt_encode_led_strip;
83 led_encoder->base.del = rmt_del_led_strip_encoder;
84 led_encoder->base.reset = rmt_led_strip_encoder_reset;
85 rmt_bytes_encoder_config_t bytes_encoder_config;
86 if (config->led_model == LED_MODEL_SK6812) {
87 bytes_encoder_config = (rmt_bytes_encoder_config_t) {
88 .bit0 = {
89 .level0 = 1,
90 .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us
91 .level1 = 0,
92 .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us
93 },
94 .bit1 = {
95 .level0 = 1,
96 .duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us
97 .level1 = 0,
98 .duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us
99 },
100 .flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0)
101 };
102 } else if (config->led_model == LED_MODEL_WS2812) {
103 // different led strip might have its own timing requirements, following parameter is for WS2812
104 bytes_encoder_config = (rmt_bytes_encoder_config_t) {
105 .bit0 = {
106 .level0 = 1,
107 .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us
108 .level1 = 0,
109 .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us
110 },
111 .bit1 = {
112 .level0 = 1,
113 .duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us
114 .level1 = 0,
115 .duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us
116 },
117 .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0
118 };
119 } else {
120 assert(false);
121 }
122 ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed");
123 rmt_copy_encoder_config_t copy_encoder_config = {};
124 ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(&copy_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed");
125
126 uint32_t reset_ticks = config->resolution / 1000000 * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5
127 led_encoder->reset_code = (rmt_symbol_word_t) {
128 .level0 = 0,
129 .duration0 = reset_ticks,
130 .level1 = 0,
131 .duration1 = reset_ticks,
132 };
133 *ret_encoder = &led_encoder->base;
134 return ESP_OK;
135err:
136 if (led_encoder) {
137 if (led_encoder->bytes_encoder) {
138 rmt_del_encoder(led_encoder->bytes_encoder);
139 }
140 if (led_encoder->copy_encoder) {
141 rmt_del_encoder(led_encoder->copy_encoder);
142 }
143 free(led_encoder);
144 }
145 return ret;
146}
#define ESP_GOTO_ON_ERROR(x, goto_tag, log_tag, format,...)
int esp_err_t
Definition esp_err.h:21
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)
static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)
static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)
@ LED_MODEL_WS2812
@ LED_MODEL_SK6812
@ LED_MODEL_INVALID
static const char * TAG
Definition main/main.c:31

References rmt_led_strip_encoder_t::base, rmt_led_strip_encoder_t::bytes_encoder, rmt_led_strip_encoder_t::copy_encoder, ESP_GOTO_ON_ERROR, ESP_OK, led_strip_encoder_config_t::led_model, LED_MODEL_INVALID, LED_MODEL_SK6812, LED_MODEL_WS2812, rmt_led_strip_encoder_t::reset_code, led_strip_encoder_config_t::resolution, rmt_del_led_strip_encoder(), rmt_encode_led_strip(), rmt_led_strip_encoder_reset(), and TAG.

Referenced by led_strip_new_rmt_device().

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ TAG

const char* TAG = "led_rmt_encoder"
static

Definition at line 10 of file led_strip_rmt_encoder.c.