11/*
2- * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
2+ * SPDX-FileCopyrightText: Copyright The Zephyr Project Contributors
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
66
7- #include "esp_check.h"
7+ #include <stdlib.h>
8+ #include <zephyr/sys/printk.h>
89#include "led_strip_encoder.h"
910
10- static const char * TAG = "led_encoder" ;
11-
1211typedef struct {
1312 rmt_encoder_t base ;
1413 rmt_encoder_t * bytes_encoder ;
@@ -26,90 +25,104 @@ static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t
2625 rmt_encode_state_t state = RMT_ENCODING_RESET ;
2726 size_t encoded_symbols = 0 ;
2827 switch (led_encoder -> state ) {
29- case 0 : // send RGB data
28+ case 0 : /* send RGB data */
3029 encoded_symbols += bytes_encoder -> encode (bytes_encoder , channel , primary_data , data_size , & session_state );
3130 if (session_state & RMT_ENCODING_COMPLETE ) {
32- led_encoder -> state = 1 ; // switch to next state when current encoding session finished
31+ led_encoder -> state = 1 ; /* switch to next state when current encoding session finished */
3332 }
3433 if (session_state & RMT_ENCODING_MEM_FULL ) {
3534 state |= RMT_ENCODING_MEM_FULL ;
36- goto out ; // yield if there's no free space for encoding artifacts
35+ goto out ; /* yield if there's no free space for encoding artifacts */
3736 }
38- // fall-through
39- case 1 : // send reset code
37+ /* fall-through */
38+ case 1 : /* send reset code */
4039 encoded_symbols += copy_encoder -> encode (copy_encoder , channel , & led_encoder -> reset_code ,
4140 sizeof (led_encoder -> reset_code ), & session_state );
4241 if (session_state & RMT_ENCODING_COMPLETE ) {
43- led_encoder -> state = RMT_ENCODING_RESET ; // back to the initial encoding session
42+ led_encoder -> state = RMT_ENCODING_RESET ; /* back to the initial encoding session */
4443 state |= RMT_ENCODING_COMPLETE ;
4544 }
4645 if (session_state & RMT_ENCODING_MEM_FULL ) {
4746 state |= RMT_ENCODING_MEM_FULL ;
48- goto out ; // yield if there's no free space for encoding artifacts
47+ goto out ; /* yield if there's no free space for encoding artifacts */
4948 }
5049 }
5150out :
5251 * ret_state = state ;
5352 return encoded_symbols ;
5453}
5554
56- static esp_err_t rmt_del_led_strip_encoder (rmt_encoder_t * encoder )
55+ static int rmt_del_led_strip_encoder (rmt_encoder_t * encoder )
5756{
5857 rmt_led_strip_encoder_t * led_encoder = __containerof (encoder , rmt_led_strip_encoder_t , base );
5958 rmt_del_encoder (led_encoder -> bytes_encoder );
6059 rmt_del_encoder (led_encoder -> copy_encoder );
6160 free (led_encoder );
62- return ESP_OK ;
61+ return 0 ;
6362}
6463
65- static esp_err_t rmt_led_strip_encoder_reset (rmt_encoder_t * encoder )
64+ static int rmt_led_strip_encoder_reset (rmt_encoder_t * encoder )
6665{
6766 rmt_led_strip_encoder_t * led_encoder = __containerof (encoder , rmt_led_strip_encoder_t , base );
6867 rmt_encoder_reset (led_encoder -> bytes_encoder );
6968 rmt_encoder_reset (led_encoder -> copy_encoder );
7069 led_encoder -> state = RMT_ENCODING_RESET ;
71- return ESP_OK ;
70+ return 0 ;
7271}
7372
74- esp_err_t rmt_new_led_strip_encoder (const led_strip_encoder_config_t * config , rmt_encoder_handle_t * ret_encoder )
73+ int rmt_new_led_strip_encoder (const led_strip_encoder_config_t * config , rmt_encoder_handle_t * ret_encoder )
7574{
76- esp_err_t ret = ESP_OK ;
75+ int rc ;
7776 rmt_led_strip_encoder_t * led_encoder = NULL ;
78- ESP_GOTO_ON_FALSE (config && ret_encoder , ESP_ERR_INVALID_ARG , err , TAG , "invalid argument" );
77+ if (!(config && ret_encoder )) {
78+ printk ("Invalid argument\n" );
79+ return - EINVAL ;
80+ }
7981 led_encoder = rmt_alloc_encoder_mem (sizeof (rmt_led_strip_encoder_t ));
80- ESP_GOTO_ON_FALSE (led_encoder , ESP_ERR_NO_MEM , err , TAG , "no mem for led strip encoder" );
82+ if (!led_encoder ) {
83+ printk ("Unable to allocate memory for LED strip encoder\n" );
84+ return - ENOMEM ;
85+ }
8186 led_encoder -> base .encode = rmt_encode_led_strip ;
8287 led_encoder -> base .del = rmt_del_led_strip_encoder ;
8388 led_encoder -> base .reset = rmt_led_strip_encoder_reset ;
84- // different led strip might have its own timing requirements, following parameter is for WS2812
89+ /* different led strip might have its own timing requirements, following parameter is for WS2812 */
8590 rmt_bytes_encoder_config_t bytes_encoder_config = {
8691 .bit0 = {
8792 .level0 = 1 ,
88- .duration0 = 0.3 * config -> resolution / 1000000 , // T0H=0.3us
93+ .duration0 = 0.3 * config -> resolution / 1000000 , /* T0H=0.3us */
8994 .level1 = 0 ,
90- .duration1 = 0.9 * config -> resolution / 1000000 , // T0L=0.9us
95+ .duration1 = 0.9 * config -> resolution / 1000000 , /* T0L=0.9us */
9196 },
9297 .bit1 = {
9398 .level0 = 1 ,
94- .duration0 = 0.9 * config -> resolution / 1000000 , // T1H=0.9us
99+ .duration0 = 0.9 * config -> resolution / 1000000 , /* T1H=0.9us */
95100 .level1 = 0 ,
96- .duration1 = 0.3 * config -> resolution / 1000000 , // T1L=0.3us
101+ .duration1 = 0.3 * config -> resolution / 1000000 , /* T1L=0.3us */
97102 },
98- .flags .msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0
103+ .flags .msb_first = 1 /* WS2812 transfer bit order: G7...G0R7...R0B7...B0 */
99104 };
100- ESP_GOTO_ON_ERROR (rmt_new_bytes_encoder (& bytes_encoder_config , & led_encoder -> bytes_encoder ), err , TAG , "create bytes encoder failed" );
105+ rc = rmt_new_bytes_encoder (& bytes_encoder_config , & led_encoder -> bytes_encoder );
106+ if (rc ) {
107+ printk ("Create bytes encoder failed\n" );
108+ goto err ;
109+ }
101110 rmt_copy_encoder_config_t copy_encoder_config = {};
102- ESP_GOTO_ON_ERROR (rmt_new_copy_encoder (& copy_encoder_config , & led_encoder -> copy_encoder ), err , TAG , "create copy encoder failed" );
103-
104- uint32_t reset_ticks = config -> resolution / 1000000 * 50 / 2 ; // reset code duration defaults to 50us
111+ rc = rmt_new_copy_encoder (& copy_encoder_config , & led_encoder -> copy_encoder );
112+ if (rc ) {
113+ printk ("create copy encoder failed\n" );
114+ goto err ;
115+ }
116+ uint32_t reset_ticks = config -> resolution / 1000000 * 50 / 2 ; /* reset code duration defaults to 50us */
105117 led_encoder -> reset_code = (rmt_symbol_word_t ) {
106118 .level0 = 0 ,
107119 .duration0 = reset_ticks ,
108120 .level1 = 0 ,
109121 .duration1 = reset_ticks ,
110122 };
111123 * ret_encoder = & led_encoder -> base ;
112- return ESP_OK ;
124+ return 0 ;
125+
113126err :
114127 if (led_encoder ) {
115128 if (led_encoder -> bytes_encoder ) {
@@ -120,5 +133,5 @@ esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rm
120133 }
121134 free (led_encoder );
122135 }
123- return ret ;
136+ return rc ;
124137}
0 commit comments