nfc_playlist_worker.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. while(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
  52. furi_delay_ms(50);
  53. }
  54. nfc_listener_stop(nfc_playlist_worker->nfc_listener);
  55. nfc_listener_free(nfc_playlist_worker->nfc_listener);
  56. }
  57. nfc_playlist_worker->state = NfcPlaylistWorkerState_Stopped;
  58. return 0;
  59. }
  60. /// @brief nfc_playlist_worker_is_emulating()
  61. /// @param nfc_playlist_worker
  62. /// @return
  63. bool nfc_playlist_worker_is_emulating(NfcPlaylistWorker* nfc_playlist_worker) {
  64. if(nfc_playlist_worker->state == NfcPlaylistWorkerState_Emulating) {
  65. return true;
  66. }
  67. return false;
  68. }
  69. /// @brief nfc_playlist_worker_set_nfc_data()
  70. /// @param nfc_playlist_worker
  71. /// @param nfc_data
  72. void nfc_playlist_worker_set_nfc_data(NfcPlaylistWorker* nfc_playlist_worker, char* file_path) {
  73. FURI_LOG_I("NfcPlaylistWorker", "nfc_playlist_worker_set_nfc_data: %s", file_path);
  74. nfc_device_clear(nfc_playlist_worker->nfc_device);
  75. nfc_device_load(nfc_playlist_worker->nfc_device, file_path);
  76. nfc_playlist_worker->nfc_protocol = nfc_device_get_protocol(nfc_playlist_worker->nfc_device);
  77. }
  78. /// @brief nfc_playlist_worker_get_nfc_data()
  79. /// @param nfc_playlist_worker
  80. /// @return
  81. NfcDeviceData* nfc_playlist_worker_get_nfc_data(NfcPlaylistWorker* nfc_playlist_worker) {
  82. return nfc_playlist_worker->nfc_data;
  83. }