uhf_uart.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "uhf_uart.h"
  2. int32_t uhf_uart_worker_callback(void *ctx){
  3. UHFUart* uart = (UHFUart*)ctx;
  4. Buffer* buffer = (Buffer*)uart->buffer;
  5. uint32_t events;
  6. size_t length_read = 0;
  7. uint8_t read_buffer[1];
  8. FURI_LOG_E("UHF_UART_WORKER", "UHF UART WORKER STARTED");
  9. do{
  10. events = furi_thread_flags_wait(
  11. UHFUartWorkerWaitingDataFlag | UHFUartWorkerExitingFlag, FuriFlagWaitAny, FuriWaitForever
  12. );
  13. FURI_LOG_E("UHF_UART_WORKER", "events = %lu", events);
  14. if(events & UHFUartWorkerWaitingDataFlag){
  15. FURI_LOG_E("UHF_UART_WORKER", "Waiting data...");
  16. length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
  17. if(length_read){
  18. do{
  19. length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
  20. uhf_buffer_append_single(buffer, read_buffer[0]);
  21. uhf_uart_tick_reset(uart);
  22. }while(read_buffer[0] != UHF_UART_FRAME_END && length_read > 0);
  23. FURI_LOG_E("UHF_UART_WORKER", "UHF Total length read = %u", uhf_buffer_get_size(buffer));
  24. uhf_buffer_close(buffer);
  25. furi_stream_buffer_reset(uart->rx_buff_stream);
  26. }
  27. }
  28. }while((events & UHFUartWorkerExitingFlag) != UHFUartWorkerExitingFlag);
  29. return 0;
  30. }
  31. void uhf_uart_default_rx_callback(FuriHalSerialHandle *handle, FuriHalSerialRxEvent event, void* ctx) {
  32. UHFUart* uart = (UHFUart*)ctx;
  33. if(event == FuriHalSerialRxEventData){
  34. uint8_t data = furi_hal_serial_async_rx(handle);
  35. furi_stream_buffer_send(uart->rx_buff_stream, (void*)&data, 1, 0);
  36. furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
  37. }
  38. // Buffer* buffer = (Buffer*)uart->buffer;
  39. // if(buffer->closed) return; // buffer closed
  40. // if(event != FuriHalSerialRxEventData) return; // not byte received
  41. // uint8_t data = furi_hal_serial_async_rx(handle); // read data
  42. // FURI_LOG_E("UHF_UART_CB", "UHF UART RX: %02X", data);
  43. // buffer_append_single(buffer, data); // append data
  44. // if(data == UHF_UART_FRAME_END) buffer_close(buffer); // end of frame
  45. // uart->tick = UHF_UART_WAIT_TICK; // reset tick
  46. }
  47. UHFUart* uhf_uart_alloc(){
  48. UHFUart *uart = (UHFUart*)malloc(sizeof(UHFUart));
  49. uart->bus = FuriHalBusUSART1;
  50. uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
  51. uart->rx_buff_stream = furi_stream_buffer_alloc(UHF_UART_RX_BUFFER_SIZE, 1);
  52. uart->init_by_app = !furi_hal_bus_is_enabled(uart->bus);
  53. uart->tick = UHF_UART_WAIT_TICK;
  54. uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
  55. if(uart->init_by_app){
  56. FURI_LOG_E("UHF_UART", "UHF UART INIT BY APP");
  57. furi_hal_serial_init(uart->handle, uart->baudrate);
  58. }
  59. else{
  60. FURI_LOG_E("UHF_UART", "UHF UART INIT BY HAL");
  61. }
  62. uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
  63. uart->thread = furi_thread_alloc_ex("UHFUartWorker", UHF_UART_WORKER_STACK_SIZE, uhf_uart_worker_callback, uart);
  64. furi_thread_start(uart->thread);
  65. furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
  66. return uart;
  67. }
  68. void uhf_uart_free(UHFUart* uart){
  69. furi_assert(uart);
  70. furi_assert(uart->thread);
  71. furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
  72. furi_thread_join(uart->thread);
  73. furi_thread_free(uart->thread);
  74. furi_stream_buffer_free(uart->rx_buff_stream);
  75. uhf_buffer_free(uart->buffer);
  76. if(uart->init_by_app){
  77. furi_hal_serial_deinit(uart->handle);
  78. }
  79. furi_hal_serial_control_release(uart->handle);
  80. free(uart);
  81. }
  82. void uhf_uart_set_receive_byte_callback(UHFUart* uart, FuriHalSerialAsyncRxCallback callback, void *ctx, bool report_errors){
  83. furi_hal_serial_async_rx_start(uart->handle, callback, ctx, report_errors);
  84. }
  85. void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size){
  86. furi_hal_serial_tx(uart->handle, data, size);
  87. }
  88. void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size){
  89. uhf_uart_send(uart, data, size);
  90. furi_hal_serial_tx_wait_complete(uart->handle);
  91. furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
  92. }
  93. void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate){
  94. furi_hal_serial_set_br(uart->handle, baudrate);
  95. uart->baudrate = baudrate;
  96. }
  97. bool uhf_uart_tick(UHFUart* uart){
  98. if(uart->tick > 0){
  99. uart->tick--;
  100. }
  101. return uart->tick == 0;
  102. }
  103. void uhf_uart_tick_reset(UHFUart* uart){
  104. uart->tick = UHF_UART_WAIT_TICK;
  105. }