| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #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;
- // }
- void uhf_uart_default_rx_callback(
- FuriHalSerialHandle* handle,
- FuriHalSerialRxEvent event,
- void* ctx) {
- UHFUart* uart = (UHFUart*)ctx;
- // FURI_LOG_E("UHF_UART", "UHF UART RX CALLBACK");
- if((event & FuriHalSerialRxEventData) == FuriHalSerialRxEventData) {
- uint8_t data = furi_hal_serial_async_rx(handle);
- // 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);
- }
- }
- UHFUart* uhf_uart_alloc() {
- UHFUart* uart = (UHFUart*)malloc(sizeof(UHFUart));
- uart->bus = FuriHalBusUSART1;
- uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
- furi_check(uart->handle, "UHF UART HANDLE IS NULL");
- uart->tick = UHF_UART_WAIT_TICK;
- uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
- // expansion_disable -> is done at app start already
- furi_hal_serial_init(uart->handle, uart->baudrate);
- uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
- furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
- return uart;
- }
- void uhf_uart_free(UHFUart* uart) {
- furi_assert(uart);
- // 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_hal_serial_async_rx_stop(uart->handle);
- furi_hal_serial_deinit(uart->handle);
- furi_hal_serial_control_release(uart->handle);
- uhf_buffer_free(uart->buffer);
- free(uart);
- }
- void uhf_uart_set_receive_byte_callback(
- UHFUart* uart,
- FuriHalSerialAsyncRxCallback callback,
- void* ctx,
- bool report_errors) {
- furi_hal_serial_async_rx_start(uart->handle, callback, ctx, report_errors);
- }
- void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size) {
- furi_hal_serial_tx(uart->handle, data, size);
- }
- void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size) {
- uhf_uart_send(uart, data, size);
- furi_hal_serial_tx_wait_complete(uart->handle);
- // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
- }
- void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate) {
- furi_hal_serial_set_br(uart->handle, baudrate);
- uart->baudrate = baudrate;
- }
- bool uhf_uart_tick(UHFUart* uart) {
- if(uart->tick > 0) {
- uart->tick--;
- }
- return uart->tick == 0;
- }
- void uhf_uart_tick_reset(UHFUart* uart) {
- uart->tick = UHF_UART_WAIT_TICK;
- }
|