uhf_worker.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "uhf_worker.h"
  2. // #include "uhf_cmd.h"
  3. void single_poll_rx_callback(UartIrqEvent event, uint8_t data, void* ctx) {
  4. UNUSED(event);
  5. UHFResponseData* response_data = ctx;
  6. UHFData* first_data = response_data->data;
  7. uhf_data_append(first_data, data);
  8. }
  9. UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
  10. // UNUSED(uhf_worker);
  11. // furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
  12. furi_hal_uart_set_br(FuriHalUartIdUSART1, 115200);
  13. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, single_poll_rx_callback, uhf_worker->data);
  14. // UHFData* first_data = uhf_worker->data->data;
  15. // furi_delay_ms(1000);
  16. // FURI_LOG_E("read_single_card", "waiting on read");
  17. // }
  18. return UHFWorkerEventSuccess;
  19. }
  20. int32_t uhf_worker_task(void* ctx) {
  21. UHFWorker* uhf_worker = ctx;
  22. // // FURI_LOG_E("uhf_worker", "worker callback has been called");
  23. if(uhf_worker->state == UHFWorkerStateDetect) {
  24. UHFWorkerEvent event = read_single_card(uhf_worker);
  25. uhf_worker->callback(event, uhf_worker->ctx);
  26. }
  27. return 0;
  28. }
  29. UHFWorker* uhf_worker_alloc() {
  30. UHFWorker* uhf_worker = (UHFWorker*)malloc(sizeof(UHFWorker));
  31. uhf_worker->thread = furi_thread_alloc_ex("UHFWorker", 8 * 1024, uhf_worker_task, uhf_worker);
  32. uhf_worker->data = uhf_response_data_alloc();
  33. uhf_worker->callback = NULL;
  34. uhf_worker->ctx = NULL;
  35. return uhf_worker;
  36. }
  37. void uhf_worker_change_state(UHFWorker* worker, UHFWorkerState state) {
  38. worker->state = state;
  39. }
  40. void uhf_worker_start(
  41. UHFWorker* uhf_worker,
  42. UHFWorkerState state,
  43. UHFWorkerCallback callback,
  44. void* ctx) {
  45. uhf_worker->state = state;
  46. uhf_worker->callback = callback;
  47. uhf_worker->ctx = ctx;
  48. furi_thread_start(uhf_worker->thread);
  49. }
  50. void uhf_worker_stop(UHFWorker* uhf_worker) {
  51. furi_assert(uhf_worker);
  52. furi_assert(uhf_worker->thread);
  53. if(furi_thread_get_state(uhf_worker->thread) != FuriThreadStateStopped) {
  54. uhf_worker_change_state(uhf_worker, UHFWorkerStateStop);
  55. furi_thread_join(uhf_worker->thread);
  56. }
  57. }
  58. void uhf_worker_free(UHFWorker* uhf_worker) {
  59. furi_assert(uhf_worker);
  60. furi_thread_free(uhf_worker->thread);
  61. uhf_response_data_free(uhf_worker->data);
  62. free(uhf_worker);
  63. }