nfc_magic_scene_gen4_set_shd_mode.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "../nfc_magic_app_i.h"
  2. enum {
  3. NfcMagicSceneGen4SetShadowModeStateCardSearch,
  4. NfcMagicSceneGen4SetShadowModeStateCardFound,
  5. };
  6. NfcCommand
  7. nfc_magic_scene_gen4_set_shd_mode_poller_callback(Gen4PollerEvent event, void* context) {
  8. NfcMagicApp* instance = context;
  9. furi_assert(event.data);
  10. NfcCommand command = NfcCommandContinue;
  11. if(event.type == Gen4PollerEventTypeCardDetected) {
  12. view_dispatcher_send_custom_event(
  13. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  14. } else if(event.type == Gen4PollerEventTypeRequestMode) {
  15. event.data->request_mode.mode = Gen4PollerModeSetShadowMode;
  16. } else if(event.type == Gen4PollerEventTypeSuccess) {
  17. view_dispatcher_send_custom_event(
  18. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  19. command = NfcCommandStop;
  20. } else if(event.type == Gen4PollerEventTypeFail) {
  21. view_dispatcher_send_custom_event(
  22. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  23. command = NfcCommandStop;
  24. }
  25. return command;
  26. }
  27. static void nfc_magic_scene_gen4_set_shd_mode_setup_view(NfcMagicApp* instance) {
  28. Popup* popup = instance->popup;
  29. popup_reset(popup);
  30. uint32_t state =
  31. scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneGen4SetShdMode);
  32. if(state == NfcMagicSceneGen4SetShadowModeStateCardSearch) {
  33. popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50);
  34. popup_set_text(
  35. instance->popup, "Apply the\ncard\nto the back", 128, 32, AlignRight, AlignCenter);
  36. } else {
  37. popup_set_icon(popup, 12, 23, &I_Loading_24);
  38. popup_set_header(popup, "Configuring\nDon't move...", 52, 32, AlignLeft, AlignCenter);
  39. }
  40. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewPopup);
  41. }
  42. void nfc_magic_scene_gen4_set_shd_mode_on_enter(void* context) {
  43. NfcMagicApp* instance = context;
  44. uint8_t shadow_mode =
  45. scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneGen4SetShdMode);
  46. scene_manager_set_scene_state(
  47. instance->scene_manager,
  48. NfcMagicSceneGen4SetShdMode,
  49. NfcMagicSceneGen4SetShadowModeStateCardSearch);
  50. nfc_magic_scene_gen4_set_shd_mode_setup_view(instance);
  51. nfc_magic_app_blink_start(instance);
  52. instance->gen4_poller = gen4_poller_alloc(instance->nfc);
  53. gen4_poller_set_password(instance->gen4_poller, instance->gen4_password);
  54. gen4_poller_struct_set_shadow_mode(instance->gen4_poller, shadow_mode);
  55. gen4_poller_start(
  56. instance->gen4_poller, nfc_magic_scene_gen4_set_shd_mode_poller_callback, instance);
  57. }
  58. bool nfc_magic_scene_gen4_set_shd_mode_on_event(void* context, SceneManagerEvent event) {
  59. NfcMagicApp* instance = context;
  60. bool consumed = false;
  61. if(event.type == SceneManagerEventTypeCustom) {
  62. if(event.event == NfcMagicCustomEventCardDetected) {
  63. scene_manager_set_scene_state(
  64. instance->scene_manager,
  65. NfcMagicSceneGen4SetShdMode,
  66. NfcMagicSceneGen4SetShadowModeStateCardFound);
  67. nfc_magic_scene_gen4_set_shd_mode_setup_view(instance);
  68. consumed = true;
  69. } else if(event.event == NfcMagicCustomEventCardLost) {
  70. scene_manager_set_scene_state(
  71. instance->scene_manager,
  72. NfcMagicSceneGen4SetShdMode,
  73. NfcMagicSceneGen4SetShadowModeStateCardSearch);
  74. nfc_magic_scene_gen4_set_shd_mode_setup_view(instance);
  75. consumed = true;
  76. } else if(event.event == NfcMagicCustomEventWorkerSuccess) {
  77. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneSuccess);
  78. consumed = true;
  79. } else if(event.event == NfcMagicCustomEventWorkerFail) {
  80. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4Fail);
  81. consumed = true;
  82. }
  83. }
  84. return consumed;
  85. }
  86. void nfc_magic_scene_gen4_set_shd_mode_on_exit(void* context) {
  87. NfcMagicApp* instance = context;
  88. gen4_poller_stop(instance->gen4_poller);
  89. gen4_poller_free(instance->gen4_poller);
  90. scene_manager_set_scene_state(
  91. instance->scene_manager,
  92. NfcMagicSceneGen4SetShdMode,
  93. NfcMagicSceneGen4SetShadowModeStateCardSearch);
  94. // Clear view
  95. popup_reset(instance->popup);
  96. nfc_magic_app_blink_stop(instance);
  97. }