39 DOPLED(uint8_t pin, uint8_t timeBase_us);
73 void sendRaw(uint8_t *data,
size_t size);
108 void writePixel(uint8_t address, uint8_t r, uint8_t g, uint8_t b);
119 void fillAll(uint8_t r, uint8_t g, uint8_t b);
149 void fillRandomGroups(uint8_t mask, uint8_t address, uint8_t r, uint8_t g, uint8_t b);
176 static const unsigned long RMT_RESOLUTION_HZ = 1000000;
177 static const unsigned int RMT_TICK_US = (RMT_RESOLUTION_HZ / 1000000);
179 static const unsigned int DEFAULT_TIMING_BASE_US = 70;
181 static const unsigned int T0L = 1 * RMT_TICK_US;
182 static const unsigned int T0H = 1 * RMT_TICK_US;
183 static const unsigned int T1L = 1 * RMT_TICK_US;
184 static const unsigned int T1H = 3 * RMT_TICK_US;
185 static const unsigned int PRE_PKT_L = 1 * RMT_TICK_US;
186 static const unsigned int INTER_PKT_H = 7 * RMT_TICK_US;
188 unsigned int timebase;
190 uint8_t _setCommand = 0b00110000;
191 uint8_t _fillCommand = 0b00011000;
192 uint8_t _randFillCommand = 0b01001000;
194 struct dopled_encoder_t
197 rmt_encoder_t *bytes_encoder;
198 rmt_encoder_t *copy_encoder;
201 rmt_symbol_word_t leading_symbol;
202 rmt_symbol_word_t ending_symbol;
206 bool _initialized =
false;
208 rmt_channel_handle_t led_chan = NULL;
209 rmt_encoder_handle_t dopled_encoder = NULL;
210 rmt_transmit_config_t tx_config;
212 static size_t rmt_encode_dopled(
213 rmt_encoder_t *encoder,
214 rmt_channel_handle_t channel,
215 const void *primary_data,
217 rmt_encode_state_t *ret_state)
219 dopled_encoder_t *led_encoder = __containerof(encoder, dopled_encoder_t, base);
220 rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
221 rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;
222 rmt_encode_state_t session_state = RMT_ENCODING_RESET;
223 rmt_encode_state_t state = RMT_ENCODING_RESET;
224 size_t encoded_symbols = 0;
225 switch (led_encoder->state)
228 encoded_symbols += copy_encoder->encode(
231 &led_encoder->leading_symbol,
232 sizeof(rmt_symbol_word_t),
234 if (session_state & RMT_ENCODING_COMPLETE)
236 led_encoder->state = 1;
238 if (session_state & RMT_ENCODING_MEM_FULL)
240 state = RMT_ENCODING_MEM_FULL;
245 encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);
246 if (session_state & RMT_ENCODING_COMPLETE)
248 led_encoder->state = 2;
250 if (session_state & RMT_ENCODING_MEM_FULL)
252 state = RMT_ENCODING_MEM_FULL;
257 encoded_symbols += copy_encoder->encode(
260 &led_encoder->ending_symbol,
261 sizeof(rmt_symbol_word_t),
263 if (session_state & RMT_ENCODING_COMPLETE)
265 led_encoder->state = RMT_ENCODING_RESET;
266 state = RMT_ENCODING_COMPLETE;
268 if (session_state & RMT_ENCODING_MEM_FULL)
270 state = RMT_ENCODING_MEM_FULL;
276 return encoded_symbols;
279 static esp_err_t rmt_del_dopled_encoder(rmt_encoder_t *encoder)
281 dopled_encoder_t *led_encoder = __containerof(encoder, dopled_encoder_t, base);
282 rmt_del_encoder(led_encoder->bytes_encoder);
283 rmt_del_encoder(led_encoder->copy_encoder);
288 static esp_err_t rmt_dopled_encoder_reset(rmt_encoder_t *encoder)
290 dopled_encoder_t *led_encoder = __containerof(encoder, dopled_encoder_t, base);
291 rmt_encoder_reset(led_encoder->bytes_encoder);
292 rmt_encoder_reset(led_encoder->copy_encoder);
293 led_encoder->state = RMT_ENCODING_RESET;
297 esp_err_t rmt_new_dopled_encoder(rmt_encoder_handle_t *ret_encoder);
299 friend bool dopled_tx_done_callback(
300 rmt_channel_handle_t,
301 const rmt_tx_done_event_data_t *,