Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgornekich <44112859+gornekich@users.noreply.github.com>2021-03-31 20:47:32 +0300
committerGitHub <noreply@github.com>2021-03-31 20:47:32 +0300
commit5309bfae4101e5675bcf961adcd11f8cfb0f5efb (patch)
tree023d121ff85c14d1254ba8420deb96d926169127 /applications/ibutton
parent6375f21cf5170cbd186433378780177621481289 (diff)
[FL-1061] iButton save and load from sd card (#394)
* SD App: fix queue adresses * sd-filesystem: fix making path on file select event * ibutton: add key reading from sd card * ibutton: save ibutton key to sd card * ibutton: add deleting keys from sd card * ibutton: remove KeyStore from application * ibutton: make directory if necessary on key save Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
Diffstat (limited to 'applications/ibutton')
-rw-r--r--applications/ibutton/helpers/key-store.cpp69
-rw-r--r--applications/ibutton/helpers/key-store.h29
-rw-r--r--applications/ibutton/ibutton-app.cpp32
-rw-r--r--applications/ibutton/ibutton-app.h22
-rw-r--r--applications/ibutton/ibutton-key.cpp23
-rw-r--r--applications/ibutton/ibutton-key.h13
-rw-r--r--applications/ibutton/scene/ibutton-scene-delete-confirm.cpp17
-rw-r--r--applications/ibutton/scene/ibutton-scene-delete-success.cpp2
-rw-r--r--applications/ibutton/scene/ibutton-scene-save-name.cpp24
-rw-r--r--applications/ibutton/scene/ibutton-scene-saved.cpp62
-rw-r--r--applications/ibutton/scene/ibutton-scene-saved.h12
-rw-r--r--applications/ibutton/scene/ibutton-scene-start.cpp38
12 files changed, 98 insertions, 245 deletions
diff --git a/applications/ibutton/helpers/key-store.cpp b/applications/ibutton/helpers/key-store.cpp
deleted file mode 100644
index ea33bb37..00000000
--- a/applications/ibutton/helpers/key-store.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "key-store.h"
-#include <furi.h>
-
-uint16_t KeyStore::get_key_count() {
- return store.size();
-}
-
-uint8_t KeyStore::add_key() {
- store.push_back(iButtonKey());
- return get_key_count() - 1;
-}
-
-void KeyStore::set_key_type(uint8_t index, iButtonKeyType type) {
- iButtonKey* key = get_key(index);
- key->set_type(type);
-}
-
-void KeyStore::set_key_name(uint8_t index, char* name) {
- iButtonKey* key = get_key(index);
- char* orphan = strdup(name);
- key->set_name(orphan);
-}
-
-void KeyStore::set_key_data(uint8_t index, uint8_t* data, uint8_t data_size) {
- iButtonKey* key = get_key(index);
- key->set_data(data, data_size);
-}
-
-iButtonKeyType KeyStore::get_key_type(uint8_t index) {
- iButtonKey* key = get_key(index);
- return key->get_key_type();
-}
-
-const char* KeyStore::get_key_name(uint8_t index) {
- iButtonKey* key = get_key(index);
- return key->get_name();
-}
-
-uint8_t* KeyStore::get_key_data(uint8_t index) {
- iButtonKey* key = get_key(index);
- return key->get_data();
-}
-
-void KeyStore::remove_key(uint8_t index) {
- furi_check(index >= 0);
- furi_check(index < get_key_count());
- auto item = std::next(store.begin(), index);
- store.erase(item);
-}
-
-KeyStore::KeyStore() {
- store.push_back(iButtonKey(
- iButtonKeyType::KeyDallas, "Dallas_1", 0x01, 0x41, 0xCE, 0x67, 0x0F, 0x00, 0x00, 0xB6));
- store.push_back(iButtonKey(
- iButtonKeyType::KeyDallas, "Dallas_2", 0x01, 0xFD, 0x0E, 0x84, 0x01, 0x00, 0x00, 0xDB));
- store.push_back(iButtonKey(
- iButtonKeyType::KeyCyfral, "Cyfral_1", 0xA6, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00));
- store.push_back(iButtonKey(
- iButtonKeyType::KeyMetakom, "Metakom_1", 0xB1, 0x2E, 0x47, 0xB2, 0x00, 0x00, 0x00, 0x00));
-}
-
-KeyStore::~KeyStore() {
-}
-
-iButtonKey* KeyStore::get_key(uint8_t index) {
- furi_check(index >= 0);
- furi_check(index < get_key_count());
- return &(*std::next(store.begin(), index));
-}
diff --git a/applications/ibutton/helpers/key-store.h b/applications/ibutton/helpers/key-store.h
deleted file mode 100644
index 8033d4d9..00000000
--- a/applications/ibutton/helpers/key-store.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#pragma once
-#include <stdint.h>
-#include <list>
-#include "key-info.h"
-#include "../ibutton-key.h"
-
-class KeyStore {
-public:
- uint16_t get_key_count();
-
- uint8_t add_key();
-
- void set_key_type(uint8_t index, iButtonKeyType type);
- void set_key_name(uint8_t index, char* name);
- void set_key_data(uint8_t index, uint8_t* data, uint8_t data_size);
-
- iButtonKeyType get_key_type(uint8_t index);
- const char* get_key_name(uint8_t index);
- uint8_t* get_key_data(uint8_t index);
-
- void remove_key(uint8_t index);
-
- KeyStore();
- ~KeyStore();
-
-private:
- std::list<iButtonKey> store;
- iButtonKey* get_key(uint8_t index);
-}; \ No newline at end of file
diff --git a/applications/ibutton/ibutton-app.cpp b/applications/ibutton/ibutton-app.cpp
index 74758280..fef1942f 100644
--- a/applications/ibutton/ibutton-app.cpp
+++ b/applications/ibutton/ibutton-app.cpp
@@ -28,12 +28,16 @@ iButtonApp::iButtonApp() {
api_hal_power_insomnia_enter();
key_worker = new KeyWorker(&ibutton_gpio);
+ sd_ex_api = static_cast<SdCard_Api*>(furi_record_open("sdcard-ex"));
+ fs_api = static_cast<FS_Api*>(furi_record_open("sdcard"));
// we need random
srand(DWT->CYCCNT);
}
iButtonApp::~iButtonApp() {
+ furi_record_close("sdcard-ex");
+ furi_record_close("sdcard");
api_hal_power_insomnia_exit();
}
@@ -107,6 +111,22 @@ iButtonKey* iButtonApp::get_key() {
return &key;
}
+SdCard_Api* iButtonApp::get_sd_ex_api() {
+ return sd_ex_api;
+}
+
+FS_Api* iButtonApp::get_fs_api() {
+ return fs_api;
+}
+
+char* iButtonApp::get_file_name() {
+ return file_name;
+}
+
+uint8_t iButtonApp::get_file_name_size() {
+ return file_name_size;
+}
+
void iButtonApp::notify_init() {
// TODO open record
const GpioPin* vibro_record = &vibro_gpio;
@@ -193,18 +213,6 @@ uint8_t iButtonApp::get_text_store_size() {
return text_store_size;
}
-KeyStore* iButtonApp::get_key_store() {
- return &store;
-}
-
-uint8_t iButtonApp::get_stored_key_index() {
- return key_index;
-}
-
-void iButtonApp::set_stored_key_index(uint8_t _index) {
- key_index = _index;
-}
-
void iButtonApp::generate_random_name(char* name, uint8_t max_name_size) {
const uint8_t prefix_size = 9;
const char* prefix[prefix_size] = {
diff --git a/applications/ibutton/ibutton-app.h b/applications/ibutton/ibutton-app.h
index 6b32ea5e..142473b9 100644
--- a/applications/ibutton/ibutton-app.h
+++ b/applications/ibutton/ibutton-app.h
@@ -12,7 +12,6 @@
#include "scene/ibutton-scene-readed-key-menu.h"
#include "scene/ibutton-scene-write.h"
#include "scene/ibutton-scene-write-success.h"
-#include "scene/ibutton-scene-saved.h"
#include "scene/ibutton-scene-saved-key-menu.h"
#include "scene/ibutton-scene-delete-confirm.h"
#include "scene/ibutton-scene-delete-success.h"
@@ -23,9 +22,11 @@
#include "scene/ibutton-scene-add-type.h"
#include "scene/ibutton-scene-add-value.h"
-#include "helpers/key-store.h"
#include "helpers/key-worker.h"
+#include <sd-card-api.h>
+#include <filesystem-api.h>
+
#include "one_wire_master.h"
#include "maxim_crc.h"
#include "ibutton-key.h"
@@ -48,7 +49,6 @@ public:
SceneWrite,
SceneWriteSuccess,
SceneEmulate,
- SceneSavedList,
SceneSavedKeyMenu,
SceneDeleteConfirm,
SceneDeleteSuccess,
@@ -88,9 +88,10 @@ public:
char* get_text_store();
uint8_t get_text_store_size();
- KeyStore* get_key_store();
- uint8_t get_stored_key_index();
- void set_stored_key_index(uint8_t index);
+ SdCard_Api* get_sd_ex_api();
+ FS_Api* get_fs_api();
+ char* get_file_name();
+ uint8_t get_file_name_size();
void generate_random_name(char* name, uint8_t max_name_size);
@@ -109,7 +110,6 @@ private:
{Scene::SceneWrite, new iButtonSceneWrite()},
{Scene::SceneWriteSuccess, new iButtonSceneWriteSuccess()},
{Scene::SceneEmulate, new iButtonSceneEmulate()},
- {Scene::SceneSavedList, new iButtonSceneSavedList()},
{Scene::SceneSavedKeyMenu, new iButtonSceneSavedKeyMenu()},
{Scene::SceneDeleteConfirm, new iButtonSceneDeleteConfirm()},
{Scene::SceneDeleteSuccess, new iButtonSceneDeleteSuccess()},
@@ -123,12 +123,14 @@ private:
KeyWorker* key_worker;
iButtonKey key;
- uint8_t key_index = 0;
+
+ SdCard_Api* sd_ex_api;
+ FS_Api* fs_api;
+ static const uint8_t file_name_size = 100;
+ char file_name[file_name_size];
static const uint8_t text_store_size = 128;
char text_store[text_store_size + 1];
- KeyStore store;
-
void notify_init();
}; \ No newline at end of file
diff --git a/applications/ibutton/ibutton-key.cpp b/applications/ibutton/ibutton-key.cpp
index 16a2aa07..a32b5003 100644
--- a/applications/ibutton/ibutton-key.cpp
+++ b/applications/ibutton/ibutton-key.cpp
@@ -51,28 +51,5 @@ iButtonKeyType iButtonKey::get_key_type() {
return type;
}
-iButtonKey::iButtonKey(
- iButtonKeyType _type,
- const char* _name,
- uint8_t d0,
- uint8_t d1,
- uint8_t d2,
- uint8_t d3,
- uint8_t d4,
- uint8_t d5,
- uint8_t d6,
- uint8_t d7) {
- type = _type;
- name = _name;
- data[0] = d0;
- data[1] = d1;
- data[2] = d2;
- data[3] = d3;
- data[4] = d4;
- data[5] = d5;
- data[6] = d6;
- data[7] = d7;
-}
-
iButtonKey::iButtonKey() {
}
diff --git a/applications/ibutton/ibutton-key.h b/applications/ibutton/ibutton-key.h
index aa693180..7a1533dc 100644
--- a/applications/ibutton/ibutton-key.h
+++ b/applications/ibutton/ibutton-key.h
@@ -16,19 +16,6 @@ public:
void set_type(iButtonKeyType key_type);
iButtonKeyType get_key_type();
- // temporary constructor for KeyStore mockup
- iButtonKey(
- iButtonKeyType type,
- const char* name,
- uint8_t d0,
- uint8_t d1,
- uint8_t d2,
- uint8_t d3,
- uint8_t d4,
- uint8_t d5,
- uint8_t d6,
- uint8_t d7);
-
iButtonKey();
private:
diff --git a/applications/ibutton/scene/ibutton-scene-delete-confirm.cpp b/applications/ibutton/scene/ibutton-scene-delete-confirm.cpp
index c9f71d25..84ba94b5 100644
--- a/applications/ibutton/scene/ibutton-scene-delete-confirm.cpp
+++ b/applications/ibutton/scene/ibutton-scene-delete-confirm.cpp
@@ -55,10 +55,19 @@ bool iButtonSceneDeleteConfirm::on_event(iButtonApp* app, iButtonEvent* event) {
if(event->type == iButtonEvent::Type::EventTypeDialogResult) {
if(event->payload.dialog_result == DialogExResultRight) {
- KeyStore* store = app->get_key_store();
- store->remove_key(app->get_stored_key_index());
-
- app->switch_to_next_scene(iButtonApp::Scene::SceneDeleteSuccess);
+ iButtonKey* key = app->get_key();
+ string_t key_file_name;
+ string_init_set_str(key_file_name, "ibutton/");
+ string_cat_str(key_file_name, key->get_name());
+ bool res =
+ (app->get_fs_api()->common.remove(string_get_cstr(key_file_name)) == FSE_OK);
+ string_clear(key_file_name);
+ if(res) {
+ app->switch_to_next_scene(iButtonApp::Scene::SceneDeleteSuccess);
+ } else {
+ // TODO error file path
+ // app->switch_to_next_scene(iButtonApp::Scene::SceneDeleteFail);
+ }
} else {
app->switch_to_previous_scene();
}
diff --git a/applications/ibutton/scene/ibutton-scene-delete-success.cpp b/applications/ibutton/scene/ibutton-scene-delete-success.cpp
index 1127b8f0..e0471daf 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::SceneSavedList});
+ app->search_and_switch_to_previous_scene({iButtonApp::Scene::SceneStart});
consumed = true;
}
diff --git a/applications/ibutton/scene/ibutton-scene-save-name.cpp b/applications/ibutton/scene/ibutton-scene-save-name.cpp
index 7243ba5d..e84cf2f2 100644
--- a/applications/ibutton/scene/ibutton-scene-save-name.cpp
+++ b/applications/ibutton/scene/ibutton-scene-save-name.cpp
@@ -4,6 +4,7 @@
#include "../ibutton-event.h"
#include "../ibutton-key.h"
#include <callback-connector.h>
+#include <filesystem-api.h>
void iButtonSceneSaveName::on_enter(iButtonApp* app) {
iButtonAppViewManager* view_manager = app->get_view_manager();
@@ -28,14 +29,23 @@ bool iButtonSceneSaveName::on_event(iButtonApp* app, iButtonEvent* event) {
bool consumed = false;
if(event->type == iButtonEvent::Type::EventTypeTextEditResult) {
- KeyStore* store = app->get_key_store();
- uint8_t key_index = store->add_key();
iButtonKey* key = app->get_key();
-
- store->set_key_type(key_index, key->get_key_type());
- store->set_key_name(key_index, app->get_text_store());
- store->set_key_data(key_index, key->get_data(), key->get_size());
-
+ File key_file;
+ string_t key_file_name;
+ string_init_set_str(key_file_name, "ibutton/");
+ string_cat_str(key_file_name, app->get_text_store());
+ uint8_t key_data[IBUTTON_KEY_SIZE + 1];
+ key_data[0] = static_cast<uint8_t>(key->get_key_type());
+ memcpy(key_data + 1, key->get_data(), IBUTTON_KEY_SIZE);
+ // Create ibutton directory if necessary
+ app->get_fs_api()->common.mkdir("ibutton");
+ bool res = app->get_fs_api()->file.open(
+ &key_file, string_get_cstr(key_file_name), FSAM_WRITE, FSOM_CREATE_ALWAYS);
+ if(res) {
+ res = app->get_fs_api()->file.write(&key_file, key_data, IBUTTON_KEY_SIZE + 1);
+ res = app->get_fs_api()->file.close(&key_file);
+ }
+ string_clear(key_file_name);
app->switch_to_next_scene(iButtonApp::Scene::SceneSaveSuccess);
consumed = true;
}
diff --git a/applications/ibutton/scene/ibutton-scene-saved.cpp b/applications/ibutton/scene/ibutton-scene-saved.cpp
deleted file mode 100644
index d73755fc..00000000
--- a/applications/ibutton/scene/ibutton-scene-saved.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#include "ibutton-scene-saved.h"
-#include "../ibutton-app.h"
-#include "../ibutton-view-manager.h"
-#include "../ibutton-event.h"
-#include <callback-connector.h>
-
-void iButtonSceneSavedList::on_enter(iButtonApp* app) {
- iButtonAppViewManager* view_manager = app->get_view_manager();
- Submenu* submenu = view_manager->get_submenu();
- auto callback = cbc::obtain_connector(this, &iButtonSceneSavedList::submenu_callback);
-
- KeyStore* store = app->get_key_store();
-
- if(store->get_key_count() > 0) {
- for(uint8_t i = 0; i < store->get_key_count(); i++) {
- submenu_add_item(submenu, store->get_key_name(i), i, callback, app);
- }
- } else {
- submenu_add_item(submenu, "Empty", 0, NULL, NULL);
- }
-
- view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewSubmenu);
-}
-
-bool iButtonSceneSavedList::on_event(iButtonApp* app, iButtonEvent* event) {
- bool consumed = false;
-
- if(event->type == iButtonEvent::Type::EventTypeMenuSelected) {
- uint8_t key_index = event->payload.menu_index;
-
- // store data
- iButtonKey* stored_key_data = app->get_key();
- KeyStore* store = app->get_key_store();
-
- app->set_stored_key_index(key_index);
- stored_key_data->set_name(store->get_key_name(key_index));
- stored_key_data->set_type(store->get_key_type(key_index));
- stored_key_data->set_data(store->get_key_data(key_index), stored_key_data->get_size());
-
- app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu);
- consumed = true;
- }
-
- return consumed;
-}
-
-void iButtonSceneSavedList::on_exit(iButtonApp* app) {
- iButtonAppViewManager* view = app->get_view_manager();
- Submenu* submenu = view->get_submenu();
-
- submenu_clean(submenu);
-}
-
-void iButtonSceneSavedList::submenu_callback(void* context, uint32_t index) {
- iButtonApp* app = static_cast<iButtonApp*>(context);
- iButtonEvent event;
-
- event.type = iButtonEvent::Type::EventTypeMenuSelected;
- event.payload.menu_index = index;
-
- app->get_view_manager()->send_event(&event);
-} \ No newline at end of file
diff --git a/applications/ibutton/scene/ibutton-scene-saved.h b/applications/ibutton/scene/ibutton-scene-saved.h
deleted file mode 100644
index 99a996cd..00000000
--- a/applications/ibutton/scene/ibutton-scene-saved.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-#include "ibutton-scene-generic.h"
-
-class iButtonSceneSavedList : public iButtonScene {
-public:
- void on_enter(iButtonApp* app) final;
- bool on_event(iButtonApp* app, iButtonEvent* event) final;
- void on_exit(iButtonApp* app) final;
-
-private:
- void submenu_callback(void* context, uint32_t index);
-}; \ 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 6944dc14..45f4bc38 100644
--- a/applications/ibutton/scene/ibutton-scene-start.cpp
+++ b/applications/ibutton/scene/ibutton-scene-start.cpp
@@ -3,6 +3,7 @@
#include "../ibutton-view-manager.h"
#include "../ibutton-event.h"
#include <callback-connector.h>
+#include <filesystem-api.h>
typedef enum {
SubmenuIndexRead,
@@ -30,9 +31,40 @@ bool iButtonSceneStart::on_event(iButtonApp* app, iButtonEvent* event) {
case SubmenuIndexRead:
app->switch_to_next_scene(iButtonApp::Scene::SceneRead);
break;
- case SubmenuIndexSaved:
- app->switch_to_next_scene(iButtonApp::Scene::SceneSavedList);
- 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_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_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_SIZE);
+ app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu);
+ } else {
+ // TODO add error scene
+ app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
+ }
+ }; break;
case SubmenuIndexAdd:
app->switch_to_next_scene(iButtonApp::Scene::SceneAddType);
break;