diff --git a/scenes/seader_scene_config.h b/scenes/seader_scene_config.h index 2d8dcb5..58914c1 100644 --- a/scenes/seader_scene_config.h +++ b/scenes/seader_scene_config.h @@ -14,3 +14,4 @@ ADD_SCENE(seader, delete, Delete) ADD_SCENE(seader, delete_success, DeleteSuccess) ADD_SCENE(seader, credential_info, CredentialInfo) ADD_SCENE(seader, sam_info, SamInfo) +ADD_SCENE(seader, virtual_credential, VirtualCredential) diff --git a/scenes/seader_scene_saved_menu.c b/scenes/seader_scene_saved_menu.c index d749ae9..9c5b671 100644 --- a/scenes/seader_scene_saved_menu.c +++ b/scenes/seader_scene_saved_menu.c @@ -3,6 +3,7 @@ enum SubmenuIndex { SubmenuIndexDelete, SubmenuIndexInfo, + SubmenuIndexVirtual, }; void seader_scene_saved_menu_submenu_callback(void* context, uint32_t index) { @@ -21,6 +22,10 @@ void seader_scene_saved_menu_on_enter(void* context) { submenu_add_item( submenu, "Info", SubmenuIndexInfo, seader_scene_saved_menu_submenu_callback, seader); + // TODO: if iClass + submenu_add_item( + submenu, "Virtual", SubmenuIndexVirtual, seader_scene_saved_menu_submenu_callback, seader); + submenu_set_selected_item( seader->submenu, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneSavedMenu)); @@ -41,6 +46,9 @@ bool seader_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubmenuIndexInfo) { scene_manager_next_scene(seader->scene_manager, SeaderSceneCredentialInfo); consumed = true; + } else if(event.event == SubmenuIndexVirtual) { + scene_manager_next_scene(seader->scene_manager, SeaderSceneVirtualCredential); + consumed = true; } } diff --git a/scenes/seader_scene_virtual_credential.c b/scenes/seader_scene_virtual_credential.c new file mode 100644 index 0000000..c51fc79 --- /dev/null +++ b/scenes/seader_scene_virtual_credential.c @@ -0,0 +1,59 @@ +#include "../seader_i.h" +#include + +void seader_scene_virtual_credential_on_enter(void* context) { + Seader* seader = context; + dolphin_deed(DolphinDeedNfcRead); + + // Setup view + Popup* popup = seader->popup; + popup_set_header(popup, "Detecting\npicopass\ncard", 68, 30, AlignLeft, AlignTop); + popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61); + + // Start worker + view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup); + + seader->worker->stage = SeaderPollerEventTypeCardDetect; + seader_credential_clear(seader->credential); + seader->picopass_poller = picopass_poller_alloc(seader->nfc); + picopass_poller_start(seader->picopass_poller, seader_worker_poller_callback_picopass, seader); + + seader_blink_start(seader); +} + +bool seader_scene_virtual_credential_on_event(void* context, SceneManagerEvent event) { + Seader* seader = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SeaderCustomEventWorkerExit) { + seader->credential->type = SeaderCredentialTypePicopass; + scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess); + consumed = true; + } else if(event.event == SeaderCustomEventPollerSuccess) { + seader->credential->type = SeaderCredentialTypePicopass; + scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess); + consumed = true; + } + + } else if(event.type == SceneManagerEventTypeBack) { + scene_manager_search_and_switch_to_previous_scene( + seader->scene_manager, SeaderSceneSamPresent); + consumed = true; + } + return consumed; +} + +void seader_scene_virtual_credential_on_exit(void* context) { + Seader* seader = context; + + if(seader->picopass_poller) { + picopass_poller_stop(seader->picopass_poller); + picopass_poller_free(seader->picopass_poller); + } + + // Clear view + popup_reset(seader->popup); + + seader_blink_stop(seader); +}