nfc_magic_scene_gen4_get_cfg.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "../nfc_magic_app_i.h"
  2. enum {
  3. NfcMagicSceneGen4GetCfgStateCardSearch,
  4. NfcMagicSceneGen4GetCfgStateCardFound,
  5. };
  6. NfcCommand nfc_mafic_scene_gen4_get_cfg_poller_callback(Gen4PollerEvent event, void* context) {
  7. NfcMagicApp* instance = context;
  8. furi_assert(event.data);
  9. NfcCommand command = NfcCommandContinue;
  10. if(event.type == Gen4PollerEventTypeCardDetected) {
  11. view_dispatcher_send_custom_event(
  12. instance->view_dispatcher, NfcMagicCustomEventCardDetected);
  13. } else if(event.type == Gen4PollerEventTypeRequestMode) {
  14. event.data->request_mode.mode = Gen4PollerModeGetCfg;
  15. } else if(event.type == Gen4PollerEventTypeSuccess) {
  16. // Copy config from event to main instance to display it on success scene
  17. memcpy(
  18. instance->gen4_config_display,
  19. event.data->display_config,
  20. sizeof(event.data->display_config));
  21. view_dispatcher_send_custom_event(
  22. instance->view_dispatcher, NfcMagicCustomEventWorkerSuccess);
  23. command = NfcCommandStop;
  24. } else if(event.type == Gen4PollerEventTypeFail) {
  25. view_dispatcher_send_custom_event(
  26. instance->view_dispatcher, NfcMagicCustomEventWorkerFail);
  27. command = NfcCommandStop;
  28. }
  29. return command;
  30. }
  31. static void nfc_magic_scene_gen4_get_cfg_setup_view(NfcMagicApp* instance) {
  32. Popup* popup = instance->popup;
  33. popup_reset(popup);
  34. uint32_t state =
  35. scene_manager_get_scene_state(instance->scene_manager, NfcMagicSceneGen4GetCfg);
  36. if(state == NfcMagicSceneGen4GetCfgStateCardSearch) {
  37. popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50);
  38. popup_set_text(
  39. instance->popup, "Apply the\ncard\nto the back", 128, 32, AlignRight, AlignCenter);
  40. } else {
  41. popup_set_icon(popup, 12, 23, &I_Loading_24);
  42. popup_set_header(popup, "Reading\nDon't move...", 52, 32, AlignLeft, AlignCenter);
  43. }
  44. view_dispatcher_switch_to_view(instance->view_dispatcher, NfcMagicAppViewPopup);
  45. }
  46. void nfc_magic_scene_gen4_get_cfg_on_enter(void* context) {
  47. NfcMagicApp* instance = context;
  48. scene_manager_set_scene_state(
  49. instance->scene_manager, NfcMagicSceneGen4GetCfg, NfcMagicSceneGen4GetCfgStateCardSearch);
  50. nfc_magic_scene_gen4_get_cfg_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_start(
  55. instance->gen4_poller, nfc_mafic_scene_gen4_get_cfg_poller_callback, instance);
  56. }
  57. bool nfc_magic_scene_gen4_get_cfg_on_event(void* context, SceneManagerEvent event) {
  58. NfcMagicApp* instance = context;
  59. bool consumed = false;
  60. if(event.type == SceneManagerEventTypeCustom) {
  61. if(event.event == NfcMagicCustomEventCardDetected) {
  62. scene_manager_set_scene_state(
  63. instance->scene_manager,
  64. NfcMagicSceneGen4GetCfg,
  65. NfcMagicSceneGen4GetCfgStateCardFound);
  66. nfc_magic_scene_gen4_get_cfg_setup_view(instance);
  67. consumed = true;
  68. } else if(event.event == NfcMagicCustomEventCardLost) {
  69. scene_manager_set_scene_state(
  70. instance->scene_manager,
  71. NfcMagicSceneGen4GetCfg,
  72. NfcMagicSceneGen4GetCfgStateCardSearch);
  73. nfc_magic_scene_gen4_get_cfg_setup_view(instance);
  74. consumed = true;
  75. } else if(event.event == NfcMagicCustomEventWorkerSuccess) {
  76. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4ShowCfg);
  77. consumed = true;
  78. } else if(event.event == NfcMagicCustomEventWorkerFail) {
  79. scene_manager_next_scene(instance->scene_manager, NfcMagicSceneGen4Fail);
  80. consumed = true;
  81. }
  82. }
  83. return consumed;
  84. }
  85. void nfc_magic_scene_gen4_get_cfg_on_exit(void* context) {
  86. NfcMagicApp* instance = context;
  87. gen4_poller_stop(instance->gen4_poller);
  88. gen4_poller_free(instance->gen4_poller);
  89. scene_manager_set_scene_state(
  90. instance->scene_manager, NfcMagicSceneGen4GetCfg, NfcMagicSceneGen4GetCfgStateCardSearch);
  91. // Clear view
  92. popup_reset(instance->popup);
  93. nfc_magic_app_blink_stop(instance);
  94. }