mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 01:29:21 -04:00
rmt: const callback event data
This commit is contained in:
parent
741b031e83
commit
9a921ada7f
@ -46,7 +46,7 @@ typedef struct {
|
||||
*
|
||||
* @return Whether a high priority task has been waken up by this callback function
|
||||
*/
|
||||
typedef bool (*rmt_tx_done_callback_t)(rmt_channel_handle_t tx_chan, rmt_tx_done_event_data_t *edata, void *user_ctx);
|
||||
typedef bool (*rmt_tx_done_callback_t)(rmt_channel_handle_t tx_chan, const rmt_tx_done_event_data_t *edata, void *user_ctx);
|
||||
|
||||
/**
|
||||
* @brief Type of RMT RX done event data
|
||||
@ -65,7 +65,7 @@ typedef struct {
|
||||
* @param[in] user_ctx User registered context, passed from `rmt_rx_register_event_callbacks()`
|
||||
* @return Whether a high priority task has been waken up by this function
|
||||
*/
|
||||
typedef bool (*rmt_rx_done_callback_t)(rmt_channel_handle_t rx_chan, rmt_rx_done_event_data_t *edata, void *user_ctx);
|
||||
typedef bool (*rmt_rx_done_callback_t)(rmt_channel_handle_t rx_chan, const rmt_rx_done_event_data_t *edata, void *user_ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ typedef struct {
|
||||
} test_nec_rx_user_data_t;
|
||||
|
||||
TEST_RMT_CALLBACK_ATTR
|
||||
static bool test_rmt_rx_done_callback(rmt_channel_handle_t channel, rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
static bool test_rmt_rx_done_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
BaseType_t high_task_wakeup = pdFALSE;
|
||||
test_nec_rx_user_data_t *test_user_data = (test_nec_rx_user_data_t *)user_data;
|
||||
|
@ -160,7 +160,7 @@ TEST_CASE("rmt_ping_pong_trans_with_dma", "[rmt]")
|
||||
#endif
|
||||
|
||||
TEST_RMT_CALLBACK_ATTR
|
||||
static bool test_rmt_tx_done_cb_check_event_data(rmt_channel_handle_t channel, rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
static bool test_rmt_tx_done_cb_check_event_data(rmt_channel_handle_t channel, const rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
uint32_t *p_expected_encoded_size = (uint32_t *)user_data;
|
||||
TEST_ASSERT_EQUAL(*p_expected_encoded_size, edata->num_symbols);
|
||||
@ -237,7 +237,7 @@ TEST_CASE("rmt_trans_done_event_callback_with_dma", "[rmt]")
|
||||
#if SOC_RMT_SUPPORT_TX_LOOP_COUNT
|
||||
|
||||
TEST_RMT_CALLBACK_ATTR
|
||||
static bool test_rmt_loop_done_cb_check_event_data(rmt_channel_handle_t channel, rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
static bool test_rmt_loop_done_cb_check_event_data(rmt_channel_handle_t channel, const rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
uint32_t *p_expected_encoded_size = (uint32_t *)user_data;
|
||||
TEST_ASSERT_EQUAL(*p_expected_encoded_size, edata->num_symbols);
|
||||
@ -454,7 +454,7 @@ TEST_CASE("rmt_tx_nec_carrier_with_dma", "[rmt]")
|
||||
#endif
|
||||
|
||||
TEST_RMT_CALLBACK_ATTR
|
||||
static bool test_rmt_tx_done_cb_record_time(rmt_channel_handle_t channel, rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
static bool test_rmt_tx_done_cb_record_time(rmt_channel_handle_t channel, const rmt_tx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
int64_t *record_time = (int64_t *)user_data;
|
||||
*record_time = esp_timer_get_time();
|
||||
|
@ -304,21 +304,21 @@ The receiver will be stopped by the driver when it finishes working (i.e. receiv
|
||||
|
||||
.. code:: c
|
||||
|
||||
static bool example_rmt_rx_done_callback(rmt_channel_handle_t channel, rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
static bool example_rmt_rx_done_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
BaseType_t high_task_wakeup = pdFALSE;
|
||||
TaskHandle_t task_to_notify = (TaskHandle_t)user_data;
|
||||
QueueHandle_t receive_queue = (QueueHandle_t)user_data;
|
||||
// send the received RMT symbols to the parser task
|
||||
xTaskNotifyFromISR(task_to_notify, (uint32_t)edata, eSetValueWithOverwrite, &high_task_wakeup);
|
||||
xQueueSendFromISR(receive_queue, edata, &high_task_wakeup);
|
||||
// return whether any task is woken up
|
||||
return high_task_wakeup == pdTRUE;
|
||||
}
|
||||
|
||||
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
|
||||
QueueHandle_t receive_queue = xQueueCreate(1, sizeof(rmt_rx_done_event_data_t));
|
||||
rmt_rx_event_callbacks_t cbs = {
|
||||
.on_recv_done = example_rmt_rx_done_callback,
|
||||
};
|
||||
ESP_ERROR_CHECK(rmt_rx_register_event_callbacks(rx_channel, &cbs, cur_task));
|
||||
ESP_ERROR_CHECK(rmt_rx_register_event_callbacks(rx_channel, &cbs, receive_queue));
|
||||
|
||||
// the following timing requirement is based on NEC protocol
|
||||
rmt_receive_config_t receive_config = {
|
||||
@ -330,10 +330,10 @@ The receiver will be stopped by the driver when it finishes working (i.e. receiv
|
||||
// ready to receive
|
||||
ESP_ERROR_CHECK(rmt_receive(rx_channel, raw_symbols, sizeof(raw_symbols), &receive_config));
|
||||
// wait for RX done signal
|
||||
rmt_rx_done_event_data_t *rx_data = NULL;
|
||||
xTaskNotifyWait(0x00, ULONG_MAX, (uint32_t *)&rx_data, portMAX_DELAY);
|
||||
rmt_rx_done_event_data_t rx_data;
|
||||
xQueueReceive(receive_queue, &rx_data, portMAX_DELAY);
|
||||
// parse the receive symbols
|
||||
example_parse_nec_frame(rx_data->received_symbols, rx_data->num_symbols);
|
||||
example_parse_nec_frame(rx_data.received_symbols, rx_data.num_symbols);
|
||||
|
||||
RMT Encoder
|
||||
^^^^^^^^^^^
|
||||
|
@ -142,7 +142,7 @@ static void example_parse_nec_frame(rmt_symbol_word_t *rmt_nec_symbols, size_t s
|
||||
}
|
||||
}
|
||||
|
||||
static bool example_rmt_rx_done_callback(rmt_channel_handle_t channel, rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
static bool example_rmt_rx_done_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
BaseType_t high_task_wakeup = pdFALSE;
|
||||
QueueHandle_t receive_queue = (QueueHandle_t)user_data;
|
||||
|
@ -144,7 +144,7 @@ const static rmt_receive_config_t onewire_rmt_rx_config = {
|
||||
.signal_range_max_ns = (ONEWIRE_RESET_PULSE_DURATION + ONEWIRE_RESET_WAIT_DURATION) * 1000
|
||||
};
|
||||
|
||||
static bool onewire_rmt_rx_done_callback(rmt_channel_handle_t channel, rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
static bool onewire_rmt_rx_done_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *edata, void *user_data)
|
||||
{
|
||||
BaseType_t task_woken = pdFALSE;
|
||||
struct onewire_bus_t *handle = (struct onewire_bus_t *)user_data;
|
||||
@ -190,12 +190,12 @@ static bool onewire_rmt_check_presence_pulse(rmt_symbol_word_t *rmt_symbols, siz
|
||||
if (symbol_num >= 2) { // there should be at lease 2 symbols(3 or 4 edges)
|
||||
if (rmt_symbols[0].level1 == 1) { // bus is high before reset pulse
|
||||
if (rmt_symbols[0].duration1 > ONEWIRE_RESET_PRESENSE_WAIT_DURATION_MIN &&
|
||||
rmt_symbols[1].duration0 > ONEWIRE_RESET_PRESENSE_DURATION_MIN) {
|
||||
rmt_symbols[1].duration0 > ONEWIRE_RESET_PRESENSE_DURATION_MIN) {
|
||||
return true;
|
||||
}
|
||||
} else { // bus is low before reset pulse(first pulse after rmt channel init)
|
||||
if (rmt_symbols[0].duration0 > ONEWIRE_RESET_PRESENSE_WAIT_DURATION_MIN &&
|
||||
rmt_symbols[1].duration1 > ONEWIRE_RESET_PRESENSE_DURATION_MIN) {
|
||||
rmt_symbols[1].duration1 > ONEWIRE_RESET_PRESENSE_DURATION_MIN) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -324,7 +324,7 @@ esp_err_t onewire_del_bus(onewire_bus_handle_t handle)
|
||||
rmt_disable(handle->tx_channel);
|
||||
rmt_del_channel(handle->tx_channel);
|
||||
}
|
||||
if(handle->receive_queue) {
|
||||
if (handle->receive_queue) {
|
||||
vQueueDelete(handle->receive_queue);
|
||||
}
|
||||
if (handle->rx_symbols) {
|
||||
@ -340,7 +340,7 @@ esp_err_t onewire_bus_reset(onewire_bus_handle_t handle)
|
||||
ESP_RETURN_ON_FALSE(handle, ESP_ERR_INVALID_ARG, TAG, "invalid 1-wire handle");
|
||||
|
||||
// send reset pulse while receive presence pulse
|
||||
ESP_RETURN_ON_ERROR(rmt_receive(handle->rx_channel, handle->rx_symbols, sizeof(rmt_symbol_word_t)*2, &onewire_rmt_rx_config),
|
||||
ESP_RETURN_ON_ERROR(rmt_receive(handle->rx_channel, handle->rx_symbols, sizeof(rmt_symbol_word_t) * 2, &onewire_rmt_rx_config),
|
||||
TAG, "1-wire reset pulse receive failed");
|
||||
ESP_RETURN_ON_ERROR(rmt_transmit(handle->tx_channel, handle->tx_copy_encoder, &onewire_reset_pulse_symbol, sizeof(onewire_reset_pulse_symbol), &onewire_rmt_tx_config),
|
||||
TAG, "1-wire reset pulse transmit failed");
|
||||
|
Loading…
x
Reference in New Issue
Block a user