uhf_uart.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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(
  32. FuriHalSerialHandle* handle,
  33. FuriHalSerialRxEvent event,
  34. void* ctx) {
  35. UHFUart* uart = (UHFUart*)ctx;
  36. // FURI_LOG_E("UHF_UART", "UHF UART RX CALLBACK");
  37. if((event & FuriHalSerialRxEventData) == FuriHalSerialRxEventData) {
  38. uint8_t data = furi_hal_serial_async_rx(handle);
  39. // if(data == UHF_UART_FRAME_START){
  40. // uhf_buffer_reset(uart->buffer);
  41. // }
  42. if(uhf_is_buffer_closed(uart->buffer)) {
  43. return;
  44. }
  45. if(data == UHF_UART_FRAME_END) {
  46. uhf_buffer_append_single(uart->buffer, data);
  47. uhf_buffer_close(uart->buffer);
  48. FURI_LOG_E(
  49. "UHF_UART", "UHF Total length read = %u", uhf_buffer_get_size(uart->buffer));
  50. }
  51. uhf_buffer_append_single(uart->buffer, data);
  52. uhf_uart_tick_reset(uart);
  53. // furi_stream_buffer_send(uart->rx_buff_stream, (void*)&data, 1, 0);
  54. // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
  55. }
  56. }
  57. UHFUart* uhf_uart_alloc() {
  58. UHFUart* uart = (UHFUart*)malloc(sizeof(UHFUart));
  59. uart->bus = FuriHalBusUSART1;
  60. uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
  61. furi_check(uart->handle);
  62. // uart->rx_buff_stream = furi_stream_buffer_alloc(UHF_UART_RX_BUFFER_SIZE, 1);
  63. uart->tick = UHF_UART_WAIT_TICK;
  64. uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
  65. // expansion_disable -> is done at app start already
  66. furi_hal_serial_init(uart->handle, uart->baudrate);
  67. uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
  68. // uart->thread = furi_thread_alloc_ex("UHFUartWorker", UHF_UART_WORKER_STACK_SIZE, uhf_uart_worker_callback, uart);
  69. // furi_thread_start(uart->thread);
  70. furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
  71. return uart;
  72. }
  73. void uhf_uart_free(UHFUart* uart) {
  74. furi_assert(uart);
  75. // furi_assert(uart->thread);
  76. // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
  77. // furi_thread_join(uart->thread);
  78. // furi_thread_free(uart->thread);
  79. // furi_stream_buffer_free(uart->rx_buff_stream);
  80. furi_hal_serial_async_rx_stop(uart->handle);
  81. furi_hal_serial_deinit(uart->handle);
  82. furi_hal_serial_control_release(uart->handle);
  83. uhf_buffer_free(uart->buffer);
  84. free(uart);
  85. }
  86. void uhf_uart_set_receive_byte_callback(
  87. UHFUart* uart,
  88. FuriHalSerialAsyncRxCallback callback,
  89. void* ctx,
  90. bool report_errors) {
  91. furi_hal_serial_async_rx_start(uart->handle, callback, ctx, report_errors);
  92. }
  93. void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size) {
  94. furi_hal_serial_tx(uart->handle, data, size);
  95. }
  96. void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size) {
  97. uhf_uart_send(uart, data, size);
  98. furi_hal_serial_tx_wait_complete(uart->handle);
  99. // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
  100. }
  101. void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate) {
  102. furi_hal_serial_set_br(uart->handle, baudrate);
  103. uart->baudrate = baudrate;
  104. }
  105. bool uhf_uart_tick(UHFUart* uart) {
  106. if(uart->tick > 0) {
  107. uart->tick--;
  108. }
  109. return uart->tick == 0;
  110. }
  111. void uhf_uart_tick_reset(UHFUart* uart) {
  112. uart->tick = UHF_UART_WAIT_TICK;
  113. }