mirror of
https://github.com/esphome/esphome.git
synced 2026-09-18 02:28:42 +00:00
[remote_receiver] Wake the main loop when the RMT callback stores a frame (#19102)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "remote_receiver.h"
|
||||
#include "esphome/core/log.h"
|
||||
#include "esphome/core/wake.h"
|
||||
|
||||
#ifdef USE_ESP32
|
||||
#include <soc/soc_caps.h>
|
||||
@@ -14,25 +15,32 @@ static constexpr uint32_t DEFAULT_BUFFER_SLOTS = 4;
|
||||
|
||||
static bool IRAM_ATTR HOT rmt_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *event, void *arg) {
|
||||
RemoteReceiverComponentStore *store = (RemoteReceiverComponentStore *) arg;
|
||||
rmt_rx_done_event_data_t *event_buffer = (rmt_rx_done_event_data_t *) (store->buffer + store->buffer_write);
|
||||
const uint32_t buffer_write = store->buffer_write;
|
||||
rmt_rx_done_event_data_t *event_buffer = (rmt_rx_done_event_data_t *) (store->buffer + buffer_write);
|
||||
uint32_t event_size = sizeof(rmt_rx_done_event_data_t);
|
||||
uint32_t next_write = store->buffer_write + event_size + event->num_symbols * sizeof(rmt_symbol_word_t);
|
||||
uint32_t next_write = buffer_write + event_size + event->num_symbols * sizeof(rmt_symbol_word_t);
|
||||
if (next_write + event_size + store->receive_size > store->buffer_size) {
|
||||
next_write = 0;
|
||||
}
|
||||
if (store->buffer_read - next_write < event_size + store->receive_size) {
|
||||
next_write = store->buffer_write;
|
||||
next_write = buffer_write;
|
||||
store->overflow = true;
|
||||
}
|
||||
if (event->num_symbols <= store->filter_symbols) {
|
||||
next_write = store->buffer_write;
|
||||
next_write = buffer_write;
|
||||
}
|
||||
store->error =
|
||||
rmt_receive(channel, (uint8_t *) store->buffer + next_write + event_size, store->receive_size, &store->config);
|
||||
event_buffer->num_symbols = event->num_symbols;
|
||||
event_buffer->received_symbols = event->received_symbols;
|
||||
const bool stored = next_write != buffer_write;
|
||||
store->buffer_write = next_write;
|
||||
return false;
|
||||
// a stored frame is decoded, and a failed re-arm reported, on the next loop pass instead of
|
||||
// waiting out the loop interval; filtered noise and dropped frames leave nothing to read
|
||||
BaseType_t task_woken = pdFALSE;
|
||||
if (stored || store->error != ESP_OK)
|
||||
wake_loop_isrsafe(&task_woken);
|
||||
return task_woken != pdFALSE;
|
||||
}
|
||||
|
||||
void RemoteReceiverComponent::setup() {
|
||||
|
||||
Reference in New Issue
Block a user