IR: "Decode only" mode, more intuitive learn scene buttons

This commit is contained in:
WillyJL
2025-06-07 15:58:04 +01:00
parent 9a4b812898
commit 326c3a13de
7 changed files with 44 additions and 5 deletions
@@ -159,6 +159,7 @@ static InfraredApp* infrared_alloc(void) {
app_state->is_otg_enabled = false;
app_state->is_easy_mode = false;
app_state->is_decode_enabled = true;
app_state->is_decode_forced = false;
app_state->edit_target = InfraredEditTargetNone;
app_state->edit_mode = InfraredEditModeNone;
app_state->current_button_index = InfraredButtonIndexNone;
@@ -91,6 +91,7 @@ typedef struct {
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. */
bool is_decode_forced; /**< Whether signal decoding is forced. */
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). */
@@ -146,9 +146,12 @@ void infrared_scene_learn_on_enter(void* context) {
}
dialog_ex_set_left_button_text(
dialog_ex, infrared->app_state.is_easy_mode ? "Manual" : "Easy");
dialog_ex, infrared->app_state.is_easy_mode ? "Easy" : "Manual");
dialog_ex_set_right_button_text(
dialog_ex, infrared->app_state.is_decode_enabled ? "RAW" : "Decode");
dialog_ex,
infrared->app_state.is_decode_forced ? "Decode" :
infrared->app_state.is_decode_enabled ? "Auto" :
"RAW");
dialog_ex_set_context(dialog_ex, context);
dialog_ex_set_result_callback(dialog_ex, infrared_scene_learn_dialog_result_callback);
@@ -179,11 +182,26 @@ bool infrared_scene_learn_on_event(void* context, SceneManagerEvent event) {
consumed = true;
} else if(event.event == DialogExResultRight) {
// Toggle signal decoding
infrared->app_state.is_decode_enabled = !infrared->app_state.is_decode_enabled;
if(infrared->app_state.is_decode_forced) {
// Decode -> RAW
infrared->app_state.is_decode_enabled = false;
infrared->app_state.is_decode_forced = false;
} else if(infrared->app_state.is_decode_enabled) {
// Auto -> Decode
infrared->app_state.is_decode_forced = true;
} else {
// RAW -> Auto
infrared->app_state.is_decode_enabled = true;
}
infrared_worker_rx_enable_signal_decoding(
infrared->worker, infrared->app_state.is_decode_enabled);
infrared_worker_rx_force_signal_decoding(
infrared->worker, infrared->app_state.is_decode_forced);
dialog_ex_set_right_button_text(
infrared->dialog_ex, infrared->app_state.is_decode_enabled ? "RAW" : "Decode");
infrared->dialog_ex,
infrared->app_state.is_decode_forced ? "Decode" :
infrared->app_state.is_decode_enabled ? "Auto" :
"RAW");
consumed = true;
}
} else if(event.type == SceneManagerEventTypeBack) {