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

[FL-1299] iButton fix previous scene transition #480

gornekich 4 лет назад
Родитель
Сommit
89d1b0546e

+ 3 - 0
applications/ibutton/ibutton-app.h

@@ -22,6 +22,7 @@
 #include "scene/ibutton-scene-save-name.h"
 #include "scene/ibutton-scene-save-success.h"
 #include "scene/ibutton-scene-info.h"
+#include "scene/ibutton-scene-select-key.h"
 #include "scene/ibutton-scene-add-type.h"
 #include "scene/ibutton-scene-add-value.h"
 
@@ -62,6 +63,7 @@ public:
         SceneSaveName,
         SceneSaveSuccess,
         SceneInfo,
+        SceneSelectKey,
         SceneAddType,
         SceneAddValue,
     };
@@ -140,6 +142,7 @@ private:
         {Scene::SceneSaveName, new iButtonSceneSaveName()},
         {Scene::SceneSaveSuccess, new iButtonSceneSaveSuccess()},
         {Scene::SceneInfo, new iButtonSceneInfo()},
+        {Scene::SceneSelectKey, new iButtonSceneSelectKey()},
         {Scene::SceneAddType, new iButtonSceneAddType()},
         {Scene::SceneAddValue, new iButtonSceneAddValue()},
     };

+ 1 - 1
applications/ibutton/scene/ibutton-scene-delete-success.cpp

@@ -25,7 +25,7 @@ bool iButtonSceneDeleteSuccess::on_event(iButtonApp* app, iButtonEvent* event) {
     bool consumed = false;
 
     if(event->type == iButtonEvent::Type::EventTypeBack) {
-        app->search_and_switch_to_previous_scene({iButtonApp::Scene::SceneStart});
+        app->search_and_switch_to_previous_scene({iButtonApp::Scene::SceneSelectKey});
         consumed = true;
     }
 

+ 51 - 0
applications/ibutton/scene/ibutton-scene-select-key.cpp

@@ -0,0 +1,51 @@
+#include "ibutton-scene-select-key.h"
+#include "../ibutton-app.h"
+#include "../ibutton-event.h"
+#include "../ibutton-key.h"
+
+void iButtonSceneSelectKey::on_enter(iButtonApp* app) {
+    // Input events and views are managed by file_select
+    bool res = app->get_sd_ex_api()->file_select(
+        app->get_sd_ex_api()->context,
+        "ibutton",
+        "*",
+        app->get_file_name(),
+        app->get_file_name_size());
+
+    // Process file_select return
+    if(res) {
+        // Get key file path
+        string_t key_str;
+        string_init_set_str(key_str, "ibutton/");
+        string_cat_str(key_str, app->get_file_name());
+
+        // Read data from file
+        File key_file;
+        uint8_t key_data[IBUTTON_KEY_DATA_SIZE + 1] = {};
+        // TODO process false result from file system service
+        app->get_fs_api()->file.open(
+            &key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING);
+        app->get_fs_api()->file.read(&key_file, key_data, IBUTTON_KEY_DATA_SIZE + 1);
+        app->get_fs_api()->file.close(&key_file);
+        string_clear(key_str);
+
+        // Set key data
+        iButtonKeyType key_type = static_cast<iButtonKeyType>(key_data[0]);
+        if(key_type > iButtonKeyType::KeyMetakom) {
+            app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
+        }
+        app->get_key()->set_name(app->get_file_name());
+        app->get_key()->set_type(key_type);
+        app->get_key()->set_data(key_data + 1, IBUTTON_KEY_DATA_SIZE);
+        app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu);
+    } else {
+        app->switch_to_previous_scene();
+    }
+}
+
+bool iButtonSceneSelectKey::on_event(iButtonApp* app, iButtonEvent* event) {
+    return false;
+}
+
+void iButtonSceneSelectKey::on_exit(iButtonApp* app) {
+}

+ 9 - 0
applications/ibutton/scene/ibutton-scene-select-key.h

@@ -0,0 +1,9 @@
+#pragma once
+#include "ibutton-scene-generic.h"
+
+class iButtonSceneSelectKey : public iButtonScene {
+public:
+    void on_enter(iButtonApp* app) final;
+    bool on_event(iButtonApp* app, iButtonEvent* event) final;
+    void on_exit(iButtonApp* app) final;
+};

+ 3 - 34
applications/ibutton/scene/ibutton-scene-start.cpp

@@ -31,40 +31,9 @@ bool iButtonSceneStart::on_event(iButtonApp* app, iButtonEvent* event) {
         case SubmenuIndexRead:
             app->switch_to_next_scene(iButtonApp::Scene::SceneRead);
             break;
-        case SubmenuIndexSaved: {
-            bool res = app->get_sd_ex_api()->file_select(
-                app->get_sd_ex_api()->context,
-                "ibutton",
-                "*",
-                app->get_file_name(),
-                app->get_file_name_size());
-            if(res) {
-                string_t key_str;
-                string_init_set_str(key_str, "ibutton/");
-                string_cat_str(key_str, app->get_file_name());
-                File key_file;
-                uint8_t key_data[IBUTTON_KEY_DATA_SIZE + 1] = {};
-                // Read data from file
-                // TODO handle false return
-                res = app->get_fs_api()->file.open(
-                    &key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING);
-                res = app->get_fs_api()->file.read(&key_file, key_data, IBUTTON_KEY_DATA_SIZE + 1);
-                res = app->get_fs_api()->file.close(&key_file);
-                string_clear(key_str);
-                // Set key
-                iButtonKeyType key_type = static_cast<iButtonKeyType>(key_data[0]);
-                if(key_type > iButtonKeyType::KeyMetakom) {
-                    app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
-                }
-                app->get_key()->set_name(app->get_file_name());
-                app->get_key()->set_type(key_type);
-                app->get_key()->set_data(key_data + 1, IBUTTON_KEY_DATA_SIZE);
-                app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu);
-            } else {
-                // TODO add error scene
-                app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
-            }
-        }; break;
+        case SubmenuIndexSaved:
+            app->switch_to_next_scene(iButtonApp::Scene::SceneSelectKey);
+            break;
         case SubmenuIndexAdd:
             app->switch_to_next_scene(iButtonApp::Scene::SceneAddType);
             break;