uhf_worker.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "uhf_worker.h"
  2. #include "uhf_cmd.h"
  3. // uart callback functions
  4. void module_rx_callback(UartIrqEvent event, uint8_t data, void* ctx) {
  5. UNUSED(event);
  6. UHFData* uhf_data = ctx;
  7. uhf_data_append(uhf_data, data);
  8. // FURI_LOG_E("module_rx_callback", "%02x", data);
  9. }
  10. // yrm100 module commands
  11. UHFWorkerEvent verify_module_connected(UHFWorker* uhf_worker) {
  12. UHFResponseData* uhf_response_data = uhf_worker->response_data;
  13. uhf_response_data_reset(uhf_response_data);
  14. FURI_LOG_E("log", "freeing done");
  15. UHFData* hardware_version = uhf_response_data->head;
  16. UHFData* software_version = uhf_response_data_add_new_uhf_data(uhf_response_data);
  17. UHFData* manufacturer = uhf_response_data_add_new_uhf_data(uhf_response_data);
  18. FURI_LOG_E("log", "alloc done");
  19. furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
  20. // read hardware version
  21. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, hardware_version);
  22. furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_HARDWARE_VERSION.cmd, CMD_HARDWARE_VERSION.length);
  23. furi_delay_ms(150);
  24. // read software version
  25. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, software_version);
  26. furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SOFTWARE_VERSION.cmd, CMD_SOFTWARE_VERSION.length);
  27. furi_delay_ms(150);
  28. // read manufacturer
  29. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, manufacturer);
  30. furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_MANUFACTURERS.cmd, CMD_MANUFACTURERS.length);
  31. furi_delay_ms(150);
  32. FURI_LOG_E("log", "done sending tx");
  33. if(!hardware_version->end || !software_version->end || !manufacturer->end) {
  34. return UHFWorkerEventFail;
  35. }
  36. return UHFWorkerEventSuccess;
  37. }
  38. UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
  39. UHFResponseData* uhf_response_data = uhf_worker->response_data;
  40. uhf_response_data_reset(uhf_response_data);
  41. UHFData* uhf_data = uhf_response_data->head;
  42. furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
  43. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, uhf_data);
  44. uhf_data_reset(uhf_data);
  45. // read epc bank
  46. while(true) {
  47. furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SINGLE_POLLING.cmd, CMD_SINGLE_POLLING.length);
  48. furi_delay_ms(100);
  49. if(uhf_worker->state == UHFWorkerStateStop) {
  50. return UHFWorkerEventAborted;
  51. }
  52. if(uhf_data->end) {
  53. if(uhf_data->data[1] == 0x01 && uhf_data->data[5] == 0x15) {
  54. uhf_data_reset(uhf_data);
  55. continue;
  56. } else if(uhf_data->data[1] == 0x02)
  57. break; // read success
  58. }
  59. }
  60. return UHFWorkerEventSuccess;
  61. }
  62. int32_t uhf_worker_task(void* ctx) {
  63. UHFWorker* uhf_worker = ctx;
  64. if(uhf_worker->state == UHFWorkerStateVerify) {
  65. UHFWorkerEvent event = verify_module_connected(uhf_worker);
  66. uhf_worker->callback(event, uhf_worker->ctx);
  67. }
  68. if(uhf_worker->state == UHFWorkerStateDetectSingle) {
  69. UHFWorkerEvent event = read_single_card(uhf_worker);
  70. uhf_worker->callback(event, uhf_worker->ctx);
  71. }
  72. return 0;
  73. }
  74. UHFWorker* uhf_worker_alloc() {
  75. UHFWorker* uhf_worker = (UHFWorker*)malloc(sizeof(UHFWorker));
  76. uhf_worker->thread = furi_thread_alloc_ex("UHFWorker", 8 * 1024, uhf_worker_task, uhf_worker);
  77. uhf_worker->response_data = uhf_response_data_alloc();
  78. uhf_worker->callback = NULL;
  79. uhf_worker->ctx = NULL;
  80. return uhf_worker;
  81. }
  82. void uhf_worker_change_state(UHFWorker* worker, UHFWorkerState state) {
  83. worker->state = state;
  84. }
  85. void uhf_worker_start(
  86. UHFWorker* uhf_worker,
  87. UHFWorkerState state,
  88. UHFWorkerCallback callback,
  89. void* ctx) {
  90. uhf_worker->state = state;
  91. uhf_worker->callback = callback;
  92. uhf_worker->ctx = ctx;
  93. furi_thread_start(uhf_worker->thread);
  94. }
  95. void uhf_worker_stop(UHFWorker* uhf_worker) {
  96. furi_assert(uhf_worker);
  97. furi_assert(uhf_worker->thread);
  98. if(furi_thread_get_state(uhf_worker->thread) != FuriThreadStateStopped) {
  99. uhf_worker_change_state(uhf_worker, UHFWorkerStateStop);
  100. furi_thread_join(uhf_worker->thread);
  101. }
  102. }
  103. void uhf_worker_free(UHFWorker* uhf_worker) {
  104. furi_assert(uhf_worker);
  105. furi_thread_free(uhf_worker->thread);
  106. uhf_response_data_free(uhf_worker->response_data);
  107. free(uhf_worker);
  108. }