From 89d1b0546ed9ed05d8b41b57a343424c2fb03617 Mon Sep 17 00:00:00 2001 From: gornekich Date: Fri, 21 May 2021 14:21:20 +0300 Subject: [PATCH] [FL-1299] iButton fix previous scene transition #480 --- applications/ibutton/ibutton-app.h | 3 ++ .../scene/ibutton-scene-delete-success.cpp | 2 +- .../scene/ibutton-scene-select-key.cpp | 51 +++++++++++++++++++ .../ibutton/scene/ibutton-scene-select-key.h | 9 ++++ .../ibutton/scene/ibutton-scene-start.cpp | 37 ++------------ 5 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 applications/ibutton/scene/ibutton-scene-select-key.cpp create mode 100644 applications/ibutton/scene/ibutton-scene-select-key.h diff --git a/applications/ibutton/ibutton-app.h b/applications/ibutton/ibutton-app.h index 64bae52a..a32d4abd 100644 --- a/applications/ibutton/ibutton-app.h +++ b/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()}, }; diff --git a/applications/ibutton/scene/ibutton-scene-delete-success.cpp b/applications/ibutton/scene/ibutton-scene-delete-success.cpp index e0471daf..5f843338 100644 --- a/applications/ibutton/scene/ibutton-scene-delete-success.cpp +++ b/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; } diff --git a/applications/ibutton/scene/ibutton-scene-select-key.cpp b/applications/ibutton/scene/ibutton-scene-select-key.cpp new file mode 100644 index 00000000..dffc7684 --- /dev/null +++ b/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(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) { +} diff --git a/applications/ibutton/scene/ibutton-scene-select-key.h b/applications/ibutton/scene/ibutton-scene-select-key.h new file mode 100644 index 00000000..07257d29 --- /dev/null +++ b/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; +}; \ No newline at end of file diff --git a/applications/ibutton/scene/ibutton-scene-start.cpp b/applications/ibutton/scene/ibutton-scene-start.cpp index f00befa2..bbeedbd9 100644 --- a/applications/ibutton/scene/ibutton-scene-start.cpp +++ b/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(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;