uhf_uart.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "uhf_uart.h"
  2. int32_t uhf_uart_worker_callback(void *ctx){
  3. // UHFUart* uart = (UHFUart*)ctx;
  4. UNUSED(ctx);
  5. // while(true){
  6. // if(uart->tick > 0){
  7. // furi_thread_sleep(uart->tick);
  8. // uart->tick--;
  9. // }
  10. // }
  11. return 0;
  12. }
  13. void uhf_uart_default_rx_callback(FuriHalSerialHandle *handle, FuriHalSerialRxEvent event, void* ctx) {
  14. UHFUart* uart = (UHFUart*)ctx;
  15. Buffer* buffer = (Buffer*)uart->buffer;
  16. if(buffer->closed) return; // buffer closed
  17. if(event != FuriHalSerialRxEventData) return; // not byte received
  18. uint8_t data = furi_hal_serial_async_rx(handle); // read data
  19. buffer_append_single(buffer, data); // append data
  20. if(data == UHF_UART_FRAME_END) buffer_close(buffer); // end of frame
  21. uart->tick = UHF_UART_WAIT_TICK; // reset tick
  22. }
  23. UHFUart* uhf_uart_alloc(){
  24. UHFUart *uart = (UHFUart*)malloc(sizeof(UHFUart));
  25. uart->bus = FuriHalBusUSART1;
  26. uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
  27. uart->init_by_app = !furi_hal_bus_is_enabled(uart->bus);
  28. uart->tick = UHF_UART_WAIT_TICK;
  29. if(uart->init_by_app){
  30. furi_hal_serial_init(uart->handle, uart->baudrate);
  31. }
  32. uhf_uart_set_baudrate(uart, UHF_UART_DEFAULT_BAUDRATE);
  33. uart->buffer = buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
  34. uart->thread = furi_thread_alloc_ex("UHFUartWorker", UHF_UART_WORKER_STACK_SIZE, uhf_uart_worker_callback, uart);
  35. furi_thread_start(uart->thread);
  36. uhf_uart_set_receive_byte_callback(uart, uhf_uart_default_rx_callback, uart, false);
  37. return uart;
  38. }
  39. void uhf_uart_free(UHFUart* uart){
  40. // furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
  41. furi_thread_join(uart->thread);
  42. furi_thread_free(uart->thread);
  43. buffer_free(uart->buffer);
  44. if(uart->init_by_app){
  45. furi_hal_serial_deinit(uart->handle);
  46. }
  47. furi_hal_serial_control_release(uart->handle);
  48. free(uart);
  49. }
  50. void uhf_uart_set_receive_byte_callback(UHFUart* uart, FuriHalSerialAsyncRxCallback callback, void *ctx, bool report_errors){
  51. furi_hal_serial_async_rx_start(uart->handle, callback, ctx, report_errors);
  52. }
  53. void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size){
  54. furi_hal_serial_tx(uart->handle, data, size);
  55. }
  56. void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size){
  57. uhf_uart_send(uart, data, size);
  58. furi_hal_serial_tx_wait_complete(uart->handle);
  59. }
  60. void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate){
  61. furi_hal_serial_set_br(uart->handle, baudrate);
  62. uart->baudrate = baudrate;
  63. }