diff --git a/main/esp_tunnel.cpp b/main/esp_tunnel.cpp index 422e415..b03061d 100644 --- a/main/esp_tunnel.cpp +++ b/main/esp_tunnel.cpp @@ -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 tx_buffer; - uart_read_bytes(UART_NUM_0, tx_buffer.data(), uart_rx_size, 0); + std::array tx_buffer; + 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(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);