Explorar o código

Merge pull request #40 from zinongli/dev

Load Scene
Luu hai 11 meses
pai
achega
6a8b95ca9c
Modificáronse 7 ficheiros con 87 adicións e 1 borrados
  1. BIN=BIN
      .DS_Store
  2. BIN=BIN
      images/icon.png
  3. 8 0
      metroflip.c
  4. 10 1
      metroflip_i.h
  5. 1 0
      scenes/metroflip_scene_config.h
  6. 66 0
      scenes/metroflip_scene_load.c
  7. 2 0
      scenes/metroflip_scene_start.c

BIN=BIN
.DS_Store


BIN=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 - 1
metroflip_i.h

@@ -48,13 +48,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 +99,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 +145,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)

+ 66 - 0
scenes/metroflip_scene_load.c

@@ -0,0 +1,66 @@
+#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, NULL);
+    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_string_free(card_type);
+    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_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", MetroflipSceneLoad, metroflip_scene_start_submenu_callback, app);
 
 
     submenu_add_item(
     submenu_add_item(
         submenu,
         submenu,