From 9aca17b015f098b0c29b20cee558875ac8a27d77 Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Fri, 19 Jan 2024 18:27:28 -0800 Subject: [PATCH] builds against RC --- seader_i.h | 10 +++++----- uart.c | 29 ++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/seader_i.h b/seader_i.h index 8d719bb..5efc80a 100644 --- a/seader_i.h +++ b/seader_i.h @@ -52,7 +52,7 @@ #define WORKER_ALL_RX_EVENTS \ (WorkerEvtStop | WorkerEvtRxDone | WorkerEvtCfgChange | WorkerEvtLineCfgSet | \ - WorkerEvtCtrlLineSet) + WorkerEvtCtrlLineSet | WorkerEvtSamTxComplete) #define WORKER_ALL_TX_EVENTS (WorkerEvtTxStop | WorkerEvtSamRx) #define SEADER_TEXT_STORE_SIZE 128 @@ -75,12 +75,12 @@ typedef enum { WorkerEvtTxStop = (1 << 2), WorkerEvtSamRx = (1 << 3), + WorkerEvtSamTxComplete = (1 << 4), - WorkerEvtCfgChange = (1 << 4), - - WorkerEvtLineCfgSet = (1 << 5), - WorkerEvtCtrlLineSet = (1 << 6), + WorkerEvtCfgChange = (1 << 5), + WorkerEvtLineCfgSet = (1 << 6), + WorkerEvtCtrlLineSet = (1 << 7), } WorkerEvtFlags; struct Seader { diff --git a/uart.c b/uart.c index 9a25fd6..b74c1c4 100644 --- a/uart.c +++ b/uart.c @@ -2,10 +2,24 @@ #define TAG "SeaderUART" -void seader_uart_on_irq_cb(uint8_t data, void* context) { +static void seader_uart_on_irq_rx_dma_cb( + FuriHalSerialHandle* handle, + FuriHalSerialRxEvent ev, + size_t size, + void* context) { SeaderUartBridge* seader_uart = (SeaderUartBridge*)context; - furi_stream_buffer_send(seader_uart->rx_stream, &data, 1, 0); - furi_thread_flags_set(furi_thread_get_id(seader_uart->thread), WorkerEvtRxDone); + if(ev & (FuriHalSerialRxEventData | FuriHalSerialRxEventIdle)) { + uint8_t data[FURI_HAL_SERIAL_DMA_BUFFER_SIZE] = {0}; + while(size) { + size_t ret = furi_hal_serial_dma_rx( + handle, + data, + (size > FURI_HAL_SERIAL_DMA_BUFFER_SIZE) ? FURI_HAL_SERIAL_DMA_BUFFER_SIZE : size); + furi_stream_buffer_send(seader_uart->rx_stream, data, ret, 0); + size -= ret; + }; + furi_thread_flags_set(furi_thread_get_id(seader_uart->thread), WorkerEvtRxDone); + } } void seader_uart_disable(SeaderUartBridge* seader_uart) { @@ -23,14 +37,15 @@ void seader_uart_serial_init(SeaderUartBridge* seader_uart, uint8_t uart_ch) { furi_assert(seader_uart->serial_handle); furi_hal_serial_init(seader_uart->serial_handle, 115200); - furi_hal_serial_set_rx_callback(seader_uart->serial_handle, seader_uart_on_irq_cb, seader_uart); + furi_hal_serial_dma_rx_start( + seader_uart->serial_handle, seader_uart_on_irq_rx_dma_cb, seader_uart, false); } void seader_uart_serial_deinit(SeaderUartBridge* seader_uart) { - UNUSED(seader_uart); - furi_hal_serial_set_rx_callback(seader_uart->serial_handle, NULL, NULL); + furi_assert(seader_uart->serial_handle); furi_hal_serial_deinit(seader_uart->serial_handle); furi_hal_serial_control_release(seader_uart->serial_handle); + seader_uart->serial_handle = NULL; } void seader_uart_set_baudrate(SeaderUartBridge* seader_uart, uint32_t baudrate) { @@ -104,7 +119,7 @@ int32_t seader_uart_worker(void* context) { cmd_len = 0; break; } - if(events & WorkerEvtRxDone) { + if(events & (WorkerEvtRxDone | WorkerEvtSamTxComplete)) { size_t len = furi_stream_buffer_receive( seader_uart->rx_stream, seader_uart->rx_buf, SEADER_UART_RX_BUF_SIZE, 0); if(len > 0) {