rmt_encoder.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #pragma once
  7. #include <stdint.h>
  8. #include "esp_err.h"
  9. #include "hal/rmt_types.h"
  10. #include "driver/rmt_types.h"
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. /** @cond */
  15. typedef struct rmt_encoder_t rmt_encoder_t;
  16. /** @endcond */
  17. /**
  18. * @brief RMT encoding state
  19. */
  20. typedef enum {
  21. RMT_ENCODING_RESET = 0, /*!< The encoding session is in reset state */
  22. RMT_ENCODING_COMPLETE = (1 << 0), /*!< The encoding session is finished, the caller can continue with subsequent encoding */
  23. RMT_ENCODING_MEM_FULL = (1 << 1), /*!< The encoding artifact memory is full, the caller should return from current encoding session */
  24. } rmt_encode_state_t;
  25. /**
  26. * @brief Interface of RMT encoder
  27. */
  28. struct rmt_encoder_t {
  29. /**
  30. * @brief Encode the user data into RMT symbols and write into RMT memory
  31. *
  32. * @note The encoding function will also be called from an ISR context, thus the function must not call any blocking API.
  33. * @note It's recommended to put this function implementation in the IRAM, to achieve a high performance and less interrupt latency.
  34. *
  35. * @param[in] encoder Encoder handle
  36. * @param[in] tx_channel RMT TX channel handle, returned from `rmt_new_tx_channel()`
  37. * @param[in] primary_data App data to be encoded into RMT symbols
  38. * @param[in] data_size Size of primary_data, in bytes
  39. * @param[out] ret_state Returned current encoder's state
  40. * @return Number of RMT symbols that the primary data has been encoded into
  41. */
  42. size_t (*encode)(rmt_encoder_t *encoder, rmt_channel_handle_t tx_channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state);
  43. /**
  44. * @brief Reset encoding state
  45. *
  46. * @param[in] encoder Encoder handle
  47. * @return
  48. * - ESP_OK: reset encoder successfully
  49. * - ESP_FAIL: reset encoder failed
  50. */
  51. esp_err_t (*reset)(rmt_encoder_t *encoder);
  52. /**
  53. * @brief Delete encoder object
  54. *
  55. * @param[in] encoder Encoder handle
  56. * @return
  57. * - ESP_OK: delete encoder successfully
  58. * - ESP_FAIL: delete encoder failed
  59. */
  60. esp_err_t (*del)(rmt_encoder_t *encoder);
  61. };
  62. /**
  63. * @brief Bytes encoder configuration
  64. */
  65. typedef struct {
  66. rmt_symbol_word_t bit0; /*!< How to represent BIT0 in RMT symbol */
  67. rmt_symbol_word_t bit1; /*!< How to represent BIT1 in RMT symbol */
  68. struct {
  69. uint32_t msb_first: 1; /*!< Whether to encode MSB bit first */
  70. } flags; /*!< Encoder config flag */
  71. } rmt_bytes_encoder_config_t;
  72. /**
  73. * @brief Copy encoder configuration
  74. */
  75. typedef struct {
  76. } rmt_copy_encoder_config_t;
  77. /**
  78. * @brief Create RMT bytes encoder, which can encode byte stream into RMT symbols
  79. *
  80. * @param[in] config Bytes encoder configuration
  81. * @param[out] ret_encoder Returned encoder handle
  82. * @return
  83. * - ESP_OK: Create RMT bytes encoder successfully
  84. * - ESP_ERR_INVALID_ARG: Create RMT bytes encoder failed because of invalid argument
  85. * - ESP_ERR_NO_MEM: Create RMT bytes encoder failed because out of memory
  86. * - ESP_FAIL: Create RMT bytes encoder failed because of other error
  87. */
  88. esp_err_t rmt_new_bytes_encoder(const rmt_bytes_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder);
  89. /**
  90. * @brief Create RMT copy encoder, which copies the given RMT symbols into RMT memory
  91. *
  92. * @param[in] config Copy encoder configuration
  93. * @param[out] ret_encoder Returned encoder handle
  94. * @return
  95. * - ESP_OK: Create RMT copy encoder successfully
  96. * - ESP_ERR_INVALID_ARG: Create RMT copy encoder failed because of invalid argument
  97. * - ESP_ERR_NO_MEM: Create RMT copy encoder failed because out of memory
  98. * - ESP_FAIL: Create RMT copy encoder failed because of other error
  99. */
  100. esp_err_t rmt_new_copy_encoder(const rmt_copy_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder);
  101. /**
  102. * @brief Delete RMT encoder
  103. *
  104. * @param[in] encoder RMT encoder handle, created by e.g `rmt_new_bytes_encoder()`
  105. * @return
  106. * - ESP_OK: Delete RMT encoder successfully
  107. * - ESP_ERR_INVALID_ARG: Delete RMT encoder failed because of invalid argument
  108. * - ESP_FAIL: Delete RMT encoder failed because of other error
  109. */
  110. esp_err_t rmt_del_encoder(rmt_encoder_handle_t encoder);
  111. /**
  112. * @brief Reset RMT encoder
  113. *
  114. * @param[in] encoder RMT encoder handle, created by e.g `rmt_new_bytes_encoder()`
  115. * @return
  116. * - ESP_OK: Reset RMT encoder successfully
  117. * - ESP_ERR_INVALID_ARG: Reset RMT encoder failed because of invalid argument
  118. * - ESP_FAIL: Reset RMT encoder failed because of other error
  119. */
  120. esp_err_t rmt_encoder_reset(rmt_encoder_handle_t encoder);
  121. #ifdef __cplusplus
  122. }
  123. #endif