Add silence timeout
This commit is contained in:
parent
0993f4df1a
commit
fd0c853f36
@ -7,6 +7,7 @@
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/queue.h"
|
||||
#include "freertos/timers.h"
|
||||
#include "nvs_flash.h"
|
||||
#include "driver/uart.h"
|
||||
#include "esp_log.h"
|
||||
@ -18,23 +19,27 @@ static const char* TAG = "App";
|
||||
|
||||
TaskHandle_t s_main_task = nullptr;
|
||||
|
||||
TimerHandle_t s_timer = nullptr;
|
||||
|
||||
QueueSetHandle_t s_queue_set = nullptr;
|
||||
QueueHandle_t s_esp_now_queue = nullptr;
|
||||
QueueHandle_t s_uart_queue = nullptr;
|
||||
|
||||
void s_sendUartData()
|
||||
void s_sendUartData(const std::size_t len)
|
||||
{
|
||||
std::size_t uart_rx_size = 0;
|
||||
uart_get_buffered_data_len(UART_NUM_0, &uart_rx_size);
|
||||
if (uart_rx_size > 128 / 2)
|
||||
{
|
||||
ESP_LOGD(TAG, "Sending %ull bytes via UART.", uart_rx_size);
|
||||
ESP_LOGD(TAG, "Sending %u bytes via UART.", len);
|
||||
|
||||
std::array<std::uint8_t, 128> tx_buffer;
|
||||
uart_read_bytes(UART_NUM_0, tx_buffer.data(), uart_rx_size, 0);
|
||||
uart_read_bytes(UART_NUM_0, tx_buffer.data(), len, 0);
|
||||
|
||||
Networking::sendData(tx_buffer, uart_rx_size);
|
||||
Networking::sendData(tx_buffer, len);
|
||||
}
|
||||
|
||||
std::size_t s_uartBytesWaiting()
|
||||
{
|
||||
std::size_t len = 0;
|
||||
uart_get_buffered_data_len(UART_NUM_0, &len);
|
||||
return std::min<std::size_t>(len, 128);
|
||||
}
|
||||
|
||||
[[noreturn]] void s_mainTask(void*)
|
||||
@ -70,7 +75,13 @@ void s_sendUartData()
|
||||
else if (event.type == Networking::EspNowEvent::MSG_SEND_COMPLETE)
|
||||
{
|
||||
ESP_LOGD(TAG, "ESP-NOW event: TX completed. Checking to send data.");
|
||||
s_sendUartData();
|
||||
|
||||
const std::size_t bytes_waiting = s_uartBytesWaiting();
|
||||
if (s_uartBytesWaiting() >= 128)
|
||||
{
|
||||
s_sendUartData(bytes_waiting);
|
||||
xTimerStop(s_timer, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (queue_select == s_uart_queue)
|
||||
@ -82,12 +93,23 @@ void s_sendUartData()
|
||||
|
||||
if (event.type == UART_DATA)
|
||||
{
|
||||
s_sendUartData();
|
||||
const std::size_t bytes_waiting = s_uartBytesWaiting();
|
||||
if (s_uartBytesWaiting() >= 128)
|
||||
s_sendUartData(bytes_waiting);
|
||||
else
|
||||
xTimerReset(s_timer, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void s_cbListenTimeout(TimerHandle_t)
|
||||
{
|
||||
const std::size_t bytes_waiting = s_uartBytesWaiting();
|
||||
if (bytes_waiting > 0)
|
||||
s_sendUartData(bytes_waiting);
|
||||
}
|
||||
|
||||
}// namespace
|
||||
|
||||
extern "C" void app_main(void)
|
||||
@ -104,6 +126,8 @@ extern "C" void app_main(void)
|
||||
s_esp_now_queue = Networking::setupEspNow();
|
||||
s_uart_queue = Serial::setupSerial();
|
||||
|
||||
s_timer = xTimerCreate("autosend_timer", pdMS_TO_TICKS(100), false, nullptr, s_cbListenTimeout);
|
||||
|
||||
s_queue_set = xQueueCreateSet(4 + 4);
|
||||
xQueueAddToSet(s_esp_now_queue, s_queue_set);
|
||||
xQueueAddToSet(s_uart_queue, s_queue_set);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user