nfc_playlist_worker.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "nfc_playlist_worker.h"
  2. /// @brief nfc_playlist_worker_alloc()
  3. /// @return
  4. NfcPlaylistWorker* nfc_playlist_worker_alloc() {
  5. NfcPlaylistWorker* nfc_playlist_worker = malloc(sizeof(NfcPlaylistWorker));
  6. // Worker thread attributes
  7. nfc_playlist_worker->thread = furi_thread_alloc_ex(
  8. "NfcPlaylistWorker", 8192, nfc_playlist_worker_task, nfc_playlist_worker);
  9. nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
  10. nfc_playlist_worker->nfc = nfc_alloc();
  11. nfc_playlist_worker->nfc_device = nfc_device_alloc();
  12. return nfc_playlist_worker;
  13. }
  14. /// @brief nfc_playlist_worker_free()
  15. /// @param nfc_playlist_worker
  16. void nfc_playlist_worker_free(NfcPlaylistWorker* nfc_playlist_worker) {
  17. furi_assert(nfc_playlist_worker);
  18. furi_thread_free(nfc_playlist_worker->thread);
  19. nfc_free(nfc_playlist_worker->nfc);
  20. nfc_device_free(nfc_playlist_worker->nfc_device);
  21. free(nfc_playlist_worker);
  22. }
  23. /// @brief nfc_playlist_worker_stop()
  24. /// @param nfc_playlist_worker
  25. void nfc_playlist_worker_stop(NfcPlaylistWorker* nfc_playlist_worker) {
  26. furi_assert(nfc_playlist_worker);
  27. if(nfc_playlist_worker->state != NfcPlaylistWorkerState_Stopped) {
  28. nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
  29. furi_thread_join(nfc_playlist_worker->thread);
  30. }
  31. }
  32. /// @brief nfc_playlist_worker_start()
  33. /// @param nfc_playlist_worker
  34. void nfc_playlist_worker_start(NfcPlaylistWorker* nfc_playlist_worker) {
  35. furi_assert(nfc_playlist_worker);
  36. nfc_playlist_worker->state = NfcPlaylistWorkerState_Emulating;
  37. furi_thread_start(nfc_playlist_worker->thread);
  38. }
  39. /// @brief nfc_playlist_worker_task()
  40. /// @param context
  41. /// @return
  42. int32_t nfc_playlist_worker_task(void* context) {
  43. NfcPlaylistWorker* nfc_playlist_worker = context;
  44. if(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
  45. nfc_playlist_worker->nfc_listener =
  46. nfc_listener_alloc(nfc_playlist_worker->nfc,
  47. nfc_playlist_worker->nfc_protocol,
  48. nfc_device_get_data(nfc_playlist_worker->nfc_device, nfc_playlist_worker->nfc_protocol)
  49. );
  50. nfc_listener_start(nfc_playlist_worker->nfc_listener, NULL, NULL);
  51. // int counter = 0;
  52. // while(true) {
  53. // furi_delay_ms(50);
  54. // counter++;
  55. // if (counter == 100) {
  56. // break;
  57. // }
  58. // }
  59. while(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
  60. furi_delay_ms(50);
  61. }
  62. nfc_listener_stop(nfc_playlist_worker->nfc_listener);
  63. nfc_listener_free(nfc_playlist_worker->nfc_listener);
  64. }
  65. nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
  66. return 0;
  67. }
  68. /// @brief nfc_playlist_worker_is_emulating()
  69. /// @param nfc_playlist_worker
  70. /// @return
  71. bool nfc_playlist_worker_is_emulating(NfcPlaylistWorker* nfc_playlist_worker) {
  72. if(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
  73. return true;
  74. }
  75. return false;
  76. }
  77. /// @brief nfc_playlist_worker_set_nfc_data()
  78. /// @param nfc_playlist_worker
  79. /// @param nfc_data
  80. void nfc_playlist_worker_set_nfc_data(NfcPlaylistWorker* nfc_playlist_worker, char* file_path) {
  81. FURI_LOG_I("NfcPlaylistWorker", "nfc_playlist_worker_set_nfc_data: %s", file_path);
  82. nfc_device_clear(nfc_playlist_worker->nfc_device);
  83. nfc_device_load(nfc_playlist_worker->nfc_device, file_path);
  84. nfc_playlist_worker->nfc_protocol = nfc_device_get_protocol(nfc_playlist_worker->nfc_device);
  85. }
  86. /// @brief nfc_playlist_worker_get_nfc_data()
  87. /// @param nfc_playlist_worker
  88. /// @return
  89. NfcDeviceData* nfc_playlist_worker_get_nfc_data(NfcPlaylistWorker* nfc_playlist_worker) {
  90. return nfc_playlist_worker->nfc_data;
  91. }