diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 04cc093ff..3a005de74 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -82,6 +82,7 @@ typedef enum { SubGhzCustomEventSceneShowOnlyRX, SubGhzCustomEventSceneAnalyzerLock, SubGhzCustomEventSceneAnalyzerUnlock, + SubGhzCustomEventSceneSettingRemoveDuplicates, SubGhzCustomEventSceneSettingLock, SubGhzCustomEventSceneSettingResetToDefault, diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 9f54a3e69..09678fb8f 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -275,6 +275,10 @@ static void subghz_scene_receiver_config_set_duplicates(VariableItem* item) { variable_item_set_current_value_text(item, combobox_text[index]); subghz->last_settings->remove_duplicates = subghz->remove_duplicates = index; + if(index) { + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingRemoveDuplicates); + } } static inline bool subghz_scene_receiver_config_ignore_filter_get_index( @@ -313,7 +317,10 @@ static void subghz_scene_receiver_config_set_tpms(VariableItem* item) { static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { furi_assert(context); SubGhz* subghz = context; - if(index == SubGhzSettingIndexLock) { + if(index == SubGhzSettingIndexRemoveDuplicates) { + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingRemoveDuplicates); + } else if(index == SubGhzSettingIndexLock) { view_dispatcher_send_custom_event( subghz->view_dispatcher, SubGhzCustomEventSceneSettingLock); } else if(index == SubGhzSettingIndexResetToDefault) { @@ -582,7 +589,11 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubGhzCustomEventSceneSettingLock) { + if(event.event == SubGhzCustomEventSceneSettingRemoveDuplicates) { + subghz_history_remove_duplicates(subghz->history); + scene_manager_previous_scene(subghz->scene_manager); + consumed = true; + } else if(event.event == SubGhzCustomEventSceneSettingLock) { subghz_lock(subghz); scene_manager_previous_scene(subghz->scene_manager); consumed = true; diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 9940b64a0..853947772 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -332,3 +332,26 @@ bool subghz_history_add_to_history( instance->last_index_write++; return true; } + +void subghz_history_remove_duplicates(SubGhzHistory* instance) { + furi_assert(instance); + + SubGhzHistoryItemArray_it_t it; + SubGhzHistoryItemArray_it_last(it, instance->history->data); + while(!SubGhzHistoryItemArray_end_p(it)) { + SubGhzHistoryItem* i = SubGhzHistoryItemArray_ref(it); + + SubGhzHistoryItemArray_it_t jt; + SubGhzHistoryItemArray_it_set(jt, it); + SubGhzHistoryItemArray_previous(jt); + while(!SubGhzHistoryItemArray_end_p(jt)) { + SubGhzHistoryItem* j = SubGhzHistoryItemArray_ref(jt); + + if(j->hash_data == i->hash_data) { + subghz_history_delete_item(instance, jt->index); + } + SubGhzHistoryItemArray_previous(jt); + } + SubGhzHistoryItemArray_previous(it); + } +} diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 41fc8e829..debd66765 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -153,3 +153,6 @@ float subghz_history_get_latitude(SubGhzHistory* instance, uint16_t idx); * @return longitude - Float */ float subghz_history_get_longitude(SubGhzHistory* instance, uint16_t idx); + +// Consolidate history removing existing duplicates +void subghz_history_remove_duplicates(SubGhzHistory* instance);