diff options
author | Albert Kharisov <albkharisov@gmail.com> | 2022-02-16 19:09:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 19:09:43 +0300 |
commit | 17d6b9f6120df4cd942d4a934cc645a6bf941d88 (patch) | |
tree | 80f1fff8b4d305302f7141b3b855d2b9b161e3df | |
parent | 97c9a2229f88a0e09091d395d13b3013bd5f5687 (diff) |
[FL-2254] IR: fix hardfault, correct remote loading (#999)
* Bugfix: remove freeing of uninitialized object (IrdaAppSignal).
Therefore rubbish in memory sometimes caused HardFault.
* Fix: slow FFF makes IR-remotes loading take much time,
so we can glimpse previous scene's view while remote is parsing.
Reproducing: remove remote, fast press back (while popup is playing)
and select new remote - previous popup view is displayed.
-rw-r--r-- | applications/gui/modules/button_menu.c | 16 | ||||
-rw-r--r-- | applications/irda/irda_app_remote_manager.cpp | 3 | ||||
-rw-r--r-- | applications/irda/irda_app_signal.cpp | 2 | ||||
-rw-r--r-- | applications/irda/scene/irda_app_scene_remote_list.cpp | 5 |
4 files changed, 16 insertions, 10 deletions
diff --git a/applications/gui/modules/button_menu.c b/applications/gui/modules/button_menu.c index 605e73eb..e8bbb6a1 100644 --- a/applications/gui/modules/button_menu.c +++ b/applications/gui/modules/button_menu.c @@ -99,8 +99,6 @@ static void button_menu_view_draw_callback(Canvas* canvas, void* _model) { furi_assert(_model); ButtonMenuModel* model = (ButtonMenuModel*)_model; - - canvas_clear(canvas); canvas_set_font(canvas, FontSecondary); uint8_t item_position = 0; @@ -117,11 +115,14 @@ static void button_menu_view_draw_callback(Canvas* canvas, void* _model) { canvas_draw_icon(canvas, 28, 123, &I_IrdaArrowDown_4x8); } - string_t disp_str; - string_init_set_str(disp_str, model->header); - elements_string_fit_width(canvas, disp_str, ITEM_WIDTH - 6); - canvas_draw_str_aligned(canvas, 32, 10, AlignCenter, AlignCenter, string_get_cstr(disp_str)); - string_clear(disp_str); + if(model->header) { + string_t disp_str; + string_init_set_str(disp_str, model->header); + elements_string_fit_width(canvas, disp_str, ITEM_WIDTH - 6); + canvas_draw_str_aligned( + canvas, 32, 10, AlignCenter, AlignCenter, string_get_cstr(disp_str)); + string_clear(disp_str); + } for(ButtonMenuItemArray_it(it, model->items); !ButtonMenuItemArray_end_p(it); ButtonMenuItemArray_next(it), ++item_position) { @@ -248,6 +249,7 @@ void button_menu_reset(ButtonMenu* button_menu) { button_menu->view, (ButtonMenuModel * model) { ButtonMenuItemArray_reset(model->items); model->position = 0; + model->header = NULL; return true; }); } diff --git a/applications/irda/irda_app_remote_manager.cpp b/applications/irda/irda_app_remote_manager.cpp index d7c33134..8b88d37d 100644 --- a/applications/irda/irda_app_remote_manager.cpp +++ b/applications/irda/irda_app_remote_manager.cpp @@ -110,10 +110,11 @@ std::string IrdaAppRemoteManager::get_button_name(uint32_t index) { } std::string IrdaAppRemoteManager::get_remote_name() { - return remote ? remote->name : std::string(); + return remote.get() ? remote->name : std::string(); } int IrdaAppRemoteManager::find_remote_name(const std::vector<std::string>& strings) { + furi_assert(remote.get() != nullptr); int i = 0; for(const auto& str : strings) { if(!str.compare(remote->name)) { diff --git a/applications/irda/irda_app_signal.cpp b/applications/irda/irda_app_signal.cpp index 3c6ea8cf..7e40a041 100644 --- a/applications/irda/irda_app_signal.cpp +++ b/applications/irda/irda_app_signal.cpp @@ -70,8 +70,6 @@ IrdaAppSignal::IrdaAppSignal(const IrdaAppSignal& other) { } IrdaAppSignal::IrdaAppSignal(IrdaAppSignal&& other) { - clear_timings(); - raw_signal = other.raw_signal; if(!raw_signal) { payload.message = other.payload.message; diff --git a/applications/irda/scene/irda_app_scene_remote_list.cpp b/applications/irda/scene/irda_app_scene_remote_list.cpp index 9532f912..c20fbafb 100644 --- a/applications/irda/scene/irda_app_scene_remote_list.cpp +++ b/applications/irda/scene/irda_app_scene_remote_list.cpp @@ -15,6 +15,11 @@ void IrdaAppSceneRemoteList::on_enter(IrdaApp* app) { last_selected_remote.size() ? last_selected_remote.c_str() : nullptr; auto filename_ts = std::make_unique<TextStore>(IrdaAppRemoteManager::max_remote_name_length); + IrdaAppViewManager* view_manager = app->get_view_manager(); + ButtonMenu* button_menu = view_manager->get_button_menu(); + button_menu_reset(button_menu); + view_manager->switch_to(IrdaAppViewManager::ViewType::ButtonMenu); + file_select_result = file_worker.file_select( IrdaApp::irda_directory, IrdaApp::irda_extension, |