uhf_worker.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. UHFResponseData* uhf_response_data = uhf_worker->data;
  11. furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
  12. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, single_poll_rx_callback, uhf_response_data);
  13. UHFData* uhf_data = uhf_response_data->data;
  14. uhf_data_reset(uhf_data);
  15. while(!uhf_data->end) {
  16. furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SINGLE_POLLING.cmd, CMD_SINGLE_POLLING.length);
  17. furi_delay_ms(100);
  18. if(uhf_worker->state == UHFWorkerStateStop) {
  19. return UHFWorkerEventAborted;
  20. }
  21. }
  22. return UHFWorkerEventSuccess;
  23. }
  24. int32_t uhf_worker_task(void* ctx) {
  25. UHFWorker* uhf_worker = ctx;
  26. if(uhf_worker->state == UHFWorkerStateDetect) {
  27. UHFWorkerEvent event = read_single_card(uhf_worker);
  28. uhf_worker->callback(event, uhf_worker->ctx);
  29. }
  30. return 0;
  31. }
  32. UHFWorker* uhf_worker_alloc() {
  33. UHFWorker* uhf_worker = (UHFWorker*)malloc(sizeof(UHFWorker));
  34. uhf_worker->thread = furi_thread_alloc_ex("UHFWorker", 8 * 1024, uhf_worker_task, uhf_worker);
  35. uhf_worker->data = uhf_response_data_alloc();
  36. uhf_worker->callback = NULL;
  37. uhf_worker->ctx = NULL;
  38. return uhf_worker;
  39. }
  40. void uhf_worker_change_state(UHFWorker* worker, UHFWorkerState state) {
  41. worker->state = state;
  42. }
  43. void uhf_worker_start(
  44. UHFWorker* uhf_worker,
  45. UHFWorkerState state,
  46. UHFWorkerCallback callback,
  47. void* ctx) {
  48. uhf_worker->state = state;
  49. uhf_worker->callback = callback;
  50. uhf_worker->ctx = ctx;
  51. furi_thread_start(uhf_worker->thread);
  52. }
  53. void uhf_worker_stop(UHFWorker* uhf_worker) {
  54. furi_assert(uhf_worker);
  55. furi_assert(uhf_worker->thread);
  56. if(furi_thread_get_state(uhf_worker->thread) != FuriThreadStateStopped) {
  57. uhf_worker_change_state(uhf_worker, UHFWorkerStateStop);
  58. furi_thread_join(uhf_worker->thread);
  59. }
  60. }
  61. void uhf_worker_free(UHFWorker* uhf_worker) {
  62. furi_assert(uhf_worker);
  63. furi_thread_free(uhf_worker->thread);
  64. uhf_response_data_free(uhf_worker->data);
  65. free(uhf_worker);
  66. }