From fe03a61bcc41d3a49ee9ab57e486cccddff59bb3 Mon Sep 17 00:00:00 2001 From: rdefeo Date: Thu, 5 Sep 2024 20:12:01 -0400 Subject: [PATCH 1/3] update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 81a8981f739..dd6a4750db6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ dist/* .vscode .clang-format +.clangd .editorconfig .env .ufbt From 75fd1a452b87fbb6e536f687cf869dd376491359 Mon Sep 17 00:00:00 2001 From: rdefeo Date: Thu, 5 Sep 2024 21:48:01 -0400 Subject: [PATCH 2/3] add Import All for ir files --- scenes/scene_action_ir_list.c | 82 ++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/scenes/scene_action_ir_list.c b/scenes/scene_action_ir_list.c index d8380ace677..b3d592169fc 100644 --- a/scenes/scene_action_ir_list.c +++ b/scenes/scene_action_ir_list.c @@ -13,6 +13,9 @@ #include +// ehhhh +uint32_t num_ir_commands; + void scene_action_ir_list_callback(void* context, uint32_t index) { App* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); @@ -27,10 +30,14 @@ void scene_action_ir_list_on_enter(void* context) { // Our selected IR File is app->temp_str submenu_set_header(menu, "Select IR Command"); + uint32_t index = 0; + + // Add an entry for IMPORT ALL + submenu_add_item(menu, "* IMPORT ALL *", index++, scene_action_ir_list_callback, app); + // read the IR file and load the names of all of the commands FuriString* name = furi_string_alloc(); - uint32_t index = 0; FlipperFormat* fff_data_file = flipper_format_file_alloc(app->storage); if(flipper_format_file_open_existing(fff_data_file, furi_string_get_cstr(app->temp_str))) { while(flipper_format_read_string(fff_data_file, "name", name)) { @@ -39,9 +46,11 @@ void scene_action_ir_list_on_enter(void* context) { index++; } } + num_ir_commands = index - 1; - if(index == 0) { + if(index == 1) { // '1' to account for 'IMPORT ALL' FURI_LOG_E(TAG, "Failed to get commands from %s", furi_string_get_cstr(app->temp_str)); + submenu_change_item_label(menu, 0, "No IR cmds!"); } flipper_format_file_close(fff_data_file); @@ -66,37 +75,48 @@ bool scene_action_ir_list_on_event(void* context, SceneManagerEvent event) { FuriString* file_name = furi_string_alloc(); // new IR file name do { - if(!flipper_format_file_open_existing( - fff_data_file, furi_string_get_cstr(app->temp_str))) { - FURI_LOG_E(TAG, "Failed to open %s", furi_string_get_cstr(app->temp_str)); - break; + uint32_t start = index - 1; + uint32_t end = index; + if(index == 0) { + start = 0; + end = num_ir_commands; } - if(!infrared_utils_read_signal_at_index(fff_data_file, index, signal, name)) { - FURI_LOG_E(TAG, "Failed to read signal at %lu", index); - break; + for(uint32_t ir_index = start; ir_index < end; ir_index++) { + if(!flipper_format_file_open_existing( + fff_data_file, furi_string_get_cstr(app->temp_str))) { + FURI_LOG_E(TAG, "Failed to open %s", furi_string_get_cstr(app->temp_str)); + break; + } + + if(!infrared_utils_read_signal_at_index(fff_data_file, ir_index, signal, name)) { + FURI_LOG_E(TAG, "Failed to read signal at %lu", index); + break; + } + FURI_LOG_I(TAG, "Read IR signal: %s", furi_string_get_cstr(name)); + flipper_format_file_close(fff_data_file); + + // generate the new path, based on current item's dir and new command name + if(app->selected_item != EMPTY_ACTION_INDEX) { + Item* item = ItemArray_get(app->items_view->items, app->selected_item); + path_extract_dirname(furi_string_get_cstr(item->path), file_name); + } else { + furi_string_set(file_name, app->items_view->path); + } + furi_string_cat_printf(file_name, "/%s.ir", furi_string_get_cstr(name)); + + FURI_LOG_I(TAG, "Writing new IR file: %s", furi_string_get_cstr(file_name)); + if(!flipper_format_file_open_new(fff_data_file, furi_string_get_cstr(file_name))) { + FURI_LOG_E( + TAG, "Error creating new file: %s", furi_string_get_cstr(file_name)); + break; + } + if(!infrared_utils_write_signal(fff_data_file, signal, name)) { + FURI_LOG_E(TAG, "Failed to write signal!"); + break; + } + flipper_format_file_close(fff_data_file); + FURI_LOG_I(TAG, "Imported %s", furi_string_get_cstr(name)); } - FURI_LOG_I(TAG, "Read IR signal: %s", furi_string_get_cstr(name)); - flipper_format_file_close(fff_data_file); - - // generate the new path, based on current item's dir and new command name - if(app->selected_item != EMPTY_ACTION_INDEX) { - Item* item = ItemArray_get(app->items_view->items, app->selected_item); - path_extract_dirname(furi_string_get_cstr(item->path), file_name); - } else { - furi_string_set(file_name, app->items_view->path); - } - furi_string_cat_printf(file_name, "/%s.ir", furi_string_get_cstr(name)); - - FURI_LOG_I(TAG, "Writing new IR file: %s", furi_string_get_cstr(file_name)); - if(!flipper_format_file_open_new(fff_data_file, furi_string_get_cstr(file_name))) { - FURI_LOG_E(TAG, "Error creating new file: %s", furi_string_get_cstr(file_name)); - break; - } - if(!infrared_utils_write_signal(fff_data_file, signal, name)) { - FURI_LOG_E(TAG, "Failed to write signal!"); - break; - } - // Import successful! // Leave the user on this scene, in case they want to import // more commands from this IR file From 6f79e18e7e722d98ce2a45c558770bd2a5c75d00 Mon Sep 17 00:00:00 2001 From: rdefeo Date: Sun, 8 Sep 2024 15:43:29 -0400 Subject: [PATCH 3/3] small cleanup of Import All --- quac.h | 12 ++++++++---- scenes/scene_action_ir_list.c | 28 ++++++++++++++++++---------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/quac.h b/quac.h index 2aa2f538287..1371214322a 100644 --- a/quac.h +++ b/quac.h @@ -16,7 +16,7 @@ #include "views/action_menu.h" #include "item.h" -#define QUAC_NAME "Quac!" +#define QUAC_NAME "Quac!" #define QUAC_VERSION "v0.6.3" #define QUAC_ABOUT \ "Quick Action remote control\n" QUAC_VERSION "\n" \ @@ -25,9 +25,12 @@ // Location of our actions and folders #define QUAC_SETTINGS_FILENAME ".quac.conf" -#define QUAC_SETTINGS_PATH APP_DATA_PATH(QUAC_SETTINGS_FILENAME) +#define QUAC_SETTINGS_PATH APP_DATA_PATH(QUAC_SETTINGS_FILENAME) -typedef enum { QUAC_APP_PORTRAIT, QUAC_APP_LANDSCAPE } QuacAppLayout; +typedef enum { + QUAC_APP_PORTRAIT, + QUAC_APP_LANDSCAPE +} QuacAppLayout; typedef struct App { SceneManager* scene_manager; @@ -49,6 +52,7 @@ typedef struct App { FuriString* temp_str; // used for renames/etc char temp_cstr[MAX_NAME_LEN]; // used for renames/etc + uint32_t temp_u32; struct { QuacAppLayout layout; // Defaults to Portrait @@ -65,4 +69,4 @@ typedef struct App { } App; App* app_alloc(); -void app_free(App* app); \ No newline at end of file +void app_free(App* app); diff --git a/scenes/scene_action_ir_list.c b/scenes/scene_action_ir_list.c index b3d592169fc..4313f5e604e 100644 --- a/scenes/scene_action_ir_list.c +++ b/scenes/scene_action_ir_list.c @@ -13,9 +13,6 @@ #include -// ehhhh -uint32_t num_ir_commands; - void scene_action_ir_list_callback(void* context, uint32_t index) { App* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); @@ -46,10 +43,11 @@ void scene_action_ir_list_on_enter(void* context) { index++; } } - num_ir_commands = index - 1; - if(index == 1) { // '1' to account for 'IMPORT ALL' - FURI_LOG_E(TAG, "Failed to get commands from %s", furi_string_get_cstr(app->temp_str)); + // Number of IR Commands in file + app->temp_u32 = index - 1; + if(app->temp_u32 == 0) { + FURI_LOG_E(TAG, "Failed to get ANY commands from %s", furi_string_get_cstr(app->temp_str)); submenu_change_item_label(menu, 0, "No IR cmds!"); } @@ -75,11 +73,12 @@ bool scene_action_ir_list_on_event(void* context, SceneManagerEvent event) { FuriString* file_name = furi_string_alloc(); // new IR file name do { + uint32_t num_imported = 0; uint32_t start = index - 1; uint32_t end = index; if(index == 0) { start = 0; - end = num_ir_commands; + end = app->temp_u32; // Number of IR Commands in file } for(uint32_t ir_index = start; ir_index < end; ir_index++) { if(!flipper_format_file_open_existing( @@ -116,12 +115,21 @@ bool scene_action_ir_list_on_event(void* context, SceneManagerEvent event) { } flipper_format_file_close(fff_data_file); FURI_LOG_I(TAG, "Imported %s", furi_string_get_cstr(name)); + num_imported++; + } + + if(num_imported == (end - start)) { + // Import successful! + notification_message(app->notifications, &sequence_success); + } else { + FURI_LOG_E( + TAG, + "Error importing IR command(s) from %s", + furi_string_get_cstr(app->temp_str)); + notification_message(app->notifications, &sequence_error); } - // Import successful! // Leave the user on this scene, in case they want to import // more commands from this IR file - notification_message(app->notifications, &sequence_success); - } while(false); // cleanup