Eric Betts 2 лет назад
Родитель
Сommit
faef7b56f4

+ 1 - 0
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)

+ 8 - 0
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;
         }
     }
 

+ 59 - 0
scenes/seader_scene_virtual_credential.c

@@ -0,0 +1,59 @@
+#include "../seader_i.h"
+#include <dolphin/dolphin.h>
+
+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);
+}