diff --git a/applications/ibutton/helpers/key-info.h b/applications/ibutton/helpers/key-info.h index f64a88e5..1eaf54c3 100644 --- a/applications/ibutton/helpers/key-info.h +++ b/applications/ibutton/helpers/key-info.h @@ -1,7 +1,8 @@ #pragma once #include -static const uint8_t IBUTTON_KEY_SIZE = 8; +static const uint8_t IBUTTON_KEY_DATA_SIZE = 8; +static const uint8_t IBUTTON_KEY_NAME_SIZE = 64; enum class iButtonKeyType : uint8_t { KeyDallas, diff --git a/applications/ibutton/ibutton-key.cpp b/applications/ibutton/ibutton-key.cpp index a32b5003..f8da3775 100644 --- a/applications/ibutton/ibutton-key.cpp +++ b/applications/ibutton/ibutton-key.cpp @@ -2,7 +2,7 @@ #include uint8_t iButtonKey::get_size() { - return IBUTTON_KEY_SIZE; + return IBUTTON_KEY_DATA_SIZE; } void iButtonKey::set_data(uint8_t* _data, uint8_t _data_count) { @@ -13,6 +13,10 @@ void iButtonKey::set_data(uint8_t* _data, uint8_t _data_count) { memcpy(data, _data, _data_count); } +void iButtonKey::clear_data() { + memset(data, 0, get_size()); +} + uint8_t* iButtonKey::get_data() { return data; } @@ -36,10 +40,10 @@ uint8_t iButtonKey::get_type_data_size() { } void iButtonKey::set_name(const char* _name) { - name = _name; + strlcpy(name, _name, IBUTTON_KEY_NAME_SIZE); } -const char* iButtonKey::get_name() { +char* iButtonKey::get_name() { return name; } diff --git a/applications/ibutton/ibutton-key.h b/applications/ibutton/ibutton-key.h index 7a1533dc..d7d8de4b 100644 --- a/applications/ibutton/ibutton-key.h +++ b/applications/ibutton/ibutton-key.h @@ -7,11 +7,12 @@ public: uint8_t get_size(); void set_data(uint8_t* data, uint8_t data_count); + void clear_data(); uint8_t* get_data(); uint8_t get_type_data_size(); void set_name(const char* name); - const char* get_name(); + char* get_name(); void set_type(iButtonKeyType key_type); iButtonKeyType get_key_type(); @@ -19,8 +20,8 @@ public: iButtonKey(); private: - uint8_t data[IBUTTON_KEY_SIZE] = {0, 0, 0, 0, 0, 0, 0, 0}; - const char* name = {0}; + uint8_t data[IBUTTON_KEY_DATA_SIZE] = {0, 0, 0, 0, 0, 0, 0, 0}; + char name[IBUTTON_KEY_NAME_SIZE] = {0}; iButtonKeyType type = iButtonKeyType::KeyDallas; }; \ No newline at end of file diff --git a/applications/ibutton/scene/ibutton-scene-add-type.cpp b/applications/ibutton/scene/ibutton-scene-add-type.cpp index eb465dbf..be875d3c 100644 --- a/applications/ibutton/scene/ibutton-scene-add-type.cpp +++ b/applications/ibutton/scene/ibutton-scene-add-type.cpp @@ -37,6 +37,8 @@ bool iButtonSceneAddType::on_event(iButtonApp* app, iButtonEvent* event) { app->get_key()->set_type(iButtonKeyType::KeyMetakom); break; } + app->get_key()->set_name(""); + app->get_key()->clear_data(); app->switch_to_next_scene(iButtonApp::Scene::SceneAddValue); consumed = true; } diff --git a/applications/ibutton/scene/ibutton-scene-save-name.cpp b/applications/ibutton/scene/ibutton-scene-save-name.cpp index 86428333..46b6df7c 100644 --- a/applications/ibutton/scene/ibutton-scene-save-name.cpp +++ b/applications/ibutton/scene/ibutton-scene-save-name.cpp @@ -34,18 +34,27 @@ bool iButtonSceneSaveName::on_event(iButtonApp* app, iButtonEvent* event) { iButtonKey* key = app->get_key(); 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(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"); + + // First remove key if it was saved + string_init_set_str(key_file_name, "ibutton/"); + string_cat_str(key_file_name, key->get_name()); + app->get_fs_api()->common.remove(string_get_cstr(key_file_name)); + + // Save the key + key->set_name(app->get_text_store()); + string_set_str(key_file_name, "ibutton/"); + string_cat_str(key_file_name, app->get_text_store()); + uint8_t key_data[IBUTTON_KEY_DATA_SIZE + 1]; + key_data[0] = static_cast(key->get_key_type()); + memcpy(key_data + 1, key->get_data(), IBUTTON_KEY_DATA_SIZE); bool res = app->get_fs_api()->file.open( &key_file, string_get_cstr(key_file_name), FSAM_WRITE, FSOM_CREATE_ALWAYS); // TODO process file system errors from file system service if(res) { - res = app->get_fs_api()->file.write(&key_file, key_data, IBUTTON_KEY_SIZE + 1); + res = app->get_fs_api()->file.write(&key_file, key_data, IBUTTON_KEY_DATA_SIZE + 1); res = app->get_fs_api()->file.close(&key_file); app->switch_to_next_scene(iButtonApp::Scene::SceneSaveSuccess); } else { diff --git a/applications/ibutton/scene/ibutton-scene-start.cpp b/applications/ibutton/scene/ibutton-scene-start.cpp index 45f4bc38..f00befa2 100644 --- a/applications/ibutton/scene/ibutton-scene-start.cpp +++ b/applications/ibutton/scene/ibutton-scene-start.cpp @@ -43,12 +43,12 @@ bool iButtonSceneStart::on_event(iButtonApp* app, iButtonEvent* event) { 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] = {}; + 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_SIZE + 1); + 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 @@ -58,7 +58,7 @@ bool iButtonSceneStart::on_event(iButtonApp* app, iButtonEvent* event) { } 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->get_key()->set_data(key_data + 1, IBUTTON_KEY_DATA_SIZE); app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu); } else { // TODO add error scene