瀏覽代碼

Info screen showing figure name

Eric Betts 8 月之前
父節點
當前提交
1d0b578f60

+ 1 - 1
application.fam

@@ -20,5 +20,5 @@ App(
             name="amiitool",
             name="amiitool",
         ),
         ),
     ],
     ],
-
+    fap_file_assets="assets",
 )
 )

+ 12 - 0
assets/figure_ids.nfc

@@ -0,0 +1,12 @@
+Filetype: Flipper NFC resources
+Version: 1
+# ID: Name
+0000: Mario
+0001: Luigi
+0002: Peach
+0003: Yoshi
+0005: Bowser
+0007: Wario
+0006: Bowser Jr.
+0008: Donkey Kong
+0009: Diddy Kong

+ 1 - 0
scenes/weebo_scene_config.h

@@ -5,3 +5,4 @@ ADD_SCENE(weebo, saved_menu, SavedMenu)
 ADD_SCENE(weebo, write, Write)
 ADD_SCENE(weebo, write, Write)
 ADD_SCENE(weebo, write_card_success, WriteCardSuccess)
 ADD_SCENE(weebo, write_card_success, WriteCardSuccess)
 ADD_SCENE(weebo, emulate, Emulate)
 ADD_SCENE(weebo, emulate, Emulate)
+ADD_SCENE(weebo, info, Info)

+ 11 - 2
scenes/weebo_scene_emulate.c

@@ -30,8 +30,17 @@ void weebo_scene_emulate_remix(Weebo* weebo) {
     UID[7] = UID[3] ^ UID[4] ^ UID[5] ^ UID[6];
     UID[7] = UID[3] ^ UID[4] ^ UID[5] ^ UID[6];
     memcpy(weebo->figure + NFC3D_UID_OFFSET, UID, 8);
     memcpy(weebo->figure + NFC3D_UID_OFFSET, UID, 8);
     memcpy(data->iso14443_3a_data->uid, UID, 7);
     memcpy(data->iso14443_3a_data->uid, UID, 7);
-    FURI_LOG_D(TAG, "New UID: %02X%02X%02X%02X%02X%02X%02X%02X",
-               UID[0], UID[1], UID[2], UID[3], UID[4], UID[5], UID[6], UID[7]);
+    FURI_LOG_D(
+        TAG,
+        "New UID: %02X%02X%02X%02X%02X%02X%02X%02X",
+        UID[0],
+        UID[1],
+        UID[2],
+        UID[3],
+        UID[4],
+        UID[5],
+        UID[6],
+        UID[7]);
 
 
     //pack
     //pack
     nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);
     nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);

+ 41 - 0
scenes/weebo_scene_info.c

@@ -0,0 +1,41 @@
+#include "../weebo_i.h"
+#include <dolphin/dolphin.h>
+
+#define TAG "WeeboSceneInfo"
+
+void weebo_scene_info_on_enter(void* context) {
+    Weebo* weebo = context;
+
+    furi_string_reset(weebo->text_box_store);
+    FuriString* str = weebo->text_box_store;
+
+    FuriString* name = furi_string_alloc();
+    furi_string_cat_printf(str, "Info:\n");
+    if(weebo_get_figure_name(weebo, name)) {
+        furi_string_cat_printf(str, "%s\n", furi_string_get_cstr(name));
+    } else {
+        furi_string_cat_printf(str, "Unknown\n");
+    }
+    furi_string_free(name);
+
+    text_box_set_font(weebo->text_box, TextBoxFontText);
+    text_box_set_text(weebo->text_box, furi_string_get_cstr(weebo->text_box_store));
+    view_dispatcher_switch_to_view(weebo->view_dispatcher, WeeboViewTextBox);
+}
+
+bool weebo_scene_info_on_event(void* context, SceneManagerEvent event) {
+    Weebo* weebo = context;
+    bool consumed = false;
+    UNUSED(weebo);
+
+    if(event.type == SceneManagerEventTypeCustom) {
+    }
+    return consumed;
+}
+
+void weebo_scene_info_on_exit(void* context) {
+    Weebo* weebo = context;
+
+    // Clear view
+    text_box_reset(weebo->text_box);
+}

+ 1 - 1
scenes/weebo_scene_main_menu.c

@@ -3,7 +3,7 @@
 #define TAG "SceneMainMenu"
 #define TAG "SceneMainMenu"
 
 
 enum SubmenuIndex {
 enum SubmenuIndex {
-    SubmenuIndexFileSaved= 0,
+    SubmenuIndexFileSaved = 0,
 };
 };
 
 
 void weebo_scene_main_menu_submenu_callback(void* context, uint32_t index) {
 void weebo_scene_main_menu_submenu_callback(void* context, uint32_t index) {

+ 16 - 0
scenes/weebo_scene_saved_menu.c

@@ -5,6 +5,8 @@
 enum SubmenuIndex {
 enum SubmenuIndex {
     SubmenuIndexWrite = 0,
     SubmenuIndexWrite = 0,
     SubmenuIndexEmulate,
     SubmenuIndexEmulate,
+    SubmenuIndexDuplicate,
+    SubmenuIndexInfo,
 };
 };
 
 
 void weebo_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
 void weebo_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
@@ -21,6 +23,14 @@ void weebo_scene_saved_menu_on_enter(void* context) {
         submenu, "Write", SubmenuIndexWrite, weebo_scene_saved_menu_submenu_callback, weebo);
         submenu, "Write", SubmenuIndexWrite, weebo_scene_saved_menu_submenu_callback, weebo);
     submenu_add_item(
     submenu_add_item(
         submenu, "Emulate", SubmenuIndexEmulate, weebo_scene_saved_menu_submenu_callback, weebo);
         submenu, "Emulate", SubmenuIndexEmulate, weebo_scene_saved_menu_submenu_callback, weebo);
+    submenu_add_item(
+        submenu,
+        "Duplicate",
+        SubmenuIndexDuplicate,
+        weebo_scene_saved_menu_submenu_callback,
+        weebo);
+    submenu_add_item(
+        submenu, "Info", SubmenuIndexInfo, weebo_scene_saved_menu_submenu_callback, weebo);
 
 
     submenu_set_selected_item(
     submenu_set_selected_item(
         submenu, scene_manager_get_scene_state(weebo->scene_manager, WeeboSceneSavedMenu));
         submenu, scene_manager_get_scene_state(weebo->scene_manager, WeeboSceneSavedMenu));
@@ -39,6 +49,12 @@ bool weebo_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
         } else if(event.event == SubmenuIndexEmulate) {
         } else if(event.event == SubmenuIndexEmulate) {
             scene_manager_next_scene(weebo->scene_manager, WeeboSceneEmulate);
             scene_manager_next_scene(weebo->scene_manager, WeeboSceneEmulate);
             consumed = true;
             consumed = true;
+        } else if(event.event == SubmenuIndexDuplicate) {
+            //scene_manager_next_scene(weebo->scene_manager, WeeboSceneDuplicate);
+            consumed = true;
+        } else if(event.event == SubmenuIndexInfo) {
+            scene_manager_next_scene(weebo->scene_manager, WeeboSceneInfo);
+            consumed = true;
         }
         }
     } else if(event.type == SceneManagerEventTypeBack) {
     } else if(event.type == SceneManagerEventTypeBack) {
         consumed = scene_manager_search_and_switch_to_previous_scene(
         consumed = scene_manager_search_and_switch_to_previous_scene(

+ 46 - 0
weebo.c

@@ -3,6 +3,11 @@
 #define TAG "weebo"
 #define TAG "weebo"
 
 
 #define WEEBO_KEY_RETAIL_FILENAME "key_retail"
 #define WEEBO_KEY_RETAIL_FILENAME "key_retail"
+#define FIGURE_ID_LIST            APP_ASSETS_PATH("figure_ids.nfc")
+#define UNPACKED_FIGURE_ID        0x1dc
+
+static const char* nfc_resources_header = "Flipper NFC resources";
+static const uint32_t nfc_resources_file_version = 1;
 
 
 bool weebo_load_key_retail(Weebo* weebo) {
 bool weebo_load_key_retail(Weebo* weebo) {
     FuriString* path = furi_string_alloc();
     FuriString* path = furi_string_alloc();
@@ -110,6 +115,47 @@ bool weebo_load_figure(Weebo* weebo, FuriString* path, bool show_dialog) {
     return parsed;
     return parsed;
 }
 }
 
 
+static bool
+    weebo_search_data(Storage* storage, const char* file_name, FuriString* key, FuriString* data) {
+    bool parsed = false;
+    FlipperFormat* file = flipper_format_file_alloc(storage);
+    FuriString* temp_str;
+    temp_str = furi_string_alloc();
+
+    do {
+        // Open file
+        if(!flipper_format_file_open_existing(file, file_name)) break;
+        // Read file header and version
+        uint32_t version = 0;
+        if(!flipper_format_read_header(file, temp_str, &version)) break;
+        if(furi_string_cmp_str(temp_str, nfc_resources_header) ||
+           (version != nfc_resources_file_version))
+            break;
+        if(!flipper_format_read_string(file, furi_string_get_cstr(key), data)) break;
+        parsed = true;
+    } while(false);
+
+    furi_string_free(temp_str);
+    flipper_format_free(file);
+    return parsed;
+}
+
+bool weebo_get_figure_name(Weebo* weebo, FuriString* name) {
+    bool parsed = false;
+
+    uint16_t id = 0;
+    id |= weebo->figure[UNPACKED_FIGURE_ID + 0] << 8;
+    id |= weebo->figure[UNPACKED_FIGURE_ID + 1] << 0;
+    FURI_LOG_D(TAG, "id = %04x", id);
+
+    FuriString* key = furi_string_alloc_printf("%04x", id);
+    if(weebo_search_data(weebo->storage, FIGURE_ID_LIST, key, name)) {
+        parsed = true;
+    }
+    furi_string_free(key);
+    return parsed;
+}
+
 void weebo_set_loading_callback(Weebo* weebo, WeeboLoadingCallback callback, void* context) {
 void weebo_set_loading_callback(Weebo* weebo, WeeboLoadingCallback callback, void* context) {
     furi_assert(weebo);
     furi_assert(weebo);
 
 

+ 2 - 0
weebo.h

@@ -1,3 +1,5 @@
 #pragma once
 #pragma once
 
 
 typedef struct Weebo Weebo;
 typedef struct Weebo Weebo;
+
+bool weebo_get_figure_name(Weebo* weebo, FuriString* name);