Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Kharisov <albkharisov@gmail.com>2022-02-16 19:09:43 +0300
committerGitHub <noreply@github.com>2022-02-16 19:09:43 +0300
commit17d6b9f6120df4cd942d4a934cc645a6bf941d88 (patch)
tree80f1fff8b4d305302f7141b3b855d2b9b161e3df
parent97c9a2229f88a0e09091d395d13b3013bd5f5687 (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.c16
-rw-r--r--applications/irda/irda_app_remote_manager.cpp3
-rw-r--r--applications/irda/irda_app_signal.cpp2
-rw-r--r--applications/irda/scene/irda_app_scene_remote_list.cpp5
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,