nfc_magic_scene_gen4_get_info.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "../nfc_magic_app_i.h"
  2. //TODO: INCAPSULATE?
  3. #include "gui/scene_manager.h"
  4. #include "protocols/gen4/gen4_poller_i.h"
  5. enum {
  6. NfcMagicSceneGen4GetInfoStateCardSearch,
  7. NfcMagicSceneGen4GetInfoStateCardFound,
  8. };
  9. NfcCommand nfc_mafic_scene_gen4_get_info_poller_callback(Gen4PollerEvent event, void* context) {
  10. NfcMagicApp* instance = context;
  11. furi_assert(event.data);
  12. NfcCommand command = NfcCommandContinue;
  13. if(event.type == Gen4PollerEventTypeCardDetected) {
  14. view_dispatcher_send_custom_event(
  15. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  16. } else if(event.type == Gen4PollerEventTypeRequestMode) {
  17. event.data->request_mode.mode = Gen4PollerModeGetInfo;
  18. } else if(event.type == Gen4PollerEventTypeSuccess) {
  19. // Copy data from event to main instance
  20. // TODO: From event data? or from poller?
  21. gen4_copy(instance->gen4_data, instance->gen4_poller->gen4_data);
  22. view_dispatcher_send_custom_event(
  23. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  24. command = NfcCommandStop;
  25. } else if(event.type == Gen4PollerEventTypeFail) {
  26. view_dispatcher_send_custom_event(
  27. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  28. command = NfcCommandStop;
  29. }
  30. return command;
  31. }
  32. static void nfc_magic_scene_gen4_get_info_setup_view(NfcMagicApp* instance) {
  33. Popup* popup = instance->popup;
  34. popup_reset(popup);
  35. uint32_t state =
  36. scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneGen4GetInfo);
  37. if(state == NfcMagicSceneGen4GetInfoStateCardSearch) {
  38. popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50);
  39. popup_set_text(
  40. instance->popup, "Apply the\ncard\nto the back", 128, 32, AlignRight, AlignCenter);
  41. } else {
  42. popup_set_icon(popup, 12, 23, &I_Loading_24);
  43. popup_set_header(popup, "Reading\nDon't move...", 52, 32, AlignLeft, AlignCenter);
  44. }
  45. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewPopup);
  46. }
  47. void nfc_magic_scene_gen4_get_info_on_enter(void* context) {
  48. NfcMagicApp* instance = context;
  49. scene_manager_set_scene_state(
  50. instance->scene_manager,
  51. NfcMagicSceneGen4GetInfo,
  52. NfcMagicSceneGen4GetInfoStateCardSearch);
  53. nfc_magic_scene_gen4_get_info_setup_view(instance);
  54. nfc_magic_app_blink_start(instance);
  55. instance->gen4_poller = gen4_poller_alloc(instance->nfc);
  56. gen4_poller_set_password(instance->gen4_poller, instance->gen4_password);
  57. gen4_poller_start(
  58. instance->gen4_poller, nfc_mafic_scene_gen4_get_info_poller_callback, instance);
  59. }
  60. bool nfc_magic_scene_gen4_get_info_on_event(void* context, SceneManagerEvent event) {
  61. NfcMagicApp* instance = context;
  62. bool consumed = false;
  63. if(event.type == SceneManagerEventTypeCustom) {
  64. if(event.event == NfcMagicCustomEventCardDetected) {
  65. scene_manager_set_scene_state(
  66. instance->scene_manager,
  67. NfcMagicSceneGen4GetInfo,
  68. NfcMagicSceneGen4GetInfoStateCardFound);
  69. nfc_magic_scene_gen4_get_info_setup_view(instance);
  70. consumed = true;
  71. } else if(event.event == NfcMagicCustomEventCardLost) {
  72. scene_manager_set_scene_state(
  73. instance->scene_manager,
  74. NfcMagicSceneGen4GetInfo,
  75. NfcMagicSceneGen4GetInfoStateCardSearch);
  76. nfc_magic_scene_gen4_get_info_setup_view(instance);
  77. consumed = true;
  78. } else if(event.event == NfcMagicCustomEventWorkerSuccess) {
  79. // for notification message
  80. scene_manager_set_scene_state(
  81. instance->scene_manager, NfcMagicSceneGen4ShowInfo, true);
  82. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4ShowInfo);
  83. consumed = true;
  84. } else if(event.event == NfcMagicCustomEventWorkerFail) {
  85. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4Fail);
  86. consumed = true;
  87. }
  88. }
  89. return consumed;
  90. }
  91. void nfc_magic_scene_gen4_get_info_on_exit(void* context) {
  92. NfcMagicApp* instance = context;
  93. gen4_poller_stop(instance->gen4_poller);
  94. gen4_poller_free(instance->gen4_poller);
  95. scene_manager_set_scene_state(
  96. instance->scene_manager,
  97. NfcMagicSceneGen4GetInfo,
  98. NfcMagicSceneGen4GetInfoStateCardSearch);
  99. // Clear view
  100. popup_reset(instance->popup);
  101. nfc_magic_app_blink_stop(instance);
  102. }