uhf_worker.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "uhf_worker.h"
  2. #include "uhf_tag.h"
  3. // yrm100 module commands
  4. UHFWorkerEvent verify_module_connected(UHFWorker* uhf_worker) {
  5. char* hw_version = m100_get_hardware_version(uhf_worker->module);
  6. char* sw_version = m100_get_software_version(uhf_worker->module);
  7. char* manufacturer = m100_get_manufacturers(uhf_worker->module);
  8. // verify all data exists
  9. if(hw_version == NULL || sw_version == NULL || manufacturer == NULL) return UHFWorkerEventFail;
  10. return UHFWorkerEventSuccess;
  11. }
  12. UHFTag* send_polling_command(UHFWorker* uhf_worker) {
  13. // read epc bank
  14. UHFTag* uhf_tag = uhf_tag_alloc();
  15. while(true) {
  16. M100ResponseType status = m100_send_single_poll(uhf_worker->module, uhf_tag);
  17. furi_delay_ms(100);
  18. if(uhf_worker->state == UHFWorkerStateStop) {
  19. uhf_tag_free(uhf_tag);
  20. return NULL;
  21. }
  22. if(status == M100Success) break;
  23. }
  24. return uhf_tag;
  25. }
  26. UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
  27. UHFTag* uhf_tag = send_polling_command(uhf_worker);
  28. if(uhf_tag == NULL) return UHFWorkerEventAborted;
  29. uhf_tag_wrapper_set_tag(uhf_worker->uhf_tag_wrapper, uhf_tag);
  30. // Todo : set select here
  31. if(!m100_set_select(uhf_worker->module, uhf_tag)) return UHFWorkerEventFail;
  32. // Todo : read tid
  33. int retry = 3, word_count = 5;
  34. do {
  35. if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
  36. M100ResponseType status =
  37. m100_read_label_data_storage(uhf_worker->module, uhf_tag, TIDBank, 0, word_count);
  38. switch(status) {
  39. case M100Success:
  40. word_count++;
  41. break;
  42. case M100NoTagResponse:
  43. retry--;
  44. break;
  45. default:
  46. retry = 0;
  47. break;
  48. }
  49. } while(retry);
  50. retry = 3;
  51. word_count = 5;
  52. do {
  53. if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
  54. M100ResponseType status =
  55. m100_read_label_data_storage(uhf_worker->module, uhf_tag, UserBank, 0, word_count);
  56. switch(status) {
  57. case M100Success:
  58. word_count++;
  59. break;
  60. case M100NoTagResponse:
  61. retry--;
  62. break;
  63. default:
  64. retry = 0;
  65. break;
  66. }
  67. } while(retry);
  68. return UHFWorkerEventSuccess;
  69. }
  70. UHFWorkerEvent write_single_card(UHFWorker* uhf_worker) {
  71. UHFTag* uhf_tag_des = send_polling_command(uhf_worker);
  72. if(uhf_tag_des == NULL) return UHFWorkerEventAborted;
  73. FURI_LOG_E("wkr", "read success");
  74. UHFTag* uhf_tag_from = uhf_worker->uhf_tag_wrapper->uhf_tag;
  75. if(m100_set_select(uhf_worker->module, uhf_tag_des) != M100Success) return UHFWorkerEventFail;
  76. FURI_LOG_E("wkr", "set select success");
  77. do {
  78. M100ResponseType rp_type =
  79. m100_write_label_data_storage(uhf_worker->module, uhf_tag_from, EPCBank, 0, 0);
  80. FURI_LOG_E("wkr", "try to write %d", rp_type);
  81. if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
  82. if(rp_type == M100Success) break;
  83. } while(true);
  84. return UHFWorkerEventSuccess;
  85. }
  86. int32_t uhf_worker_task(void* ctx) {
  87. UHFWorker* uhf_worker = ctx;
  88. if(uhf_worker->state == UHFWorkerStateVerify) {
  89. UHFWorkerEvent event = verify_module_connected(uhf_worker);
  90. uhf_worker->callback(event, uhf_worker->ctx);
  91. } else if(uhf_worker->state == UHFWorkerStateDetectSingle) {
  92. UHFWorkerEvent event = read_single_card(uhf_worker);
  93. uhf_worker->callback(event, uhf_worker->ctx);
  94. } else if(uhf_worker->state == UHFWorkerStateWriteSingle) {
  95. UHFWorkerEvent event = write_single_card(uhf_worker);
  96. uhf_worker->callback(event, uhf_worker->ctx);
  97. }
  98. return 0;
  99. }
  100. UHFWorker* uhf_worker_alloc() {
  101. UHFWorker* uhf_worker = (UHFWorker*)malloc(sizeof(UHFWorker));
  102. uhf_worker->thread = furi_thread_alloc_ex("UHFWorker", 8 * 1024, uhf_worker_task, uhf_worker);
  103. uhf_worker->module = m100_module_alloc();
  104. uhf_worker->callback = NULL;
  105. uhf_worker->ctx = NULL;
  106. return uhf_worker;
  107. }
  108. void uhf_worker_change_state(UHFWorker* worker, UHFWorkerState state) {
  109. worker->state = state;
  110. }
  111. void uhf_worker_start(
  112. UHFWorker* uhf_worker,
  113. UHFWorkerState state,
  114. UHFWorkerCallback callback,
  115. void* ctx) {
  116. uhf_worker->state = state;
  117. uhf_worker->callback = callback;
  118. uhf_worker->ctx = ctx;
  119. furi_thread_start(uhf_worker->thread);
  120. }
  121. void uhf_worker_stop(UHFWorker* uhf_worker) {
  122. furi_assert(uhf_worker);
  123. furi_assert(uhf_worker->thread);
  124. if(furi_thread_get_state(uhf_worker->thread) != FuriThreadStateStopped) {
  125. uhf_worker_change_state(uhf_worker, UHFWorkerStateStop);
  126. furi_thread_join(uhf_worker->thread);
  127. }
  128. }
  129. void uhf_worker_free(UHFWorker* uhf_worker) {
  130. furi_assert(uhf_worker);
  131. furi_thread_free(uhf_worker->thread);
  132. m100_module_free(uhf_worker->module);
  133. free(uhf_worker);
  134. }