nfc_magic_scene_write.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "../nfc_magic_app_i.h"
  2. enum {
  3. NfcMagicSceneWriteStateCardSearch,
  4. NfcMagicSceneWriteStateCardFound,
  5. };
  6. NfcCommand nfc_magic_scene_write_gen1_poller_callback(Gen1aPollerEvent event, void* context) {
  7. NfcMagicApp* instance = context;
  8. furi_assert(event.data);
  9. NfcCommand command = NfcCommandContinue;
  10. if(event.type == Gen1aPollerEventTypeDetected) {
  11. view_dispatcher_send_custom_event(
  12. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  13. } else if(event.type == Gen1aPollerEventTypeRequestMode) {
  14. event.data->request_mode.mode = Gen1aPollerModeWrite;
  15. } else if(event.type == Gen1aPollerEventTypeRequestDataToWrite) {
  16. const MfClassicData* mfc_data =
  17. nfc_device_get_data(instance->source_dev, NfcProtocolMfClassic);
  18. event.data->data_to_write.mfc_data = mfc_data;
  19. } else if(event.type == Gen1aPollerEventTypeSuccess) {
  20. view_dispatcher_send_custom_event(
  21. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  22. command = NfcCommandStop;
  23. } else if(event.type == Gen1aPollerEventTypeFail) {
  24. view_dispatcher_send_custom_event(
  25. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  26. command = NfcCommandStop;
  27. }
  28. return command;
  29. }
  30. NfcCommand nfc_magic_scene_write_gen2_poller_callback(Gen2PollerEvent event, void* context) {
  31. NfcMagicApp* instance = context;
  32. furi_assert(event.data);
  33. NfcCommand command = NfcCommandContinue;
  34. if(event.type == Gen2PollerEventTypeDetected) {
  35. view_dispatcher_send_custom_event(
  36. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  37. } else if(event.type == Gen2PollerEventTypeRequestMode) {
  38. event.data->poller_mode.mode = Gen2PollerModeWrite;
  39. } else if(event.type == Gen2PollerEventTypeRequestDataToWrite) {
  40. const MfClassicData* mfc_data =
  41. nfc_device_get_data(instance->source_dev, NfcProtocolMfClassic);
  42. event.data->data_to_write.mfc_data = mfc_data;
  43. } else if(event.type == Gen2PollerEventTypeRequestTargetData) {
  44. const MfClassicData* mfc_data =
  45. nfc_device_get_data(instance->target_dev, NfcProtocolMfClassic);
  46. event.data->target_data.mfc_data = mfc_data;
  47. } else if(event.type == Gen2PollerEventTypeSuccess) {
  48. view_dispatcher_send_custom_event(
  49. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  50. command = NfcCommandStop;
  51. } else if(event.type == Gen2PollerEventTypeFail) {
  52. view_dispatcher_send_custom_event(
  53. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  54. command = NfcCommandStop;
  55. }
  56. return command;
  57. }
  58. NfcCommand nfc_magic_scene_write_gen4_poller_callback(Gen4PollerEvent event, void* context) {
  59. NfcMagicApp* instance = context;
  60. furi_assert(event.data);
  61. NfcCommand command = NfcCommandContinue;
  62. if(event.type == Gen4PollerEventTypeCardDetected) {
  63. view_dispatcher_send_custom_event(
  64. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  65. } else if(event.type == Gen4PollerEventTypeRequestMode) {
  66. event.data->request_mode.mode = Gen4PollerModeWrite;
  67. } else if(event.type == Gen4PollerEventTypeRequestDataToWrite) {
  68. NfcProtocol protocol = nfc_device_get_protocol(instance->source_dev);
  69. event.data->request_data.protocol = protocol;
  70. event.data->request_data.data = nfc_device_get_data(instance->source_dev, protocol);
  71. } else if(event.type == Gen4PollerEventTypeSuccess) {
  72. view_dispatcher_send_custom_event(
  73. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  74. command = NfcCommandStop;
  75. } else if(event.type == Gen4PollerEventTypeFail) {
  76. view_dispatcher_send_custom_event(
  77. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  78. command = NfcCommandStop;
  79. }
  80. return command;
  81. }
  82. static void nfc_magic_scene_write_setup_view(NfcMagicApp* instance) {
  83. Popup* popup = instance->popup;
  84. popup_reset(popup);
  85. uint32_t state = scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneWrite);
  86. if(state == NfcMagicSceneWriteStateCardSearch) {
  87. popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50);
  88. popup_set_text(
  89. instance->popup, "Apply the\nsame card\nto the back", 128, 32, AlignRight, AlignCenter);
  90. } else {
  91. popup_set_icon(popup, 12, 23, &I_Loading_24);
  92. popup_set_header(popup, "Writing\nDon't move...", 52, 32, AlignLeft, AlignCenter);
  93. }
  94. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewPopup);
  95. }
  96. void nfc_magic_scene_write_on_enter(void* context) {
  97. NfcMagicApp* instance = context;
  98. scene_manager_set_scene_state(
  99. instance->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
  100. nfc_magic_scene_write_setup_view(instance);
  101. nfc_magic_app_blink_start(instance);
  102. if(instance->protocol == NfcMagicProtocolGen1) {
  103. instance->gen1a_poller = gen1a_poller_alloc(instance->nfc);
  104. gen1a_poller_start(
  105. instance->gen1a_poller, nfc_magic_scene_write_gen1_poller_callback, instance);
  106. } else if(instance->protocol == NfcMagicProtocolGen2) {
  107. instance->gen2_poller = gen2_poller_alloc(instance->nfc);
  108. gen2_poller_start(
  109. instance->gen2_poller, nfc_magic_scene_write_gen2_poller_callback, instance);
  110. } else if(instance->protocol == NfcMagicProtocolClassic) {
  111. instance->gen2_poller = gen2_poller_alloc(instance->nfc);
  112. gen2_poller_start(
  113. instance->gen2_poller, nfc_magic_scene_write_gen2_poller_callback, instance);
  114. } else {
  115. instance->gen4_poller = gen4_poller_alloc(instance->nfc);
  116. gen4_poller_set_password(instance->gen4_poller, instance->gen4_password);
  117. gen4_poller_start(
  118. instance->gen4_poller, nfc_magic_scene_write_gen4_poller_callback, instance);
  119. }
  120. }
  121. bool nfc_magic_scene_write_on_event(void* context, SceneManagerEvent event) {
  122. NfcMagicApp* instance = context;
  123. bool consumed = false;
  124. if(event.type == SceneManagerEventTypeCustom) {
  125. if(event.event == NfcMagicCustomEventCardDetected) {
  126. scene_manager_set_scene_state(
  127. instance->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardFound);
  128. nfc_magic_scene_write_setup_view(instance);
  129. consumed = true;
  130. } else if(event.event == NfcMagicCustomEventCardLost) {
  131. scene_manager_set_scene_state(
  132. instance->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
  133. nfc_magic_scene_write_setup_view(instance);
  134. consumed = true;
  135. } else if(event.event == NfcMagicCustomEventWorkerSuccess) {
  136. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneSuccess);
  137. consumed = true;
  138. } else if(event.event == NfcMagicCustomEventWorkerFail) {
  139. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneWriteFail);
  140. consumed = true;
  141. }
  142. }
  143. return consumed;
  144. }
  145. void nfc_magic_scene_write_on_exit(void* context) {
  146. NfcMagicApp* instance = context;
  147. if(instance->protocol == NfcMagicProtocolGen1) {
  148. gen1a_poller_stop(instance->gen1a_poller);
  149. gen1a_poller_free(instance->gen1a_poller);
  150. } else if(
  151. instance->protocol == NfcMagicProtocolGen2 ||
  152. instance->protocol == NfcMagicProtocolClassic) {
  153. gen2_poller_stop(instance->gen2_poller);
  154. gen2_poller_free(instance->gen2_poller);
  155. } else if(instance->protocol == NfcMagicProtocolGen4) {
  156. gen4_poller_stop(instance->gen4_poller);
  157. gen4_poller_free(instance->gen4_poller);
  158. }
  159. scene_manager_set_scene_state(
  160. instance->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
  161. // Clear view
  162. popup_reset(instance->popup);
  163. nfc_magic_app_blink_stop(instance);
  164. }