[FL-2675] /int space reservation (#1448)
* storage: added global #defines for /int, /ext & /any * storage: introduced PATH_EXT, PATH_INT& PATH_ANY macros * core apps: moved hardcoded config files names to separate headers; prefixed them with "."; updater: added file name migration to new naming convention on backup extraction * storage: fixed storage_merge_recursive handling of complex directory structures; storage_move_to_sd: changed data migration logic to all non-dot files & all folders * core: added macro aliases for core record names * Bumped protobuf commit pointer * storage: reserved 5 pages in /int; denying write&creation of non-dot files when running out of free space Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									52a83fc929
								
							
						
					
					
						commit
						056446dfed
					
				| @ -156,10 +156,10 @@ const size_t about_screens_count = sizeof(about_screens) / sizeof(AboutDialogScr | |||||||
| 
 | 
 | ||||||
| int32_t about_settings_app(void* p) { | int32_t about_settings_app(void* p) { | ||||||
|     UNUSED(p); |     UNUSED(p); | ||||||
|     DialogsApp* dialogs = furi_record_open("dialogs"); |     DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|     DialogMessage* message = dialog_message_alloc(); |     DialogMessage* message = dialog_message_alloc(); | ||||||
| 
 | 
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); |     ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); | ||||||
|     EmptyScreen* empty_screen = empty_screen_alloc(); |     EmptyScreen* empty_screen = empty_screen_alloc(); | ||||||
|     const uint32_t empty_screen_index = 0; |     const uint32_t empty_screen_index = 0; | ||||||
| @ -198,12 +198,12 @@ int32_t about_settings_app(void* p) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     dialog_message_free(message); |     dialog_message_free(message); | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_remove_view(view_dispatcher, empty_screen_index); |     view_dispatcher_remove_view(view_dispatcher, empty_screen_index); | ||||||
|     view_dispatcher_free(view_dispatcher); |     view_dispatcher_free(view_dispatcher); | ||||||
|     empty_screen_free(empty_screen); |     empty_screen_free(empty_screen); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @ -16,7 +16,7 @@ bool archive_back_event_callback(void* context) { | |||||||
| ArchiveApp* archive_alloc() { | ArchiveApp* archive_alloc() { | ||||||
|     ArchiveApp* archive = malloc(sizeof(ArchiveApp)); |     ArchiveApp* archive = malloc(sizeof(ArchiveApp)); | ||||||
| 
 | 
 | ||||||
|     archive->gui = furi_record_open("gui"); |     archive->gui = furi_record_open(RECORD_GUI); | ||||||
|     archive->text_input = text_input_alloc(); |     archive->text_input = text_input_alloc(); | ||||||
|     string_init(archive->fav_move_str); |     string_init(archive->fav_move_str); | ||||||
| 
 | 
 | ||||||
| @ -62,7 +62,7 @@ void archive_free(ArchiveApp* archive) { | |||||||
| 
 | 
 | ||||||
|     text_input_free(archive->text_input); |     text_input_free(archive->text_input); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     archive->gui = NULL; |     archive->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     free(archive); |     free(archive); | ||||||
|  | |||||||
| @ -29,21 +29,22 @@ bool archive_app_is_available(void* context, const char* path) { | |||||||
| 
 | 
 | ||||||
|     if(app == ArchiveAppTypeU2f) { |     if(app == ArchiveAppTypeU2f) { | ||||||
|         bool file_exists = false; |         bool file_exists = false; | ||||||
|         Storage* fs_api = furi_record_open("storage"); |         Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|         File* file = storage_file_alloc(fs_api); |         File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|         file_exists = storage_file_open(file, "/any/u2f/key.u2f", FSAM_READ, FSOM_OPEN_EXISTING); |         file_exists = | ||||||
|  |             storage_file_open(file, ANY_PATH("u2f/key.u2f"), FSAM_READ, FSOM_OPEN_EXISTING); | ||||||
|         if(file_exists) { |         if(file_exists) { | ||||||
|             storage_file_close(file); |             storage_file_close(file); | ||||||
|             file_exists = |             file_exists = | ||||||
|                 storage_file_open(file, "/any/u2f/cnt.u2f", FSAM_READ, FSOM_OPEN_EXISTING); |                 storage_file_open(file, ANY_PATH("u2f/cnt.u2f"), FSAM_READ, FSOM_OPEN_EXISTING); | ||||||
|             if(file_exists) { |             if(file_exists) { | ||||||
|                 storage_file_close(file); |                 storage_file_close(file); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         storage_file_free(file); |         storage_file_free(file); | ||||||
|         furi_record_close("storage"); |         furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|         return file_exists; |         return file_exists; | ||||||
|     } else { |     } else { | ||||||
| @ -77,10 +78,10 @@ void archive_app_delete_file(void* context, const char* path) { | |||||||
|     bool res = false; |     bool res = false; | ||||||
| 
 | 
 | ||||||
|     if(app == ArchiveAppTypeU2f) { |     if(app == ArchiveAppTypeU2f) { | ||||||
|         Storage* fs_api = furi_record_open("storage"); |         Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|         res = (storage_common_remove(fs_api, "/any/u2f/key.u2f") == FSE_OK); |         res = (storage_common_remove(fs_api, ANY_PATH("u2f/key.u2f")) == FSE_OK); | ||||||
|         res |= (storage_common_remove(fs_api, "/any/u2f/cnt.u2f") == FSE_OK); |         res |= (storage_common_remove(fs_api, ANY_PATH("u2f/cnt.u2f")) == FSE_OK); | ||||||
|         furi_record_close("storage"); |         furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|         if(archive_is_favorite("/app:u2f/U2F Token")) { |         if(archive_is_favorite("/app:u2f/U2F Token")) { | ||||||
|             archive_favorites_delete("/app:u2f/U2F Token"); |             archive_favorites_delete("/app:u2f/U2F Token"); | ||||||
|  | |||||||
| @ -391,18 +391,18 @@ void archive_favorites_move_mode(ArchiveBrowserView* browser, bool active) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool archive_is_dir_exists(string_t path) { | static bool archive_is_dir_exists(string_t path) { | ||||||
|     if(string_equal_str_p(path, "/any")) { |     if(string_equal_str_p(path, STORAGE_ANY_PATH_PREFIX)) { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|     bool state = false; |     bool state = false; | ||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     if(storage_common_stat(storage, string_get_cstr(path), &file_info) == FSE_OK) { |     if(storage_common_stat(storage, string_get_cstr(path), &file_info) == FSE_OK) { | ||||||
|         if(file_info.flags & FSF_DIRECTORY) { |         if(file_info.flags & FSF_DIRECTORY) { | ||||||
|             state = true; |             state = true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "../archive_i.h" | #include "../archive_i.h" | ||||||
|  | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| #define TAB_RIGHT InputKeyRight // Default tab swith direction
 | #define TAB_RIGHT InputKeyRight // Default tab swith direction
 | ||||||
| #define TAB_DEFAULT ArchiveTabFavorites // Start tab
 | #define TAB_DEFAULT ArchiveTabFavorites // Start tab
 | ||||||
| @ -8,14 +9,14 @@ | |||||||
| 
 | 
 | ||||||
| static const char* tab_default_paths[] = { | static const char* tab_default_paths[] = { | ||||||
|     [ArchiveTabFavorites] = "/app:favorites", |     [ArchiveTabFavorites] = "/app:favorites", | ||||||
|     [ArchiveTabIButton] = "/any/ibutton", |     [ArchiveTabIButton] = ANY_PATH("ibutton"), | ||||||
|     [ArchiveTabNFC] = "/any/nfc", |     [ArchiveTabNFC] = ANY_PATH("nfc"), | ||||||
|     [ArchiveTabSubGhz] = "/any/subghz", |     [ArchiveTabSubGhz] = ANY_PATH("subghz"), | ||||||
|     [ArchiveTabLFRFID] = "/any/lfrfid", |     [ArchiveTabLFRFID] = ANY_PATH("lfrfid"), | ||||||
|     [ArchiveTabInfrared] = "/any/infrared", |     [ArchiveTabInfrared] = ANY_PATH("infrared"), | ||||||
|     [ArchiveTabBadUsb] = "/any/badusb", |     [ArchiveTabBadUsb] = ANY_PATH("badusb"), | ||||||
|     [ArchiveTabU2f] = "/app:u2f", |     [ArchiveTabU2f] = "/app:u2f", | ||||||
|     [ArchiveTabBrowser] = "/any", |     [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const char* known_ext[] = { | static const char* known_ext[] = { | ||||||
|  | |||||||
| @ -49,7 +49,7 @@ static bool archive_favorites_read_line(File* file, string_t str_result) { | |||||||
| uint16_t archive_favorites_count(void* context) { | uint16_t archive_favorites_count(void* context) { | ||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| 
 | 
 | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     string_t buffer; |     string_t buffer; | ||||||
| @ -74,7 +74,7 @@ uint16_t archive_favorites_count(void* context) { | |||||||
| 
 | 
 | ||||||
|     string_clear(buffer); |     string_clear(buffer); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return lines; |     return lines; | ||||||
| } | } | ||||||
| @ -82,7 +82,7 @@ uint16_t archive_favorites_count(void* context) { | |||||||
| static bool archive_favourites_rescan() { | static bool archive_favourites_rescan() { | ||||||
|     string_t buffer; |     string_t buffer; | ||||||
|     string_init(buffer); |     string_init(buffer); | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
|     File* fav_item_file = storage_file_alloc(fs_api); |     File* fav_item_file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
| @ -122,7 +122,7 @@ static bool archive_favourites_rescan() { | |||||||
| 
 | 
 | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     storage_file_free(fav_item_file); |     storage_file_free(fav_item_file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| @ -131,7 +131,7 @@ bool archive_favorites_read(void* context) { | |||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| 
 | 
 | ||||||
|     ArchiveBrowserView* browser = context; |     ArchiveBrowserView* browser = context; | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
|     File* fav_item_file = storage_file_alloc(fs_api); |     File* fav_item_file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
| @ -184,7 +184,7 @@ bool archive_favorites_read(void* context) { | |||||||
|     string_clear(buffer); |     string_clear(buffer); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     storage_file_free(fav_item_file); |     storage_file_free(fav_item_file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     archive_set_item_count(browser, file_count); |     archive_set_item_count(browser, file_count); | ||||||
| 
 | 
 | ||||||
| @ -204,7 +204,7 @@ bool archive_favorites_delete(const char* format, ...) { | |||||||
|     va_end(args); |     va_end(args); | ||||||
| 
 | 
 | ||||||
|     string_init(buffer); |     string_init(buffer); | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); |     bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); | ||||||
| @ -233,7 +233,7 @@ bool archive_favorites_delete(const char* format, ...) { | |||||||
|     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); |     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); | ||||||
| 
 | 
 | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| @ -247,7 +247,7 @@ bool archive_is_favorite(const char* format, ...) { | |||||||
|     va_end(args); |     va_end(args); | ||||||
| 
 | 
 | ||||||
|     string_init(buffer); |     string_init(buffer); | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     bool found = false; |     bool found = false; | ||||||
| @ -272,7 +272,7 @@ bool archive_is_favorite(const char* format, ...) { | |||||||
|     string_clear(buffer); |     string_clear(buffer); | ||||||
|     string_clear(filename); |     string_clear(filename); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return found; |     return found; | ||||||
| } | } | ||||||
| @ -281,7 +281,7 @@ bool archive_favorites_rename(const char* src, const char* dst) { | |||||||
|     furi_assert(src); |     furi_assert(src); | ||||||
|     furi_assert(dst); |     furi_assert(dst); | ||||||
| 
 | 
 | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     string_t path; |     string_t path; | ||||||
| @ -318,7 +318,7 @@ bool archive_favorites_rename(const char* src, const char* dst) { | |||||||
|     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); |     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); | ||||||
| 
 | 
 | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| @ -333,7 +333,7 @@ void archive_favorites_save(void* context) { | |||||||
|     furi_assert(context); |     furi_assert(context); | ||||||
| 
 | 
 | ||||||
|     ArchiveBrowserView* browser = context; |     ArchiveBrowserView* browser = context; | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     for(size_t i = 0; i < archive_file_get_array_size(browser); i++) { |     for(size_t i = 0; i < archive_file_get_array_size(browser); i++) { | ||||||
| @ -346,5 +346,5 @@ void archive_favorites_save(void* context) { | |||||||
|     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); |     storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); | ||||||
| 
 | 
 | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,8 +2,8 @@ | |||||||
| 
 | 
 | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| #define ARCHIVE_FAV_PATH "/any/favorites.txt" | #define ARCHIVE_FAV_PATH ANY_PATH("favorites.txt") | ||||||
| #define ARCHIVE_FAV_TEMP_PATH "/any/favorites.tmp" | #define ARCHIVE_FAV_TEMP_PATH ANY_PATH("favorites.tmp") | ||||||
| 
 | 
 | ||||||
| uint16_t archive_favorites_count(void* context); | uint16_t archive_favorites_count(void* context); | ||||||
| bool archive_favorites_read(void* context); | bool archive_favorites_read(void* context); | ||||||
|  | |||||||
| @ -60,7 +60,7 @@ void archive_file_append(const char* path, const char* format, ...) { | |||||||
|     string_init_vprintf(string, format, args); |     string_init_vprintf(string, format, args); | ||||||
|     va_end(args); |     va_end(args); | ||||||
| 
 | 
 | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(fs_api); |     File* file = storage_file_alloc(fs_api); | ||||||
| 
 | 
 | ||||||
|     bool res = storage_file_open(file, path, FSAM_WRITE, FSOM_OPEN_APPEND); |     bool res = storage_file_open(file, path, FSAM_WRITE, FSOM_OPEN_APPEND); | ||||||
| @ -71,7 +71,7 @@ void archive_file_append(const char* path, const char* format, ...) { | |||||||
| 
 | 
 | ||||||
|     storage_file_close(file); |     storage_file_close(file); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void archive_delete_file(void* context, const char* format, ...) { | void archive_delete_file(void* context, const char* format, ...) { | ||||||
| @ -84,7 +84,7 @@ void archive_delete_file(void* context, const char* format, ...) { | |||||||
|     va_end(args); |     va_end(args); | ||||||
| 
 | 
 | ||||||
|     ArchiveBrowserView* browser = context; |     ArchiveBrowserView* browser = context; | ||||||
|     Storage* fs_api = furi_record_open("storage"); |     Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     FileInfo fileinfo; |     FileInfo fileinfo; | ||||||
|     storage_common_stat(fs_api, string_get_cstr(filename), &fileinfo); |     storage_common_stat(fs_api, string_get_cstr(filename), &fileinfo); | ||||||
| @ -97,7 +97,7 @@ void archive_delete_file(void* context, const char* format, ...) { | |||||||
|         res = (storage_common_remove(fs_api, string_get_cstr(filename)) == FSE_OK); |         res = (storage_common_remove(fs_api, string_get_cstr(filename)) == FSE_OK); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     if(archive_is_favorite("%s", string_get_cstr(filename))) { |     if(archive_is_favorite("%s", string_get_cstr(filename))) { | ||||||
|         archive_favorites_delete("%s", string_get_cstr(filename)); |         archive_favorites_delete("%s", string_get_cstr(filename)); | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ static void archive_loader_callback(const void* message, void* context) { | |||||||
| 
 | 
 | ||||||
| static void archive_run_in_app(ArchiveBrowserView* browser, ArchiveFile_t* selected) { | static void archive_run_in_app(ArchiveBrowserView* browser, ArchiveFile_t* selected) { | ||||||
|     UNUSED(browser); |     UNUSED(browser); | ||||||
|     Loader* loader = furi_record_open("loader"); |     Loader* loader = furi_record_open(RECORD_LOADER); | ||||||
| 
 | 
 | ||||||
|     LoaderStatus status; |     LoaderStatus status; | ||||||
|     if(selected->is_app) { |     if(selected->is_app) { | ||||||
| @ -54,7 +54,7 @@ static void archive_run_in_app(ArchiveBrowserView* browser, ArchiveFile_t* selec | |||||||
|         FURI_LOG_E(TAG, "loader_start failed: %d", status); |         FURI_LOG_E(TAG, "loader_start failed: %d", status); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("loader"); |     furi_record_close(RECORD_LOADER); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void archive_scene_browser_callback(ArchiveBrowserEvent event, void* context) { | void archive_scene_browser_callback(ArchiveBrowserEvent event, void* context) { | ||||||
| @ -71,10 +71,10 @@ void archive_scene_browser_on_enter(void* context) { | |||||||
|     archive_update_focus(browser, archive->text_store); |     archive_update_focus(browser, archive->text_store); | ||||||
|     view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewBrowser); |     view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewBrowser); | ||||||
| 
 | 
 | ||||||
|     Loader* loader = furi_record_open("loader"); |     Loader* loader = furi_record_open(RECORD_LOADER); | ||||||
|     archive->loader_stop_subscription = |     archive->loader_stop_subscription = | ||||||
|         furi_pubsub_subscribe(loader_get_pubsub(loader), archive_loader_callback, archive); |         furi_pubsub_subscribe(loader_get_pubsub(loader), archive_loader_callback, archive); | ||||||
|     furi_record_close("loader"); |     furi_record_close(RECORD_LOADER); | ||||||
| 
 | 
 | ||||||
|     uint32_t state = scene_manager_get_scene_state(archive->scene_manager, ArchiveAppSceneBrowser); |     uint32_t state = scene_manager_get_scene_state(archive->scene_manager, ArchiveAppSceneBrowser); | ||||||
| 
 | 
 | ||||||
| @ -196,10 +196,10 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { | |||||||
|             if(!archive_is_home(browser)) { |             if(!archive_is_home(browser)) { | ||||||
|                 archive_leave_dir(browser); |                 archive_leave_dir(browser); | ||||||
|             } else { |             } else { | ||||||
|                 Loader* loader = furi_record_open("loader"); |                 Loader* loader = furi_record_open(RECORD_LOADER); | ||||||
|                 furi_pubsub_unsubscribe( |                 furi_pubsub_unsubscribe( | ||||||
|                     loader_get_pubsub(loader), archive->loader_stop_subscription); |                     loader_get_pubsub(loader), archive->loader_stop_subscription); | ||||||
|                 furi_record_close("loader"); |                 furi_record_close(RECORD_LOADER); | ||||||
| 
 | 
 | ||||||
|                 view_dispatcher_stop(archive->view_dispatcher); |                 view_dispatcher_stop(archive->view_dispatcher); | ||||||
|             } |             } | ||||||
| @ -216,7 +216,7 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { | |||||||
| void archive_scene_browser_on_exit(void* context) { | void archive_scene_browser_on_exit(void* context) { | ||||||
|     ArchiveApp* archive = (ArchiveApp*)context; |     ArchiveApp* archive = (ArchiveApp*)context; | ||||||
| 
 | 
 | ||||||
|     Loader* loader = furi_record_open("loader"); |     Loader* loader = furi_record_open(RECORD_LOADER); | ||||||
|     furi_pubsub_unsubscribe(loader_get_pubsub(loader), archive->loader_stop_subscription); |     furi_pubsub_unsubscribe(loader_get_pubsub(loader), archive->loader_stop_subscription); | ||||||
|     furi_record_close("loader"); |     furi_record_close(RECORD_LOADER); | ||||||
| } | } | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ bool archive_scene_rename_on_event(void* context, SceneManagerEvent event) { | |||||||
| 
 | 
 | ||||||
|     if(event.type == SceneManagerEventTypeCustom) { |     if(event.type == SceneManagerEventTypeCustom) { | ||||||
|         if(event.event == SCENE_RENAME_CUSTOM_EVENT) { |         if(event.event == SCENE_RENAME_CUSTOM_EVENT) { | ||||||
|             Storage* fs_api = furi_record_open("storage"); |             Storage* fs_api = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|             const char* path_src = archive_get_name(archive->browser); |             const char* path_src = archive_get_name(archive->browser); | ||||||
|             ArchiveFile_t* file = archive_get_current_file(archive->browser); |             ArchiveFile_t* file = archive_get_current_file(archive->browser); | ||||||
| @ -62,7 +62,7 @@ bool archive_scene_rename_on_event(void* context, SceneManagerEvent event) { | |||||||
|             string_cat_printf(path_dst, "/%s%s", archive->text_store, known_ext[file->type]); |             string_cat_printf(path_dst, "/%s%s", archive->text_store, known_ext[file->type]); | ||||||
| 
 | 
 | ||||||
|             storage_common_rename(fs_api, path_src, string_get_cstr(path_dst)); |             storage_common_rename(fs_api, path_src, string_get_cstr(path_dst)); | ||||||
|             furi_record_close("storage"); |             furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|             if(file->fav) { |             if(file->fav) { | ||||||
|                 archive_favorites_rename(path_src, string_get_cstr(path_dst)); |                 archive_favorites_rename(path_src, string_get_cstr(path_dst)); | ||||||
|  | |||||||
| @ -32,9 +32,9 @@ BadUsbApp* bad_usb_app_alloc(char* arg) { | |||||||
|         string_set_str(app->file_path, arg); |         string_set_str(app->file_path, arg); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|     app->notifications = furi_record_open("notification"); |     app->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     app->dialogs = furi_record_open("dialogs"); |     app->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
| 
 | 
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     view_dispatcher_enable_queue(app->view_dispatcher); |     view_dispatcher_enable_queue(app->view_dispatcher); | ||||||
| @ -92,9 +92,9 @@ void bad_usb_app_free(BadUsbApp* app) { | |||||||
|     scene_manager_free(app->scene_manager); |     scene_manager_free(app->scene_manager); | ||||||
| 
 | 
 | ||||||
|     // Close records
 |     // Close records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
| 
 | 
 | ||||||
|     string_clear(app->file_path); |     string_clear(app->file_path); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| #include <gui/modules/widget.h> | #include <gui/modules/widget.h> | ||||||
| #include "views/bad_usb_view.h" | #include "views/bad_usb_view.h" | ||||||
| 
 | 
 | ||||||
| #define BAD_USB_APP_PATH_FOLDER "/any/badusb" | #define BAD_USB_APP_PATH_FOLDER ANY_PATH("badusb") | ||||||
| #define BAD_USB_APP_EXTENSION ".txt" | #define BAD_USB_APP_EXTENSION ".txt" | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|  | |||||||
| @ -455,7 +455,7 @@ static int32_t bad_usb_worker(void* context) { | |||||||
|     FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); |     FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); | ||||||
| 
 | 
 | ||||||
|     FURI_LOG_I(WORKER_TAG, "Init"); |     FURI_LOG_I(WORKER_TAG, "Init"); | ||||||
|     File* script_file = storage_file_alloc(furi_record_open("storage")); |     File* script_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); | ||||||
|     string_init(bad_usb->line); |     string_init(bad_usb->line); | ||||||
|     string_init(bad_usb->line_prev); |     string_init(bad_usb->line_prev); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -33,7 +33,7 @@ static void bt_cli_command_carrier_tx(Cli* cli, string_t args, void* context) { | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Bt* bt = furi_record_open("bt"); |         Bt* bt = furi_record_open(RECORD_BT); | ||||||
|         bt_disconnect(bt); |         bt_disconnect(bt); | ||||||
|         furi_hal_bt_reinit(); |         furi_hal_bt_reinit(); | ||||||
|         printf("Transmitting carrier at %d channel at %d dB power\r\n", channel, power); |         printf("Transmitting carrier at %d channel at %d dB power\r\n", channel, power); | ||||||
| @ -46,7 +46,7 @@ static void bt_cli_command_carrier_tx(Cli* cli, string_t args, void* context) { | |||||||
|         furi_hal_bt_stop_tone_tx(); |         furi_hal_bt_stop_tone_tx(); | ||||||
| 
 | 
 | ||||||
|         bt_set_profile(bt, BtProfileSerial); |         bt_set_profile(bt, BtProfileSerial); | ||||||
|         furi_record_close("bt"); |         furi_record_close(RECORD_BT); | ||||||
|     } while(false); |     } while(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -60,7 +60,7 @@ static void bt_cli_command_carrier_rx(Cli* cli, string_t args, void* context) { | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Bt* bt = furi_record_open("bt"); |         Bt* bt = furi_record_open(RECORD_BT); | ||||||
|         bt_disconnect(bt); |         bt_disconnect(bt); | ||||||
|         furi_hal_bt_reinit(); |         furi_hal_bt_reinit(); | ||||||
|         printf("Receiving carrier at %d channel\r\n", channel); |         printf("Receiving carrier at %d channel\r\n", channel); | ||||||
| @ -77,7 +77,7 @@ static void bt_cli_command_carrier_rx(Cli* cli, string_t args, void* context) { | |||||||
|         furi_hal_bt_stop_packet_test(); |         furi_hal_bt_stop_packet_test(); | ||||||
| 
 | 
 | ||||||
|         bt_set_profile(bt, BtProfileSerial); |         bt_set_profile(bt, BtProfileSerial); | ||||||
|         furi_record_close("bt"); |         furi_record_close(RECORD_BT); | ||||||
|     } while(false); |     } while(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -107,7 +107,7 @@ static void bt_cli_command_packet_tx(Cli* cli, string_t args, void* context) { | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Bt* bt = furi_record_open("bt"); |         Bt* bt = furi_record_open(RECORD_BT); | ||||||
|         bt_disconnect(bt); |         bt_disconnect(bt); | ||||||
|         furi_hal_bt_reinit(); |         furi_hal_bt_reinit(); | ||||||
|         printf( |         printf( | ||||||
| @ -125,7 +125,7 @@ static void bt_cli_command_packet_tx(Cli* cli, string_t args, void* context) { | |||||||
|         printf("Transmitted %lu packets", furi_hal_bt_get_transmitted_packets()); |         printf("Transmitted %lu packets", furi_hal_bt_get_transmitted_packets()); | ||||||
| 
 | 
 | ||||||
|         bt_set_profile(bt, BtProfileSerial); |         bt_set_profile(bt, BtProfileSerial); | ||||||
|         furi_record_close("bt"); |         furi_record_close(RECORD_BT); | ||||||
|     } while(false); |     } while(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -144,7 +144,7 @@ static void bt_cli_command_packet_rx(Cli* cli, string_t args, void* context) { | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Bt* bt = furi_record_open("bt"); |         Bt* bt = furi_record_open(RECORD_BT); | ||||||
|         bt_disconnect(bt); |         bt_disconnect(bt); | ||||||
|         furi_hal_bt_reinit(); |         furi_hal_bt_reinit(); | ||||||
|         printf("Receiving packets at %d channel at %d M datarate\r\n", channel, datarate); |         printf("Receiving packets at %d channel at %d M datarate\r\n", channel, datarate); | ||||||
| @ -160,7 +160,7 @@ static void bt_cli_command_packet_rx(Cli* cli, string_t args, void* context) { | |||||||
|         printf("Received %hu packets", packets_received); |         printf("Received %hu packets", packets_received); | ||||||
| 
 | 
 | ||||||
|         bt_set_profile(bt, BtProfileSerial); |         bt_set_profile(bt, BtProfileSerial); | ||||||
|         furi_record_close("bt"); |         furi_record_close(RECORD_BT); | ||||||
|     } while(false); |     } while(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -180,7 +180,7 @@ static void bt_cli_print_usage() { | |||||||
| 
 | 
 | ||||||
| static void bt_cli(Cli* cli, string_t args, void* context) { | static void bt_cli(Cli* cli, string_t args, void* context) { | ||||||
|     UNUSED(context); |     UNUSED(context); | ||||||
|     furi_record_open("bt"); |     furi_record_open(RECORD_BT); | ||||||
| 
 | 
 | ||||||
|     string_t cmd; |     string_t cmd; | ||||||
|     string_init(cmd); |     string_init(cmd); | ||||||
| @ -223,14 +223,14 @@ static void bt_cli(Cli* cli, string_t args, void* context) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     string_clear(cmd); |     string_clear(cmd); | ||||||
|     furi_record_close("bt"); |     furi_record_close(RECORD_BT); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void bt_on_system_start() { | void bt_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(cli, "bt", CliCommandFlagDefault, bt_cli, NULL); |     cli_add_command(cli, RECORD_BT, CliCommandFlagDefault, bt_cli, NULL); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(bt_cli); |     UNUSED(bt_cli); | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ BtDebugApp* bt_debug_app_alloc() { | |||||||
|     bt_settings_load(&app->settings); |     bt_settings_load(&app->settings); | ||||||
| 
 | 
 | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     // View dispatcher
 |     // View dispatcher
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
| @ -88,7 +88,7 @@ void bt_debug_app_free(BtDebugApp* app) { | |||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     // Close gui record
 |     // Close gui record
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     app->gui = NULL; |     app->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     // Free rest
 |     // Free rest
 | ||||||
| @ -99,7 +99,7 @@ int32_t bt_debug_app(void* p) { | |||||||
|     UNUSED(p); |     UNUSED(p); | ||||||
|     if(!furi_hal_bt_is_testing_supported()) { |     if(!furi_hal_bt_is_testing_supported()) { | ||||||
|         FURI_LOG_E(TAG, "Incorrect radio stack: radio testing fetures are absent."); |         FURI_LOG_E(TAG, "Incorrect radio stack: radio testing fetures are absent."); | ||||||
|         DialogsApp* dialogs = furi_record_open("dialogs"); |         DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|         dialog_message_show_storage_error(dialogs, "Incorrect\nRadioStack"); |         dialog_message_show_storage_error(dialogs, "Incorrect\nRadioStack"); | ||||||
|         return 255; |         return 255; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -70,13 +70,13 @@ BtHid* bt_hid_app_alloc() { | |||||||
|     BtHid* app = malloc(sizeof(BtHid)); |     BtHid* app = malloc(sizeof(BtHid)); | ||||||
| 
 | 
 | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     // Bt
 |     // Bt
 | ||||||
|     app->bt = furi_record_open("bt"); |     app->bt = furi_record_open(RECORD_BT); | ||||||
| 
 | 
 | ||||||
|     // Notifications
 |     // Notifications
 | ||||||
|     app->notifications = furi_record_open("notification"); |     app->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     // View dispatcher
 |     // View dispatcher
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
| @ -161,11 +161,11 @@ void bt_hid_app_free(BtHid* app) { | |||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     // Close records
 |     // Close records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     app->gui = NULL; |     app->gui = NULL; | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     app->notifications = NULL; |     app->notifications = NULL; | ||||||
|     furi_record_close("bt"); |     furi_record_close(RECORD_BT); | ||||||
|     app->bt = NULL; |     app->bt = NULL; | ||||||
| 
 | 
 | ||||||
|     // Free rest
 |     // Free rest
 | ||||||
|  | |||||||
| @ -124,23 +124,23 @@ Bt* bt_alloc() { | |||||||
|     // Pin code view port
 |     // Pin code view port
 | ||||||
|     bt->pin_code_view_port = bt_pin_code_view_port_alloc(bt); |     bt->pin_code_view_port = bt_pin_code_view_port_alloc(bt); | ||||||
|     // Notification
 |     // Notification
 | ||||||
|     bt->notification = furi_record_open("notification"); |     bt->notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     bt->gui = furi_record_open("gui"); |     bt->gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(bt->gui, bt->statusbar_view_port, GuiLayerStatusBarLeft); |     gui_add_view_port(bt->gui, bt->statusbar_view_port, GuiLayerStatusBarLeft); | ||||||
|     gui_add_view_port(bt->gui, bt->pin_code_view_port, GuiLayerFullscreen); |     gui_add_view_port(bt->gui, bt->pin_code_view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     // Dialogs
 |     // Dialogs
 | ||||||
|     bt->dialogs = furi_record_open("dialogs"); |     bt->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|     bt->dialog_message = dialog_message_alloc(); |     bt->dialog_message = dialog_message_alloc(); | ||||||
| 
 | 
 | ||||||
|     // Power
 |     // Power
 | ||||||
|     bt->power = furi_record_open("power"); |     bt->power = furi_record_open(RECORD_POWER); | ||||||
|     FuriPubSub* power_pubsub = power_get_pubsub(bt->power); |     FuriPubSub* power_pubsub = power_get_pubsub(bt->power); | ||||||
|     furi_pubsub_subscribe(power_pubsub, bt_battery_level_changed_callback, bt); |     furi_pubsub_subscribe(power_pubsub, bt_battery_level_changed_callback, bt); | ||||||
| 
 | 
 | ||||||
|     // RPC
 |     // RPC
 | ||||||
|     bt->rpc = furi_record_open("rpc"); |     bt->rpc = furi_record_open(RECORD_RPC); | ||||||
|     bt->rpc_event = furi_event_flag_alloc(); |     bt->rpc_event = furi_event_flag_alloc(); | ||||||
| 
 | 
 | ||||||
|     // API evnent
 |     // API evnent
 | ||||||
| @ -353,7 +353,7 @@ int32_t bt_srv() { | |||||||
|     if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { |     if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { | ||||||
|         FURI_LOG_W(TAG, "Skipped BT init: device in special startup mode"); |         FURI_LOG_W(TAG, "Skipped BT init: device in special startup mode"); | ||||||
|         ble_glue_wait_for_c2_start(FURI_HAL_BT_C2_START_TIMEOUT); |         ble_glue_wait_for_c2_start(FURI_HAL_BT_C2_START_TIMEOUT); | ||||||
|         furi_record_create("bt", bt); |         furi_record_create(RECORD_BT, bt); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -381,7 +381,7 @@ int32_t bt_srv() { | |||||||
|         bt->status = BtStatusUnavailable; |         bt->status = BtStatusUnavailable; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_create("bt", bt); |     furi_record_create(RECORD_BT, bt); | ||||||
| 
 | 
 | ||||||
|     BtMessage message; |     BtMessage message; | ||||||
|     while(1) { |     while(1) { | ||||||
|  | |||||||
| @ -7,6 +7,8 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_BT "bt" | ||||||
|  | 
 | ||||||
| typedef struct Bt Bt; | typedef struct Bt Bt; | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								applications/bt/bt_service/bt_keys_filename.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								applications/bt/bt_service/bt_keys_filename.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define BT_KEYS_STORAGE_FILE_NAME ".bt.keys" | ||||||
| @ -2,8 +2,9 @@ | |||||||
| 
 | 
 | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <lib/toolbox/saved_struct.h> | #include <lib/toolbox/saved_struct.h> | ||||||
|  | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| #define BT_KEYS_STORAGE_PATH "/int/bt.keys" | #define BT_KEYS_STORAGE_PATH INT_PATH(BT_KEYS_STORAGE_FILE_NAME) | ||||||
| #define BT_KEYS_STORAGE_VERSION (0) | #define BT_KEYS_STORAGE_VERSION (0) | ||||||
| #define BT_KEYS_STORAGE_MAGIC (0x18) | #define BT_KEYS_STORAGE_MAGIC (0x18) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "bt_i.h" | #include "bt_i.h" | ||||||
|  | #include "bt_keys_filename.h" | ||||||
| 
 | 
 | ||||||
| bool bt_keys_storage_load(Bt* bt); | bool bt_keys_storage_load(Bt* bt); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,8 +2,9 @@ | |||||||
| 
 | 
 | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <lib/toolbox/saved_struct.h> | #include <lib/toolbox/saved_struct.h> | ||||||
|  | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| #define BT_SETTINGS_PATH "/int/bt.settings" | #define BT_SETTINGS_PATH INT_PATH(BT_SETTINGS_FILE_NAME) | ||||||
| #define BT_SETTINGS_VERSION (0) | #define BT_SETTINGS_VERSION (0) | ||||||
| #define BT_SETTINGS_MAGIC (0x19) | #define BT_SETTINGS_MAGIC (0x19) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "bt_settings_filename.h" | ||||||
|  | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ BtSettingsApp* bt_settings_app_alloc() { | |||||||
| 
 | 
 | ||||||
|     // Load settings
 |     // Load settings
 | ||||||
|     bt_settings_load(&app->settings); |     bt_settings_load(&app->settings); | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|     app->bt = furi_record_open("bt"); |     app->bt = furi_record_open(RECORD_BT); | ||||||
| 
 | 
 | ||||||
|     // View Dispatcher and Scene Manager
 |     // View Dispatcher and Scene Manager
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
| @ -70,8 +70,8 @@ void bt_settings_app_free(BtSettingsApp* app) { | |||||||
|     scene_manager_free(app->scene_manager); |     scene_manager_free(app->scene_manager); | ||||||
| 
 | 
 | ||||||
|     // Records
 |     // Records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("bt"); |     furi_record_close(RECORD_BT); | ||||||
|     free(app); |     free(app); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								applications/bt/bt_settings_filename.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								applications/bt/bt_settings_filename.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define BT_SETTINGS_FILE_NAME ".bt.settings" | ||||||
| @ -185,7 +185,7 @@ static void cli_execute_command(Cli* cli, CliCommand* command, string_t args) { | |||||||
| 
 | 
 | ||||||
|     // Ensure that we running alone
 |     // Ensure that we running alone
 | ||||||
|     if(!(command->flags & CliCommandFlagParallelSafe)) { |     if(!(command->flags & CliCommandFlagParallelSafe)) { | ||||||
|         Loader* loader = furi_record_open("loader"); |         Loader* loader = furi_record_open(RECORD_LOADER); | ||||||
|         bool safety_lock = loader_lock(loader); |         bool safety_lock = loader_lock(loader); | ||||||
|         if(safety_lock) { |         if(safety_lock) { | ||||||
|             // Execute command
 |             // Execute command
 | ||||||
| @ -194,7 +194,7 @@ static void cli_execute_command(Cli* cli, CliCommand* command, string_t args) { | |||||||
|         } else { |         } else { | ||||||
|             printf("Other application is running, close it first"); |             printf("Other application is running, close it first"); | ||||||
|         } |         } | ||||||
|         furi_record_close("loader"); |         furi_record_close(RECORD_LOADER); | ||||||
|     } else { |     } else { | ||||||
|         // Execute command
 |         // Execute command
 | ||||||
|         command->callback(cli, args, command->context); |         command->callback(cli, args, command->context); | ||||||
| @ -466,7 +466,7 @@ int32_t cli_srv(void* p) { | |||||||
|     // Init basic cli commands
 |     // Init basic cli commands
 | ||||||
|     cli_commands_init(cli); |     cli_commands_init(cli); | ||||||
| 
 | 
 | ||||||
|     furi_record_create("cli", cli); |     furi_record_create(RECORD_CLI, cli); | ||||||
| 
 | 
 | ||||||
|     if(cli->session != NULL) { |     if(cli->session != NULL) { | ||||||
|         furi_stdglue_set_thread_stdout_callback(cli->session->tx_stdout); |         furi_stdglue_set_thread_stdout_callback(cli->session->tx_stdout); | ||||||
|  | |||||||
| @ -33,6 +33,8 @@ typedef enum { | |||||||
|     CliCommandFlagInsomniaSafe = (1 << 1), /**< Safe to run with insomnia mode on */ |     CliCommandFlagInsomniaSafe = (1 << 1), /**< Safe to run with insomnia mode on */ | ||||||
| } CliCommandFlag; | } CliCommandFlag; | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_CLI "cli" | ||||||
|  | 
 | ||||||
| /** Cli type anonymous structure */ | /** Cli type anonymous structure */ | ||||||
| typedef struct Cli Cli; | typedef struct Cli Cli; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -166,13 +166,13 @@ void cli_command_vibro(Cli* cli, string_t args, void* context) { | |||||||
|     UNUSED(cli); |     UNUSED(cli); | ||||||
|     UNUSED(context); |     UNUSED(context); | ||||||
|     if(!string_cmp(args, "0")) { |     if(!string_cmp(args, "0")) { | ||||||
|         NotificationApp* notification = furi_record_open("notification"); |         NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|         notification_message_block(notification, &sequence_reset_vibro); |         notification_message_block(notification, &sequence_reset_vibro); | ||||||
|         furi_record_close("notification"); |         furi_record_close(RECORD_NOTIFICATION); | ||||||
|     } else if(!string_cmp(args, "1")) { |     } else if(!string_cmp(args, "1")) { | ||||||
|         NotificationApp* notification = furi_record_open("notification"); |         NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|         notification_message_block(notification, &sequence_set_vibro_on); |         notification_message_block(notification, &sequence_set_vibro_on); | ||||||
|         furi_record_close("notification"); |         furi_record_close(RECORD_NOTIFICATION); | ||||||
|     } else { |     } else { | ||||||
|         cli_print_usage("vibro", "<1|0>", string_get_cstr(args)); |         cli_print_usage("vibro", "<1|0>", string_get_cstr(args)); | ||||||
|     } |     } | ||||||
| @ -244,9 +244,9 @@ void cli_command_led(Cli* cli, string_t args, void* context) { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     // Send notification
 |     // Send notification
 | ||||||
|     NotificationApp* notification = furi_record_open("notification"); |     NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     notification_internal_message_block(notification, ¬ification_sequence); |     notification_internal_message_block(notification, ¬ification_sequence); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cli_command_ps(Cli* cli, string_t args, void* context) { | void cli_command_ps(Cli* cli, string_t args, void* context) { | ||||||
|  | |||||||
| @ -317,9 +317,9 @@ static void crypto_cli(Cli* cli, string_t args, void* context) { | |||||||
| 
 | 
 | ||||||
| void crypto_on_system_start() { | void crypto_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli, NULL); |     cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli, NULL); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(crypto_cli); |     UNUSED(crypto_cli); | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -88,10 +88,10 @@ int32_t blink_test_app(void* p) { | |||||||
|     furi_timer_start(timer, furi_kernel_get_tick_frequency()); |     furi_timer_start(timer, furi_kernel_get_tick_frequency()); | ||||||
| 
 | 
 | ||||||
|     // Register view port in GUI
 |     // Register view port in GUI
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     NotificationApp* notifications = furi_record_open("notification"); |     NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     uint8_t state = 0; |     uint8_t state = 0; | ||||||
|     BlinkEvent event; |     BlinkEvent event; | ||||||
| @ -119,8 +119,8 @@ int32_t blink_test_app(void* p) { | |||||||
|     view_port_free(view_port); |     view_port_free(view_port); | ||||||
|     furi_message_queue_free(event_queue); |     furi_message_queue_free(event_queue); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -127,7 +127,7 @@ DisplayTest* display_test_alloc() { | |||||||
| 
 | 
 | ||||||
|     View* view = NULL; |     View* view = NULL; | ||||||
| 
 | 
 | ||||||
|     instance->gui = furi_record_open("gui"); |     instance->gui = furi_record_open(RECORD_GUI); | ||||||
|     instance->view_dispatcher = view_dispatcher_alloc(); |     instance->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     view_dispatcher_enable_queue(instance->view_dispatcher); |     view_dispatcher_enable_queue(instance->view_dispatcher); | ||||||
|     view_dispatcher_attach_to_gui( |     view_dispatcher_attach_to_gui( | ||||||
| @ -206,7 +206,7 @@ void display_test_free(DisplayTest* instance) { | |||||||
|     view_display_test_free(instance->view_display_test); |     view_display_test_free(instance->view_display_test); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_free(instance->view_dispatcher); |     view_dispatcher_free(instance->view_dispatcher); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     free(instance); |     free(instance); | ||||||
| } | } | ||||||
|  | |||||||
| @ -29,8 +29,8 @@ FileBrowserApp* file_browser_app_alloc(char* arg) { | |||||||
|     UNUSED(arg); |     UNUSED(arg); | ||||||
|     FileBrowserApp* app = malloc(sizeof(FileBrowserApp)); |     FileBrowserApp* app = malloc(sizeof(FileBrowserApp)); | ||||||
| 
 | 
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|     app->dialogs = furi_record_open("dialogs"); |     app->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
| 
 | 
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     view_dispatcher_enable_queue(app->view_dispatcher); |     view_dispatcher_enable_queue(app->view_dispatcher); | ||||||
| @ -80,9 +80,9 @@ void file_browser_app_free(FileBrowserApp* app) { | |||||||
|     scene_manager_free(app->scene_manager); |     scene_manager_free(app->scene_manager); | ||||||
| 
 | 
 | ||||||
|     // Close records
 |     // Close records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
| 
 | 
 | ||||||
|     string_clear(app->file_path); |     string_clear(app->file_path); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| #include "../file_browser_app_i.h" | #include "../file_browser_app_i.h" | ||||||
| #include "furi_hal.h" | 
 | ||||||
| #include "gui/modules/widget_elements/widget_element_i.h" | #include <furi_hal.h> | ||||||
|  | #include <gui/modules/widget_elements/widget_element_i.h> | ||||||
|  | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|     file_browser_scene_start_ok_callback(GuiButtonType result, InputType type, void* context) { |     file_browser_scene_start_ok_callback(GuiButtonType result, InputType type, void* context) { | ||||||
| @ -17,7 +19,7 @@ bool file_browser_scene_start_on_event(void* context, SceneManagerEvent event) { | |||||||
|     bool consumed = false; |     bool consumed = false; | ||||||
| 
 | 
 | ||||||
|     if(event.type == SceneManagerEventTypeCustom) { |     if(event.type == SceneManagerEventTypeCustom) { | ||||||
|         string_set_str(app->file_path, "/any/badusb/demo_windows.txt"); |         string_set_str(app->file_path, ANY_PATH("badusb/demo_windows.txt")); | ||||||
|         scene_manager_next_scene(app->scene_manager, FileBrowserSceneBrowser); |         scene_manager_next_scene(app->scene_manager, FileBrowserSceneBrowser); | ||||||
|         consumed = true; |         consumed = true; | ||||||
|     } else if(event.type == SceneManagerEventTypeTick) { |     } else if(event.type == SceneManagerEventTypeTick) { | ||||||
|  | |||||||
| @ -78,7 +78,7 @@ int32_t keypad_test_app(void* p) { | |||||||
|     view_port_input_callback_set(view_port, keypad_test_input_callback, event_queue); |     view_port_input_callback_set(view_port, keypad_test_input_callback, event_queue); | ||||||
| 
 | 
 | ||||||
|     // Open GUI and register view_port
 |     // Open GUI and register view_port
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     InputEvent event; |     InputEvent event; | ||||||
| @ -149,7 +149,7 @@ int32_t keypad_test_app(void* p) { | |||||||
|     furi_message_queue_free(event_queue); |     furi_message_queue_free(event_queue); | ||||||
|     delete_mutex(&state_mutex); |     delete_mutex(&state_mutex); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -88,7 +88,7 @@ int32_t text_box_test_app(void* p) { | |||||||
|     view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue); |     view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue); | ||||||
| 
 | 
 | ||||||
|     // Open GUI and register view_port
 |     // Open GUI and register view_port
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     uint32_t test_renders_num = COUNT_OF(text_box_test_render); |     uint32_t test_renders_num = COUNT_OF(text_box_test_render); | ||||||
| @ -121,7 +121,7 @@ int32_t text_box_test_app(void* p) { | |||||||
|     furi_message_queue_free(event_queue); |     furi_message_queue_free(event_queue); | ||||||
|     delete_mutex(&state_mutex); |     delete_mutex(&state_mutex); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -189,8 +189,8 @@ static UartEchoApp* uart_echo_app_alloc() { | |||||||
|     app->rx_stream = xStreamBufferCreate(2048, 1); |     app->rx_stream = xStreamBufferCreate(2048, 1); | ||||||
| 
 | 
 | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|     app->notification = furi_record_open("notification"); |     app->notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     // View dispatcher
 |     // View dispatcher
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
| @ -256,8 +256,8 @@ static void uart_echo_app_free(UartEchoApp* app) { | |||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     // Close gui record
 |     // Close gui record
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     app->gui = NULL; |     app->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     vStreamBufferDelete(app->rx_stream); |     vStreamBufferDelete(app->rx_stream); | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ int32_t usb_mouse_app(void* p) { | |||||||
|     view_port_input_callback_set(view_port, usb_mouse_input_callback, event_queue); |     view_port_input_callback_set(view_port, usb_mouse_input_callback, event_queue); | ||||||
| 
 | 
 | ||||||
|     // Open GUI and register view_port
 |     // Open GUI and register view_port
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     UsbMouseEvent event; |     UsbMouseEvent event; | ||||||
|  | |||||||
| @ -59,7 +59,7 @@ UsbTestApp* usb_test_app_alloc() { | |||||||
|     UsbTestApp* app = malloc(sizeof(UsbTestApp)); |     UsbTestApp* app = malloc(sizeof(UsbTestApp)); | ||||||
| 
 | 
 | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     // View dispatcher
 |     // View dispatcher
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
| @ -106,7 +106,7 @@ void usb_test_app_free(UsbTestApp* app) { | |||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     // Close gui record
 |     // Close gui record
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     app->gui = NULL; |     app->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     // Free rest
 |     // Free rest
 | ||||||
|  | |||||||
| @ -32,10 +32,10 @@ int32_t vibro_test_app(void* p) { | |||||||
|     view_port_input_callback_set(view_port, vibro_test_input_callback, event_queue); |     view_port_input_callback_set(view_port, vibro_test_input_callback, event_queue); | ||||||
| 
 | 
 | ||||||
|     // Register view port in GUI
 |     // Register view port in GUI
 | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     NotificationApp* notification = furi_record_open("notification"); |     NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     InputEvent event; |     InputEvent event; | ||||||
| 
 | 
 | ||||||
| @ -60,8 +60,8 @@ int32_t vibro_test_app(void* p) { | |||||||
|     view_port_free(view_port); |     view_port_free(view_port); | ||||||
|     furi_message_queue_free(event_queue); |     furi_message_queue_free(event_queue); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -137,9 +137,9 @@ void animation_manager_check_blocking_process(AnimationManager* animation_manage | |||||||
|         bool blocked = animation_manager_check_blocking(animation_manager); |         bool blocked = animation_manager_check_blocking(animation_manager); | ||||||
| 
 | 
 | ||||||
|         if(!blocked) { |         if(!blocked) { | ||||||
|             Dolphin* dolphin = furi_record_open("dolphin"); |             Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|             DolphinStats stats = dolphin_stats(dolphin); |             DolphinStats stats = dolphin_stats(dolphin); | ||||||
|             furi_record_close("dolphin"); |             furi_record_close(RECORD_DOLPHIN); | ||||||
| 
 | 
 | ||||||
|             const StorageAnimationManifestInfo* manifest_info = |             const StorageAnimationManifestInfo* manifest_info = | ||||||
|                 animation_storage_get_meta(animation_manager->current_animation); |                 animation_storage_get_meta(animation_manager->current_animation); | ||||||
| @ -170,9 +170,9 @@ bool animation_manager_interact_process(AnimationManager* animation_manager) { | |||||||
|         animation_manager->levelup_pending = false; |         animation_manager->levelup_pending = false; | ||||||
|         animation_manager->levelup_active = true; |         animation_manager->levelup_active = true; | ||||||
|         animation_manager_switch_to_one_shot_view(animation_manager); |         animation_manager_switch_to_one_shot_view(animation_manager); | ||||||
|         Dolphin* dolphin = furi_record_open("dolphin"); |         Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|         dolphin_upgrade_level(dolphin); |         dolphin_upgrade_level(dolphin); | ||||||
|         furi_record_close("dolphin"); |         furi_record_close(RECORD_DOLPHIN); | ||||||
|     } else if(animation_manager->levelup_active) { |     } else if(animation_manager->levelup_active) { | ||||||
|         animation_manager->levelup_active = false; |         animation_manager->levelup_active = false; | ||||||
|         animation_manager_start_new_idle(animation_manager); |         animation_manager_start_new_idle(animation_manager); | ||||||
| @ -205,7 +205,7 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| 
 | 
 | ||||||
|     StorageAnimation* blocking_animation = NULL; |     StorageAnimation* blocking_animation = NULL; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FS_Error sd_status = storage_sd_status(storage); |     FS_Error sd_status = storage_sd_status(storage); | ||||||
| 
 | 
 | ||||||
|     if(sd_status == FSE_INTERNAL) { |     if(sd_status == FSE_INTERNAL) { | ||||||
| @ -220,7 +220,7 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
|             furi_assert(blocking_animation); |             furi_assert(blocking_animation); | ||||||
|             animation_manager->sd_shown_sd_ok = true; |             animation_manager->sd_shown_sd_ok = true; | ||||||
|         } else if(!animation_manager->sd_shown_no_db) { |         } else if(!animation_manager->sd_shown_no_db) { | ||||||
|             bool db_exists = storage_common_stat(storage, "/ext/Manifest", NULL) == FSE_OK; |             bool db_exists = storage_common_stat(storage, EXT_PATH("Manifest"), NULL) == FSE_OK; | ||||||
|             if(!db_exists) { |             if(!db_exists) { | ||||||
|                 blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); |                 blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); | ||||||
|                 furi_assert(blocking_animation); |                 furi_assert(blocking_animation); | ||||||
| @ -234,9 +234,9 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
|     if(!blocking_animation && stats.level_up_is_pending) { |     if(!blocking_animation && stats.level_up_is_pending) { | ||||||
|         blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME); |         blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME); | ||||||
|         furi_assert(blocking_animation); |         furi_assert(blocking_animation); | ||||||
| @ -252,7 +252,7 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager | |||||||
|         animation_manager->state = AnimationManagerStateBlocked; |         animation_manager->state = AnimationManagerStateBlocked; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return !!blocking_animation; |     return !!blocking_animation; | ||||||
| } | } | ||||||
| @ -287,15 +287,15 @@ AnimationManager* animation_manager_alloc(void) { | |||||||
|     bubble_animation_view_set_interact_callback( |     bubble_animation_view_set_interact_callback( | ||||||
|         animation_manager->animation_view, animation_manager_interact_callback, animation_manager); |         animation_manager->animation_view, animation_manager_interact_callback, animation_manager); | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     animation_manager->pubsub_subscription_storage = furi_pubsub_subscribe( |     animation_manager->pubsub_subscription_storage = furi_pubsub_subscribe( | ||||||
|         storage_get_pubsub(storage), animation_manager_check_blocking_callback, animation_manager); |         storage_get_pubsub(storage), animation_manager_check_blocking_callback, animation_manager); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     animation_manager->pubsub_subscription_dolphin = furi_pubsub_subscribe( |     animation_manager->pubsub_subscription_dolphin = furi_pubsub_subscribe( | ||||||
|         dolphin_get_pubsub(dolphin), animation_manager_check_blocking_callback, animation_manager); |         dolphin_get_pubsub(dolphin), animation_manager_check_blocking_callback, animation_manager); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
| 
 | 
 | ||||||
|     animation_manager->sd_shown_sd_ok = true; |     animation_manager->sd_shown_sd_ok = true; | ||||||
|     if(!animation_manager_check_blocking(animation_manager)) { |     if(!animation_manager_check_blocking(animation_manager)) { | ||||||
| @ -308,15 +308,15 @@ AnimationManager* animation_manager_alloc(void) { | |||||||
| void animation_manager_free(AnimationManager* animation_manager) { | void animation_manager_free(AnimationManager* animation_manager) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
| 
 | 
 | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     furi_pubsub_unsubscribe( |     furi_pubsub_unsubscribe( | ||||||
|         dolphin_get_pubsub(dolphin), animation_manager->pubsub_subscription_dolphin); |         dolphin_get_pubsub(dolphin), animation_manager->pubsub_subscription_dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     furi_pubsub_unsubscribe( |     furi_pubsub_unsubscribe( | ||||||
|         storage_get_pubsub(storage), animation_manager->pubsub_subscription_storage); |         storage_get_pubsub(storage), animation_manager->pubsub_subscription_storage); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     string_clear(animation_manager->freezed_animation_name); |     string_clear(animation_manager->freezed_animation_name); | ||||||
|     View* animation_view = bubble_animation_get_view(animation_manager->animation_view); |     View* animation_view = bubble_animation_get_view(animation_manager->animation_view); | ||||||
| @ -340,16 +340,16 @@ static bool animation_manager_is_valid_idle_animation( | |||||||
|     bool result = true; |     bool result = true; | ||||||
| 
 | 
 | ||||||
|     if(!strcmp(info->name, BAD_BATTERY_ANIMATION_NAME)) { |     if(!strcmp(info->name, BAD_BATTERY_ANIMATION_NAME)) { | ||||||
|         Power* power = furi_record_open("power"); |         Power* power = furi_record_open(RECORD_POWER); | ||||||
|         bool battery_is_well = power_is_battery_healthy(power); |         bool battery_is_well = power_is_battery_healthy(power); | ||||||
|         furi_record_close("power"); |         furi_record_close(RECORD_POWER); | ||||||
| 
 | 
 | ||||||
|         result = !battery_is_well; |         result = !battery_is_well; | ||||||
|     } |     } | ||||||
|     if(!strcmp(info->name, NO_SD_ANIMATION_NAME)) { |     if(!strcmp(info->name, NO_SD_ANIMATION_NAME)) { | ||||||
|         Storage* storage = furi_record_open("storage"); |         Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|         FS_Error sd_status = storage_sd_status(storage); |         FS_Error sd_status = storage_sd_status(storage); | ||||||
|         furi_record_close("storage"); |         furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|         result = (sd_status == FSE_NOT_READY); |         result = (sd_status == FSE_NOT_READY); | ||||||
|     } |     } | ||||||
| @ -370,9 +370,9 @@ static StorageAnimation* | |||||||
|     StorageAnimationList_init(animation_list); |     StorageAnimationList_init(animation_list); | ||||||
|     animation_storage_fill_animation_list(&animation_list); |     animation_storage_fill_animation_list(&animation_list); | ||||||
| 
 | 
 | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
|     uint32_t whole_weight = 0; |     uint32_t whole_weight = 0; | ||||||
| 
 | 
 | ||||||
|     StorageAnimationList_it_t it; |     StorageAnimationList_it_t it; | ||||||
| @ -492,9 +492,9 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m | |||||||
|             StorageAnimation* restore_animation = animation_storage_find_animation( |             StorageAnimation* restore_animation = animation_storage_find_animation( | ||||||
|                 string_get_cstr(animation_manager->freezed_animation_name)); |                 string_get_cstr(animation_manager->freezed_animation_name)); | ||||||
|             if(restore_animation) { |             if(restore_animation) { | ||||||
|                 Dolphin* dolphin = furi_record_open("dolphin"); |                 Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|                 DolphinStats stats = dolphin_stats(dolphin); |                 DolphinStats stats = dolphin_stats(dolphin); | ||||||
|                 furi_record_close("dolphin"); |                 furi_record_close(RECORD_DOLPHIN); | ||||||
|                 const StorageAnimationManifestInfo* manifest_info = |                 const StorageAnimationManifestInfo* manifest_info = | ||||||
|                     animation_storage_get_meta(restore_animation); |                     animation_storage_get_meta(restore_animation); | ||||||
|                 bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); |                 bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); | ||||||
| @ -543,9 +543,9 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m | |||||||
| static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager) { | static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager) { | ||||||
|     furi_assert(animation_manager); |     furi_assert(animation_manager); | ||||||
|     furi_assert(!animation_manager->one_shot_view); |     furi_assert(!animation_manager->one_shot_view); | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
| 
 | 
 | ||||||
|     animation_manager->one_shot_view = one_shot_view_alloc(); |     animation_manager->one_shot_view = one_shot_view_alloc(); | ||||||
|     one_shot_view_set_interact_callback( |     one_shot_view_set_interact_callback( | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| #include <assets_dolphin_blocking.h> | #include <assets_dolphin_blocking.h> | ||||||
| 
 | 
 | ||||||
| #define ANIMATION_META_FILE "meta.txt" | #define ANIMATION_META_FILE "meta.txt" | ||||||
| #define ANIMATION_DIR "/ext/dolphin" | #define ANIMATION_DIR EXT_PATH("dolphin") | ||||||
| #define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" | #define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" | ||||||
| #define TAG "AnimationStorage" | #define TAG "AnimationStorage" | ||||||
| 
 | 
 | ||||||
| @ -29,7 +29,7 @@ static bool animation_storage_load_single_manifest_info( | |||||||
|     furi_assert(manifest_info); |     furi_assert(manifest_info); | ||||||
| 
 | 
 | ||||||
|     bool result = false; |     bool result = false; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* file = flipper_format_file_alloc(storage); |     FlipperFormat* file = flipper_format_file_alloc(storage); | ||||||
|     flipper_format_set_strict_mode(file, true); |     flipper_format_set_strict_mode(file, true); | ||||||
|     string_t read_string; |     string_t read_string; | ||||||
| @ -75,7 +75,7 @@ static bool animation_storage_load_single_manifest_info( | |||||||
|     string_clear(read_string); |     string_clear(read_string); | ||||||
|     flipper_format_free(file); |     flipper_format_free(file); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| @ -84,7 +84,7 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis | |||||||
|     furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); |     furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); | ||||||
|     furi_assert(!StorageAnimationList_size(*animation_list)); |     furi_assert(!StorageAnimationList_size(*animation_list)); | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* file = flipper_format_file_alloc(storage); |     FlipperFormat* file = flipper_format_file_alloc(storage); | ||||||
|     /* Forbid skipping fields */ |     /* Forbid skipping fields */ | ||||||
|     flipper_format_set_strict_mode(file, true); |     flipper_format_set_strict_mode(file, true); | ||||||
| @ -134,7 +134,7 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis | |||||||
|         StorageAnimationList_push_back(*animation_list, (StorageAnimation*)&dolphin_internal[i]); |         StorageAnimationList_push_back(*animation_list, (StorageAnimation*)&dolphin_internal[i]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| StorageAnimation* animation_storage_find_animation(const char* name) { | StorageAnimation* animation_storage_find_animation(const char* name) { | ||||||
| @ -434,7 +434,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { | |||||||
|     uint32_t height = 0; |     uint32_t height = 0; | ||||||
|     uint32_t width = 0; |     uint32_t width = 0; | ||||||
|     uint32_t* u32array = NULL; |     uint32_t* u32array = NULL; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* ff = flipper_format_file_alloc(storage); |     FlipperFormat* ff = flipper_format_file_alloc(storage); | ||||||
|     /* Forbid skipping fields */ |     /* Forbid skipping fields */ | ||||||
|     flipper_format_set_strict_mode(ff, true); |     flipper_format_set_strict_mode(ff, true); | ||||||
|  | |||||||
| @ -15,6 +15,7 @@ | |||||||
| #include "desktop/views/desktop_view_pin_timeout.h" | #include "desktop/views/desktop_view_pin_timeout.h" | ||||||
| #include "desktop_i.h" | #include "desktop_i.h" | ||||||
| #include "helpers/pin_lock.h" | #include "helpers/pin_lock.h" | ||||||
|  | #include "helpers/slideshow_filename.h" | ||||||
| 
 | 
 | ||||||
| static void desktop_auto_lock_arm(Desktop*); | static void desktop_auto_lock_arm(Desktop*); | ||||||
| static void desktop_auto_lock_inhibit(Desktop*); | static void desktop_auto_lock_inhibit(Desktop*); | ||||||
| @ -127,9 +128,9 @@ void desktop_lock(Desktop* desktop) { | |||||||
| 
 | 
 | ||||||
| void desktop_unlock(Desktop* desktop) { | void desktop_unlock(Desktop* desktop) { | ||||||
|     view_port_enabled_set(desktop->lock_viewport, false); |     view_port_enabled_set(desktop->lock_viewport, false); | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_set_lockdown(gui, false); |     gui_set_lockdown(gui, false); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     desktop_view_locked_unlock(desktop->locked_view); |     desktop_view_locked_unlock(desktop->locked_view); | ||||||
|     scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); |     scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); | ||||||
|     desktop_auto_lock_arm(desktop); |     desktop_auto_lock_arm(desktop); | ||||||
| @ -139,7 +140,7 @@ Desktop* desktop_alloc() { | |||||||
|     Desktop* desktop = malloc(sizeof(Desktop)); |     Desktop* desktop = malloc(sizeof(Desktop)); | ||||||
| 
 | 
 | ||||||
|     desktop->animation_manager = animation_manager_alloc(); |     desktop->animation_manager = animation_manager_alloc(); | ||||||
|     desktop->gui = furi_record_open("gui"); |     desktop->gui = furi_record_open(RECORD_GUI); | ||||||
|     desktop->scene_thread = furi_thread_alloc(); |     desktop->scene_thread = furi_thread_alloc(); | ||||||
|     desktop->view_dispatcher = view_dispatcher_alloc(); |     desktop->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     desktop->scene_manager = scene_manager_alloc(&desktop_scene_handlers, desktop); |     desktop->scene_manager = scene_manager_alloc(&desktop_scene_handlers, desktop); | ||||||
| @ -218,17 +219,17 @@ Desktop* desktop_alloc() { | |||||||
|     gui_add_view_port(desktop->gui, desktop->lock_viewport, GuiLayerStatusBarLeft); |     gui_add_view_port(desktop->gui, desktop->lock_viewport, GuiLayerStatusBarLeft); | ||||||
| 
 | 
 | ||||||
|     // Special case: autostart application is already running
 |     // Special case: autostart application is already running
 | ||||||
|     desktop->loader = furi_record_open("loader"); |     desktop->loader = furi_record_open(RECORD_LOADER); | ||||||
|     if(loader_is_locked(desktop->loader) && |     if(loader_is_locked(desktop->loader) && | ||||||
|        animation_manager_is_animation_loaded(desktop->animation_manager)) { |        animation_manager_is_animation_loaded(desktop->animation_manager)) { | ||||||
|         animation_manager_unload_and_stall_animation(desktop->animation_manager); |         animation_manager_unload_and_stall_animation(desktop->animation_manager); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     desktop->notification = furi_record_open("notification"); |     desktop->notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     desktop->app_start_stop_subscription = furi_pubsub_subscribe( |     desktop->app_start_stop_subscription = furi_pubsub_subscribe( | ||||||
|         loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); |         loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); | ||||||
| 
 | 
 | ||||||
|     desktop->input_events_pubsub = furi_record_open("input_events"); |     desktop->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS); | ||||||
|     desktop->input_events_subscription = NULL; |     desktop->input_events_subscription = NULL; | ||||||
| 
 | 
 | ||||||
|     desktop->auto_lock_timer = |     desktop->auto_lock_timer = | ||||||
| @ -250,9 +251,9 @@ void desktop_free(Desktop* desktop) { | |||||||
| 
 | 
 | ||||||
|     desktop->loader = NULL; |     desktop->loader = NULL; | ||||||
|     desktop->input_events_pubsub = NULL; |     desktop->input_events_pubsub = NULL; | ||||||
|     furi_record_close("loader"); |     furi_record_close(RECORD_LOADER); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     furi_record_close("input_events"); |     furi_record_close(RECORD_INPUT_EVENTS); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_remove_view(desktop->view_dispatcher, DesktopViewIdMain); |     view_dispatcher_remove_view(desktop->view_dispatcher, DesktopViewIdMain); | ||||||
|     view_dispatcher_remove_view(desktop->view_dispatcher, DesktopViewIdLockMenu); |     view_dispatcher_remove_view(desktop->view_dispatcher, DesktopViewIdLockMenu); | ||||||
| @ -276,7 +277,7 @@ void desktop_free(Desktop* desktop) { | |||||||
|     popup_free(desktop->hw_mismatch_popup); |     popup_free(desktop->hw_mismatch_popup); | ||||||
|     desktop_view_pin_timeout_free(desktop->pin_timeout_view); |     desktop_view_pin_timeout_free(desktop->pin_timeout_view); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     desktop->gui = NULL; |     desktop->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_thread_free(desktop->scene_thread); |     furi_thread_free(desktop->scene_thread); | ||||||
| @ -289,9 +290,9 @@ void desktop_free(Desktop* desktop) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool desktop_check_file_flag(const char* flag_path) { | static bool desktop_check_file_flag(const char* flag_path) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     bool exists = storage_common_stat(storage, flag_path, NULL) == FSE_OK; |     bool exists = storage_common_stat(storage, flag_path, NULL) == FSE_OK; | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return exists; |     return exists; | ||||||
| } | } | ||||||
| @ -318,7 +319,7 @@ int32_t desktop_srv(void* p) { | |||||||
|         desktop_lock(desktop); |         desktop_lock(desktop); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(desktop_check_file_flag("/int/slideshow")) { |     if(desktop_check_file_flag(SLIDESHOW_FS_PATH)) { | ||||||
|         scene_manager_next_scene(desktop->scene_manager, DesktopSceneSlideshow); |         scene_manager_next_scene(desktop->scene_manager, DesktopSceneSlideshow); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,12 +1,16 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "desktop_settings_filename.h" | ||||||
|  | 
 | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <toolbox/saved_struct.h> | #include <toolbox/saved_struct.h> | ||||||
|  | #include <storage/storage.h> | ||||||
| 
 | 
 | ||||||
| #define DESKTOP_SETTINGS_VER (4) | #define DESKTOP_SETTINGS_VER (4) | ||||||
| #define DESKTOP_SETTINGS_PATH "/int/desktop.settings" | 
 | ||||||
|  | #define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) | ||||||
| #define DESKTOP_SETTINGS_MAGIC (0x17) | #define DESKTOP_SETTINGS_MAGIC (0x17) | ||||||
| #define PIN_MAX_LENGTH 12 | #define PIN_MAX_LENGTH 12 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ static bool desktop_settings_back_event_callback(void* context) { | |||||||
| DesktopSettingsApp* desktop_settings_app_alloc() { | DesktopSettingsApp* desktop_settings_app_alloc() { | ||||||
|     DesktopSettingsApp* app = malloc(sizeof(DesktopSettingsApp)); |     DesktopSettingsApp* app = malloc(sizeof(DesktopSettingsApp)); | ||||||
| 
 | 
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app); |     app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app); | ||||||
|     view_dispatcher_enable_queue(app->view_dispatcher); |     view_dispatcher_enable_queue(app->view_dispatcher); | ||||||
| @ -83,7 +83,7 @@ void desktop_settings_app_free(DesktopSettingsApp* app) { | |||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
|     scene_manager_free(app->scene_manager); |     scene_manager_free(app->scene_manager); | ||||||
|     // Records
 |     // Records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     free(app); |     free(app); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define DESKTOP_SETTINGS_FILE_NAME ".desktop.settings" | ||||||
| @ -25,9 +25,9 @@ void desktop_settings_scene_pin_setup_done_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     app->settings.pin_code = app->pincode_buffer; |     app->settings.pin_code = app->pincode_buffer; | ||||||
|     SAVE_DESKTOP_SETTINGS(&app->settings); |     SAVE_DESKTOP_SETTINGS(&app->settings); | ||||||
|     NotificationApp* notification = furi_record_open("notification"); |     NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     notification_message(notification, &sequence_single_vibro); |     notification_message(notification, &sequence_single_vibro); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     desktop_view_pin_input_set_context(app->pin_input_view, app); |     desktop_view_pin_input_set_context(app->pin_input_view, app); | ||||||
|     desktop_view_pin_input_set_back_callback(app->pin_input_view, NULL); |     desktop_view_pin_input_set_back_callback(app->pin_input_view, NULL); | ||||||
|  | |||||||
| @ -44,9 +44,9 @@ static const uint8_t desktop_helpers_fails_timeout[] = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void desktop_pin_lock_error_notify() { | void desktop_pin_lock_error_notify() { | ||||||
|     NotificationApp* notification = furi_record_open("notification"); |     NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     notification_message(notification, &sequence_pin_fail); |     notification_message(notification, &sequence_pin_fail); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint32_t desktop_pin_lock_get_fail_timeout() { | uint32_t desktop_pin_lock_get_fail_timeout() { | ||||||
| @ -67,9 +67,9 @@ void desktop_pin_lock(DesktopSettings* settings) { | |||||||
| 
 | 
 | ||||||
|     furi_hal_rtc_set_pin_fails(0); |     furi_hal_rtc_set_pin_fails(0); | ||||||
|     furi_hal_rtc_set_flag(FuriHalRtcFlagLock); |     furi_hal_rtc_set_flag(FuriHalRtcFlagLock); | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_session_close(cli); |     cli_session_close(cli); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
|     settings->is_locked = 1; |     settings->is_locked = 1; | ||||||
|     SAVE_DESKTOP_SETTINGS(settings); |     SAVE_DESKTOP_SETTINGS(settings); | ||||||
| } | } | ||||||
| @ -78,9 +78,9 @@ void desktop_pin_unlock(DesktopSettings* settings) { | |||||||
|     furi_assert(settings); |     furi_assert(settings); | ||||||
| 
 | 
 | ||||||
|     furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); |     furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_session_open(cli, &cli_vcp); |     cli_session_open(cli, &cli_vcp); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
|     settings->is_locked = 0; |     settings->is_locked = 0; | ||||||
|     SAVE_DESKTOP_SETTINGS(settings); |     SAVE_DESKTOP_SETTINGS(settings); | ||||||
| } | } | ||||||
| @ -103,9 +103,9 @@ void desktop_pin_lock_init(DesktopSettings* settings) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(desktop_pin_lock_is_locked()) { |     if(desktop_pin_lock_is_locked()) { | ||||||
|         Cli* cli = furi_record_open("cli"); |         Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|         cli_session_close(cli); |         cli_session_close(cli); | ||||||
|         furi_record_close("cli"); |         furi_record_close(RECORD_CLI); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -52,7 +52,7 @@ void slideshow_free(Slideshow* slideshow) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool slideshow_load(Slideshow* slideshow, const char* fspath) { | bool slideshow_load(Slideshow* slideshow, const char* fspath) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     File* slideshow_file = storage_file_alloc(storage); |     File* slideshow_file = storage_file_alloc(storage); | ||||||
|     slideshow->loaded = false; |     slideshow->loaded = false; | ||||||
|     do { |     do { | ||||||
| @ -86,7 +86,7 @@ bool slideshow_load(Slideshow* slideshow, const char* fspath) { | |||||||
|         } |         } | ||||||
|     } while(false); |     } while(false); | ||||||
|     storage_file_free(slideshow_file); |     storage_file_free(slideshow_file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return slideshow->loaded; |     return slideshow->loaded; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								applications/desktop/helpers/slideshow_filename.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								applications/desktop/helpers/slideshow_filename.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define SLIDESHOW_FILE_NAME ".slideshow" | ||||||
| @ -22,7 +22,7 @@ void desktop_scene_debug_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
| bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) { | bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) { | ||||||
|     Desktop* desktop = (Desktop*)context; |     Desktop* desktop = (Desktop*)context; | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     bool consumed = false; |     bool consumed = false; | ||||||
| 
 | 
 | ||||||
|     if(event.type == SceneManagerEventTypeCustom) { |     if(event.type == SceneManagerEventTypeCustom) { | ||||||
| @ -55,7 +55,7 @@ bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
|     return consumed; |     return consumed; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -47,9 +47,9 @@ void desktop_scene_locked_on_enter(void* context) { | |||||||
|     if(state == SCENE_LOCKED_FIRST_ENTER) { |     if(state == SCENE_LOCKED_FIRST_ENTER) { | ||||||
|         bool pin_locked = desktop_pin_lock_is_locked(); |         bool pin_locked = desktop_pin_lock_is_locked(); | ||||||
|         view_port_enabled_set(desktop->lock_viewport, true); |         view_port_enabled_set(desktop->lock_viewport, true); | ||||||
|         Gui* gui = furi_record_open("gui"); |         Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|         gui_set_lockdown(gui, true); |         gui_set_lockdown(gui, true); | ||||||
|         furi_record_close("gui"); |         furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|         if(pin_locked) { |         if(pin_locked) { | ||||||
|             LOAD_DESKTOP_SETTINGS(&desktop->settings); |             LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||||
|  | |||||||
| @ -24,13 +24,13 @@ typedef struct { | |||||||
| } DesktopScenePinInputState; | } DesktopScenePinInputState; | ||||||
| 
 | 
 | ||||||
| static void desktop_scene_locked_light_red(bool value) { | static void desktop_scene_locked_light_red(bool value) { | ||||||
|     NotificationApp* app = furi_record_open("notification"); |     NotificationApp* app = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     if(value) { |     if(value) { | ||||||
|         notification_message(app, &sequence_set_only_red_255); |         notification_message(app, &sequence_set_only_red_255); | ||||||
|     } else { |     } else { | ||||||
|         notification_message(app, &sequence_reset_red); |         notification_message(app, &sequence_reset_red); | ||||||
|     } |     } | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | |||||||
| @ -26,9 +26,9 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { | |||||||
|     if(event.type == SceneManagerEventTypeCustom) { |     if(event.type == SceneManagerEventTypeCustom) { | ||||||
|         switch(event.event) { |         switch(event.event) { | ||||||
|         case DesktopSlideshowCompleted: |         case DesktopSlideshowCompleted: | ||||||
|             storage = furi_record_open("storage"); |             storage = furi_record_open(RECORD_STORAGE); | ||||||
|             storage_common_remove(storage, "/int/slideshow"); |             storage_common_remove(storage, SLIDESHOW_FS_PATH); | ||||||
|             furi_record_close("storage"); |             furi_record_close(RECORD_STORAGE); | ||||||
|             scene_manager_previous_scene(desktop->scene_manager); |             scene_manager_previous_scene(desktop->scene_manager); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -79,9 +79,9 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
| 
 | 
 | ||||||
|     } else { |     } else { | ||||||
|         char buffer[64]; |         char buffer[64]; | ||||||
|         Dolphin* dolphin = furi_record_open("dolphin"); |         Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|         DolphinStats stats = dolphin_stats(dolphin); |         DolphinStats stats = dolphin_stats(dolphin); | ||||||
|         furi_record_close("dolphin"); |         furi_record_close(RECORD_DOLPHIN); | ||||||
| 
 | 
 | ||||||
|         uint32_t current_lvl = stats.level; |         uint32_t current_lvl = stats.level; | ||||||
|         uint32_t remaining = dolphin_state_xp_to_levelup(m->icounter); |         uint32_t remaining = dolphin_state_xp_to_levelup(m->icounter); | ||||||
| @ -175,7 +175,7 @@ void desktop_debug_free(DesktopDebugView* debug_view) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_debug_get_dolphin_data(DesktopDebugView* debug_view) { | void desktop_debug_get_dolphin_data(DesktopDebugView* debug_view) { | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     with_view_model( |     with_view_model( | ||||||
|         debug_view->view, (DesktopDebugViewModel * model) { |         debug_view->view, (DesktopDebugViewModel * model) { | ||||||
| @ -185,7 +185,7 @@ void desktop_debug_get_dolphin_data(DesktopDebugView* debug_view) { | |||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void desktop_debug_reset_screen_idx(DesktopDebugView* debug_view) { | void desktop_debug_reset_screen_idx(DesktopDebugView* debug_view) { | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ | |||||||
| #include "../desktop_i.h" | #include "../desktop_i.h" | ||||||
| #include "desktop_view_slideshow.h" | #include "desktop_view_slideshow.h" | ||||||
| #include "../helpers/slideshow.h" | #include "../helpers/slideshow.h" | ||||||
|  | #include "../helpers/slideshow_filename.h" | ||||||
| 
 | 
 | ||||||
| struct DesktopSlideshowView { | struct DesktopSlideshowView { | ||||||
|     View* view; |     View* view; | ||||||
| @ -60,7 +61,7 @@ static void desktop_view_slideshow_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     DesktopSlideshowViewModel* model = view_get_model(instance->view); |     DesktopSlideshowViewModel* model = view_get_model(instance->view); | ||||||
|     model->slideshow = slideshow_alloc(); |     model->slideshow = slideshow_alloc(); | ||||||
|     if(!slideshow_load(model->slideshow, "/int/slideshow")) { |     if(!slideshow_load(model->slideshow, SLIDESHOW_FS_PATH)) { | ||||||
|         instance->callback(DesktopSlideshowCompleted, instance->context); |         instance->callback(DesktopSlideshowCompleted, instance->context); | ||||||
|     } |     } | ||||||
|     view_commit_model(instance->view, false); |     view_commit_model(instance->view, false); | ||||||
|  | |||||||
| @ -3,6 +3,9 @@ | |||||||
| #include <gui/view.h> | #include <gui/view.h> | ||||||
| 
 | 
 | ||||||
| #include "desktop_events.h" | #include "desktop_events.h" | ||||||
|  | #include "../helpers/slideshow_filename.h" | ||||||
|  | 
 | ||||||
|  | #define SLIDESHOW_FS_PATH INT_PATH(SLIDESHOW_FILE_NAME) | ||||||
| 
 | 
 | ||||||
| typedef struct DesktopSlideshowView DesktopSlideshowView; | typedef struct DesktopSlideshowView DesktopSlideshowView; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ static void dialogs_app_process_message(DialogsApp* app, DialogsAppMessage* mess | |||||||
| int32_t dialogs_srv(void* p) { | int32_t dialogs_srv(void* p) { | ||||||
|     UNUSED(p); |     UNUSED(p); | ||||||
|     DialogsApp* app = dialogs_app_alloc(); |     DialogsApp* app = dialogs_app_alloc(); | ||||||
|     furi_record_create("dialogs", app); |     furi_record_create(RECORD_DIALOGS, app); | ||||||
| 
 | 
 | ||||||
|     DialogsAppMessage message; |     DialogsAppMessage message; | ||||||
|     while(1) { |     while(1) { | ||||||
|  | |||||||
| @ -9,6 +9,8 @@ extern "C" { | |||||||
| 
 | 
 | ||||||
| /****************** COMMON ******************/ | /****************** COMMON ******************/ | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_DIALOGS "dialogs" | ||||||
|  | 
 | ||||||
| typedef struct DialogsApp DialogsApp; | typedef struct DialogsApp DialogsApp; | ||||||
| 
 | 
 | ||||||
| /****************** FILE BROWSER ******************/ | /****************** FILE BROWSER ******************/ | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ static void dialogs_app_file_browser_callback(void* context) { | |||||||
| 
 | 
 | ||||||
| bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrowser* data) { | bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrowser* data) { | ||||||
|     bool ret = false; |     bool ret = false; | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     DialogsAppFileBrowserContext* file_browser_context = |     DialogsAppFileBrowserContext* file_browser_context = | ||||||
|         malloc(sizeof(DialogsAppFileBrowserContext)); |         malloc(sizeof(DialogsAppFileBrowserContext)); | ||||||
| @ -53,7 +53,7 @@ bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrow | |||||||
|     file_browser_free(file_browser); |     file_browser_free(file_browser); | ||||||
|     API_LOCK_FREE(file_browser_context->lock); |     API_LOCK_FREE(file_browser_context->lock); | ||||||
|     free(file_browser_context); |     free(file_browser_context); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -54,7 +54,7 @@ static void dialogs_app_message_callback(DialogExResult result, void* context) { | |||||||
| 
 | 
 | ||||||
| DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDataDialog* data) { | DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDataDialog* data) { | ||||||
|     DialogMessageButton ret = DialogMessageButtonBack; |     DialogMessageButton ret = DialogMessageButtonBack; | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     const DialogMessage* message = data->message; |     const DialogMessage* message = data->message; | ||||||
|     DialogsAppMessageContext* message_context = malloc(sizeof(DialogsAppMessageContext)); |     DialogsAppMessageContext* message_context = malloc(sizeof(DialogsAppMessageContext)); | ||||||
|     message_context->lock = API_LOCK_INIT_LOCKED(); |     message_context->lock = API_LOCK_INIT_LOCKED(); | ||||||
| @ -96,7 +96,7 @@ DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDa | |||||||
|     dialog_ex_free(dialog_ex); |     dialog_ex_free(dialog_ex); | ||||||
|     API_LOCK_FREE(message_context->lock); |     API_LOCK_FREE(message_context->lock); | ||||||
|     free(message_context); |     free(message_context); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -155,7 +155,7 @@ static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) { | |||||||
| int32_t dolphin_srv(void* p) { | int32_t dolphin_srv(void* p) { | ||||||
|     UNUSED(p); |     UNUSED(p); | ||||||
|     Dolphin* dolphin = dolphin_alloc(); |     Dolphin* dolphin = dolphin_alloc(); | ||||||
|     furi_record_create("dolphin", dolphin); |     furi_record_create(RECORD_DOLPHIN, dolphin); | ||||||
| 
 | 
 | ||||||
|     dolphin_state_load(dolphin->state); |     dolphin_state_load(dolphin->state); | ||||||
|     xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); |     xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); | ||||||
|  | |||||||
| @ -9,6 +9,8 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_DOLPHIN "dolphin" | ||||||
|  | 
 | ||||||
| typedef struct Dolphin Dolphin; | typedef struct Dolphin Dolphin; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| #include "dolphin_state.h" | #include "dolphin_state.h" | ||||||
| #include "dolphin/helpers/dolphin_deed.h" | #include "dolphin/helpers/dolphin_deed.h" | ||||||
|  | #include "dolphin_state_filename.h" | ||||||
|  | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <storage/storage.h> | #include <storage/storage.h> | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| @ -8,7 +10,8 @@ | |||||||
| #include <toolbox/saved_struct.h> | #include <toolbox/saved_struct.h> | ||||||
| 
 | 
 | ||||||
| #define TAG "DolphinState" | #define TAG "DolphinState" | ||||||
| #define DOLPHIN_STATE_PATH "/int/dolphin.state" | 
 | ||||||
|  | #define DOLPHIN_STATE_PATH INT_PATH(DOLPHIN_STATE_FILE_NAME) | ||||||
| #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 | #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 | ||||||
| #define DOLPHIN_STATE_HEADER_VERSION 0x01 | #define DOLPHIN_STATE_HEADER_VERSION 0x01 | ||||||
| #define LEVEL2_THRESHOLD 735 | #define LEVEL2_THRESHOLD 735 | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								applications/dolphin/helpers/dolphin_state_filename.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								applications/dolphin/helpers/dolphin_state_filename.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define DOLPHIN_STATE_FILE_NAME ".dolphin.state" | ||||||
| @ -95,12 +95,12 @@ int32_t passport_app(void* p) { | |||||||
| 
 | 
 | ||||||
|     ViewPort* view_port = view_port_alloc(); |     ViewPort* view_port = view_port_alloc(); | ||||||
| 
 | 
 | ||||||
|     Dolphin* dolphin = furi_record_open("dolphin"); |     Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); | ||||||
|     DolphinStats stats = dolphin_stats(dolphin); |     DolphinStats stats = dolphin_stats(dolphin); | ||||||
|     furi_record_close("dolphin"); |     furi_record_close(RECORD_DOLPHIN); | ||||||
|     view_port_draw_callback_set(view_port, render_callback, &stats); |     view_port_draw_callback_set(view_port, render_callback, &stats); | ||||||
|     view_port_input_callback_set(view_port, input_callback, semaphore); |     view_port_input_callback_set(view_port, input_callback, semaphore); | ||||||
|     Gui* gui = furi_record_open("gui"); |     Gui* gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(gui, view_port, GuiLayerFullscreen); |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
|     view_port_update(view_port); |     view_port_update(view_port); | ||||||
| 
 | 
 | ||||||
| @ -108,7 +108,7 @@ int32_t passport_app(void* p) { | |||||||
| 
 | 
 | ||||||
|     gui_remove_view_port(gui, view_port); |     gui_remove_view_port(gui, view_port); | ||||||
|     view_port_free(view_port); |     view_port_free(view_port); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_semaphore_free(semaphore); |     furi_semaphore_free(semaphore); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ static void gpio_app_tick_event_callback(void* context) { | |||||||
| GpioApp* gpio_app_alloc() { | GpioApp* gpio_app_alloc() { | ||||||
|     GpioApp* app = malloc(sizeof(GpioApp)); |     GpioApp* app = malloc(sizeof(GpioApp)); | ||||||
| 
 | 
 | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     app->view_dispatcher = view_dispatcher_alloc(); |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app); |     app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app); | ||||||
| @ -40,7 +40,7 @@ GpioApp* gpio_app_alloc() { | |||||||
| 
 | 
 | ||||||
|     view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); |     view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); | ||||||
| 
 | 
 | ||||||
|     app->notifications = furi_record_open("notification"); |     app->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     app->var_item_list = variable_item_list_alloc(); |     app->var_item_list = variable_item_list_alloc(); | ||||||
|     view_dispatcher_add_view( |     view_dispatcher_add_view( | ||||||
| @ -88,8 +88,8 @@ void gpio_app_free(GpioApp* app) { | |||||||
|     scene_manager_free(app->scene_manager); |     scene_manager_free(app->scene_manager); | ||||||
| 
 | 
 | ||||||
|     // Close records
 |     // Close records
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     free(app); |     free(app); | ||||||
| } | } | ||||||
|  | |||||||
| @ -86,15 +86,15 @@ static void usb_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) { | |||||||
| static void usb_uart_vcp_init(UsbUartBridge* usb_uart, uint8_t vcp_ch) { | static void usb_uart_vcp_init(UsbUartBridge* usb_uart, uint8_t vcp_ch) { | ||||||
|     furi_hal_usb_unlock(); |     furi_hal_usb_unlock(); | ||||||
|     if(vcp_ch == 0) { |     if(vcp_ch == 0) { | ||||||
|         Cli* cli = furi_record_open("cli"); |         Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|         cli_session_close(cli); |         cli_session_close(cli); | ||||||
|         furi_record_close("cli"); |         furi_record_close(RECORD_CLI); | ||||||
|         furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); |         furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); | ||||||
|     } else { |     } else { | ||||||
|         furi_check(furi_hal_usb_set_config(&usb_cdc_dual, NULL) == true); |         furi_check(furi_hal_usb_set_config(&usb_cdc_dual, NULL) == true); | ||||||
|         Cli* cli = furi_record_open("cli"); |         Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|         cli_session_open(cli, &cli_vcp); |         cli_session_open(cli, &cli_vcp); | ||||||
|         furi_record_close("cli"); |         furi_record_close(RECORD_CLI); | ||||||
|     } |     } | ||||||
|     furi_hal_cdc_set_callbacks(vcp_ch, (CdcCallbacks*)&cdc_cb, usb_uart); |     furi_hal_cdc_set_callbacks(vcp_ch, (CdcCallbacks*)&cdc_cb, usb_uart); | ||||||
| } | } | ||||||
| @ -103,9 +103,9 @@ static void usb_uart_vcp_deinit(UsbUartBridge* usb_uart, uint8_t vcp_ch) { | |||||||
|     UNUSED(usb_uart); |     UNUSED(usb_uart); | ||||||
|     furi_hal_cdc_set_callbacks(vcp_ch, NULL, NULL); |     furi_hal_cdc_set_callbacks(vcp_ch, NULL, NULL); | ||||||
|     if(vcp_ch != 0) { |     if(vcp_ch != 0) { | ||||||
|         Cli* cli = furi_record_open("cli"); |         Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|         cli_session_close(cli); |         cli_session_close(cli); | ||||||
|         furi_record_close("cli"); |         furi_record_close(RECORD_CLI); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -276,9 +276,9 @@ static int32_t usb_uart_worker(void* context) { | |||||||
| 
 | 
 | ||||||
|     furi_hal_usb_unlock(); |     furi_hal_usb_unlock(); | ||||||
|     furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); |     furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_session_open(cli, &cli_vcp); |     cli_session_open(cli, &cli_vcp); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -485,7 +485,7 @@ Gui* gui_alloc() { | |||||||
| 
 | 
 | ||||||
|     // Input
 |     // Input
 | ||||||
|     gui->input_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); |     gui->input_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); | ||||||
|     gui->input_events = furi_record_open("input_events"); |     gui->input_events = furi_record_open(RECORD_INPUT_EVENTS); | ||||||
| 
 | 
 | ||||||
|     furi_check(gui->input_events); |     furi_check(gui->input_events); | ||||||
|     furi_pubsub_subscribe(gui->input_events, gui_input_events_callback, gui); |     furi_pubsub_subscribe(gui->input_events, gui_input_events_callback, gui); | ||||||
| @ -497,7 +497,7 @@ int32_t gui_srv(void* p) { | |||||||
|     UNUSED(p); |     UNUSED(p); | ||||||
|     Gui* gui = gui_alloc(); |     Gui* gui = gui_alloc(); | ||||||
| 
 | 
 | ||||||
|     furi_record_create("gui", gui); |     furi_record_create(RECORD_GUI, gui); | ||||||
| 
 | 
 | ||||||
|     while(1) { |     while(1) { | ||||||
|         uint32_t flags = |         uint32_t flags = | ||||||
|  | |||||||
| @ -29,6 +29,8 @@ typedef enum { | |||||||
| /** Gui Canvas Commit Callback */ | /** Gui Canvas Commit Callback */ | ||||||
| typedef void (*GuiCanvasCommitCallback)(uint8_t* data, size_t size, void* context); | typedef void (*GuiCanvasCommitCallback)(uint8_t* data, size_t size, void* context); | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_GUI "gui" | ||||||
|  | 
 | ||||||
| typedef struct Gui Gui; | typedef struct Gui Gui; | ||||||
| 
 | 
 | ||||||
| /** Add view_port to view_port tree
 | /** Add view_port to view_port tree
 | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ | |||||||
| #define TAG "BrowserWorker" | #define TAG "BrowserWorker" | ||||||
| 
 | 
 | ||||||
| #define ASSETS_DIR "assets" | #define ASSETS_DIR "assets" | ||||||
| #define BROWSER_ROOT "/any" | #define BROWSER_ROOT STORAGE_ANY_PATH_PREFIX | ||||||
| #define FILE_NAME_LEN_MAX 256 | #define FILE_NAME_LEN_MAX 256 | ||||||
| #define LONG_LOAD_THRESHOLD 100 | #define LONG_LOAD_THRESHOLD 100 | ||||||
| 
 | 
 | ||||||
| @ -53,13 +53,13 @@ struct BrowserWorker { | |||||||
| static bool browser_path_is_file(string_t path) { | static bool browser_path_is_file(string_t path) { | ||||||
|     bool state = false; |     bool state = false; | ||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     if(storage_common_stat(storage, string_get_cstr(path), &file_info) == FSE_OK) { |     if(storage_common_stat(storage, string_get_cstr(path), &file_info) == FSE_OK) { | ||||||
|         if((file_info.flags & FSF_DIRECTORY) == 0) { |         if((file_info.flags & FSF_DIRECTORY) == 0) { | ||||||
|             state = true; |             state = true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -97,7 +97,7 @@ static bool browser_filter_by_name(BrowserWorker* browser, string_t name, bool i | |||||||
| 
 | 
 | ||||||
| static bool browser_folder_check_and_switch(string_t path) { | static bool browser_folder_check_and_switch(string_t path) { | ||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     bool is_root = false; |     bool is_root = false; | ||||||
|     while(1) { |     while(1) { | ||||||
|         // Check if folder is existing and navigate back if not
 |         // Check if folder is existing and navigate back if not
 | ||||||
| @ -111,7 +111,7 @@ static bool browser_folder_check_and_switch(string_t path) { | |||||||
|         } |         } | ||||||
|         is_root = browser_path_trim(path); |         is_root = browser_path_trim(path); | ||||||
|     } |     } | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return is_root; |     return is_root; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -125,7 +125,7 @@ static bool browser_folder_init( | |||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
|     uint32_t total_files_cnt = 0; |     uint32_t total_files_cnt = 0; | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     File* directory = storage_file_alloc(storage); |     File* directory = storage_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     char name_temp[FILE_NAME_LEN_MAX]; |     char name_temp[FILE_NAME_LEN_MAX]; | ||||||
| @ -167,7 +167,7 @@ static bool browser_folder_init( | |||||||
|     storage_dir_close(directory); |     storage_dir_close(directory); | ||||||
|     storage_file_free(directory); |     storage_file_free(directory); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
| @ -176,7 +176,7 @@ static bool | |||||||
|     browser_folder_load(BrowserWorker* browser, string_t path, uint32_t offset, uint32_t count) { |     browser_folder_load(BrowserWorker* browser, string_t path, uint32_t offset, uint32_t count) { | ||||||
|     FileInfo file_info; |     FileInfo file_info; | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     File* directory = storage_file_alloc(storage); |     File* directory = storage_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     char name_temp[FILE_NAME_LEN_MAX]; |     char name_temp[FILE_NAME_LEN_MAX]; | ||||||
| @ -241,7 +241,7 @@ static bool | |||||||
|     storage_dir_close(directory); |     storage_dir_close(directory); | ||||||
|     storage_file_free(directory); |     storage_file_free(directory); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return (items_cnt == count); |     return (items_cnt == count); | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ bool validator_is_file_callback(const char* text, string_t error, void* context) | |||||||
|     bool ret = true; |     bool ret = true; | ||||||
|     string_t path; |     string_t path; | ||||||
|     string_init_printf(path, "%s/%s%s", instance->app_path_folder, text, instance->app_extension); |     string_init_printf(path, "%s/%s%s", instance->app_path_folder, text, instance->app_extension); | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     if(storage_common_stat(storage, string_get_cstr(path), NULL) == FSE_OK) { |     if(storage_common_stat(storage, string_get_cstr(path), NULL) == FSE_OK) { | ||||||
|         ret = false; |         ret = false; | ||||||
|         string_printf(error, "This name\nexists!\nChoose\nanother one."); |         string_printf(error, "This name\nexists!\nChoose\nanother one."); | ||||||
| @ -29,7 +29,7 @@ bool validator_is_file_callback(const char* text, string_t error, void* context) | |||||||
|         ret = true; |         ret = true; | ||||||
|     } |     } | ||||||
|     string_clear(path); |     string_clear(path); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | |||||||
| @ -163,11 +163,11 @@ iButton* ibutton_alloc() { | |||||||
|     view_dispatcher_set_tick_event_callback( |     view_dispatcher_set_tick_event_callback( | ||||||
|         ibutton->view_dispatcher, ibutton_tick_event_callback, 100); |         ibutton->view_dispatcher, ibutton_tick_event_callback, 100); | ||||||
| 
 | 
 | ||||||
|     ibutton->gui = furi_record_open("gui"); |     ibutton->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     ibutton->storage = furi_record_open("storage"); |     ibutton->storage = furi_record_open(RECORD_STORAGE); | ||||||
|     ibutton->dialogs = furi_record_open("dialogs"); |     ibutton->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|     ibutton->notifications = furi_record_open("notification"); |     ibutton->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     ibutton->key = ibutton_key_alloc(); |     ibutton->key = ibutton_key_alloc(); | ||||||
|     ibutton->key_worker = ibutton_worker_alloc(); |     ibutton->key_worker = ibutton_worker_alloc(); | ||||||
| @ -224,16 +224,16 @@ void ibutton_free(iButton* ibutton) { | |||||||
|     view_dispatcher_free(ibutton->view_dispatcher); |     view_dispatcher_free(ibutton->view_dispatcher); | ||||||
|     scene_manager_free(ibutton->scene_manager); |     scene_manager_free(ibutton->scene_manager); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     ibutton->storage = NULL; |     ibutton->storage = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     ibutton->notifications = NULL; |     ibutton->notifications = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
|     ibutton->dialogs = NULL; |     ibutton->dialogs = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     ibutton->gui = NULL; |     ibutton->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     ibutton_worker_stop_thread(ibutton->key_worker); |     ibutton_worker_stop_thread(ibutton->key_worker); | ||||||
|  | |||||||
| @ -12,10 +12,10 @@ static void onewire_cli(Cli* cli, string_t args, void* context); | |||||||
| // app cli function
 | // app cli function
 | ||||||
| void ibutton_on_system_start() { | void ibutton_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli, cli); |     cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli, cli); | ||||||
|     cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli); |     cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(ibutton_cli); |     UNUSED(ibutton_cli); | ||||||
|     UNUSED(onewire_cli); |     UNUSED(onewire_cli); | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ | |||||||
| #define IBUTTON_FILE_NAME_SIZE 100 | #define IBUTTON_FILE_NAME_SIZE 100 | ||||||
| #define IBUTTON_TEXT_STORE_SIZE 128 | #define IBUTTON_TEXT_STORE_SIZE 128 | ||||||
| 
 | 
 | ||||||
| #define IBUTTON_APP_FOLDER "/any/ibutton" | #define IBUTTON_APP_FOLDER ANY_PATH("ibutton") | ||||||
| #define IBUTTON_APP_EXTENSION ".ibtn" | #define IBUTTON_APP_EXTENSION ".ibtn" | ||||||
| #define IBUTTON_APP_FILE_TYPE "Flipper iButton key" | #define IBUTTON_APP_FILE_TYPE "Flipper iButton key" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -85,7 +85,7 @@ static bool | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void infrared_find_vacant_remote_name(string_t name, const char* path) { | static void infrared_find_vacant_remote_name(string_t name, const char* path) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     string_t base_path; |     string_t base_path; | ||||||
|     string_init_set_str(base_path, path); |     string_init_set_str(base_path, path); | ||||||
| @ -122,7 +122,7 @@ static void infrared_find_vacant_remote_name(string_t name, const char* path) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     string_clear(base_path); |     string_clear(base_path); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Infrared* infrared_alloc() { | static Infrared* infrared_alloc() { | ||||||
| @ -140,7 +140,7 @@ static Infrared* infrared_alloc() { | |||||||
|     infrared->scene_manager = scene_manager_alloc(&infrared_scene_handlers, infrared); |     infrared->scene_manager = scene_manager_alloc(&infrared_scene_handlers, infrared); | ||||||
|     infrared->view_dispatcher = view_dispatcher_alloc(); |     infrared->view_dispatcher = view_dispatcher_alloc(); | ||||||
| 
 | 
 | ||||||
|     infrared->gui = furi_record_open("gui"); |     infrared->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     ViewDispatcher* view_dispatcher = infrared->view_dispatcher; |     ViewDispatcher* view_dispatcher = infrared->view_dispatcher; | ||||||
|     view_dispatcher_enable_queue(view_dispatcher); |     view_dispatcher_enable_queue(view_dispatcher); | ||||||
| @ -149,9 +149,9 @@ static Infrared* infrared_alloc() { | |||||||
|     view_dispatcher_set_navigation_event_callback(view_dispatcher, infrared_back_event_callback); |     view_dispatcher_set_navigation_event_callback(view_dispatcher, infrared_back_event_callback); | ||||||
|     view_dispatcher_set_tick_event_callback(view_dispatcher, infrared_tick_event_callback, 100); |     view_dispatcher_set_tick_event_callback(view_dispatcher, infrared_tick_event_callback, 100); | ||||||
| 
 | 
 | ||||||
|     infrared->storage = furi_record_open("storage"); |     infrared->storage = furi_record_open(RECORD_STORAGE); | ||||||
|     infrared->dialogs = furi_record_open("dialogs"); |     infrared->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|     infrared->notifications = furi_record_open("notification"); |     infrared->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     infrared->worker = infrared_worker_alloc(); |     infrared->worker = infrared_worker_alloc(); | ||||||
|     infrared->remote = infrared_remote_alloc(); |     infrared->remote = infrared_remote_alloc(); | ||||||
| @ -242,16 +242,16 @@ static void infrared_free(Infrared* infrared) { | |||||||
|     infrared_remote_free(infrared->remote); |     infrared_remote_free(infrared->remote); | ||||||
|     infrared_worker_free(infrared->worker); |     infrared_worker_free(infrared->worker); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     infrared->gui = NULL; |     infrared->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     infrared->notifications = NULL; |     infrared->notifications = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
|     infrared->dialogs = NULL; |     infrared->dialogs = NULL; | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     infrared->gui = NULL; |     infrared->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     string_clear(infrared->file_path); |     string_clear(infrared->file_path); | ||||||
| @ -302,7 +302,7 @@ bool infrared_rename_current_remote(Infrared* infrared, const char* name) { | |||||||
|     } |     } | ||||||
|     string_cat_printf(new_path, "/%s%s", string_get_cstr(new_name), INFRARED_APP_EXTENSION); |     string_cat_printf(new_path, "/%s%s", string_get_cstr(new_name), INFRARED_APP_EXTENSION); | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     FS_Error status = storage_common_rename( |     FS_Error status = storage_common_rename( | ||||||
|         storage, infrared_remote_get_path(remote), string_get_cstr(new_path)); |         storage, infrared_remote_get_path(remote), string_get_cstr(new_path)); | ||||||
| @ -312,7 +312,7 @@ bool infrared_rename_current_remote(Infrared* infrared, const char* name) { | |||||||
|     string_clear(new_name); |     string_clear(new_name); | ||||||
|     string_clear(new_path); |     string_clear(new_path); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return (status == FSE_OK || status == FSE_EXIST); |     return (status == FSE_OK || status == FSE_EXIST); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -50,7 +50,7 @@ bool infrared_brute_force_calculate_messages(InfraredBruteForce* brute_force) { | |||||||
|     furi_assert(brute_force->db_filename); |     furi_assert(brute_force->db_filename); | ||||||
|     bool success = false; |     bool success = false; | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* ff = flipper_format_buffered_file_alloc(storage); |     FlipperFormat* ff = flipper_format_buffered_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     success = flipper_format_buffered_file_open_existing(ff, brute_force->db_filename); |     success = flipper_format_buffered_file_open_existing(ff, brute_force->db_filename); | ||||||
| @ -68,7 +68,7 @@ bool infrared_brute_force_calculate_messages(InfraredBruteForce* brute_force) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     flipper_format_free(ff); |     flipper_format_free(ff); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return success; |     return success; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -94,14 +94,14 @@ bool infrared_brute_force_start( | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(*record_count) { |     if(*record_count) { | ||||||
|         Storage* storage = furi_record_open("storage"); |         Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|         brute_force->ff = flipper_format_buffered_file_alloc(storage); |         brute_force->ff = flipper_format_buffered_file_alloc(storage); | ||||||
|         success = |         success = | ||||||
|             flipper_format_buffered_file_open_existing(brute_force->ff, brute_force->db_filename); |             flipper_format_buffered_file_open_existing(brute_force->ff, brute_force->db_filename); | ||||||
|         if(!success) { |         if(!success) { | ||||||
|             flipper_format_free(brute_force->ff); |             flipper_format_free(brute_force->ff); | ||||||
|             brute_force->ff = NULL; |             brute_force->ff = NULL; | ||||||
|             furi_record_close("storage"); |             furi_record_close(RECORD_STORAGE); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     return success; |     return success; | ||||||
| @ -117,7 +117,7 @@ void infrared_brute_force_stop(InfraredBruteForce* brute_force) { | |||||||
| 
 | 
 | ||||||
|     string_reset(brute_force->current_record_name); |     string_reset(brute_force->current_record_name); | ||||||
|     flipper_format_free(brute_force->ff); |     flipper_format_free(brute_force->ff); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     brute_force->ff = NULL; |     brute_force->ff = NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -192,9 +192,9 @@ static void infrared_cli_start_ir(Cli* cli, string_t args, void* context) { | |||||||
| } | } | ||||||
| void infrared_on_system_start() { | void infrared_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = (Cli*)furi_record_open("cli"); |     Cli* cli = (Cli*)furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(cli, "ir", CliCommandFlagDefault, infrared_cli_start_ir, NULL); |     cli_add_command(cli, "ir", CliCommandFlagDefault, infrared_cli_start_ir, NULL); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(infrared_cli_start_ir); |     UNUSED(infrared_cli_start_ir); | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -39,7 +39,7 @@ | |||||||
| #define INFRARED_MAX_BUTTON_NAME_LENGTH 22 | #define INFRARED_MAX_BUTTON_NAME_LENGTH 22 | ||||||
| #define INFRARED_MAX_REMOTE_NAME_LENGTH 22 | #define INFRARED_MAX_REMOTE_NAME_LENGTH 22 | ||||||
| 
 | 
 | ||||||
| #define INFRARED_APP_FOLDER "/any/infrared" | #define INFRARED_APP_FOLDER ANY_PATH("infrared") | ||||||
| #define INFRARED_APP_EXTENSION ".ir" | #define INFRARED_APP_EXTENSION ".ir" | ||||||
| 
 | 
 | ||||||
| #define INFRARED_DEFAULT_REMOTE_NAME "Remote" | #define INFRARED_DEFAULT_REMOTE_NAME "Remote" | ||||||
|  | |||||||
| @ -110,7 +110,7 @@ bool infrared_remote_delete_button(InfraredRemote* remote, size_t index) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool infrared_remote_store(InfraredRemote* remote) { | bool infrared_remote_store(InfraredRemote* remote) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* ff = flipper_format_file_alloc(storage); |     FlipperFormat* ff = flipper_format_file_alloc(storage); | ||||||
|     const char* path = string_get_cstr(remote->path); |     const char* path = string_get_cstr(remote->path); | ||||||
| 
 | 
 | ||||||
| @ -134,12 +134,12 @@ bool infrared_remote_store(InfraredRemote* remote) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     flipper_format_free(ff); |     flipper_format_free(ff); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return success; |     return success; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool infrared_remote_load(InfraredRemote* remote, string_t path) { | bool infrared_remote_load(InfraredRemote* remote, string_t path) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* ff = flipper_format_buffered_file_alloc(storage); |     FlipperFormat* ff = flipper_format_buffered_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     string_t buf; |     string_t buf; | ||||||
| @ -174,16 +174,16 @@ bool infrared_remote_load(InfraredRemote* remote, string_t path) { | |||||||
| 
 | 
 | ||||||
|     string_clear(buf); |     string_clear(buf); | ||||||
|     flipper_format_free(ff); |     flipper_format_free(ff); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return success; |     return success; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool infrared_remote_remove(InfraredRemote* remote) { | bool infrared_remote_remove(InfraredRemote* remote) { | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     FS_Error status = storage_common_remove(storage, string_get_cstr(remote->path)); |     FS_Error status = storage_common_remove(storage, string_get_cstr(remote->path)); | ||||||
|     infrared_remote_reset(remote); |     infrared_remote_reset(remote); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     return (status == FSE_OK || status == FSE_NOT_EXIST); |     return (status == FSE_OK || status == FSE_NOT_EXIST); | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ void infrared_scene_universal_tv_on_enter(void* context) { | |||||||
|     ButtonPanel* button_panel = infrared->button_panel; |     ButtonPanel* button_panel = infrared->button_panel; | ||||||
|     InfraredBruteForce* brute_force = infrared->brute_force; |     InfraredBruteForce* brute_force = infrared->brute_force; | ||||||
| 
 | 
 | ||||||
|     infrared_brute_force_set_db_filename(brute_force, "/ext/infrared/assets/tv.ir"); |     infrared_brute_force_set_db_filename(brute_force, EXT_PATH("infrared/assets/tv.ir")); | ||||||
| 
 | 
 | ||||||
|     button_panel_reserve(button_panel, 2, 3); |     button_panel_reserve(button_panel, 2, 3); | ||||||
|     uint32_t i = 0; |     uint32_t i = 0; | ||||||
|  | |||||||
| @ -68,10 +68,10 @@ int32_t input_srv() { | |||||||
|     input = malloc(sizeof(Input)); |     input = malloc(sizeof(Input)); | ||||||
|     input->thread_id = furi_thread_get_current_id(); |     input->thread_id = furi_thread_get_current_id(); | ||||||
|     input->event_pubsub = furi_pubsub_alloc(); |     input->event_pubsub = furi_pubsub_alloc(); | ||||||
|     furi_record_create("input_events", input->event_pubsub); |     furi_record_create(RECORD_INPUT_EVENTS, input->event_pubsub); | ||||||
| 
 | 
 | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     input->cli = furi_record_open("cli"); |     input->cli = furi_record_open(RECORD_CLI); | ||||||
|     if(input->cli) { |     if(input->cli) { | ||||||
|         cli_add_command(input->cli, "input", CliCommandFlagParallelSafe, input_cli, input); |         cli_add_command(input->cli, "input", CliCommandFlagParallelSafe, input_cli, input); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -7,6 +7,8 @@ | |||||||
| 
 | 
 | ||||||
| #include <furi_hal_resources.h> | #include <furi_hal_resources.h> | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_INPUT_EVENTS "input_events" | ||||||
|  | 
 | ||||||
| /** Input Types
 | /** Input Types
 | ||||||
|  * Some of them are physical events and some logical |  * Some of them are physical events and some logical | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ | |||||||
| 
 | 
 | ||||||
| #include "rpc/rpc_app.h" | #include "rpc/rpc_app.h" | ||||||
| 
 | 
 | ||||||
| const char* LfRfidApp::app_folder = "/any/lfrfid"; | const char* LfRfidApp::app_folder = ANY_PATH("lfrfid"); | ||||||
| const char* LfRfidApp::app_extension = ".rfid"; | const char* LfRfidApp::app_extension = ".rfid"; | ||||||
| const char* LfRfidApp::app_filetype = "Flipper RFID key"; | const char* LfRfidApp::app_filetype = "Flipper RFID key"; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -290,8 +290,9 @@ static Loader* loader_alloc() { | |||||||
|     instance->pubsub = furi_pubsub_alloc(); |     instance->pubsub = furi_pubsub_alloc(); | ||||||
| 
 | 
 | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     instance->cli = furi_record_open("cli"); |     instance->cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(instance->cli, "loader", CliCommandFlagParallelSafe, loader_cli, instance); |     cli_add_command( | ||||||
|  |         instance->cli, RECORD_LOADER, CliCommandFlagParallelSafe, loader_cli, instance); | ||||||
| #else | #else | ||||||
|     UNUSED(loader_cli); |     UNUSED(loader_cli); | ||||||
| #endif | #endif | ||||||
| @ -299,7 +300,7 @@ static Loader* loader_alloc() { | |||||||
|     instance->loader_thread = furi_thread_get_current_id(); |     instance->loader_thread = furi_thread_get_current_id(); | ||||||
| 
 | 
 | ||||||
|     // Gui
 |     // Gui
 | ||||||
|     instance->gui = furi_record_open("gui"); |     instance->gui = furi_record_open(RECORD_GUI); | ||||||
|     instance->view_dispatcher = view_dispatcher_alloc(); |     instance->view_dispatcher = view_dispatcher_alloc(); | ||||||
|     view_dispatcher_attach_to_gui( |     view_dispatcher_attach_to_gui( | ||||||
|         instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); |         instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); | ||||||
| @ -343,7 +344,7 @@ static void loader_free(Loader* instance) { | |||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
| 
 | 
 | ||||||
|     if(instance->cli) { |     if(instance->cli) { | ||||||
|         furi_record_close("cli"); |         furi_record_close(RECORD_CLI); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_pubsub_free(instance->pubsub); |     furi_pubsub_free(instance->pubsub); | ||||||
| @ -360,7 +361,7 @@ static void loader_free(Loader* instance) { | |||||||
|     view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewSettings); |     view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewSettings); | ||||||
|     view_dispatcher_free(loader_instance->view_dispatcher); |     view_dispatcher_free(loader_instance->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     free(instance); |     free(instance); | ||||||
|     instance = NULL; |     instance = NULL; | ||||||
| @ -463,7 +464,7 @@ int32_t loader_srv(void* p) { | |||||||
| 
 | 
 | ||||||
|     FURI_LOG_I(TAG, "Started"); |     FURI_LOG_I(TAG, "Started"); | ||||||
| 
 | 
 | ||||||
|     furi_record_create("loader", loader_instance); |     furi_record_create(RECORD_LOADER, loader_instance); | ||||||
| 
 | 
 | ||||||
| #ifdef LOADER_AUTOSTART | #ifdef LOADER_AUTOSTART | ||||||
|     loader_start(loader_instance, LOADER_AUTOSTART, NULL); |     loader_start(loader_instance, LOADER_AUTOSTART, NULL); | ||||||
| @ -480,7 +481,7 @@ int32_t loader_srv(void* p) { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     furi_record_destroy("loader"); |     furi_record_destroy(RECORD_LOADER); | ||||||
|     loader_free(loader_instance); |     loader_free(loader_instance); | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
|  | |||||||
| @ -3,6 +3,8 @@ | |||||||
| #include <core/pubsub.h> | #include <core/pubsub.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_LOADER "loader" | ||||||
|  | 
 | ||||||
| typedef struct Loader Loader; | typedef struct Loader Loader; | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|  | |||||||
| @ -1,15 +1,18 @@ | |||||||
| #include "assets_icons.h" | #include "music_player_worker.h" | ||||||
| #include "m-string.h" | 
 | ||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| 
 | 
 | ||||||
|  | #include <assets_icons.h> | ||||||
| #include <gui/gui.h> | #include <gui/gui.h> | ||||||
| #include <dialogs/dialogs.h> | #include <dialogs/dialogs.h> | ||||||
| #include "music_player_worker.h" | #include <storage/storage.h> | ||||||
|  | 
 | ||||||
|  | #include <m-string.h> | ||||||
| 
 | 
 | ||||||
| #define TAG "MusicPlayer" | #define TAG "MusicPlayer" | ||||||
| 
 | 
 | ||||||
| #define MUSIC_PLAYER_APP_PATH_FOLDER "/any/music_player" | #define MUSIC_PLAYER_APP_PATH_FOLDER ANY_PATH("music_player") | ||||||
| #define MUSIC_PLAYER_APP_EXTENSION "*" | #define MUSIC_PLAYER_APP_EXTENSION "*" | ||||||
| 
 | 
 | ||||||
| #define MUSIC_PLAYER_SEMITONE_HISTORY_SIZE 4 | #define MUSIC_PLAYER_SEMITONE_HISTORY_SIZE 4 | ||||||
| @ -269,7 +272,7 @@ MusicPlayer* music_player_alloc() { | |||||||
|     view_port_input_callback_set(instance->view_port, input_callback, instance); |     view_port_input_callback_set(instance->view_port, input_callback, instance); | ||||||
| 
 | 
 | ||||||
|     // Open GUI and register view_port
 |     // Open GUI and register view_port
 | ||||||
|     instance->gui = furi_record_open("gui"); |     instance->gui = furi_record_open(RECORD_GUI); | ||||||
|     gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen); |     gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen); | ||||||
| 
 | 
 | ||||||
|     return instance; |     return instance; | ||||||
| @ -277,7 +280,7 @@ MusicPlayer* music_player_alloc() { | |||||||
| 
 | 
 | ||||||
| void music_player_free(MusicPlayer* instance) { | void music_player_free(MusicPlayer* instance) { | ||||||
|     gui_remove_view_port(instance->gui, instance->view_port); |     gui_remove_view_port(instance->gui, instance->view_port); | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     view_port_free(instance->view_port); |     view_port_free(instance->view_port); | ||||||
| 
 | 
 | ||||||
|     music_player_worker_free(instance->worker); |     music_player_worker_free(instance->worker); | ||||||
| @ -302,7 +305,7 @@ int32_t music_player_app(void* p) { | |||||||
|         } else { |         } else { | ||||||
|             string_set_str(file_path, MUSIC_PLAYER_APP_PATH_FOLDER); |             string_set_str(file_path, MUSIC_PLAYER_APP_PATH_FOLDER); | ||||||
| 
 | 
 | ||||||
|             DialogsApp* dialogs = furi_record_open("dialogs"); |             DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|             bool res = dialog_file_browser_show( |             bool res = dialog_file_browser_show( | ||||||
|                 dialogs, |                 dialogs, | ||||||
|                 file_path, |                 file_path, | ||||||
| @ -312,7 +315,7 @@ int32_t music_player_app(void* p) { | |||||||
|                 &I_music_10px, |                 &I_music_10px, | ||||||
|                 false); |                 false); | ||||||
| 
 | 
 | ||||||
|             furi_record_close("dialogs"); |             furi_record_close(RECORD_DIALOGS); | ||||||
|             if(!res) { |             if(!res) { | ||||||
|                 FURI_LOG_E(TAG, "No file selected"); |                 FURI_LOG_E(TAG, "No file selected"); | ||||||
|                 break; |                 break; | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| static void music_player_cli(Cli* cli, string_t args, void* context) { | static void music_player_cli(Cli* cli, string_t args, void* context) { | ||||||
|     UNUSED(context); |     UNUSED(context); | ||||||
|     MusicPlayerWorker* music_player_worker = music_player_worker_alloc(); |     MusicPlayerWorker* music_player_worker = music_player_worker_alloc(); | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
|         if(storage_common_stat(storage, string_get_cstr(args), NULL) == FSE_OK) { |         if(storage_common_stat(storage, string_get_cstr(args), NULL) == FSE_OK) { | ||||||
| @ -31,17 +31,17 @@ static void music_player_cli(Cli* cli, string_t args, void* context) { | |||||||
|         music_player_worker_stop(music_player_worker); |         music_player_worker_stop(music_player_worker); | ||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     music_player_worker_free(music_player_worker); |     music_player_worker_free(music_player_worker); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void music_player_on_system_start() { | void music_player_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
| 
 | 
 | ||||||
|     cli_add_command(cli, "music_player", CliCommandFlagDefault, music_player_cli, NULL); |     cli_add_command(cli, "music_player", CliCommandFlagDefault, music_player_cli, NULL); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(music_player_cli); |     UNUSED(music_player_cli); | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -329,7 +329,7 @@ bool music_player_worker_load_fmf_from_file(MusicPlayerWorker* instance, const c | |||||||
|     string_t temp_str; |     string_t temp_str; | ||||||
|     string_init(temp_str); |     string_init(temp_str); | ||||||
| 
 | 
 | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     FlipperFormat* file = flipper_format_file_alloc(storage); |     FlipperFormat* file = flipper_format_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
| @ -367,7 +367,7 @@ bool music_player_worker_load_fmf_from_file(MusicPlayerWorker* instance, const c | |||||||
|         result = true; |         result = true; | ||||||
|     } while(false); |     } while(false); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     flipper_format_free(file); |     flipper_format_free(file); | ||||||
|     string_clear(temp_str); |     string_clear(temp_str); | ||||||
| 
 | 
 | ||||||
| @ -381,7 +381,7 @@ bool music_player_worker_load_rtttl_from_file(MusicPlayerWorker* instance, const | |||||||
|     bool result = false; |     bool result = false; | ||||||
|     string_t content; |     string_t content; | ||||||
|     string_init(content); |     string_init(content); | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open(RECORD_STORAGE); | ||||||
|     File* file = storage_file_alloc(storage); |     File* file = storage_file_alloc(storage); | ||||||
| 
 | 
 | ||||||
|     do { |     do { | ||||||
| @ -414,7 +414,7 @@ bool music_player_worker_load_rtttl_from_file(MusicPlayerWorker* instance, const | |||||||
|     } while(0); |     } while(0); | ||||||
| 
 | 
 | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     string_clear(content); |     string_clear(content); | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| #define DATA_PICC_TO_PCD_CRC_DROPPED 0xFB | #define DATA_PICC_TO_PCD_CRC_DROPPED 0xFB | ||||||
| #define DATA_PCD_TO_PICC_CRC_DROPPED 0xFA | #define DATA_PCD_TO_PICC_CRC_DROPPED 0xFA | ||||||
| 
 | 
 | ||||||
| #define NFC_DEBUG_PCAP_FILENAME "/ext/nfc/debug.pcap" | #define NFC_DEBUG_PCAP_FILENAME EXT_PATH("nfc/debug.pcap") | ||||||
| #define NFC_DEBUG_PCAP_BUFFER_SIZE 64 | #define NFC_DEBUG_PCAP_BUFFER_SIZE 64 | ||||||
| 
 | 
 | ||||||
| struct NfcDebugPcapWorker { | struct NfcDebugPcapWorker { | ||||||
|  | |||||||
| @ -44,7 +44,7 @@ bool nfc_emv_parser_get_aid_name( | |||||||
|     for(uint8_t i = 0; i < aid_len; i++) { |     for(uint8_t i = 0; i < aid_len; i++) { | ||||||
|         string_cat_printf(key, "%02X", aid[i]); |         string_cat_printf(key, "%02X", aid[i]); | ||||||
|     } |     } | ||||||
|     if(nfc_emv_parser_search_data(storage, "/ext/nfc/assets/aid.nfc", key, aid_name)) { |     if(nfc_emv_parser_search_data(storage, EXT_PATH("nfc/assets/aid.nfc"), key, aid_name)) { | ||||||
|         parsed = true; |         parsed = true; | ||||||
|     } |     } | ||||||
|     string_clear(key); |     string_clear(key); | ||||||
| @ -58,7 +58,8 @@ bool nfc_emv_parser_get_country_name( | |||||||
|     bool parsed = false; |     bool parsed = false; | ||||||
|     string_t key; |     string_t key; | ||||||
|     string_init_printf(key, "%04X", country_code); |     string_init_printf(key, "%04X", country_code); | ||||||
|     if(nfc_emv_parser_search_data(storage, "/ext/nfc/assets/country_code.nfc", key, country_name)) { |     if(nfc_emv_parser_search_data( | ||||||
|  |            storage, EXT_PATH("nfc/assets/country_code.nfc"), key, country_name)) { | ||||||
|         parsed = true; |         parsed = true; | ||||||
|     } |     } | ||||||
|     string_clear(key); |     string_clear(key); | ||||||
| @ -73,7 +74,7 @@ bool nfc_emv_parser_get_currency_name( | |||||||
|     string_t key; |     string_t key; | ||||||
|     string_init_printf(key, "%04X", currency_code); |     string_init_printf(key, "%04X", currency_code); | ||||||
|     if(nfc_emv_parser_search_data( |     if(nfc_emv_parser_search_data( | ||||||
|            storage, "/ext/nfc/assets/currency_code.nfc", key, currency_name)) { |            storage, EXT_PATH("nfc/assets/currency_code.nfc"), key, currency_name)) { | ||||||
|         parsed = true; |         parsed = true; | ||||||
|     } |     } | ||||||
|     string_clear(key); |     string_clear(key); | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
| #include <flipper_format/flipper_format.h> | #include <flipper_format/flipper_format.h> | ||||||
| #include <lib/toolbox/args.h> | #include <lib/toolbox/args.h> | ||||||
| 
 | 
 | ||||||
| #define NFC_MF_CLASSIC_DICT_PATH "/ext/nfc/assets/mf_classic_dict.nfc" | #define NFC_MF_CLASSIC_DICT_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") | ||||||
| 
 | 
 | ||||||
| #define NFC_MF_CLASSIC_KEY_LEN (13) | #define NFC_MF_CLASSIC_KEY_LEN (13) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -108,10 +108,10 @@ Nfc* nfc_alloc() { | |||||||
|     nfc->dev = nfc_device_alloc(); |     nfc->dev = nfc_device_alloc(); | ||||||
| 
 | 
 | ||||||
|     // Open GUI record
 |     // Open GUI record
 | ||||||
|     nfc->gui = furi_record_open("gui"); |     nfc->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     // Open Notification record
 |     // Open Notification record
 | ||||||
|     nfc->notifications = furi_record_open("notification"); |     nfc->notifications = furi_record_open(RECORD_NOTIFICATION); | ||||||
| 
 | 
 | ||||||
|     // Submenu
 |     // Submenu
 | ||||||
|     nfc->submenu = submenu_alloc(); |     nfc->submenu = submenu_alloc(); | ||||||
| @ -224,11 +224,11 @@ void nfc_free(Nfc* nfc) { | |||||||
|     scene_manager_free(nfc->scene_manager); |     scene_manager_free(nfc->scene_manager); | ||||||
| 
 | 
 | ||||||
|     // GUI
 |     // GUI
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     nfc->gui = NULL; |     nfc->gui = NULL; | ||||||
| 
 | 
 | ||||||
|     // Notifications
 |     // Notifications
 | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     nfc->notifications = NULL; |     nfc->notifications = NULL; | ||||||
| 
 | 
 | ||||||
|     free(nfc); |     free(nfc); | ||||||
|  | |||||||
| @ -131,9 +131,9 @@ static void nfc_cli(Cli* cli, string_t args, void* context) { | |||||||
| 
 | 
 | ||||||
| void nfc_on_system_start() { | void nfc_on_system_start() { | ||||||
| #ifdef SRV_CLI | #ifdef SRV_CLI | ||||||
|     Cli* cli = furi_record_open("cli"); |     Cli* cli = furi_record_open(RECORD_CLI); | ||||||
|     cli_add_command(cli, "nfc", CliCommandFlagDefault, nfc_cli, NULL); |     cli_add_command(cli, "nfc", CliCommandFlagDefault, nfc_cli, NULL); | ||||||
|     furi_record_close("cli"); |     furi_record_close(RECORD_CLI); | ||||||
| #else | #else | ||||||
|     UNUSED(nfc_cli); |     UNUSED(nfc_cli); | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -14,8 +14,8 @@ static const uint32_t nfc_mifare_classic_data_format_version = 1; | |||||||
| 
 | 
 | ||||||
| NfcDevice* nfc_device_alloc() { | NfcDevice* nfc_device_alloc() { | ||||||
|     NfcDevice* nfc_dev = malloc(sizeof(NfcDevice)); |     NfcDevice* nfc_dev = malloc(sizeof(NfcDevice)); | ||||||
|     nfc_dev->storage = furi_record_open("storage"); |     nfc_dev->storage = furi_record_open(RECORD_STORAGE); | ||||||
|     nfc_dev->dialogs = furi_record_open("dialogs"); |     nfc_dev->dialogs = furi_record_open(RECORD_DIALOGS); | ||||||
|     string_init(nfc_dev->load_path); |     string_init(nfc_dev->load_path); | ||||||
|     return nfc_dev; |     return nfc_dev; | ||||||
| } | } | ||||||
| @ -23,8 +23,8 @@ NfcDevice* nfc_device_alloc() { | |||||||
| void nfc_device_free(NfcDevice* nfc_dev) { | void nfc_device_free(NfcDevice* nfc_dev) { | ||||||
|     furi_assert(nfc_dev); |     furi_assert(nfc_dev); | ||||||
|     nfc_device_clear(nfc_dev); |     nfc_device_clear(nfc_dev); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
|     furi_record_close("dialogs"); |     furi_record_close(RECORD_DIALOGS); | ||||||
|     string_clear(nfc_dev->load_path); |     string_clear(nfc_dev->load_path); | ||||||
|     free(nfc_dev); |     free(nfc_dev); | ||||||
| } | } | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
| #define NFC_DEV_NAME_MAX_LEN 22 | #define NFC_DEV_NAME_MAX_LEN 22 | ||||||
| #define NFC_READER_DATA_MAX_SIZE 64 | #define NFC_READER_DATA_MAX_SIZE 64 | ||||||
| 
 | 
 | ||||||
| #define NFC_APP_FOLDER "/any/nfc" | #define NFC_APP_FOLDER ANY_PATH("nfc") | ||||||
| #define NFC_APP_EXTENSION ".nfc" | #define NFC_APP_EXTENSION ".nfc" | ||||||
| #define NFC_APP_SHADOW_EXTENSION ".shd" | #define NFC_APP_SHADOW_EXTENSION ".shd" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ NfcWorker* nfc_worker_alloc() { | |||||||
| 
 | 
 | ||||||
|     nfc_worker->callback = NULL; |     nfc_worker->callback = NULL; | ||||||
|     nfc_worker->context = NULL; |     nfc_worker->context = NULL; | ||||||
|     nfc_worker->storage = furi_record_open("storage"); |     nfc_worker->storage = furi_record_open(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     // Initialize rfal
 |     // Initialize rfal
 | ||||||
|     while(furi_hal_nfc_is_busy()) { |     while(furi_hal_nfc_is_busy()) { | ||||||
| @ -39,7 +39,7 @@ void nfc_worker_free(NfcWorker* nfc_worker) { | |||||||
| 
 | 
 | ||||||
|     furi_thread_free(nfc_worker->thread); |     furi_thread_free(nfc_worker->thread); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     if(nfc_worker->debug_pcap_worker) nfc_debug_pcap_free(nfc_worker->debug_pcap_worker); |     if(nfc_worker->debug_pcap_worker) nfc_debug_pcap_free(nfc_worker->debug_pcap_worker); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -7,6 +7,8 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #define RECORD_NOTIFICATION "notification" | ||||||
|  | 
 | ||||||
| typedef struct NotificationApp NotificationApp; | typedef struct NotificationApp NotificationApp; | ||||||
| typedef struct { | typedef struct { | ||||||
|     float frequency; |     float frequency; | ||||||
|  | |||||||
| @ -398,7 +398,7 @@ void notification_process_internal_message(NotificationApp* app, NotificationApp | |||||||
| 
 | 
 | ||||||
| static bool notification_load_settings(NotificationApp* app) { | static bool notification_load_settings(NotificationApp* app) { | ||||||
|     NotificationSettings settings; |     NotificationSettings settings; | ||||||
|     File* file = storage_file_alloc(furi_record_open("storage")); |     File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); | ||||||
|     const size_t settings_size = sizeof(NotificationSettings); |     const size_t settings_size = sizeof(NotificationSettings); | ||||||
| 
 | 
 | ||||||
|     FURI_LOG_I(TAG, "loading settings from \"%s\"", NOTIFICATION_SETTINGS_PATH); |     FURI_LOG_I(TAG, "loading settings from \"%s\"", NOTIFICATION_SETTINGS_PATH); | ||||||
| @ -430,14 +430,14 @@ static bool notification_load_settings(NotificationApp* app) { | |||||||
| 
 | 
 | ||||||
|     storage_file_close(file); |     storage_file_close(file); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return fs_result; |     return fs_result; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static bool notification_save_settings(NotificationApp* app) { | static bool notification_save_settings(NotificationApp* app) { | ||||||
|     NotificationSettings settings; |     NotificationSettings settings; | ||||||
|     File* file = storage_file_alloc(furi_record_open("storage")); |     File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); | ||||||
|     const size_t settings_size = sizeof(NotificationSettings); |     const size_t settings_size = sizeof(NotificationSettings); | ||||||
| 
 | 
 | ||||||
|     FURI_LOG_I(TAG, "saving settings to \"%s\"", NOTIFICATION_SETTINGS_PATH); |     FURI_LOG_I(TAG, "saving settings to \"%s\"", NOTIFICATION_SETTINGS_PATH); | ||||||
| @ -465,7 +465,7 @@ static bool notification_save_settings(NotificationApp* app) { | |||||||
| 
 | 
 | ||||||
|     storage_file_close(file); |     storage_file_close(file); | ||||||
|     storage_file_free(file); |     storage_file_free(file); | ||||||
|     furi_record_close("storage"); |     furi_record_close(RECORD_STORAGE); | ||||||
| 
 | 
 | ||||||
|     return fs_result; |     return fs_result; | ||||||
| }; | }; | ||||||
| @ -512,7 +512,7 @@ static NotificationApp* notification_app_alloc() { | |||||||
|     app->settings.version = NOTIFICATION_SETTINGS_VERSION; |     app->settings.version = NOTIFICATION_SETTINGS_VERSION; | ||||||
| 
 | 
 | ||||||
|     // display backlight control
 |     // display backlight control
 | ||||||
|     app->event_record = furi_record_open("input_events"); |     app->event_record = furi_record_open(RECORD_INPUT_EVENTS); | ||||||
|     furi_pubsub_subscribe(app->event_record, input_event_callback, app); |     furi_pubsub_subscribe(app->event_record, input_event_callback, app); | ||||||
|     notification_message(app, &sequence_display_backlight_on); |     notification_message(app, &sequence_display_backlight_on); | ||||||
| 
 | 
 | ||||||
| @ -535,7 +535,7 @@ int32_t notification_srv(void* p) { | |||||||
|     notification_apply_internal_led_layer(&app->led[1], 0x00); |     notification_apply_internal_led_layer(&app->led[1], 0x00); | ||||||
|     notification_apply_internal_led_layer(&app->led[2], 0x00); |     notification_apply_internal_led_layer(&app->led[2], 0x00); | ||||||
| 
 | 
 | ||||||
|     furi_record_create("notification", app); |     furi_record_create(RECORD_NOTIFICATION, app); | ||||||
| 
 | 
 | ||||||
|     NotificationAppMessage message; |     NotificationAppMessage message; | ||||||
|     while(1) { |     while(1) { | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| #include "notification.h" | #include "notification.h" | ||||||
| #include "notification_messages.h" | #include "notification_messages.h" | ||||||
|  | #include "notification_settings_filename.h" | ||||||
| 
 | 
 | ||||||
| #define NOTIFICATION_LED_COUNT 3 | #define NOTIFICATION_LED_COUNT 3 | ||||||
| #define NOTIFICATION_EVENT_COMPLETE 0x00000001U | #define NOTIFICATION_EVENT_COMPLETE 0x00000001U | ||||||
| @ -32,7 +33,7 @@ typedef struct { | |||||||
| } NotificationLedLayer; | } NotificationLedLayer; | ||||||
| 
 | 
 | ||||||
| #define NOTIFICATION_SETTINGS_VERSION 0x01 | #define NOTIFICATION_SETTINGS_VERSION 0x01 | ||||||
| #define NOTIFICATION_SETTINGS_PATH "/int/notification.settings" | #define NOTIFICATION_SETTINGS_PATH INT_PATH(NOTIFICATION_SETTINGS_FILE_NAME) | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t version; |     uint8_t version; | ||||||
|  | |||||||
| @ -126,8 +126,8 @@ static uint32_t notification_app_settings_exit(void* context) { | |||||||
| 
 | 
 | ||||||
| static NotificationAppSettings* alloc_settings() { | static NotificationAppSettings* alloc_settings() { | ||||||
|     NotificationAppSettings* app = malloc(sizeof(NotificationAppSettings)); |     NotificationAppSettings* app = malloc(sizeof(NotificationAppSettings)); | ||||||
|     app->notification = furi_record_open("notification"); |     app->notification = furi_record_open(RECORD_NOTIFICATION); | ||||||
|     app->gui = furi_record_open("gui"); |     app->gui = furi_record_open(RECORD_GUI); | ||||||
| 
 | 
 | ||||||
|     app->variable_item_list = variable_item_list_alloc(); |     app->variable_item_list = variable_item_list_alloc(); | ||||||
|     View* view = variable_item_list_get_view(app->variable_item_list); |     View* view = variable_item_list_get_view(app->variable_item_list); | ||||||
| @ -184,8 +184,8 @@ static void free_settings(NotificationAppSettings* app) { | |||||||
|     variable_item_list_free(app->variable_item_list); |     variable_item_list_free(app->variable_item_list); | ||||||
|     view_dispatcher_free(app->view_dispatcher); |     view_dispatcher_free(app->view_dispatcher); | ||||||
| 
 | 
 | ||||||
|     furi_record_close("gui"); |     furi_record_close(RECORD_GUI); | ||||||
|     furi_record_close("notification"); |     furi_record_close(RECORD_NOTIFICATION); | ||||||
|     free(app); |     free(app); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 hedger
						hedger