diff options
author | SG <who.just.the.doctor@gmail.com> | 2021-10-06 12:40:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-06 12:40:28 +0300 |
commit | c8b36dd406e325263df280941d5da1623f96305b (patch) | |
tree | c6a8f08d10579767a9acf181ce7155b118e4aa4f /applications/ibutton | |
parent | e0c1928fde94387f0fc819eda16004c68ce164a6 (diff) |
[FL-1791] Flipper file format (#740)
* Lib: new flipper file format library
* Lib: flipper file format cpp wrapper
* Storage: simple function for remove file and check error
* iButton app: remove file worker, use new flipper file format instead
* Dialogs: storage error message
* Storage: simple function for mkdir and check error
* iButton app: error messages
* Libs: update makefile
* RFID app: remove file worker, use new flipper file format instead
* Flipper File: library documentation
Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Diffstat (limited to 'applications/ibutton')
-rw-r--r-- | applications/ibutton/ibutton-app.cpp | 159 | ||||
-rw-r--r-- | applications/ibutton/ibutton-app.h | 5 | ||||
-rw-r--r-- | applications/ibutton/ibutton-key.cpp | 66 | ||||
-rw-r--r-- | applications/ibutton/ibutton-key.h | 4 |
4 files changed, 137 insertions, 97 deletions
diff --git a/applications/ibutton/ibutton-app.cpp b/applications/ibutton/ibutton-app.cpp index 651d754d..3491c95e 100644 --- a/applications/ibutton/ibutton-app.cpp +++ b/applications/ibutton/ibutton-app.cpp @@ -2,11 +2,12 @@ #include <stdarg.h> #include <callback-connector.h> #include <m-string.h> -#include <file-worker-cpp.h> -#include <lib/toolbox/path.h> +#include <toolbox/path.h> +#include <toolbox/flipper-file-cpp.h> const char* iButtonApp::app_folder = "/any/ibutton"; const char* iButtonApp::app_extension = ".ibtn"; +const char* iButtonApp::app_filetype = "Flipper iButton key"; void iButtonApp::run(void* args) { iButtonEvent event; @@ -37,7 +38,9 @@ void iButtonApp::run(void* args) { } iButtonApp::iButtonApp() - : notification{"notification"} { + : notification{"notification"} + , storage{"storage"} + , dialogs{"dialogs"} { furi_hal_power_insomnia_enter(); key_worker = new KeyWorker(&ibutton_gpio); } @@ -188,102 +191,90 @@ bool iButtonApp::save_key(const char* key_name) { // Create ibutton directory if necessary make_app_folder(); - FileWorkerCpp file_worker; + FlipperFileCpp file(storage); string_t key_file_name; bool result = false; + string_init(key_file_name); - // First remove key if it was saved - string_init_printf(key_file_name, "%s/%s%s", app_folder, get_key()->get_name(), app_extension); - if(!file_worker.remove(string_get_cstr(key_file_name))) { - string_clear(key_file_name); - return false; - }; + do { + // First remove key if it was saved (we rename the key) + if(!delete_key()) break; - // Save the key - get_key()->set_name(key_name); - string_printf(key_file_name, "%s/%s%s", app_folder, get_key()->get_name(), app_extension); + // Save the key + key.set_name(key_name); - bool res = file_worker.open(string_get_cstr(key_file_name), FSAM_WRITE, FSOM_CREATE_ALWAYS); - string_clear(key_file_name); + // Set full file name, for new key + string_printf(key_file_name, "%s/%s%s", app_folder, key.get_name(), app_extension); - if(res) { - // type header - const char* key_type = "E "; + // Open file for write + if(!file.new_write(string_get_cstr(key_file_name))) break; - switch(get_key()->get_key_type()) { - case iButtonKeyType::KeyCyfral: - key_type = "C "; - break; - case iButtonKeyType::KeyDallas: - key_type = "D "; - break; - case iButtonKeyType::KeyMetakom: - key_type = "M "; - break; - } + // Write header + if(!file.write_header_cstr(iButtonApp::app_filetype, 1)) break; - if(!file_worker.write(key_type, 2)) { - file_worker.close(); - return false; - } + // Write key type + if(!file.write_comment_cstr("Key type can be Cyfral, Dallas or Metakom")) break; + const char* key_type = key.get_key_type_string_by_type(key.get_key_type()); + if(!file.write_string_cstr("Key type", key_type)) break; - if(!file_worker.write_hex(get_key()->get_data(), get_key()->get_type_data_size())) { - file_worker.close(); - return false; - } + // Write data + if(!file.write_comment_cstr( + "Data size for Cyfral is 2, for Metakom is 4, for Dallas is 8")) + break; + + if(!file.write_hex_array("Data", key.get_data(), key.get_type_data_size())) break; result = true; - } - file_worker.close(); + } while(false); + + file.close(); + string_clear(key_file_name); + + if(!result) { + dialog_message_show_storage_error(dialogs, "Cannot save\nkey file"); + } return result; } bool iButtonApp::load_key_data(string_t key_path) { - FileWorkerCpp file_worker; + FlipperFileCpp file(storage); + bool result = false; + string_t data; + string_init(data); - // Open key file - if(!file_worker.open(string_get_cstr(key_path), FSAM_READ, FSOM_OPEN_EXISTING)) { - file_worker.close(); - return false; - } + do { + if(!file.open_read(string_get_cstr(key_path))) break; - const uint8_t byte_text_size = 4; - char byte_text[byte_text_size] = {0, 0, 0, 0}; + // header + uint32_t version; + if(!file.read_header(data, &version)) break; + if(string_cmp_str(data, iButtonApp::app_filetype) != 0) break; + if(version != 1) break; - // Load type header - if(!file_worker.read(byte_text, 2)) { - file_worker.close(); - return false; - } + // key type + iButtonKeyType type; + if(!file.read_string("Key type", data)) break; + if(!key.get_key_type_by_type_string(string_get_cstr(data), &type)) break; - iButtonKeyType key_type = iButtonKeyType::KeyCyfral; - if(strcmp(byte_text, "C ") == 0) { - key_type = iButtonKeyType::KeyCyfral; - } else if(strcmp(byte_text, "M ") == 0) { - key_type = iButtonKeyType::KeyMetakom; - } else if(strcmp(byte_text, "D ") == 0) { - key_type = iButtonKeyType::KeyDallas; - } else { - file_worker.show_error("Cannot parse\nkey file"); - file_worker.close(); - return false; - } + // key data + uint8_t key_data[IBUTTON_KEY_DATA_SIZE] = {0}; + if(!file.read_hex_array("Data", key_data, key.get_type_data_size_by_type(type))) break; - iButtonKeyType old_type = get_key()->get_key_type(); - get_key()->set_type(key_type); + key.set_type(type); + key.set_data(key_data, IBUTTON_KEY_DATA_SIZE); - uint8_t key_data[IBUTTON_KEY_DATA_SIZE] = {0, 0, 0, 0, 0, 0, 0, 0}; - if(!file_worker.read_hex(key_data, get_key()->get_type_data_size())) { - get_key()->set_type(old_type); - file_worker.close(); - return false; - } + result = true; + } while(false); - file_worker.close(); - get_key()->set_data(key_data, IBUTTON_KEY_DATA_SIZE); + file.close(); + string_clear(data); - return true; + if(!result) { + dialog_message_show_storage_error(dialogs, "Cannot load\nkey file"); + } + + return result; } bool iButtonApp::load_key(const char* key_name) { @@ -303,11 +294,15 @@ bool iButtonApp::load_key(const char* key_name) { bool iButtonApp::load_key() { bool result = false; - FileWorkerCpp file_worker; // Input events and views are managed by file_select - bool res = file_worker.file_select( - app_folder, app_extension, get_file_name(), get_file_name_size(), get_key()->get_name()); + bool res = dialog_file_select_show( + dialogs, + app_folder, + app_extension, + get_file_name(), + get_file_name_size(), + get_key()->get_name()); if(res) { string_t key_str; @@ -328,16 +323,16 @@ bool iButtonApp::load_key() { bool iButtonApp::delete_key() { string_t file_name; bool result = false; - FileWorkerCpp file_worker; string_init_printf(file_name, "%s/%s%s", app_folder, get_key()->get_name(), app_extension); - result = file_worker.remove(string_get_cstr(file_name)); + result = storage_simply_remove(storage, string_get_cstr(file_name)); string_clear(file_name); return result; } void iButtonApp::make_app_folder() { - FileWorkerCpp file_worker; - file_worker.mkdir(app_folder); + if(!storage_simply_mkdir(storage, app_folder)) { + dialog_message_show_storage_error(dialogs, "Cannot create\napp folder"); + } }
\ No newline at end of file diff --git a/applications/ibutton/ibutton-app.h b/applications/ibutton/ibutton-app.h index 7e6017d5..9751191f 100644 --- a/applications/ibutton/ibutton-app.h +++ b/applications/ibutton/ibutton-app.h @@ -30,6 +30,8 @@ #include "ibutton-key.h" #include <notification/notification-messages.h> +#include <storage/storage.h> +#include <dialogs/dialogs.h> #include <record-controller.hpp> @@ -126,6 +128,8 @@ private: iButtonKey key; RecordController<NotificationApp> notification; + RecordController<Storage> storage; + RecordController<DialogsApp> dialogs; static const uint8_t file_name_size = 100; char file_name[file_name_size]; @@ -135,6 +139,7 @@ private: static const char* app_folder; static const char* app_extension; + static const char* app_filetype; bool load_key_data(string_t key_path); void make_app_folder(); diff --git a/applications/ibutton/ibutton-key.cpp b/applications/ibutton/ibutton-key.cpp index f8da3775..3d459c60 100644 --- a/applications/ibutton/ibutton-key.cpp +++ b/applications/ibutton/ibutton-key.cpp @@ -22,21 +22,7 @@ uint8_t* iButtonKey::get_data() { } uint8_t iButtonKey::get_type_data_size() { - uint8_t size = 0; - - switch(type) { - case iButtonKeyType::KeyCyfral: - size = 2; - break; - case iButtonKeyType::KeyMetakom: - size = 4; - break; - case iButtonKeyType::KeyDallas: - size = 8; - break; - } - - return size; + return get_type_data_size_by_type(type); } void iButtonKey::set_name(const char* _name) { @@ -55,5 +41,55 @@ iButtonKeyType iButtonKey::get_key_type() { return type; } +const char* iButtonKey::get_key_type_string_by_type(iButtonKeyType key_type) { + switch(key_type) { + case iButtonKeyType::KeyCyfral: + return "Cyfral"; + break; + case iButtonKeyType::KeyMetakom: + return "Metakom"; + break; + case iButtonKeyType::KeyDallas: + return "Dallas"; + break; + default: + furi_crash("Invalid iButton type"); + return ""; + break; + } +} + +bool iButtonKey::get_key_type_by_type_string(const char* type_string, iButtonKeyType* key_type) { + if(strcmp(type_string, get_key_type_string_by_type(iButtonKeyType::KeyCyfral)) == 0) { + *key_type = iButtonKeyType::KeyCyfral; + } else if(strcmp(type_string, get_key_type_string_by_type(iButtonKeyType::KeyMetakom)) == 0) { + *key_type = iButtonKeyType::KeyMetakom; + } else if(strcmp(type_string, get_key_type_string_by_type(iButtonKeyType::KeyDallas)) == 0) { + *key_type = iButtonKeyType::KeyDallas; + } else { + return false; + } + + return true; +} + +uint8_t iButtonKey::get_type_data_size_by_type(iButtonKeyType key_type) { + uint8_t size = 0; + + switch(key_type) { + case iButtonKeyType::KeyCyfral: + size = 2; + break; + case iButtonKeyType::KeyMetakom: + size = 4; + break; + case iButtonKeyType::KeyDallas: + size = 8; + break; + } + + return size; +} + iButtonKey::iButtonKey() { } diff --git a/applications/ibutton/ibutton-key.h b/applications/ibutton/ibutton-key.h index d7d8de4b..08e68102 100644 --- a/applications/ibutton/ibutton-key.h +++ b/applications/ibutton/ibutton-key.h @@ -17,6 +17,10 @@ public: void set_type(iButtonKeyType key_type); iButtonKeyType get_key_type(); + const char* get_key_type_string_by_type(iButtonKeyType key_type); + bool get_key_type_by_type_string(const char* type_string, iButtonKeyType* key_type); + uint8_t get_type_data_size_by_type(iButtonKeyType key_type); + iButtonKey(); private: |