From 93cd7eab04b6d249eace22d838438c412a4189ea Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Sat, 13 Apr 2024 21:32:35 -0700 Subject: [PATCH] scene to show parsed formats --- plugin_interface.h | 3 ++- plugin_wiegand.c | 11 +++++--- scenes/seader_scene_card_menu.c | 19 +++++++++++++ scenes/seader_scene_config.h | 1 + scenes/seader_scene_formats.c | 47 +++++++++++++++++++++++++++++++++ seader.c | 10 +++++++ 6 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 scenes/seader_scene_formats.c diff --git a/plugin_interface.h b/plugin_interface.h index 0e5ca51..714b245 100644 --- a/plugin_interface.h +++ b/plugin_interface.h @@ -8,6 +8,7 @@ #include #include +#include #define PLUGIN_APP_ID "plugin_wiegand" #define PLUGIN_API_VERSION 1 @@ -15,5 +16,5 @@ typedef struct { const char* name; int (*count)(uint8_t, uint64_t); - int (*description)(uint8_t, uint64_t, size_t); + void (*description)(uint8_t, uint64_t, size_t, FuriString*); } PluginWiegand; diff --git a/plugin_wiegand.c b/plugin_wiegand.c index 69e271f..6e2b86d 100644 --- a/plugin_wiegand.c +++ b/plugin_wiegand.c @@ -6,15 +6,18 @@ static int wiegand_format_count(uint8_t bit_length, uint64_t bits) { UNUSED(bit_length); UNUSED(bits); - return 1337; + return 0; } -static int wiegand_format_description(uint8_t bit_length, uint64_t bits, size_t index) { +static void wiegand_format_description( + uint8_t bit_length, + uint64_t bits, + size_t index, + FuriString* description) { UNUSED(bit_length); UNUSED(bits); UNUSED(index); - - return 0; + UNUSED(description); } /* Actual implementation of app<>plugin interface */ diff --git a/scenes/seader_scene_card_menu.c b/scenes/seader_scene_card_menu.c index 7cd6c58..813a47a 100644 --- a/scenes/seader_scene_card_menu.c +++ b/scenes/seader_scene_card_menu.c @@ -6,6 +6,7 @@ enum SubmenuIndex { SubmenuIndexSaveRFID, SubmenuIndexSaveSR, SubmenuIndexSaveMFC, + SubmenuIndexParse, }; void seader_scene_card_menu_submenu_callback(void* context, uint32_t index) { @@ -17,6 +18,7 @@ void seader_scene_card_menu_submenu_callback(void* context, uint32_t index) { void seader_scene_card_menu_on_enter(void* context) { Seader* seader = context; SeaderCredential* credential = seader->credential; + PluginWiegand* plugin = seader->plugin_wiegand; Submenu* submenu = seader->submenu; submenu_add_item( @@ -44,6 +46,18 @@ void seader_scene_card_menu_on_enter(void* context) { submenu_add_item( submenu, "Save MFC", SubmenuIndexSaveMFC, seader_scene_card_menu_submenu_callback, seader); + if(plugin) { + size_t format_count = plugin->count(credential->bit_length, credential->credential); + if(format_count > 0) { + submenu_add_item( + submenu, + "Parse", + SubmenuIndexParse, + seader_scene_card_menu_submenu_callback, + seader); + } + } + submenu_set_selected_item( seader->submenu, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneCardMenu)); @@ -85,6 +99,11 @@ bool seader_scene_card_menu_on_event(void* context, SceneManagerEvent event) { seader->credential->save_format = SeaderCredentialSaveFormatMFC; scene_manager_next_scene(seader->scene_manager, SeaderSceneSaveName); consumed = true; + } else if(event.event == SubmenuIndexParse) { + scene_manager_set_scene_state( + seader->scene_manager, SeaderSceneCardMenu, SubmenuIndexParse); + scene_manager_next_scene(seader->scene_manager, SeaderSceneFormats); + consumed = true; } } else if(event.type == SceneManagerEventTypeBack) { consumed = scene_manager_search_and_switch_to_previous_scene( diff --git a/scenes/seader_scene_config.h b/scenes/seader_scene_config.h index 58914c1..86443dc 100644 --- a/scenes/seader_scene_config.h +++ b/scenes/seader_scene_config.h @@ -15,3 +15,4 @@ ADD_SCENE(seader, delete_success, DeleteSuccess) ADD_SCENE(seader, credential_info, CredentialInfo) ADD_SCENE(seader, sam_info, SamInfo) ADD_SCENE(seader, virtual_credential, VirtualCredential) +ADD_SCENE(seader, formats, Formats) diff --git a/scenes/seader_scene_formats.c b/scenes/seader_scene_formats.c new file mode 100644 index 0000000..f79ebc7 --- /dev/null +++ b/scenes/seader_scene_formats.c @@ -0,0 +1,47 @@ +#include "../seader_i.h" +#include + +void seader_scene_formats_on_enter(void* context) { + Seader* seader = context; + PluginWiegand* plugin = seader->plugin_wiegand; + SeaderCredential* credential = seader->credential; + + FuriString* str = seader->text_box_store; + furi_string_reset(str); + + if(plugin) { + FuriString* description = furi_string_alloc(); + size_t format_count = plugin->count(credential->bit_length, credential->credential); + for(size_t i = 0; i < format_count; i++) { + plugin->description(credential->bit_length, credential->credential, i, description); + + furi_string_cat_printf(str, "%s\n", furi_string_get_cstr(description)); + } + furi_string_free(description); + } + + text_box_set_font(seader->text_box, TextBoxFontHex); + text_box_set_text(seader->text_box, furi_string_get_cstr(seader->text_box_store)); + view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewTextBox); +} + +bool seader_scene_formats_on_event(void* context, SceneManagerEvent event) { + Seader* seader = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == GuiButtonTypeLeft) { + consumed = scene_manager_previous_scene(seader->scene_manager); + } + } else if(event.type == SceneManagerEventTypeBack) { + consumed = scene_manager_previous_scene(seader->scene_manager); + } + return consumed; +} + +void seader_scene_formats_on_exit(void* context) { + Seader* seader = context; + + // Clear views + text_box_reset(seader->text_box); +} diff --git a/seader.c b/seader.c index 1b4f5a8..eb9010e 100644 --- a/seader.c +++ b/seader.c @@ -94,12 +94,22 @@ Seader* seader_alloc() { seader->plugin_manager = plugin_manager_alloc(PLUGIN_APP_ID, PLUGIN_API_VERSION, firmware_api_interface); + seader->plugin_wiegand = NULL; if(plugin_manager_load_all(seader->plugin_manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { FURI_LOG_E(TAG, "Failed to load all libs"); } else { uint32_t plugin_count = plugin_manager_get_count(seader->plugin_manager); FURI_LOG_I(TAG, "Loaded %lu plugin(s)", plugin_count); + + for(uint32_t i = 0; i < plugin_count; i++) { + const PluginWiegand* plugin = plugin_manager_get_ep(seader->plugin_manager, i); + FURI_LOG_I(TAG, "plugin name: %s", plugin->name); + if(strcmp(plugin->name, PLUGIN_APP_ID) == 0) { + // Have to cast to drop "const" qualifier + seader->plugin_wiegand = (PluginWiegand*)plugin; + } + } } return seader;