nfc.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "nfc_i.h"
  2. #include "api-hal-nfc.h"
  3. uint32_t nfc_view_exit(void* context) {
  4. return VIEW_NONE;
  5. }
  6. void nfc_menu_callback(void* context, uint32_t index) {
  7. furi_assert(context);
  8. Nfc* nfc = (Nfc*)context;
  9. if(index == NfcSubmenuDetect) {
  10. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewDetect);
  11. } else if(index == NfcSubmenuEmulate) {
  12. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewEmulate);
  13. } else if(index == NfcSubmenuEMV) {
  14. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewEmv);
  15. } else if(index == NfcSubmenuMifareUl) {
  16. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewMifareUl);
  17. }
  18. }
  19. void nfc_view_dispatcher_callback(uint32_t event, void* context) {
  20. furi_assert(context);
  21. Nfc* nfc = (Nfc*)context;
  22. NfcMessage message;
  23. osMessageQueueGet(nfc->message_queue, &message, NULL, osWaitForever);
  24. if(event == NfcEventDetect) {
  25. nfc_detect_view_dispatcher_callback(nfc->nfc_detect, &message);
  26. } else if(event == NfcEventEmv) {
  27. nfc_emv_view_dispatcher_callback(nfc->nfc_emv, &message);
  28. } else if(event == NfcEventMifareUl) {
  29. nfc_mifare_ul_view_dispatcher_callback(nfc->nfc_mifare_ul, &message);
  30. }
  31. }
  32. Nfc* nfc_alloc() {
  33. Nfc* nfc = furi_alloc(sizeof(Nfc));
  34. nfc->message_queue = osMessageQueueNew(8, sizeof(NfcMessage), NULL);
  35. nfc->nfc_common.worker = nfc_worker_alloc(nfc->message_queue);
  36. nfc->nfc_common.view_dispatcher = view_dispatcher_alloc();
  37. view_dispatcher_enable_queue(nfc->nfc_common.view_dispatcher);
  38. // Open GUI record
  39. nfc->gui = furi_record_open("gui");
  40. view_dispatcher_attach_to_gui(
  41. nfc->nfc_common.view_dispatcher, nfc->gui, ViewDispatcherTypeFullscreen);
  42. // Menu
  43. nfc->submenu = submenu_alloc();
  44. submenu_add_item(nfc->submenu, "Detect", NfcSubmenuDetect, nfc_menu_callback, nfc);
  45. submenu_add_item(nfc->submenu, "Emulate", NfcSubmenuEmulate, nfc_menu_callback, nfc);
  46. submenu_add_item(nfc->submenu, "Read bank card", NfcSubmenuEMV, nfc_menu_callback, nfc);
  47. submenu_add_item(
  48. nfc->submenu, "Read Mifare Ultralight", NfcSubmenuMifareUl, nfc_menu_callback, nfc);
  49. View* submenu_view = submenu_get_view(nfc->submenu);
  50. view_set_previous_callback(submenu_view, nfc_view_exit);
  51. view_dispatcher_add_view(nfc->nfc_common.view_dispatcher, NfcViewMenu, submenu_view);
  52. // Detect
  53. nfc->nfc_detect = nfc_detect_alloc(&nfc->nfc_common);
  54. view_dispatcher_add_view(
  55. nfc->nfc_common.view_dispatcher, NfcViewDetect, nfc_detect_get_view(nfc->nfc_detect));
  56. // Emulate
  57. nfc->nfc_emulate = nfc_emulate_alloc(&nfc->nfc_common);
  58. view_dispatcher_add_view(
  59. nfc->nfc_common.view_dispatcher, NfcViewEmulate, nfc_emulate_get_view(nfc->nfc_emulate));
  60. // EMV
  61. nfc->nfc_emv = nfc_emv_alloc(&nfc->nfc_common);
  62. view_dispatcher_add_view(
  63. nfc->nfc_common.view_dispatcher, NfcViewEmv, nfc_emv_get_view(nfc->nfc_emv));
  64. // Mifare Ultralight
  65. nfc->nfc_mifare_ul = nfc_mifare_ul_alloc(&nfc->nfc_common);
  66. view_dispatcher_add_view(
  67. nfc->nfc_common.view_dispatcher,
  68. NfcViewMifareUl,
  69. nfc_mifare_ul_get_view(nfc->nfc_mifare_ul));
  70. // Set View Dispatcher custom event callback
  71. view_dispatcher_set_custom_callback(
  72. nfc->nfc_common.view_dispatcher, nfc_view_dispatcher_callback, nfc);
  73. // Switch to menu
  74. view_dispatcher_switch_to_view(nfc->nfc_common.view_dispatcher, NfcViewMenu);
  75. return nfc;
  76. }
  77. void nfc_free(Nfc* nfc) {
  78. furi_assert(nfc);
  79. // Submenu
  80. view_dispatcher_remove_view(nfc->nfc_common.view_dispatcher, NfcViewMenu);
  81. submenu_free(nfc->submenu);
  82. // Detect
  83. view_dispatcher_remove_view(nfc->nfc_common.view_dispatcher, NfcViewDetect);
  84. nfc_detect_free(nfc->nfc_detect);
  85. // Emulate
  86. view_dispatcher_remove_view(nfc->nfc_common.view_dispatcher, NfcViewEmulate);
  87. nfc_emulate_free(nfc->nfc_emulate);
  88. // EMV
  89. view_dispatcher_remove_view(nfc->nfc_common.view_dispatcher, NfcViewEmv);
  90. nfc_emv_free(nfc->nfc_emv);
  91. // Mifare ultralight
  92. view_dispatcher_remove_view(nfc->nfc_common.view_dispatcher, NfcViewMifareUl);
  93. nfc_mifare_ul_free(nfc->nfc_mifare_ul);
  94. // Worker
  95. nfc_worker_stop(nfc->nfc_common.worker);
  96. nfc_worker_free(nfc->nfc_common.worker);
  97. // View dispatcher
  98. view_dispatcher_free(nfc->nfc_common.view_dispatcher);
  99. // GUI
  100. furi_record_close("gui");
  101. nfc->gui = NULL;
  102. // The rest
  103. osMessageQueueDelete(nfc->message_queue);
  104. free(nfc);
  105. }
  106. int32_t nfc_task(void* p) {
  107. Nfc* nfc = nfc_alloc();
  108. view_dispatcher_run(nfc->nfc_common.view_dispatcher);
  109. nfc_free(nfc);
  110. return 0;
  111. }