From 5cd0e72726412b56e2d34ed3096505bd19cefd70 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Thu, 23 Jan 2025 01:08:48 +0000 Subject: [PATCH] IR: Easy Learn & Learn RAW toggles in Learn screen Also cleanup some of the text shown during learning --- CHANGELOG.md | 4 +- applications/main/infrared/infrared_app.c | 1 + applications/main/infrared/infrared_app_i.h | 1 + .../infrared/scenes/infrared_scene_learn.c | 29 ++++++++++-- .../scenes/infrared_scene_learn_success.c | 4 +- .../infrared/scenes/infrared_scene_start.c | 47 +------------------ 6 files changed, 33 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 329dc30d9..75437b4e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ - GPIO: TEA5767 FM Radio (by @coolshrimp) - NFC: Metroflip (by @luu176) - USB: USB Game Controller (by @expected-ingot) -- Infrared: Easy Learn mode to quickly save buttons without typing (#350 by @jaylikesbunda) +- Infrared: + - Easy Learn mode to quickly save buttons without typing (#350 by @jaylikesbunda) + - Move Easy Learn and Learn RAW toggles inside Learning/Receiving screen for quick access, RAW mode doesn't require Debug anymore (by @Willy-JL) - Archive: Setting to show dynamic path in file browser statusbar (#322 by @956MB) - CLI: Add `clear` and `cls` commands, add `did you mean ...?` command suggestion (#342 by @dexvleads) - Main Menu: Add coverflow menu style (#314 by @CodyTolene) diff --git a/applications/main/infrared/infrared_app.c b/applications/main/infrared/infrared_app.c index 43f6e7817..5551591c2 100644 --- a/applications/main/infrared/infrared_app.c +++ b/applications/main/infrared/infrared_app.c @@ -158,6 +158,7 @@ static InfraredApp* infrared_alloc(void) { app_state->is_transmitting = false; app_state->is_otg_enabled = false; app_state->is_easy_mode = false; + app_state->is_decode_enabled = true; app_state->edit_target = InfraredEditTargetNone; app_state->edit_mode = InfraredEditModeNone; app_state->current_button_index = InfraredButtonIndexNone; diff --git a/applications/main/infrared/infrared_app_i.h b/applications/main/infrared/infrared_app_i.h index b078429b3..0d9b440a8 100644 --- a/applications/main/infrared/infrared_app_i.h +++ b/applications/main/infrared/infrared_app_i.h @@ -90,6 +90,7 @@ typedef struct { bool is_transmitting; /**< Whether a signal is currently being transmitted. */ bool is_otg_enabled; /**< Whether OTG power (external 5V) is enabled. */ bool is_easy_mode; /**< Whether easy learning mode is enabled. */ + bool is_decode_enabled; /**< Whether signal decoding is enabled. */ InfraredEditTarget edit_target : 8; /**< Selected editing target (a remote or a button). */ InfraredEditMode edit_mode : 8; /**< Selected editing operation (rename or delete). */ int32_t current_button_index; /**< Selected button index (move destination). */ diff --git a/applications/main/infrared/scenes/infrared_scene_learn.c b/applications/main/infrared/scenes/infrared_scene_learn.c index e19624d20..8c6b557b7 100644 --- a/applications/main/infrared/scenes/infrared_scene_learn.c +++ b/applications/main/infrared/scenes/infrared_scene_learn.c @@ -82,7 +82,7 @@ static void infrared_scene_learn_update_button_name(InfraredApp* infrared, bool // Now we know button_index is valid, use it to get the name const char* button_name = easy_mode_button_names[button_index]; dialog_ex_set_text( - dialog_ex, "Point remote at IR port\nand press button:", 5, 10, AlignLeft, AlignCenter); + dialog_ex, "Point the remote at IR port\nand press button:", 5, 10, AlignLeft, AlignCenter); dialog_ex_set_header(dialog_ex, button_name, 78, 11, AlignLeft, AlignTop); // For existing remotes, check if there are any more buttons to add @@ -130,22 +130,26 @@ void infrared_scene_learn_on_enter(void* context) { infrared_worker_rx_start(worker); infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStartRead); - dialog_ex_set_icon(dialog_ex, 0, 32, &I_InfraredLearnShort_128x31); + dialog_ex_set_icon(dialog_ex, 0, 22, &I_InfraredLearnShort_128x31); dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter); if(infrared->app_state.is_easy_mode) { infrared_scene_learn_update_button_name(infrared, false); - dialog_ex_set_icon(dialog_ex, 0, 22, &I_InfraredLearnShort_128x31); } else { dialog_ex_set_text( dialog_ex, - "Point the remote at IR port\nand push the button", + "Point the remote at IR port\nand press the button", 5, - 13, + 10, AlignLeft, AlignCenter); } + dialog_ex_set_left_button_text( + dialog_ex, infrared->app_state.is_easy_mode ? "Manual" : "Easy"); + dialog_ex_set_right_button_text( + dialog_ex, infrared->app_state.is_decode_enabled ? "RAW" : "Decode"); + dialog_ex_set_context(dialog_ex, context); dialog_ex_set_result_callback(dialog_ex, infrared_scene_learn_dialog_result_callback); @@ -166,6 +170,21 @@ bool infrared_scene_learn_on_event(void* context, SceneManagerEvent event) { // Update with increment when skipping infrared_scene_learn_update_button_name(infrared, true); consumed = true; + } else if(event.event == DialogExResultLeft) { + // Toggle Easy Learn + infrared->app_state.is_easy_mode = !infrared->app_state.is_easy_mode; + infrared_save_settings(infrared); + scene_manager_previous_scene(infrared->scene_manager); + scene_manager_next_scene(infrared->scene_manager, InfraredSceneLearn); + consumed = true; + } else if(event.event == DialogExResultRight) { + // Toggle signal decoding + infrared->app_state.is_decode_enabled = !infrared->app_state.is_decode_enabled; + infrared_worker_rx_enable_signal_decoding( + infrared->worker, infrared->app_state.is_decode_enabled); + dialog_ex_set_right_button_text( + infrared->dialog_ex, infrared->app_state.is_decode_enabled ? "RAW" : "Decode"); + consumed = true; } } else if(event.type == SceneManagerEventTypeBack) { // Reset button indices when exiting learn mode completely diff --git a/applications/main/infrared/scenes/infrared_scene_learn_success.c b/applications/main/infrared/scenes/infrared_scene_learn_success.c index deb54bb5e..115f25958 100644 --- a/applications/main/infrared/scenes/infrared_scene_learn_success.c +++ b/applications/main/infrared/scenes/infrared_scene_learn_success.c @@ -15,9 +15,9 @@ void infrared_scene_learn_success_on_enter(void* context) { if(infrared_signal_is_raw(signal)) { const InfraredRawSignal* raw = infrared_signal_get_raw_signal(signal); - dialog_ex_set_header(dialog_ex, "Unknown", 95, 10, AlignCenter, AlignCenter); + dialog_ex_set_header(dialog_ex, "Unknown\n(RAW)", 95, 12, AlignCenter, AlignCenter); infrared_text_store_set(infrared, 0, "%zu samples", raw->timings_size); - dialog_ex_set_text(dialog_ex, infrared->text_store[0], 75, 23, AlignLeft, AlignTop); + dialog_ex_set_text(dialog_ex, infrared->text_store[0], 75, 32, AlignLeft, AlignTop); } else { const InfraredMessage* message = infrared_signal_get_message(signal); diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index 63cd66585..6e195182e 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -5,8 +5,6 @@ enum SubmenuIndex { SubmenuIndexLearnNewRemote, SubmenuIndexSavedRemotes, SubmenuIndexGpioSettings, - SubmenuIndexEasyLearn, - SubmenuIndexLearnNewRemoteRaw, SubmenuIndexDebug }; @@ -45,30 +43,6 @@ void infrared_scene_start_on_enter(void* context) { infrared_scene_start_submenu_callback, infrared); - char easy_learn_text[24]; - snprintf( - easy_learn_text, - sizeof(easy_learn_text), - "Easy Learn [%s]", - infrared->app_state.is_easy_mode ? "X" : " "); - submenu_add_item( - submenu, - easy_learn_text, - SubmenuIndexEasyLearn, - infrared_scene_start_submenu_callback, - infrared); - - submenu_add_lockable_item( - submenu, - "Learn New Remote RAW", - SubmenuIndexLearnNewRemoteRaw, - infrared_scene_start_submenu_callback, - infrared, - !infrared->app_state.is_debug_enabled, - "Enable\n" - "Settings >\n" - "System >\n" - "Debug"); submenu_add_lockable_item( submenu, "Debug RX", @@ -84,7 +58,7 @@ void infrared_scene_start_on_enter(void* context) { const uint32_t submenu_index = scene_manager_get_scene_state(scene_manager, InfraredSceneStart); submenu_set_selected_item(submenu, submenu_index); - // scene_manager_set_scene_state(scene_manager, InfraredSceneStart, SubmenuIndexUniversalRemotes); + scene_manager_set_scene_state(scene_manager, InfraredSceneStart, SubmenuIndexUniversalRemotes); view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewSubmenu); } @@ -104,13 +78,7 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { // last selected file, feels more intuitive furi_string_set(infrared->file_path, INFRARED_APP_FOLDER); scene_manager_next_scene(scene_manager, InfraredSceneUniversal); - } else if( - submenu_index == SubmenuIndexLearnNewRemote || - submenu_index == SubmenuIndexLearnNewRemoteRaw) { - // enable automatic signal decoding if "Learn New Remote" - // disable automatic signal decoding if "Learn New Remote (RAW)" - infrared_worker_rx_enable_signal_decoding( - infrared->worker, submenu_index == SubmenuIndexLearnNewRemote); + } else if(submenu_index == SubmenuIndexLearnNewRemote) { infrared->app_state.is_learning_new_remote = true; infrared->app_state.current_button_index = 0; // Reset index when starting new remote scene_manager_next_scene(scene_manager, InfraredSceneLearn); @@ -119,17 +87,6 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(scene_manager, InfraredSceneRemoteList); } else if(submenu_index == SubmenuIndexGpioSettings) { scene_manager_next_scene(scene_manager, InfraredSceneGpioSettings); - } else if(submenu_index == SubmenuIndexEasyLearn) { - infrared->app_state.is_easy_mode = !infrared->app_state.is_easy_mode; - infrared_save_settings(infrared); - // Update the menu item text without scene transition - char easy_learn_text[24]; - snprintf( - easy_learn_text, - sizeof(easy_learn_text), - "Easy Learn [%s]", - infrared->app_state.is_easy_mode ? "X" : " "); - submenu_change_item_label(infrared->submenu, SubmenuIndexEasyLearn, easy_learn_text); } else if(submenu_index == SubmenuIndexDebug) { scene_manager_next_scene(scene_manager, InfraredSceneDebug); }