uhf_uart.c 2.1 KB

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