From b3810ec573c37610612a606d10aa864566034773 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 14 Jul 2023 14:16:37 +0300 Subject: [PATCH] SubRem: archive browser --- .../main/archive/helpers/archive_browser.h | 3 ++ .../main/archive/helpers/archive_files.c | 6 +++ .../main/archive/helpers/archive_files.h | 1 + .../archive/scenes/archive_scene_browser.c | 2 + .../main/archive/views/archive_browser_view.c | 2 + .../main/archive/views/archive_browser_view.h | 1 + .../scenes/subrem_scene_open_map_file.c | 2 - .../scenes/subrem_scene_remote.c | 3 ++ .../main/subghz_remote/subghz_remote_app.c | 44 +++++++++++++++---- .../main/subghz_remote/views/remote.c | 13 ++++++ .../main/subghz_remote/views/remote.h | 4 +- 11 files changed, 69 insertions(+), 12 deletions(-) diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index 43a9a651a..579c51082 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -12,6 +12,7 @@ static const char* tab_default_paths[] = { [ArchiveTabIButton] = ANY_PATH("ibutton"), [ArchiveTabNFC] = ANY_PATH("nfc"), [ArchiveTabSubGhz] = ANY_PATH("subghz"), + [ArchiveTabSubGhzRemote] = EXT_PATH("subghz_remote"), [ArchiveTabLFRFID] = ANY_PATH("lfrfid"), [ArchiveTabInfrared] = ANY_PATH("infrared"), [ArchiveTabBadUsb] = ANY_PATH("badusb"), @@ -25,6 +26,7 @@ static const char* known_ext[] = { [ArchiveFileTypeIButton] = ".ibtn", [ArchiveFileTypeNFC] = ".nfc", [ArchiveFileTypeSubGhz] = ".sub", + [ArchiveFileTypeSubGhzRemote] = ".txt", [ArchiveFileTypeLFRFID] = ".rfid", [ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeBadUsb] = ".txt", @@ -40,6 +42,7 @@ static const ArchiveFileTypeEnum known_type[] = { [ArchiveTabIButton] = ArchiveFileTypeIButton, [ArchiveTabNFC] = ArchiveFileTypeNFC, [ArchiveTabSubGhz] = ArchiveFileTypeSubGhz, + [ArchiveTabSubGhzRemote] = ArchiveFileTypeSubGhzRemote, [ArchiveTabLFRFID] = ArchiveFileTypeLFRFID, [ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, diff --git a/applications/main/archive/helpers/archive_files.c b/applications/main/archive/helpers/archive_files.c index 8aef0ef09..e12576cb2 100644 --- a/applications/main/archive/helpers/archive_files.c +++ b/applications/main/archive/helpers/archive_files.c @@ -22,6 +22,12 @@ void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder file->type = i; return; // *.txt file is a BadUSB script only if it is in BadUSB folder } + } else if(i == ArchiveFileTypeSubGhzRemote) { + if(furi_string_search( + file->path, archive_get_default_path(ArchiveTabSubGhzRemote)) == 0) { + file->type = i; + return; // *.txt file is a SubRem map file only if it is in SubRem folder + } } else { file->type = i; return; diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 6acdb2213..989198fec 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -12,6 +12,7 @@ typedef enum { ArchiveFileTypeIButton, ArchiveFileTypeNFC, ArchiveFileTypeSubGhz, + ArchiveFileTypeSubGhzRemote, ArchiveFileTypeLFRFID, ArchiveFileTypeInfrared, ArchiveFileTypeBadUsb, diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index a6892239a..e512d31d5 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -20,6 +20,8 @@ static const char* archive_get_flipper_app_name(ArchiveFileTypeEnum file_type) { return "NFC"; case ArchiveFileTypeSubGhz: return "Sub-GHz"; + case ArchiveFileTypeSubGhzRemote: + return "Sub-GHz Remote"; case ArchiveFileTypeLFRFID: return "125 kHz RFID"; case ArchiveFileTypeInfrared: diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 63fa91c4d..fd7de727d 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -14,6 +14,7 @@ static const char* ArchiveTabNames[] = { [ArchiveTabIButton] = "iButton", [ArchiveTabNFC] = "NFC", [ArchiveTabSubGhz] = "Sub-GHz", + [ArchiveTabSubGhzRemote] = "SubRem", [ArchiveTabLFRFID] = "RFID LF", [ArchiveTabInfrared] = "Infrared", [ArchiveTabBadUsb] = "Bad USB", @@ -27,6 +28,7 @@ static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeIButton] = &I_ibutt_10px, [ArchiveFileTypeNFC] = &I_Nfc_10px, [ArchiveFileTypeSubGhz] = &I_sub1_10px, + [ArchiveFileTypeSubGhzRemote] = &I_subrem_10px, [ArchiveFileTypeLFRFID] = &I_125_10px, [ArchiveFileTypeInfrared] = &I_ir_10px, [ArchiveFileTypeBadUsb] = &I_badusb_10px, diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index 323e583cc..d3a57f755 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -24,6 +24,7 @@ typedef enum { ArchiveTabFavorites, ArchiveTabSubGhz, + ArchiveTabSubGhzRemote, ArchiveTabLFRFID, ArchiveTabNFC, ArchiveTabInfrared, diff --git a/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c b/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c index 1ed8ea252..b91a35129 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c @@ -8,8 +8,6 @@ void subrem_scene_open_map_file_on_enter(void* context) { uint32_t start_scene_state = scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart); - // TODO if optimization - if(load_state == SubRemLoadMapStateBack) { scene_manager_previous_scene(app->scene_manager); } else if(start_scene_state == SubmenuIndexSubRemEditMapFile) { diff --git a/applications/main/subghz_remote/scenes/subrem_scene_remote.c b/applications/main/subghz_remote/scenes/subrem_scene_remote.c index ebc582991..692863434 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_remote.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_remote.c @@ -39,6 +39,9 @@ void subrem_scene_remote_on_enter(void* context) { SubGhzRemoteApp* app = context; subrem_view_remote_update_data_labels(app->subrem_remote_view, app->map_preset->subs_preset); + subrem_view_remote_set_radio( + app->subrem_remote_view, + subghz_txrx_radio_device_get(app->txrx) == SubGhzRadioDeviceTypeExternalCC1101); subrem_view_remote_set_callback(app->subrem_remote_view, subrem_scene_remote_callback, app); diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index e91d07d32..1af39f57d 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -18,16 +18,23 @@ static void subghz_remote_app_tick_event_callback(void* context) { scene_manager_handle_tick_event(app->scene_manager); } -SubGhzRemoteApp* subghz_remote_app_alloc() { - SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp)); +static void subghz_remote_make_app_folder(SubGhzRemoteApp* app) { + furi_assert(app); Storage* storage = furi_record_open(RECORD_STORAGE); + + // Migrate old users data storage_common_migrate(storage, EXT_PATH("unirf"), SUBREM_APP_FOLDER); if(!storage_simply_mkdir(storage, SUBREM_APP_FOLDER)) { - //FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER); + // FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER); + dialog_message_show_storage_error(app->dialogs, "Cannot create\napp folder"); } furi_record_close(RECORD_STORAGE); +} + +SubGhzRemoteApp* subghz_remote_app_alloc() { + SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp)); furi_hal_power_suppress_charge_enter(); @@ -103,9 +110,6 @@ SubGhzRemoteApp* subghz_remote_app_alloc() { app->map_not_saved = false; - scene_manager_next_scene(app->scene_manager, SubRemSceneStart); - scene_manager_next_scene(app->scene_manager, SubRemSceneOpenMapFile); - return app; } @@ -164,11 +168,33 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) { free(app); } -int32_t subghz_remote_app(void* p) { - UNUSED(p); +int32_t subghz_remote_app(void* arg) { SubGhzRemoteApp* subghz_remote_app = subghz_remote_app_alloc(); - furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER); + subghz_remote_make_app_folder(subghz_remote_app); + + bool map_loaded = false; + + if((arg != NULL) && (strlen(arg) != 0)) { + furi_string_set(subghz_remote_app->file_path, (const char*)arg); + SubRemLoadMapState load_state = subrem_map_file_load( + subghz_remote_app, furi_string_get_cstr(subghz_remote_app->file_path)); + + if(load_state == SubRemLoadMapStateOK || load_state == SubRemLoadMapStateNotAllOK) { + map_loaded = true; + } else { + // TODO Replace + dialog_message_show_storage_error(subghz_remote_app->dialogs, "Cannot load\nmap file"); + } + } + + if(map_loaded) { + scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneRemote); + } else { + furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER); + scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneStart); + scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile); + } view_dispatcher_run(subghz_remote_app->view_dispatcher); diff --git a/applications/main/subghz_remote/views/remote.c b/applications/main/subghz_remote/views/remote.c index c2b41cfd6..fc7608624 100644 --- a/applications/main/subghz_remote/views/remote.c +++ b/applications/main/subghz_remote/views/remote.c @@ -22,6 +22,7 @@ typedef struct { SubRemViewRemoteState state; uint8_t pressed_btn; + bool is_external; } SubRemViewRemoteModel; void subrem_view_remote_set_callback( @@ -106,6 +107,15 @@ void subrem_view_remote_set_state( true); } +void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external) { + furi_assert(subrem_view_remote); + with_view_model( + subrem_view_remote->view, + SubRemViewRemoteModel * model, + { model->is_external = external; }, + true); +} + void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) { canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); @@ -143,6 +153,8 @@ void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) { elements_button_right(canvas, "Save"); } else { canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit."); + canvas_draw_str_aligned( + canvas, 126, 62, AlignRight, AlignBottom, ((model->is_external) ? "Ext" : "Int")); } //Status text and indicator @@ -267,6 +279,7 @@ SubRemViewRemote* subrem_view_remote_alloc() { } model->pressed_btn = 0; + model->is_external = false; }, true); return subrem_view_remote; diff --git a/applications/main/subghz_remote/views/remote.h b/applications/main/subghz_remote/views/remote.h index 5b1e8153a..39f9a007d 100644 --- a/applications/main/subghz_remote/views/remote.h +++ b/applications/main/subghz_remote/views/remote.h @@ -33,4 +33,6 @@ void subrem_view_remote_update_data_labels( void subrem_view_remote_set_state( SubRemViewRemote* subrem_view_remote, SubRemViewRemoteState state, - uint8_t presed_btn); \ No newline at end of file + uint8_t presed_btn); + +void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external); \ No newline at end of file