|
@@ -1,60 +1,67 @@
|
|
|
#include "uhf_uart.h"
|
|
#include "uhf_uart.h"
|
|
|
|
|
|
|
|
|
|
+// int32_t uhf_uart_worker_callback(void *ctx){
|
|
|
|
|
+// UHFUart* uart = (UHFUart*)ctx;
|
|
|
|
|
+// Buffer* buffer = (Buffer*)uart->buffer;
|
|
|
|
|
+// uint32_t events;
|
|
|
|
|
+// size_t length_read = 0;
|
|
|
|
|
+// uint8_t read_buffer[1];
|
|
|
|
|
+// FURI_LOG_E("UHF_UART_WORKER", "UHF UART WORKER STARTED");
|
|
|
|
|
+// do{
|
|
|
|
|
+// events = furi_thread_flags_wait(
|
|
|
|
|
+// UHFUartWorkerWaitingDataFlag | UHFUartWorkerExitingFlag, FuriFlagWaitAny, FuriWaitForever
|
|
|
|
|
+// );
|
|
|
|
|
+// FURI_LOG_E("UHF_UART_WORKER", "events = %lu", events);
|
|
|
|
|
+// if(events & UHFUartWorkerWaitingDataFlag){
|
|
|
|
|
+// FURI_LOG_E("UHF_UART_WORKER", "Waiting data...");
|
|
|
|
|
+// length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
|
|
|
|
|
+// if(length_read){
|
|
|
|
|
+// do{
|
|
|
|
|
+// length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
|
|
|
|
|
+// uhf_buffer_append_single(buffer, read_buffer[0]);
|
|
|
|
|
+// uhf_uart_tick_reset(uart);
|
|
|
|
|
+// }while(read_buffer[0] != UHF_UART_FRAME_END && length_read > 0);
|
|
|
|
|
+// FURI_LOG_E("UHF_UART_WORKER", "UHF Total length read = %u", uhf_buffer_get_size(buffer));
|
|
|
|
|
+// uhf_buffer_close(buffer);
|
|
|
|
|
+// furi_stream_buffer_reset(uart->rx_buff_stream);
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+// }while((events & UHFUartWorkerExitingFlag) != UHFUartWorkerExitingFlag);
|
|
|
|
|
+// return 0;
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
-int32_t uhf_uart_worker_callback(void *ctx){
|
|
|
|
|
- UHFUart* uart = (UHFUart*)ctx;
|
|
|
|
|
- Buffer* buffer = (Buffer*)uart->buffer;
|
|
|
|
|
- uint32_t events;
|
|
|
|
|
- size_t length_read = 0;
|
|
|
|
|
- uint8_t read_buffer[1];
|
|
|
|
|
- FURI_LOG_E("UHF_UART_WORKER", "UHF UART WORKER STARTED");
|
|
|
|
|
- do{
|
|
|
|
|
- events = furi_thread_flags_wait(
|
|
|
|
|
- UHFUartWorkerWaitingDataFlag | UHFUartWorkerExitingFlag, FuriFlagWaitAny, FuriWaitForever
|
|
|
|
|
- );
|
|
|
|
|
- FURI_LOG_E("UHF_UART_WORKER", "events = %lu", events);
|
|
|
|
|
- if(events & UHFUartWorkerWaitingDataFlag){
|
|
|
|
|
- FURI_LOG_E("UHF_UART_WORKER", "Waiting data...");
|
|
|
|
|
- length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
|
|
|
|
|
- if(length_read){
|
|
|
|
|
- do{
|
|
|
|
|
- length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
|
|
|
|
|
- uhf_buffer_append_single(buffer, read_buffer[0]);
|
|
|
|
|
- uhf_uart_tick_reset(uart);
|
|
|
|
|
- }while(read_buffer[0] != UHF_UART_FRAME_END && length_read > 0);
|
|
|
|
|
- FURI_LOG_E("UHF_UART_WORKER", "UHF Total length read = %u", uhf_buffer_get_size(buffer));
|
|
|
|
|
- uhf_buffer_close(buffer);
|
|
|
|
|
- furi_stream_buffer_reset(uart->rx_buff_stream);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }while((events & UHFUartWorkerExitingFlag) != UHFUartWorkerExitingFlag);
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
void uhf_uart_default_rx_callback(FuriHalSerialHandle *handle, FuriHalSerialRxEvent event, void* ctx) {
|
|
void uhf_uart_default_rx_callback(FuriHalSerialHandle *handle, FuriHalSerialRxEvent event, void* ctx) {
|
|
|
UHFUart* uart = (UHFUart*)ctx;
|
|
UHFUart* uart = (UHFUart*)ctx;
|
|
|
- if(event == FuriHalSerialRxEventData){
|
|
|
|
|
|
|
+ // FURI_LOG_E("UHF_UART", "UHF UART RX CALLBACK");
|
|
|
|
|
+ if((event & FuriHalSerialRxEventData) == FuriHalSerialRxEventData){
|
|
|
uint8_t data = furi_hal_serial_async_rx(handle);
|
|
uint8_t data = furi_hal_serial_async_rx(handle);
|
|
|
- furi_stream_buffer_send(uart->rx_buff_stream, (void*)&data, 1, 0);
|
|
|
|
|
- furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
|
|
|
|
|
|
|
+ // if(data == UHF_UART_FRAME_START){
|
|
|
|
|
+ // uhf_buffer_reset(uart->buffer);
|
|
|
|
|
+ // }
|
|
|
|
|
+ if(uhf_is_buffer_closed(uart->buffer)){
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(data == UHF_UART_FRAME_END){
|
|
|
|
|
+ uhf_buffer_append_single(uart->buffer, data);
|
|
|
|
|
+ uhf_buffer_close(uart->buffer);
|
|
|
|
|
+ FURI_LOG_E("UHF_UART", "UHF Total length read = %u", uhf_buffer_get_size(uart->buffer));
|
|
|
|
|
+ }
|
|
|
|
|
+ uhf_buffer_append_single(uart->buffer, data);
|
|
|
|
|
+ uhf_uart_tick_reset(uart);
|
|
|
|
|
+ // furi_stream_buffer_send(uart->rx_buff_stream, (void*)&data, 1, 0);
|
|
|
|
|
+ // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
|
|
|
}
|
|
}
|
|
|
- // Buffer* buffer = (Buffer*)uart->buffer;
|
|
|
|
|
- // if(buffer->closed) return; // buffer closed
|
|
|
|
|
- // if(event != FuriHalSerialRxEventData) return; // not byte received
|
|
|
|
|
- // uint8_t data = furi_hal_serial_async_rx(handle); // read data
|
|
|
|
|
- // FURI_LOG_E("UHF_UART_CB", "UHF UART RX: %02X", data);
|
|
|
|
|
- // buffer_append_single(buffer, data); // append data
|
|
|
|
|
- // if(data == UHF_UART_FRAME_END) buffer_close(buffer); // end of frame
|
|
|
|
|
- // uart->tick = UHF_UART_WAIT_TICK; // reset tick
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
UHFUart* uhf_uart_alloc(){
|
|
UHFUart* uhf_uart_alloc(){
|
|
|
UHFUart *uart = (UHFUart*)malloc(sizeof(UHFUart));
|
|
UHFUart *uart = (UHFUart*)malloc(sizeof(UHFUart));
|
|
|
uart->bus = FuriHalBusUSART1;
|
|
uart->bus = FuriHalBusUSART1;
|
|
|
uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
|
|
uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
|
|
|
- uart->rx_buff_stream = furi_stream_buffer_alloc(UHF_UART_RX_BUFFER_SIZE, 1);
|
|
|
|
|
|
|
+ // uart->rx_buff_stream = furi_stream_buffer_alloc(UHF_UART_RX_BUFFER_SIZE, 1);
|
|
|
uart->init_by_app = !furi_hal_bus_is_enabled(uart->bus);
|
|
uart->init_by_app = !furi_hal_bus_is_enabled(uart->bus);
|
|
|
uart->tick = UHF_UART_WAIT_TICK;
|
|
uart->tick = UHF_UART_WAIT_TICK;
|
|
|
uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
|
|
uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
|
|
|
|
|
+ // expansion_disable();
|
|
|
if(uart->init_by_app){
|
|
if(uart->init_by_app){
|
|
|
FURI_LOG_E("UHF_UART", "UHF UART INIT BY APP");
|
|
FURI_LOG_E("UHF_UART", "UHF UART INIT BY APP");
|
|
|
furi_hal_serial_init(uart->handle, uart->baudrate);
|
|
furi_hal_serial_init(uart->handle, uart->baudrate);
|
|
@@ -63,20 +70,20 @@ UHFUart* uhf_uart_alloc(){
|
|
|
FURI_LOG_E("UHF_UART", "UHF UART INIT BY HAL");
|
|
FURI_LOG_E("UHF_UART", "UHF UART INIT BY HAL");
|
|
|
}
|
|
}
|
|
|
uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
|
|
uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
|
|
|
- uart->thread = furi_thread_alloc_ex("UHFUartWorker", UHF_UART_WORKER_STACK_SIZE, uhf_uart_worker_callback, uart);
|
|
|
|
|
- furi_thread_start(uart->thread);
|
|
|
|
|
|
|
+ // uart->thread = furi_thread_alloc_ex("UHFUartWorker", UHF_UART_WORKER_STACK_SIZE, uhf_uart_worker_callback, uart);
|
|
|
|
|
+ // furi_thread_start(uart->thread);
|
|
|
furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
|
|
furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
|
|
|
return uart;
|
|
return uart;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void uhf_uart_free(UHFUart* uart){
|
|
void uhf_uart_free(UHFUart* uart){
|
|
|
furi_assert(uart);
|
|
furi_assert(uart);
|
|
|
- furi_assert(uart->thread);
|
|
|
|
|
|
|
+ // furi_assert(uart->thread);
|
|
|
|
|
|
|
|
- furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
|
|
|
|
|
- furi_thread_join(uart->thread);
|
|
|
|
|
- furi_thread_free(uart->thread);
|
|
|
|
|
- furi_stream_buffer_free(uart->rx_buff_stream);
|
|
|
|
|
|
|
+ // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
|
|
|
|
|
+ // furi_thread_join(uart->thread);
|
|
|
|
|
+ // furi_thread_free(uart->thread);
|
|
|
|
|
+ // furi_stream_buffer_free(uart->rx_buff_stream);
|
|
|
uhf_buffer_free(uart->buffer);
|
|
uhf_buffer_free(uart->buffer);
|
|
|
if(uart->init_by_app){
|
|
if(uart->init_by_app){
|
|
|
furi_hal_serial_deinit(uart->handle);
|
|
furi_hal_serial_deinit(uart->handle);
|
|
@@ -96,7 +103,7 @@ void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size){
|
|
|
void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size){
|
|
void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size){
|
|
|
uhf_uart_send(uart, data, size);
|
|
uhf_uart_send(uart, data, size);
|
|
|
furi_hal_serial_tx_wait_complete(uart->handle);
|
|
furi_hal_serial_tx_wait_complete(uart->handle);
|
|
|
- furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
|
|
|
|
|
|
|
+ // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate){
|
|
void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate){
|