瀏覽代碼

order card menu better

Eric Betts 9 月之前
父節點
當前提交
5f2dc7845a
共有 2 個文件被更改,包括 111 次插入64 次删除
  1. 1 1
      application.fam
  2. 110 63
      scenes/picopass_scene_card_menu.c

+ 1 - 1
application.fam

@@ -11,7 +11,7 @@ App(
         "storage",
         "gui",
     ],
-    stack_size=4 * 1024,
+    stack_size=5 * 1024,
     fap_description="App to communicate with NFC tags using the PicoPass(iClass) format",
     fap_version="1.18",
     fap_icon="125_10px.png",

+ 110 - 63
scenes/picopass_scene_card_menu.c

@@ -1,16 +1,19 @@
 #include "../picopass_i.h"
 
 enum SubmenuIndex {
+    SubmenuIndexParse,
+    SubmenuIndexParseSIO,
+
     SubmenuIndexSave,
+    SubmenuIndexSaveLegacy,
     SubmenuIndexSaveAsLF,
-    SubmenuIndexParseSIO,
     SubmenuIndexSaveAsSeader,
-    SubmenuIndexParse,
+    SubmenuIndexSavePartial,
+
     SubmenuIndexChangeKey,
     SubmenuIndexWrite,
     SubmenuIndexEmulate,
-    SubmenuIndexSavePartial,
-    SubmenuIndexSaveLegacy,
+    SubmenuIndexMax,
 };
 
 void picopass_scene_card_menu_submenu_callback(void* context, uint32_t index) {
@@ -19,65 +22,131 @@ void picopass_scene_card_menu_submenu_callback(void* context, uint32_t index) {
     view_dispatcher_send_custom_event(picopass->view_dispatcher, index);
 }
 
-void picopass_scene_card_menu_on_enter(void* context) {
+void picopass_scene_card_menu_add_items(void* context, bool included[]) {
     Picopass* picopass = context;
     Submenu* submenu = picopass->submenu;
-    PicopassPacs* pacs = &picopass->dev->dev_data.pacs;
-    PicopassBlock* card_data = picopass->dev->dev_data.card_data;
-    PicopassDeviceAuthMethod auth = picopass->dev->dev_data.auth;
-    PluginWiegand* plugin = picopass->plugin_wiegand;
-
-    bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
-              0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
-    bool SR = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0] == 0xA3 &&
-              card_data[10].valid && 0x30 == card_data[10].data[0];
-    bool has_sio = SE || SR;
-    bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
-                   PICOPASS_FUSE_CRYPT0;
-    bool no_credential = picopass_is_memset(pacs->credential, 0x00, sizeof(pacs->credential));
 
-    if(auth == PicopassDeviceAuthMethodFailed) {
+    // Clear the menu
+    submenu_reset(submenu);
+    if(included[SubmenuIndexParse]) {
         submenu_add_item(
             submenu,
-            "Save Partial",
-            SubmenuIndexSavePartial,
+            "Parse",
+            SubmenuIndexParse,
             picopass_scene_card_menu_submenu_callback,
             picopass);
-    } else {
-        submenu_add_item(
-            submenu, "Save", SubmenuIndexSave, picopass_scene_card_menu_submenu_callback, picopass);
     }
-
-    if(secured && has_sio) {
+    if(included[SubmenuIndexParseSIO]) {
         submenu_add_item(
             submenu,
             "Parse SIO",
             SubmenuIndexParseSIO,
             picopass_scene_card_menu_submenu_callback,
             picopass);
+    }
+    if(included[SubmenuIndexSave]) {
+        submenu_add_item(
+            submenu, "Save", SubmenuIndexSave, picopass_scene_card_menu_submenu_callback, picopass);
+    }
+    if(included[SubmenuIndexSaveLegacy]) {
         submenu_add_item(
             submenu,
-            "Save in Seader fmt",
-            SubmenuIndexSaveAsSeader,
+            "Save as Legacy",
+            SubmenuIndexSaveLegacy,
             picopass_scene_card_menu_submenu_callback,
             picopass);
     }
-
-    if(secured && !no_credential) {
+    if(included[SubmenuIndexSaveAsLF]) {
         submenu_add_item(
             submenu,
             "Save as LFRFID",
             SubmenuIndexSaveAsLF,
             picopass_scene_card_menu_submenu_callback,
             picopass);
+    }
+    if(included[SubmenuIndexSaveAsSeader]) {
+        submenu_add_item(
+            submenu,
+            "Save in Seader fmt",
+            SubmenuIndexSaveAsSeader,
+            picopass_scene_card_menu_submenu_callback,
+            picopass);
+    }
+    if(included[SubmenuIndexSavePartial]) {
+        submenu_add_item(
+            submenu,
+            "Save Partial",
+            SubmenuIndexSavePartial,
+            picopass_scene_card_menu_submenu_callback,
+            picopass);
+    }
+    if(included[SubmenuIndexChangeKey]) {
+        submenu_add_item(
+            submenu,
+            "Change Key",
+            SubmenuIndexChangeKey,
+            picopass_scene_card_menu_submenu_callback,
+            picopass);
+    }
+    if(included[SubmenuIndexWrite]) {
+        submenu_add_item(
+            submenu,
+            "Write",
+            SubmenuIndexWrite,
+            picopass_scene_card_menu_submenu_callback,
+            picopass);
+    }
+    if(included[SubmenuIndexEmulate]) {
+        submenu_add_item(
+            submenu,
+            "Emulate",
+            SubmenuIndexEmulate,
+            picopass_scene_card_menu_submenu_callback,
+            picopass);
+    }
+
+    submenu_set_selected_item(
+        picopass->submenu,
+        scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneCardMenu));
+}
+
+void picopass_scene_card_menu_on_enter(void* context) {
+    Picopass* picopass = context;
+    PicopassPacs* pacs = &picopass->dev->dev_data.pacs;
+    PicopassBlock* card_data = picopass->dev->dev_data.card_data;
+    PicopassDeviceAuthMethod auth = picopass->dev->dev_data.auth;
+    PluginWiegand* plugin = picopass->plugin_wiegand;
 
+    bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
+              0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
+    bool SR = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0] == 0xA3 &&
+              card_data[10].valid && 0x30 == card_data[10].data[0];
+    bool has_sio = SE || SR;
+    bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
+                   PICOPASS_FUSE_CRYPT0;
+    bool no_credential = picopass_is_memset(pacs->credential, 0x00, sizeof(pacs->credential));
+
+    // To allow us to disconnect the order of the menu items from the order we determine what is valid
+    bool included[SubmenuIndexMax];
+    for(size_t i = 0; i < SubmenuIndexMax; i++) {
+        included[i] = false;
+    }
+
+    if(auth == PicopassDeviceAuthMethodFailed) {
+        included[SubmenuIndexSavePartial] = true;
+    } else {
+        included[SubmenuIndexSave] = true;
+    }
+
+    if(secured && has_sio) {
+        included[SubmenuIndexParseSIO] = true;
+        included[SubmenuIndexSaveAsSeader] = true;
+    }
+
+    if(secured && !no_credential) {
+        included[SubmenuIndexSaveAsLF] = true;
         if(SR) {
-            submenu_add_item(
-                submenu,
-                "Save as Legacy",
-                SubmenuIndexSaveLegacy,
-                picopass_scene_card_menu_submenu_callback,
-                picopass);
+            included[SubmenuIndexSaveLegacy] = true;
         }
 
         if(plugin) {
@@ -88,44 +157,22 @@ void picopass_scene_card_menu_on_enter(void* context) {
 
             size_t format_count = plugin->count(pacs->bitLength, credential);
             if(format_count > 0) {
-                submenu_add_item(
-                    submenu,
-                    "Parse",
-                    SubmenuIndexParse,
-                    picopass_scene_card_menu_submenu_callback,
-                    picopass);
+                included[SubmenuIndexParse] = true;
             }
         }
     }
 
     if(auth == PicopassDeviceAuthMethodNone || auth == PicopassDeviceAuthMethodKey) {
+        included[SubmenuIndexEmulate] = true;
         if(!has_sio) {
-            submenu_add_item(
-                submenu,
-                "Write",
-                SubmenuIndexWrite,
-                picopass_scene_card_menu_submenu_callback,
-                picopass);
+            included[SubmenuIndexWrite] = true;
         }
-        submenu_add_item(
-            submenu,
-            "Emulate",
-            SubmenuIndexEmulate,
-            picopass_scene_card_menu_submenu_callback,
-            picopass);
         if(secured) {
-            submenu_add_item(
-                submenu,
-                "Change Key",
-                SubmenuIndexChangeKey,
-                picopass_scene_card_menu_submenu_callback,
-                picopass);
+            included[SubmenuIndexChangeKey] = true;
         }
     }
 
-    submenu_set_selected_item(
-        picopass->submenu,
-        scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneCardMenu));
+    picopass_scene_card_menu_add_items(picopass, included);
 
     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewMenu);
 }