Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit e9ca1dc

Browse files
committedJan 9, 2018
Merge branch 'feature/rmt_end_transmission_callback' into 'master'
rmt: Adds a simple handler that can be called when transmission ends. See merge request !1726
2 parents 3452845 + 2227c44 commit e9ca1dc

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed
 

‎components/driver/include/driver/rmt.h

+25
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,16 @@ typedef struct {
119119

120120
typedef intr_handle_t rmt_isr_handle_t;
121121

122+
typedef void (*rmt_tx_end_fn_t)(rmt_channel_t channel, void *arg);
123+
124+
/**
125+
* @brief Structure encapsulating a RMT TX end callback
126+
*/
127+
typedef struct {
128+
rmt_tx_end_fn_t function; /*!< Function which is called on RMT TX end */
129+
void *arg; /*!< Optional argument passed to function */
130+
} rmt_tx_end_callback_t;
131+
122132
/**
123133
* @brief Set RMT clock divider, channel clock is divided from source clock.
124134
*
@@ -702,6 +712,21 @@ esp_err_t rmt_wait_tx_done(rmt_channel_t channel, TickType_t wait_time);
702712
*/
703713
esp_err_t rmt_get_ringbuf_handle(rmt_channel_t channel, RingbufHandle_t* buf_handle);
704714

715+
/**
716+
* @brief Registers a callback that will be called when transmission ends.
717+
*
718+
* Called by rmt_driver_isr_default in interrupt context.
719+
*
720+
* @note Requires rmt_driver_install to install the default ISR handler.
721+
*
722+
* @param function Function to be called from the default interrupt handler or NULL.
723+
* @param arg Argument which will be provided to the callback when it is called.
724+
*
725+
* @return the previous callback settings (members will be set to NULL if there was none)
726+
*/
727+
rmt_tx_end_callback_t rmt_register_tx_end_callback(rmt_tx_end_fn_t function, void *arg);
728+
729+
705730
/*
706731
* ----------------EXAMPLE OF RMT INTERRUPT ------------------
707732
* @code{c}

‎components/driver/rmt.c

+13
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ typedef struct {
7575

7676
rmt_obj_t* p_rmt_obj[RMT_CHANNEL_MAX] = {0};
7777

78+
// Event called when transmission is ended
79+
static rmt_tx_end_callback_t rmt_tx_end_callback;
80+
7881
static void rmt_set_tx_wrap_en(rmt_channel_t channel, bool en)
7982
{
8083
portENTER_CRITICAL(&rmt_spinlock);
@@ -548,6 +551,9 @@ static void IRAM_ATTR rmt_driver_isr_default(void* arg)
548551
p_rmt->tx_len_rem = 0;
549552
p_rmt->tx_offset = 0;
550553
p_rmt->tx_sub_len = 0;
554+
if(rmt_tx_end_callback.function != NULL) {
555+
rmt_tx_end_callback.function(channel, rmt_tx_end_callback.arg);
556+
}
551557
break;
552558
//RX_END
553559
case 1:
@@ -771,3 +777,10 @@ esp_err_t rmt_get_ringbuf_handle(rmt_channel_t channel, RingbufHandle_t* buf_han
771777
return ESP_OK;
772778
}
773779

780+
rmt_tx_end_callback_t rmt_register_tx_end_callback(rmt_tx_end_fn_t function, void *arg)
781+
{
782+
rmt_tx_end_callback_t previous = rmt_tx_end_callback;
783+
rmt_tx_end_callback.function = function;
784+
rmt_tx_end_callback.arg = arg;
785+
return previous;
786+
}

0 commit comments

Comments
 (0)
This repository has been archived.