Преглед изворни кода

refractoring dev done, now moving on to viewing saved

frux-c пре 2 година
родитељ
комит
73c9d6bf73
7 измењених фајлова са 199 додато и 192 уклоњено
  1. 2 2
      scenes/uhf_scene_config.h
  2. 20 20
      scenes/uhf_scene_file_select.c
  3. 59 64
      scenes/uhf_scene_saved_menu.c
  4. 7 7
      scenes/uhf_scene_start.c
  5. 1 0
      uhf_app.c
  6. 101 97
      uhf_device.c
  7. 9 2
      uhf_device.h

+ 2 - 2
scenes/uhf_scene_config.h

@@ -5,8 +5,8 @@ ADD_SCENE(uhf, read_tag_success, ReadTagSuccess)
 ADD_SCENE(uhf, card_menu, CardMenu)
 ADD_SCENE(uhf, save_name, SaveName)
 ADD_SCENE(uhf, save_success, SaveSuccess)
-// ADD_SCENE(uhf, saved_menu, SavedMenu)
-// ADD_SCENE(uhf, file_select, FileSelect)
+ADD_SCENE(uhf, saved_menu, SavedMenu)
+ADD_SCENE(uhf, file_select, FileSelect)
 // ADD_SCENE(uhf, device_info, DeviceInfo)
 // ADD_SCENE(uhf, delete, Delete)
 // ADD_SCENE(uhf, delete_success, DeleteSuccess)

+ 20 - 20
scenes/uhf_scene_file_select.c

@@ -1,23 +1,23 @@
-// #include "../uhf_app_i.h"
+#include "../uhf_app_i.h"
 
-// void uhf_scene_file_select_on_enter(void* context) {
-//     UHFApp* uhf_app = context;
-//     // Process file_select return
-//     uhf_device_set_loading_callback(uhf_app->dev, uhf_app_show_loading_popup, uhf_app);
-//     if(uhf_file_select(uhf_app->dev)) {
-//         scene_manager_next_scene(uhf_app->scene_manager, UHFSceneSavedMenu);
-//     } else {
-//         scene_manager_search_and_switch_to_previous_scene(uhf_app->scene_manager, UHFSceneStart);
-//     }
-//     uhf_device_set_loading_callback(uhf_app->dev, NULL, uhf_app);
-// }
+void uhf_scene_file_select_on_enter(void* context) {
+    UHFApp* uhf_app = context;
+    // Process file_select return
+    uhf_device_set_loading_callback(uhf_app->uhf_device, uhf_show_loading_popup, uhf_app);
+    if(uhf_file_select(uhf_app->uhf_device)) {
+        scene_manager_next_scene(uhf_app->scene_manager, UHFSceneSavedMenu);
+    } else {
+        scene_manager_search_and_switch_to_previous_scene(uhf_app->scene_manager, UHFSceneStart);
+    }
+    uhf_device_set_loading_callback(uhf_app->uhf_device, NULL, uhf_app);
+}
 
-// bool uhf_scene_file_select_on_event(void* context, SceneManagerEvent event) {
-//     UNUSED(context);
-//     UNUSED(event);
-//     return false;
-// }
+bool uhf_scene_file_select_on_event(void* context, SceneManagerEvent event) {
+    UNUSED(context);
+    UNUSED(event);
+    return false;
+}
 
-// void uhf_scene_file_select_on_exit(void* context) {
-//     UNUSED(context);
-// }
+void uhf_scene_file_select_on_exit(void* context) {
+    UNUSED(context);
+}

+ 59 - 64
scenes/uhf_scene_saved_menu.c

@@ -1,64 +1,59 @@
-// #include "../uhf_app_i.h"
-
-// #include "../uhf_app_i.h"
-
-// enum SubmenuIndex {
-//     SubmenuIndexSave,
-//     SubmenuIndexChangeKey,
-// };
-
-// void uhf_scene_card_menu_submenu_callback(void* ctx, uint32_t index) {
-//     UHFApp* uhf_app = ctx;
-//     view_dispatcher_send_custom_event(uhf_app->view_dispatcher, index);
-// }
-
-// void uhf_scene_card_menu_on_enter(void* ctx) {
-//     UHFApp* uhf_app = ctx;
-
-//     Submenu* submenu = uhf_app->submenu;
-
-//     submenu_add_item(
-//         submenu, "Save", SubmenuIndexSave, uhf_scene_card_menu_submenu_callback, uhf_app);
-//     submenu_add_item(
-//         submenu,
-//         "Change Key",
-//         SubmenuIndexChangeKey,
-//         uhf_scene_card_menu_submenu_callback,
-//         uhf_app);
-
-//     submenu_set_selected_item(
-//         submenu, scene_manager_get_scene_state(uhf_app->scene_manager, UHFSceneCardMenu));
-
-//     view_dispatcher_switch_to_view(uhf_app->view_dispatcher, UHFViewMenu);
-// }
-
-// bool uhf_scene_card_menu_on_event(void* ctx, SceneManagerEvent event) {
-//     UHFApp* uhf_app = ctx;
-//     bool consumed = false;
-
-//     if(event.type == SceneManagerEventTypeCustom) {
-//         if(event.event == SubmenuIndexSave) {
-//             scene_manager_set_scene_state(
-//                 uhf_app->scene_manager, UHFSceneCardMenu, SubmenuIndexSave);
-//             scene_manager_next_scene(uhf_app->scene_manager, UHFSceneSaveName);
-//             consumed = true;
-//         }
-//         // else if(event.event == SubmenuIndexChangeKey) {
-//         //     scene_manager_set_scene_state(
-//         //         picopass->scene_manager, UHFSceneCardMenu, SubmenuIndexChangeKey);
-//         //     scene_manager_next_scene(picopass->scene_manager, PicopassSceneKeyMenu);
-//         //     consumed = true;
-//         // }
-//     } else if(event.type == SceneManagerEventTypeBack) {
-//         consumed = scene_manager_search_and_switch_to_previous_scene(
-//             uhf_app->scene_manager, UHFSceneStart);
-//     }
-
-//     return consumed;
-// }
-
-// void uhf_scene_card_menu_on_exit(void* ctx) {
-//     UHFApp* uhf_app = ctx;
-
-//     submenu_reset(uhf_app->submenu);
-// }
+#include "../uhf_app_i.h"
+
+enum SubmenuIndex {
+    SubmenuIndexDelete,
+    SubmenuIndexInfo,
+    SubmenuIndexWrite,
+};
+
+void uhf_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
+    UHFApp* uhf_app = context;
+
+    view_dispatcher_send_custom_event(uhf_app->view_dispatcher, index);
+}
+
+void uhf_scene_saved_menu_on_enter(void* context) {
+    UHFApp* uhf_app = context;
+    Submenu* submenu = uhf_app->submenu;
+
+    submenu_add_item(
+        submenu, "Delete", SubmenuIndexDelete, uhf_scene_saved_menu_submenu_callback, uhf_app);
+    submenu_add_item(
+        submenu, "Info", SubmenuIndexInfo, uhf_scene_saved_menu_submenu_callback, uhf_app);
+    submenu_add_item(
+        submenu, "Write", SubmenuIndexWrite, uhf_scene_saved_menu_submenu_callback, uhf_app);
+
+    submenu_set_selected_item(
+        uhf_app->submenu,
+        scene_manager_get_scene_state(uhf_app->scene_manager, UHFSceneSavedMenu));
+
+    view_dispatcher_switch_to_view(uhf_app->view_dispatcher, UHFViewMenu);
+}
+
+bool uhf_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
+    UHFApp* uhf_app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        scene_manager_set_scene_state(uhf_app->scene_manager, UHFSceneSavedMenu, event.event);
+
+        // if(event.event == SubmenuIndexDelete) {
+        //     scene_manager_next_scene(uhf_app->scene_manager, UHFSceneDelete);
+        //     consumed = true;
+        // } else if(event.event == SubmenuIndexInfo) {
+        //     scene_manager_next_scene(uhf_app->scene_manager, UHFSceneDeviceInfo);
+        //     consumed = true;
+        // } else if(event.event == SubmenuIndexWrite) {
+        //     scene_manager_next_scene(uhf_app->scene_manager, UHFSceneWriteCard);
+        //     consumed = true;
+        // }
+    }
+
+    return consumed;
+}
+
+void uhf_scene_saved_menu_on_exit(void* context) {
+    UHFApp* uhf_app = context;
+
+    submenu_reset(uhf_app->submenu);
+}

+ 7 - 7
scenes/uhf_scene_start.c

@@ -31,14 +31,14 @@ bool uhf_scene_start_on_event(void* ctx, SceneManagerEvent event) {
             scene_manager_set_scene_state(uhf_app->scene_manager, UHFSceneStart, SubmenuIndexRead);
             scene_manager_next_scene(uhf_app->scene_manager, UHFSceneReadTag);
             consumed = true;
+        } else if(event.event == SubmenuIndexSaved) {
+            // Explicitly save state so that the correct item is
+            // reselected if the user cancels loading a file.
+            scene_manager_set_scene_state(
+                uhf_app->scene_manager, UHFSceneStart, SubmenuIndexSaved);
+            scene_manager_next_scene(uhf_app->scene_manager, UHFSceneFileSelect);
+            consumed = true;
         }
-        // else if(event.event == SubmenuIndexSaved) {
-        // Explicitly save state so that the correct item is
-        // reselected if the user cancels loading a file.
-        // scene_manager_set_scene_state(
-        //     uhf_app->scene_manager, UHFSceneStart, SubmenuIndexSaved);
-        // scene_manager_next_scene(uhf_app->scene_manager, UHFSceneFileSelect);
-        // consumed = true;
         // } else if(event.event == SubmenuIndexEliteDictAttack) {
         //     scene_manager_set_scene_state(
         //         uhf_app->scene_manager, UHFSceneStart, SubmenuIndexEliteDictAttack);

+ 1 - 0
uhf_app.c

@@ -70,6 +70,7 @@ UHFApp* uhf_alloc() {
 
     // device
     uhf_app->uhf_device = uhf_device_alloc();
+    // use same linked list
     uhf_app->uhf_device->dev_data = uhf_app->worker->response_data;
 
     // Open Notification record

+ 101 - 97
uhf_device.c

@@ -19,7 +19,7 @@ UHFDevice* uhf_device_alloc() {
     return uhf_device;
 }
 
-void picopass_device_set_name(UHFDevice* dev, const char* name) {
+void uhf_device_set_name(UHFDevice* dev, const char* name) {
     furi_assert(dev);
 
     strlcpy(dev->dev_name, name, UHF_DEV_NAME_MAX_LEN);
@@ -58,39 +58,47 @@ static bool uhf_device_save_file(
         UHFData* rfu_data = uhf_response_data_get_uhf_data(uhf_response_data, 1);
         if(rfu_data->length) {
             if(!flipper_format_write_hex(
-                   file, "RFU", rfu_data->data + bank_data_start, bank_data_length))
+                   file, UHF_RFU_BANK, rfu_data->data + bank_data_start, bank_data_length))
                 return false;
         } else {
-            if(!flipper_format_write_hex(file, "RFU", UHF_BANK_DOES_NOT_EXIST, 1)) return false;
+            if(!flipper_format_write_hex(
+                   file, UHF_RFU_BANK, UHF_BANK_DOES_NOT_EXIST, bank_data_length))
+                return false;
         }
 
         // write epc data to file
         UHFData* epc_data = uhf_response_data_get_uhf_data(uhf_response_data, 2);
         if(epc_data->length) {
             if(!flipper_format_write_hex(
-                   file, "EPC", epc_data->data + bank_data_start, bank_data_length))
+                   file, UHF_EPC_BANK, epc_data->data + bank_data_start, bank_data_length))
                 return false;
         } else {
-            if(!flipper_format_write_hex(file, "EPC", UHF_BANK_DOES_NOT_EXIST, 1)) return false;
+            if(!flipper_format_write_hex(
+                   file, UHF_EPC_BANK, UHF_BANK_DOES_NOT_EXIST, bank_data_length))
+                return false;
         }
 
         // write tid data to file
         UHFData* tid_data = uhf_response_data_get_uhf_data(uhf_response_data, 3);
         if(tid_data->length) {
             if(!flipper_format_write_hex(
-                   file, "TID", tid_data->data + bank_data_start, bank_data_length))
+                   file, UHF_TID_BANK, tid_data->data + bank_data_start, bank_data_length))
                 return false;
         } else {
-            if(!flipper_format_write_hex(file, "TID", UHF_BANK_DOES_NOT_EXIST, 1)) return false;
+            if(!flipper_format_write_hex(
+                   file, UHF_TID_BANK, UHF_BANK_DOES_NOT_EXIST, bank_data_length))
+                return false;
         }
         // write user data to file
         UHFData* user_data = uhf_response_data_get_uhf_data(uhf_response_data, 4);
         if(user_data->length) {
             if(!flipper_format_write_hex(
-                   file, "USER", user_data->data + bank_data_start, bank_data_length))
+                   file, UHF_USER_BANK, user_data->data + bank_data_start, bank_data_length))
                 return false;
         } else {
-            if(!flipper_format_write_hex(file, "USER", UHF_BANK_DOES_NOT_EXIST, 1)) return false;
+            if(!flipper_format_write_hex(
+                   file, UHF_USER_BANK, UHF_BANK_DOES_NOT_EXIST, bank_data_length))
+                return false;
         }
         saved = true;
     } while(0);
@@ -111,75 +119,71 @@ bool uhf_device_save(UHFDevice* dev, const char* dev_name) {
 }
 // uncomment
 
-// static bool uhf_device_load_data(UHFDevice* dev, FuriString* path, bool show_dialog) {
-//     bool parsed = false;
-//     FlipperFormat* file = flipper_format_file_alloc(dev->storage);
-//     FuriString* temp_str;
-//     temp_str = furi_string_alloc();
-//     bool deprecated_version = false;
+static bool uhf_device_load_data(UHFDevice* dev, FuriString* path, bool show_dialog) {
+    bool parsed = false;
+    FlipperFormat* file = flipper_format_file_alloc(dev->storage);
+    UHFResponseData* uhf_response_data = dev->dev_data;
+    // reset response list
+    uhf_response_data_reset(uhf_response_data);
+    FuriString* temp_str;
+    temp_str = furi_string_alloc();
+    bool deprecated_version = false;
 
-//     if(dev->loading_cb) {
-//         dev->loading_cb(dev->loading_cb_ctx, true);
-//     }
+    if(dev->loading_cb) {
+        dev->loading_cb(dev->loading_cb_ctx, true);
+    }
 
-//     do {
-//         if(!flipper_format_file_open_existing(file, furi_string_get_cstr(path))) break;
+    do {
+        if(!flipper_format_file_open_existing(file, furi_string_get_cstr(path))) break;
+
+        // Read and verify file header
+        uint32_t version = 0;
+        if(!flipper_format_read_header(file, temp_str, &version)) break;
+        if(furi_string_cmp_str(temp_str, uhf_file_header) || (version != uhf_file_version)) {
+            deprecated_version = true;
+            break;
+        }
 
-//         // Read and verify file header
-//         uint32_t version = 0;
-//         if(!flipper_format_read_header(file, temp_str, &version)) break;
-//         if(furi_string_cmp_str(temp_str, uhf_file_header) || (version != uhf_file_version)) {
-//             deprecated_version = true;
-//             break;
-//         }
+        // Parse RFU Bank
+        UHFData* rfu_bank = uhf_response_data_get_uhf_data(uhf_response_data, 0);
+        if(!flipper_format_read_hex(file, UHF_RFU_BANK, rfu_bank->data, bank_data_length)) break;
 
-//         // // Parse header blocks
-//         // bool block_read = true;
-//         // for(size_t i = 0; i < 6; i++) {
-//         //     furi_string_printf(temp_str, "Block %d", i);
-//         //     if(!flipper_format_read_hex(
-//         //            file, furi_string_get_cstr(temp_str), AA1[i].data, PICOPASS_BLOCK_LEN)) {
-//         //         block_read = false;
-//         //         break;
-//         //     }
-//         // }
-
-//         // size_t app_limit = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0];
-//         // // Fix for unpersonalized cards that have app_limit set to 0xFF
-//         // if(app_limit > PICOPASS_MAX_APP_LIMIT) app_limit = PICOPASS_MAX_APP_LIMIT;
-//         // for(size_t i = 6; i < app_limit; i++) {
-//         //     furi_string_printf(temp_str, "Block %d", i);
-//         //     if(!flipper_format_read_hex(
-//         //            file, furi_string_get_cstr(temp_str), AA1[i].data, PICOPASS_BLOCK_LEN)) {
-//         //         block_read = false;
-//         //         break;
-//         //     }
-//         // }
-//         // if(!block_read) break;
-
-//         // if(picopass_device_parse_credential(AA1, pacs) != ERR_NONE) break;
-//         // if(picopass_device_parse_wiegand(pacs->credential, &pacs->record) != ERR_NONE) break;
-
-//         parsed = true;
-//     } while(false);
-
-//     if(dev->loading_cb) {
-//         dev->loading_cb(dev->loading_cb_ctx, false);
-//     }
+        rfu_bank->length = bank_data_length;
 
-//     if((!parsed) && (show_dialog)) {
-//         if(deprecated_version) {
-//             dialog_message_show_storage_error(dev->dialogs, "File format deprecated");
-//         } else {
-//             dialog_message_show_storage_error(dev->dialogs, "Can not parse\nfile");
-//         }
-//     }
+        // Parse EPC Bank
+        UHFData* epc_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+        if(!flipper_format_read_hex(file, UHF_EPC_BANK, epc_bank->data, bank_data_length)) break;
+        epc_bank->length = bank_data_length;
 
-//     furi_string_free(temp_str);
-//     flipper_format_free(file);
+        // Parse TID Bank
+        UHFData* tid_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+        if(!flipper_format_read_hex(file, UHF_TID_BANK, tid_bank->data, bank_data_length)) break;
+        tid_bank->length = bank_data_length;
 
-//     return parsed;
-// }
+        // Parse USER Bank
+        UHFData* user_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+        if(!flipper_format_read_hex(file, UHF_USER_BANK, user_bank->data, bank_data_length)) break;
+        user_bank->length = bank_data_length;
+        parsed = true;
+    } while(false);
+
+    if(dev->loading_cb) {
+        dev->loading_cb(dev->loading_cb_ctx, false);
+    }
+
+    if((!parsed) && (show_dialog)) {
+        if(deprecated_version) {
+            dialog_message_show_storage_error(dev->dialogs, "File format deprecated");
+        } else {
+            dialog_message_show_storage_error(dev->dialogs, "Can not parse\nfile");
+        }
+    }
+
+    furi_string_free(temp_str);
+    flipper_format_free(file);
+
+    return parsed;
+}
 
 // void picopass_device_clear(UHFDevice* dev) {
 //     furi_assert(dev);
@@ -200,34 +204,34 @@ void uhf_device_free(UHFDevice* uhf_dev) {
     free(uhf_dev);
 }
 
-// bool uhf_file_select(UHFDevice* dev) {
-//     furi_assert(dev);
+bool uhf_file_select(UHFDevice* dev) {
+    furi_assert(dev);
 
-//     FuriString* uhf_app_folder;
-//     uhf_app_folder = furi_string_alloc_set(STORAGE_APP_DATA_PATH_PREFIX);
-
-//     DialogsFileBrowserOptions browser_options;
-//     dialog_file_browser_set_basic_options(&browser_options, UHF_APP_EXTENSION, &I_Nfc_10px);
-//     browser_options.base_path = STORAGE_APP_DATA_PATH_PREFIX;
-
-//     bool res =
-//         dialog_file_browser_show(dev->dialogs, dev->load_path, uhf_app_folder, &browser_options);
-
-//     furi_string_free(uhf_app_folder);
-//     if(res) {
-//         FuriString* filename;
-//         filename = furi_string_alloc();
-//         path_extract_filename(dev->load_path, filename, true);
-//         strncpy(dev->dev_name, furi_string_get_cstr(filename), UHF_DEV_NAME_MAX_LEN);
-//         res = uhf_device_load_data(dev, dev->load_path, true);
-//         if(res) {
-//             uhf_device_set_name(dev, dev->dev_name);
-//         }
-//         furi_string_free(filename);
-//     }
+    FuriString* uhf_app_folder;
+    uhf_app_folder = furi_string_alloc_set(STORAGE_APP_DATA_PATH_PREFIX);
+
+    DialogsFileBrowserOptions browser_options;
+    dialog_file_browser_set_basic_options(&browser_options, UHF_APP_EXTENSION, &I_Nfc_10px);
+    browser_options.base_path = STORAGE_APP_DATA_PATH_PREFIX;
+
+    bool res =
+        dialog_file_browser_show(dev->dialogs, dev->load_path, uhf_app_folder, &browser_options);
+
+    furi_string_free(uhf_app_folder);
+    if(res) {
+        FuriString* filename;
+        filename = furi_string_alloc();
+        path_extract_filename(dev->load_path, filename, true);
+        strncpy(dev->dev_name, furi_string_get_cstr(filename), UHF_DEV_NAME_MAX_LEN);
+        res = uhf_device_load_data(dev, dev->load_path, true);
+        if(res) {
+            uhf_device_set_name(dev, dev->dev_name);
+        }
+        furi_string_free(filename);
+    }
 
-//     return res;
-// }
+    return res;
+}
 
 // void uhf_device_data_clear(UHFDevice* dev_data) {
 //     for(size_t i = 0; i < PICOPASS_MAX_APP_LIMIT; i++) {

+ 9 - 2
uhf_device.h

@@ -13,8 +13,15 @@
 #define PICOPASS_READER_DATA_MAX_SIZE 64
 #define PICOPASS_BLOCK_LEN 8
 #define PICOPASS_MAX_APP_LIMIT 32
-#define UHF_BANK_DOES_NOT_EXIST (uint8_t[]){0xFF}
-
+#define UHF_BANK_DOES_NOT_EXIST                                                                   \
+    (uint8_t[]) {                                                                                 \
+        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \
+            0xFF                                                                                  \
+    }
+#define UHF_RFU_BANK "RFU"
+#define UHF_EPC_BANK "EPC"
+#define UHF_TID_BANK "TID"
+#define UHF_USER_BANK "USER"
 
 #define UHF_APP_EXTENSION ".uhf"
 // #define PICOPASS_APP_SHADOW_EXTENSION ".pas"