Просмотр исходного кода

Merge branch 'dev' of https://github.com/luu176/Metroflip into dev

Luu 11 месяцев назад
Родитель
Сommit
b74210134a

+ 4 - 0
api/metroflip/metroflip_api.h

@@ -132,6 +132,10 @@ void show_ravkav_event_info(RavKavCardEvent* event, FuriString* parsed_data);
 void show_ravkav_contract_info(RavKavCardContract* contract, FuriString* parsed_data);
 void show_ravkav_contract_info(RavKavCardContract* contract, FuriString* parsed_data);
 
 
 void show_ravkav_environment_info(RavKavCardEnv* environment, FuriString* parsed_data);
 void show_ravkav_environment_info(RavKavCardEnv* environment, FuriString* parsed_data);
+
+extern const Icon I_RFIDDolphinReceive_97x61;
+extern const Icon I_icon;
+
 /*******************/
 /*******************/
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

+ 4 - 1
api/metroflip/metroflip_api_table_i.h

@@ -68,4 +68,7 @@ static constexpr auto metroflip_api_table = sort(create_array_t<sym_entry>(
     API_METHOD(get_ravkav_env_holder_structure, CalypsoApp*, ()),
     API_METHOD(get_ravkav_env_holder_structure, CalypsoApp*, ()),
     API_METHOD(show_ravkav_event_info, void, (RavKavCardEvent*, FuriString*)),
     API_METHOD(show_ravkav_event_info, void, (RavKavCardEvent*, FuriString*)),
     API_METHOD(show_ravkav_contract_info, void, (RavKavCardContract*, FuriString*)),
     API_METHOD(show_ravkav_contract_info, void, (RavKavCardContract*, FuriString*)),
-    API_METHOD(show_ravkav_environment_info, void, (RavKavCardEnv*, FuriString*))));
+    API_METHOD(show_ravkav_environment_info, void, (RavKavCardEnv*, FuriString*)),
+    
+    API_VARIABLE(I_RFIDDolphinReceive_97x61, Icon),
+    API_VARIABLE(I_icon,Icon)));

BIN
images/icon.png


+ 8 - 0
metroflip.c

@@ -78,6 +78,10 @@ Metroflip* metroflip_alloc() {
         app->view_dispatcher, MetroflipViewTextBox, text_box_get_view(app->text_box));
         app->view_dispatcher, MetroflipViewTextBox, text_box_get_view(app->text_box));
     app->text_box_store = furi_string_alloc();
     app->text_box_store = furi_string_alloc();
 
 
+    // Dialog for loading
+    app->dialogs = furi_record_open(RECORD_DIALOGS);
+
+    app->data_loaded = false;
     return app;
     return app;
 }
 }
 
 
@@ -121,6 +125,10 @@ void metroflip_free(Metroflip* app) {
 
 
     // Records
     // Records
     furi_record_close(RECORD_GUI);
     furi_record_close(RECORD_GUI);
+
+    // Dialogs
+    furi_record_close(RECORD_DIALOGS);
+
     free(app);
     free(app);
 }
 }
 
 

+ 10 - 6
metroflip_i.h

@@ -9,11 +9,6 @@
 #include <gui/view_dispatcher.h>
 #include <gui/view_dispatcher.h>
 #include <gui/scene_manager.h>
 #include <gui/scene_manager.h>
 #include "api/nfc/mf_classic_key_cache.h"
 #include "api/nfc/mf_classic_key_cache.h"
-#if __has_include(<assets_icons.h>)
-#include <assets_icons.h>
-#else
-extern const Icon I_RFIDDolphinReceive_97x61;
-#endif
 #include <flipper_application/plugins/composite_resolver.h>
 #include <flipper_application/plugins/composite_resolver.h>
 #include <loader/firmware_api/firmware_api.h>
 #include <loader/firmware_api/firmware_api.h>
 #include <flipper_application/plugins/plugin_manager.h>
 #include <flipper_application/plugins/plugin_manager.h>
@@ -48,13 +43,15 @@ extern const Icon I_RFIDDolphinReceive_97x61;
 #include <strings.h>
 #include <strings.h>
 #include <flipper_application/flipper_application.h>
 #include <flipper_application/flipper_application.h>
 #include <loader/firmware_api/firmware_api.h>
 #include <loader/firmware_api/firmware_api.h>
+#include <applications/services/storage/storage.h>
+#include <applications/services/dialogs/dialogs.h>
 
 
 #include "scenes/metroflip_scene.h"
 #include "scenes/metroflip_scene.h"
 
 
 #include "api/calypso/calypso_i.h"
 #include "api/calypso/calypso_i.h"
 
 
 #define KEY_MASK_BIT_CHECK(key_mask_1, key_mask_2) (((key_mask_1) & (key_mask_2)) == (key_mask_1))
 #define KEY_MASK_BIT_CHECK(key_mask_1, key_mask_2) (((key_mask_1) & (key_mask_2)) == (key_mask_1))
-
+#define METROFLIP_FILE_EXTENSION                   ".metro"
 typedef struct {
 typedef struct {
     Gui* gui;
     Gui* gui;
     SceneManager* scene_manager;
     SceneManager* scene_manager;
@@ -97,6 +94,12 @@ typedef struct {
 
 
     // Calypso specific context
     // Calypso specific context
     CalypsoContext* calypso_context;
     CalypsoContext* calypso_context;
+
+
+    DialogsApp* dialogs;
+
+    bool data_loaded;
+
 } Metroflip;
 } Metroflip;
 
 
 enum MetroflipCustomEvent {
 enum MetroflipCustomEvent {
@@ -137,6 +140,7 @@ typedef enum {
     MetroflipViewTextBox,
     MetroflipViewTextBox,
     MetroflipViewWidget,
     MetroflipViewWidget,
     MetroflipViewUart,
     MetroflipViewUart,
+    MetroflipViewCanvas,
 } MetroflipView;
 } MetroflipView;
 
 
 typedef enum {
 typedef enum {

+ 1 - 0
scenes/metroflip_scene_config.h

@@ -5,3 +5,4 @@ ADD_SCENE(metroflip, ovc, OVC)
 ADD_SCENE(metroflip, supported, Supported)
 ADD_SCENE(metroflip, supported, Supported)
 ADD_SCENE(metroflip, about, About)
 ADD_SCENE(metroflip, about, About)
 ADD_SCENE(metroflip, credits, Credits)
 ADD_SCENE(metroflip, credits, Credits)
+ADD_SCENE(metroflip, load, Load)

+ 65 - 0
scenes/metroflip_scene_load.c

@@ -0,0 +1,65 @@
+#include "../metroflip_i.h"
+#include <dolphin/dolphin.h>
+#include <furi.h>
+#include <bit_lib.h>
+#include <lib/nfc/protocols/nfc_protocol.h>
+#include "../api/metroflip/metroflip_api.h"
+#define TAG "Metroflip:Scene:Load"
+
+void metroflip_scene_load_on_enter(void* context) {
+    Metroflip* app = (Metroflip*)context;
+    // We initialized this to be false every time we enter
+    app->data_loaded = false;
+    // The same string we will use to direct parse scene which plugin to call
+    // Extracted from the file
+    FuriString* card_type = furi_string_alloc();
+
+    // All the app_data browser stuff. Don't worry about this
+    DialogsFileBrowserOptions browser_options;
+    Storage* storage = furi_record_open(RECORD_STORAGE);
+    storage_simply_mkdir(storage, STORAGE_APP_DATA_PATH_PREFIX);
+    dialog_file_browser_set_basic_options(&browser_options, METROFLIP_FILE_EXTENSION, &I_icon);
+    browser_options.base_path = STORAGE_APP_DATA_PATH_PREFIX;
+    FuriString* file_path = furi_string_alloc_set(browser_options.base_path);
+
+    if(dialog_file_browser_show(app->dialogs, file_path, file_path, &browser_options)) {
+        FlipperFormat* format = flipper_format_file_alloc(storage);
+        do {
+            if(!flipper_format_file_open_existing(format, furi_string_get_cstr(file_path))) break;
+            if(!flipper_format_read_string(format, "Card Type", card_type)) break;
+            if(furi_string_equal_str(card_type, "suica")) {
+            }
+            app->data_loaded = true;
+        } while(0);
+        flipper_format_free(format);
+    }
+
+    if(app->data_loaded) {
+        // Direct to the parsing screen just like the auto scene does
+        app->card_type = furi_string_get_cstr(card_type);
+        scene_manager_next_scene(app->scene_manager, MetroflipSceneParse);
+    } else {
+        scene_manager_next_scene(app->scene_manager, MetroflipSceneStart);
+    }
+    furi_string_free(file_path);
+    furi_record_close(RECORD_STORAGE);
+}
+
+bool metroflip_scene_load_on_event(void* context, SceneManagerEvent event) {
+    Metroflip* app = context;
+    UNUSED(event);
+    bool consumed = false;
+    // If they don't select any file in the brwoser and press back button,
+    // the data is not loaded
+    if(!app->data_loaded) {
+        scene_manager_search_and_switch_to_previous_scene(app->scene_manager, MetroflipSceneStart);
+    }
+    consumed = true;
+
+    return consumed;
+}
+
+void metroflip_scene_load_on_exit(void* context) {
+    Metroflip* app = context;
+    UNUSED(app);
+}

+ 2 - 0
scenes/metroflip_scene_parse.c

@@ -1,6 +1,7 @@
 #include "../metroflip_i.h"
 #include "../metroflip_i.h"
 #include <furi.h>
 #include <furi.h>
 #include "../metroflip_plugins.h"
 #include "../metroflip_plugins.h"
+#include "../api/metroflip/metroflip_api.h"
 #define TAG "Metroflip:Scene:Parse"
 #define TAG "Metroflip:Scene:Parse"
 #include <stdio.h>
 #include <stdio.h>
 
 
@@ -63,4 +64,5 @@ void metroflip_scene_parse_on_exit(void* context) {
         composite_api_resolver_free(app->resolver);
         composite_api_resolver_free(app->resolver);
     }
     }
     app->card_type = "unknown";
     app->card_type = "unknown";
+    app->data_loaded = false;
 }
 }

+ 2 - 0
scenes/metroflip_scene_start.c

@@ -20,6 +20,8 @@ void metroflip_scene_start_on_enter(void* context) {
         MetroflipSceneOVC,
         MetroflipSceneOVC,
         metroflip_scene_start_submenu_callback,
         metroflip_scene_start_submenu_callback,
         app);
         app);
+        
+    submenu_add_item(submenu, "Load (not working)", MetroflipSceneLoad, metroflip_scene_start_submenu_callback, app);
 
 
     submenu_add_item(
     submenu_add_item(
         submenu,
         submenu,

+ 1 - 1
scenes/plugins/bip.c

@@ -385,7 +385,7 @@ static bool bip_on_event(Metroflip* app, SceneManagerEvent event) {
 static void bip_on_exit(Metroflip* app) {
 static void bip_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/calypso.c

@@ -2484,7 +2484,7 @@ static bool calypso_on_event(Metroflip* app, SceneManagerEvent event) {
 }
 }
 
 
 static void calypso_on_exit(Metroflip* app) {
 static void calypso_on_exit(Metroflip* app) {
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/charliecard.c

@@ -1298,7 +1298,7 @@ static bool charliecard_on_event(Metroflip* app, SceneManagerEvent event) {
 static void charliecard_on_exit(Metroflip* app) {
 static void charliecard_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/clipper.c

@@ -651,7 +651,7 @@ static void clipper_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/itso.c

@@ -197,7 +197,7 @@ static bool itso_on_event(Metroflip* app, SceneManagerEvent event) {
 static void itso_on_exit(Metroflip* app) {
 static void itso_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/metromoney.c

@@ -188,7 +188,7 @@ static bool metromoney_on_event(Metroflip* app, SceneManagerEvent event) {
 static void metromoney_on_exit(Metroflip* app) {
 static void metromoney_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/myki.c

@@ -180,7 +180,7 @@ static bool myki_on_event(Metroflip* app, SceneManagerEvent event) {
 static void myki_on_exit(Metroflip* app) {
 static void myki_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/opal.c

@@ -301,7 +301,7 @@ static bool opal_on_event(Metroflip* app, SceneManagerEvent event) {
 static void opal_on_exit(Metroflip* app) {
 static void opal_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
     metroflip_app_blink_stop(app);
     metroflip_app_blink_stop(app);
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/smartrider.c

@@ -384,7 +384,7 @@ static bool smartrider_on_event(Metroflip* app, SceneManagerEvent event) {
 static void smartrider_on_exit(Metroflip* app) {
 static void smartrider_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }

+ 1 - 1
scenes/plugins/troika.c

@@ -285,7 +285,7 @@ static bool troika_on_event(Metroflip* app, SceneManagerEvent event) {
 static void troika_on_exit(Metroflip* app) {
 static void troika_on_exit(Metroflip* app) {
     widget_reset(app->widget);
     widget_reset(app->widget);
 
 
-    if(app->poller) {
+    if(app->poller && !app->data_loaded) {
         nfc_poller_stop(app->poller);
         nfc_poller_stop(app->poller);
         nfc_poller_free(app->poller);
         nfc_poller_free(app->poller);
     }
     }