From 92f763e5531daf7006d10bbaa88bae7233f2c7bf Mon Sep 17 00:00:00 2001 From: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Date: Tue, 21 Jun 2022 17:45:55 +0300 Subject: [PATCH] [FL-2548] Infrared: show error if no SD card/databases (#1337) * Add Database error scene * More general popup callback name --- applications/infrared/infrared.c | 8 ++-- applications/infrared/infrared_custom_event.h | 2 +- applications/infrared/infrared_i.h | 4 +- .../infrared/scenes/infrared_scene_config.h | 1 + .../scenes/infrared_scene_edit_delete_done.c | 4 +- .../scenes/infrared_scene_edit_rename_done.c | 4 +- .../scenes/infrared_scene_error_databases.c | 37 +++++++++++++++++++ .../scenes/infrared_scene_learn_done.c | 4 +- .../scenes/infrared_scene_universal_tv.c | 2 +- .../notification/notification_messages.c | 9 +++++ .../notification/notification_messages.h | 3 ++ 11 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 applications/infrared/scenes/infrared_scene_error_databases.c diff --git a/applications/infrared/infrared.c b/applications/infrared/infrared.c index ee6b931e..e641302c 100644 --- a/applications/infrared/infrared.c +++ b/applications/infrared/infrared.c @@ -8,7 +8,9 @@ static const NotificationSequence* infrared_notification_sequences[] = { &sequence_set_only_green_255, &sequence_reset_green, &sequence_blink_cyan_10, - &sequence_blink_magenta_10}; + &sequence_blink_magenta_10, + &sequence_solid_yellow, + &sequence_reset_rgb}; static void infrared_make_app_folder(Infrared* infrared) { if(!storage_simply_mkdir(infrared->storage, INFRARED_APP_FOLDER)) { @@ -360,11 +362,11 @@ void infrared_text_input_callback(void* context) { infrared->view_dispatcher, InfraredCustomEventTypeTextEditDone); } -void infrared_popup_timeout_callback(void* context) { +void infrared_popup_closed_callback(void* context) { furi_assert(context); Infrared* infrared = context; view_dispatcher_send_custom_event( - infrared->view_dispatcher, InfraredCustomEventTypePopupTimeout); + infrared->view_dispatcher, InfraredCustomEventTypePopupClosed); } int32_t infrared_app(void* p) { diff --git a/applications/infrared/infrared_custom_event.h b/applications/infrared/infrared_custom_event.h index d991afb9..46d75a9e 100644 --- a/applications/infrared/infrared_custom_event.h +++ b/applications/infrared/infrared_custom_event.h @@ -11,7 +11,7 @@ enum InfraredCustomEventType { InfraredCustomEventTypeTransmitStopped, InfraredCustomEventTypeSignalReceived, InfraredCustomEventTypeTextEditDone, - InfraredCustomEventTypePopupTimeout, + InfraredCustomEventTypePopupClosed, InfraredCustomEventTypeButtonSelected, InfraredCustomEventTypeBackPressed, }; diff --git a/applications/infrared/infrared_i.h b/applications/infrared/infrared_i.h index 06c6a5f7..5c447adc 100644 --- a/applications/infrared/infrared_i.h +++ b/applications/infrared/infrared_i.h @@ -113,6 +113,8 @@ typedef enum { InfraredNotificationMessageGreenOff, InfraredNotificationMessageBlinkRead, InfraredNotificationMessageBlinkSend, + InfraredNotificationMessageYellowOn, + InfraredNotificationMessageYellowOff, } InfraredNotificationMessage; bool infrared_add_remote_with_button(Infrared* infrared, const char* name, InfraredSignal* signal); @@ -129,4 +131,4 @@ void infrared_show_loading_popup(Infrared* infrared, bool show); void infrared_signal_sent_callback(void* context); void infrared_signal_received_callback(void* context, InfraredWorkerSignal* received_signal); void infrared_text_input_callback(void* context); -void infrared_popup_timeout_callback(void* context); +void infrared_popup_closed_callback(void* context); diff --git a/applications/infrared/scenes/infrared_scene_config.h b/applications/infrared/scenes/infrared_scene_config.h index 3677ab3c..c4e083c1 100644 --- a/applications/infrared/scenes/infrared_scene_config.h +++ b/applications/infrared/scenes/infrared_scene_config.h @@ -15,3 +15,4 @@ ADD_SCENE(infrared, remote_list, RemoteList) ADD_SCENE(infrared, universal, Universal) ADD_SCENE(infrared, universal_tv, UniversalTV) ADD_SCENE(infrared, debug, Debug) +ADD_SCENE(infrared, error_databases, ErrorDatabases) diff --git a/applications/infrared/scenes/infrared_scene_edit_delete_done.c b/applications/infrared/scenes/infrared_scene_edit_delete_done.c index 688c3a45..4502abbd 100644 --- a/applications/infrared/scenes/infrared_scene_edit_delete_done.c +++ b/applications/infrared/scenes/infrared_scene_edit_delete_done.c @@ -7,7 +7,7 @@ void infrared_scene_edit_delete_done_on_enter(void* context) { popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); - popup_set_callback(popup, infrared_popup_timeout_callback); + popup_set_callback(popup, infrared_popup_closed_callback); popup_set_context(popup, context); popup_set_timeout(popup, 1500); popup_enable_timeout(popup); @@ -21,7 +21,7 @@ bool infrared_scene_edit_delete_done_on_event(void* context, SceneManagerEvent e bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == InfraredCustomEventTypePopupTimeout) { + if(event.event == InfraredCustomEventTypePopupClosed) { const InfraredEditTarget edit_target = infrared->app_state.edit_target; if(edit_target == InfraredEditTargetButton) { scene_manager_search_and_switch_to_previous_scene( diff --git a/applications/infrared/scenes/infrared_scene_edit_rename_done.c b/applications/infrared/scenes/infrared_scene_edit_rename_done.c index 60a26954..54b18ab6 100644 --- a/applications/infrared/scenes/infrared_scene_edit_rename_done.c +++ b/applications/infrared/scenes/infrared_scene_edit_rename_done.c @@ -7,7 +7,7 @@ void infrared_scene_edit_rename_done_on_enter(void* context) { popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); - popup_set_callback(popup, infrared_popup_timeout_callback); + popup_set_callback(popup, infrared_popup_closed_callback); popup_set_context(popup, context); popup_set_timeout(popup, 1500); popup_enable_timeout(popup); @@ -20,7 +20,7 @@ bool infrared_scene_edit_rename_done_on_event(void* context, SceneManagerEvent e bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == InfraredCustomEventTypePopupTimeout) { + if(event.event == InfraredCustomEventTypePopupClosed) { scene_manager_next_scene(infrared->scene_manager, InfraredSceneRemote); consumed = true; } diff --git a/applications/infrared/scenes/infrared_scene_error_databases.c b/applications/infrared/scenes/infrared_scene_error_databases.c new file mode 100644 index 00000000..4ed4dee5 --- /dev/null +++ b/applications/infrared/scenes/infrared_scene_error_databases.c @@ -0,0 +1,37 @@ +#include "../infrared_i.h" + +void infrared_scene_error_databases_on_enter(void* context) { + Infrared* infrared = context; + Popup* popup = infrared->popup; + + popup_set_icon(popup, 5, 11, &I_SDQuestion_35x43); + popup_set_text( + popup, "Function requires\nSD card with fresh\ndatabases.", 47, 17, AlignLeft, AlignTop); + + popup_set_context(popup, context); + popup_set_callback(popup, infrared_popup_closed_callback); + + infrared_play_notification_message(infrared, InfraredNotificationMessageYellowOn); + view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewPopup); +} + +bool infrared_scene_error_databases_on_event(void* context, SceneManagerEvent event) { + Infrared* infrared = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == InfraredCustomEventTypePopupClosed) { + scene_manager_search_and_switch_to_previous_scene( + infrared->scene_manager, InfraredSceneUniversal); + consumed = true; + } + } + + return consumed; +} + +void infrared_scene_error_databases_on_exit(void* context) { + Infrared* infrared = context; + popup_reset(infrared->popup); + infrared_play_notification_message(infrared, InfraredNotificationMessageYellowOff); +} diff --git a/applications/infrared/scenes/infrared_scene_learn_done.c b/applications/infrared/scenes/infrared_scene_learn_done.c index a24bb918..eb6cced8 100644 --- a/applications/infrared/scenes/infrared_scene_learn_done.c +++ b/applications/infrared/scenes/infrared_scene_learn_done.c @@ -15,7 +15,7 @@ void infrared_scene_learn_done_on_enter(void* context) { popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); } - popup_set_callback(popup, infrared_popup_timeout_callback); + popup_set_callback(popup, infrared_popup_closed_callback); popup_set_context(popup, context); popup_set_timeout(popup, 1500); popup_enable_timeout(popup); @@ -28,7 +28,7 @@ bool infrared_scene_learn_done_on_event(void* context, SceneManagerEvent event) bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == InfraredCustomEventTypePopupTimeout) { + if(event.event == InfraredCustomEventTypePopupClosed) { scene_manager_next_scene(infrared->scene_manager, InfraredSceneRemote); consumed = true; } diff --git a/applications/infrared/scenes/infrared_scene_universal_tv.c b/applications/infrared/scenes/infrared_scene_universal_tv.c index f3a9a06b..83b084c3 100644 --- a/applications/infrared/scenes/infrared_scene_universal_tv.c +++ b/applications/infrared/scenes/infrared_scene_universal_tv.c @@ -98,7 +98,7 @@ void infrared_scene_universal_tv_on_enter(void* context) { infrared_show_loading_popup(infrared, false); if(!success) { - scene_manager_previous_scene(infrared->scene_manager); + scene_manager_next_scene(infrared->scene_manager, InfraredSceneErrorDatabases); } } diff --git a/applications/notification/notification_messages.c b/applications/notification/notification_messages.c index b14c08e3..b469cb5f 100644 --- a/applications/notification/notification_messages.c +++ b/applications/notification/notification_messages.c @@ -335,6 +335,15 @@ const NotificationSequence sequence_set_blue_255 = { NULL, }; +// Solid colors +const NotificationSequence sequence_solid_yellow = { + &message_red_255, + &message_green_255, + &message_blue_0, + &message_do_not_reset, + NULL, +}; + // Blink const NotificationSequence sequence_blink_blue_10 = { &message_blue_255, diff --git a/applications/notification/notification_messages.h b/applications/notification/notification_messages.h index a0ef654e..92a105f6 100644 --- a/applications/notification/notification_messages.h +++ b/applications/notification/notification_messages.h @@ -103,6 +103,9 @@ extern const NotificationSequence sequence_set_red_255; extern const NotificationSequence sequence_set_green_255; extern const NotificationSequence sequence_set_blue_255; +// Solid colors +extern const NotificationSequence sequence_solid_yellow; + // Blink extern const NotificationSequence sequence_blink_blue_10; extern const NotificationSequence sequence_blink_red_10;