nfc_magic_scene_dump.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "../nfc_magic_app_i.h"
  2. enum {
  3. NfcMagicSceneDumpStateCardSearch,
  4. NfcMagicSceneDumpStateCardFound,
  5. };
  6. NfcCommand nfc_magic_scene_dump_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 = Gen1aPollerModeDump;
  15. } else if(event.type == Gen1aPollerEventTypeRequestDataToDump) {
  16. event.data->data_to_dump.mfc_data = instance->dump_data;
  17. } else if(event.type == Gen1aPollerEventTypeSuccess) {
  18. view_dispatcher_send_custom_event(
  19. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  20. command = NfcCommandStop;
  21. } else if(event.type == Gen1aPollerEventTypeFail) {
  22. view_dispatcher_send_custom_event(
  23. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  24. command = NfcCommandStop;
  25. }
  26. return command;
  27. }
  28. static void nfc_magic_scene_dump_setup_view(NfcMagicApp* instance) {
  29. Popup* popup = instance->popup;
  30. popup_reset(popup);
  31. uint32_t state = scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneDump);
  32. if(state == NfcMagicSceneDumpStateCardSearch) {
  33. popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50);
  34. popup_set_text(
  35. instance->popup, "Apply the\nsame card\nto the back", 128, 32, AlignRight, AlignCenter);
  36. } else {
  37. popup_set_icon(popup, 12, 23, &I_Loading_24);
  38. popup_set_header(popup, "Dumping\nDon't move...", 52, 32, AlignLeft, AlignCenter);
  39. }
  40. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewPopup);
  41. }
  42. void nfc_magic_scene_dump_on_enter(void* context) {
  43. NfcMagicApp* instance = context;
  44. scene_manager_set_scene_state(
  45. instance->scene_manager, NfcMagicSceneDump, NfcMagicSceneDumpStateCardSearch);
  46. nfc_magic_scene_dump_setup_view(instance);
  47. nfc_magic_app_blink_start(instance);
  48. if(instance->protocol == NfcMagicProtocolGen1) {
  49. instance->gen1a_poller = gen1a_poller_alloc(instance->nfc);
  50. gen1a_poller_start(
  51. instance->gen1a_poller, nfc_magic_scene_dump_gen1_poller_callback, instance);
  52. }
  53. }
  54. bool nfc_magic_scene_dump_on_event(void* context, SceneManagerEvent event) {
  55. NfcMagicApp* instance = context;
  56. bool consumed = false;
  57. if(event.type == SceneManagerEventTypeCustom) {
  58. if(event.event == NfcMagicCustomEventCardDetected) {
  59. scene_manager_set_scene_state(
  60. instance->scene_manager, NfcMagicSceneDump, NfcMagicSceneDumpStateCardFound);
  61. nfc_magic_scene_dump_setup_view(instance);
  62. consumed = true;
  63. } else if(event.event == NfcMagicCustomEventCardLost) {
  64. scene_manager_set_scene_state(
  65. instance->scene_manager, NfcMagicSceneDump, NfcMagicSceneDumpStateCardSearch);
  66. nfc_magic_scene_dump_setup_view(instance);
  67. consumed = true;
  68. } else if(event.event == NfcMagicCustomEventWorkerSuccess) {
  69. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen1SaveName);
  70. consumed = true;
  71. } else if(event.event == NfcMagicCustomEventWorkerFail) {
  72. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneDumpFail);
  73. consumed = true;
  74. }
  75. }
  76. return consumed;
  77. }
  78. void nfc_magic_scene_dump_on_exit(void* context) {
  79. NfcMagicApp* instance = context;
  80. if(instance->protocol == NfcMagicProtocolGen1) {
  81. gen1a_poller_stop(instance->gen1a_poller);
  82. gen1a_poller_free(instance->gen1a_poller);
  83. }
  84. nfc_device_set_data(instance->source_dev, NfcProtocolMfClassic, instance->dump_data);
  85. scene_manager_set_scene_state(
  86. instance->scene_manager, NfcMagicSceneDump, NfcMagicSceneDumpStateCardSearch);
  87. // Clear view
  88. popup_reset(instance->popup);
  89. nfc_magic_app_blink_stop(instance);
  90. }