diff --git a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c index 8889dac83..1a0992f94 100644 --- a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c +++ b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c @@ -14,6 +14,10 @@ void subghz_scene_frequency_analyzer_on_enter(void* context) { DOLPHIN_DEED(DolphinDeedSubGhzFrequencyAnalyzer); subghz_frequency_analyzer_set_callback( subghz->subghz_frequency_analyzer, subghz_scene_frequency_analyzer_callback, subghz); + subghz_frequency_analyzer_feedback_level( + subghz->subghz_frequency_analyzer, + subghz->last_settings->frequency_analyzer_feedback_level, + true); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdFrequencyAnalyzer); } @@ -44,4 +48,8 @@ bool subghz_scene_frequency_analyzer_on_event(void* context, SceneManagerEvent e void subghz_scene_frequency_analyzer_on_exit(void* context) { SubGhz* subghz = context; notification_message(subghz->notifications, &sequence_reset_rgb); + + subghz->last_settings->frequency_analyzer_feedback_level = + subghz_frequency_analyzer_feedback_level(subghz->subghz_frequency_analyzer, 0, false); + subghz_last_settings_save(subghz->last_settings); } diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index a518c3594..fe9317d08 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -42,7 +42,12 @@ static void subghz_scene_read_raw_update_statusbar(void* context) { frequency_str = furi_string_alloc(); modulation_str = furi_string_alloc(); +#ifdef SUBGHZ_EXT_PRESET_NAME + subghz_get_frequency_modulation(subghz, frequency_str, NULL); + furi_string_printf(modulation_str, "%s", furi_string_get_cstr(subghz->txrx->preset->name)); +#else subghz_get_frequency_modulation(subghz, frequency_str, modulation_str); +#endif subghz_read_raw_add_data_statusbar( subghz->subghz_read_raw, furi_string_get_cstr(frequency_str), diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index cafa8b927..87a7c9552 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -46,7 +46,17 @@ static void subghz_scene_receiver_update_statusbar(void* context) { frequency_str = furi_string_alloc(); modulation_str = furi_string_alloc(); +#ifdef SUBGHZ_EXT_PRESET_NAME + if(subghz_history_get_last_index(subghz->txrx->history) > 0) { + subghz_get_frequency_modulation(subghz, frequency_str, modulation_str); + } else { + subghz_get_frequency_modulation(subghz, frequency_str, NULL); + furi_string_printf( + modulation_str, "Mod: %s", furi_string_get_cstr(subghz->txrx->preset->name)); + } +#else subghz_get_frequency_modulation(subghz, frequency_str, modulation_str); +#endif subghz_view_receiver_add_data_statusbar( subghz->subghz_receiver, diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 961be06ad..646ee9f07 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -309,6 +309,10 @@ bool subghz_history_get_text_space_left(SubGhzHistory* instance, FuriString* out return false; } +uint16_t subghz_history_get_last_index(SubGhzHistory* instance) { + return instance->last_index_write; +} + void subghz_history_get_text_item_menu(SubGhzHistory* instance, FuriString* output, uint16_t idx) { SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx); furi_string_set(output, item->item_str); diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 6ab3603d8..f14253896 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -84,6 +84,13 @@ void subghz_history_get_text_item_menu(SubGhzHistory* instance, FuriString* outp */ bool subghz_history_get_text_space_left(SubGhzHistory* instance, FuriString* output); +/** Return last index + * + * @param instance - SubGhzHistory instance + * @return + */ +uint16_t subghz_history_get_last_index(SubGhzHistory* instance); + /** Add protocol to history * * @param instance - SubGhzHistory instance diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index baf3ae82a..e7b03e94f 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -44,6 +44,7 @@ #include "rpc/rpc_app.h" #define SUBGHZ_MAX_LEN_NAME 64 +#define SUBGHZ_EXT_PRESET_NAME true typedef struct { uint8_t fix[4]; diff --git a/applications/main/subghz/subghz_last_settings.c b/applications/main/subghz/subghz_last_settings.c index 6382253b8..bf3638908 100644 --- a/applications/main/subghz/subghz_last_settings.c +++ b/applications/main/subghz/subghz_last_settings.c @@ -13,6 +13,7 @@ // "AM270", "AM650", "FM238", "FM476", #define SUBGHZ_LAST_SETTING_DEFAULT_PRESET 1 #define SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY 433920000 +#define SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_FEEDBACK_LEVEL 2 #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING #define SUBGHZ_LAST_SETTING_DEFAULT_READ_RAW 0 @@ -21,6 +22,7 @@ #define SUBGHZ_LAST_SETTING_FIELD_FREQUENCY "Frequency" #define SUBGHZ_LAST_SETTING_FIELD_PRESET "Preset" +#define SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_FEEDBACK_LEVEL "FeedbackLevel" SubGhzLastSettings* subghz_last_settings_alloc(void) { SubGhzLastSettings* instance = malloc(sizeof(SubGhzLastSettings)); @@ -42,7 +44,9 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); uint32_t temp_frequency = 0; + uint32_t temp_frequency_analyzer_feedback_level = 0; int32_t temp_preset = 0; + bool frequency_analyzer_feedback_level_was_read = false; #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING uint32_t temp_read_raw = 0; #endif @@ -53,6 +57,11 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count fff_data_file, SUBGHZ_LAST_SETTING_FIELD_PRESET, (int32_t*)&temp_preset, 1); flipper_format_read_uint32( fff_data_file, SUBGHZ_LAST_SETTING_FIELD_FREQUENCY, (uint32_t*)&temp_frequency, 1); + frequency_analyzer_feedback_level_was_read = flipper_format_read_uint32( + fff_data_file, + SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_FEEDBACK_LEVEL, + (uint32_t*)&temp_frequency_analyzer_feedback_level, + 1); #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING flipper_format_read_uint32( fff_data_file, SUBGHZ_LAST_SETTING_FIELD_DETECT_RAW, (uint32_t*)&temp_read_raw, 1); @@ -65,11 +74,17 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count FURI_LOG_W(TAG, "Last used frequency not found or can't be used!"); instance->frequency = SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY; instance->preset = SUBGHZ_LAST_SETTING_DEFAULT_PRESET; + instance->frequency_analyzer_feedback_level = + SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_FEEDBACK_LEVEL; #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING instance->detect_raw = SUBGHZ_LAST_SETTING_DEFAULT_READ_RAW; #endif } else { instance->frequency = temp_frequency; + instance->frequency_analyzer_feedback_level = + frequency_analyzer_feedback_level_was_read ? + temp_frequency_analyzer_feedback_level : + SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_FEEDBACK_LEVEL; #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING instance->detect_raw = temp_read_raw; #endif @@ -118,6 +133,13 @@ bool subghz_last_settings_save(SubGhzLastSettings* instance) { file, SUBGHZ_LAST_SETTING_FIELD_FREQUENCY, &instance->frequency, 1)) { break; } + if(!flipper_format_insert_or_update_uint32( + file, + SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_FEEDBACK_LEVEL, + &instance->frequency_analyzer_feedback_level, + 1)) { + break; + } #ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING if(!flipper_format_insert_or_update_uint32( file, SUBGHZ_LAST_SETTING_FIELD_DETECT_RAW, &instance->detect_raw, 1)) { diff --git a/applications/main/subghz/subghz_last_settings.h b/applications/main/subghz/subghz_last_settings.h index 116eacadd..cb6a058fe 100644 --- a/applications/main/subghz/subghz_last_settings.h +++ b/applications/main/subghz/subghz_last_settings.h @@ -19,6 +19,7 @@ typedef struct { uint32_t detect_raw; #endif int32_t preset; + uint32_t frequency_analyzer_feedback_level; } SubGhzLastSettings; SubGhzLastSettings* subghz_last_settings_alloc(void); diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index 05c6e7908..30372a51d 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -265,11 +265,30 @@ void subghz_view_receiver_draw(Canvas* canvas, SubGhzViewReceiverModel* model) { canvas_draw_icon(canvas, 64, 55, &I_Unlock_7x8); canvas_draw_str(canvas, 74, 62, "Unlocked"); break; - default: - canvas_draw_str(canvas, 44, 62, furi_string_get_cstr(model->frequency_str)); + default: { + const char* frequency_str = furi_string_get_cstr(model->frequency_str); + canvas_draw_str(canvas, 44, 62, frequency_str); +#ifdef SUBGHZ_EXT_PRESET_NAME + if(model->history_item == 0 && model->mode == SubGhzViewReceiverModeLive) { + canvas_draw_str( + canvas, 44 + canvas_string_width(canvas, frequency_str) + 1, 62, "MHz"); + const char* str = furi_string_get_cstr(model->preset_str); + const uint8_t vertical_offset = 7; + const uint8_t horizontal_offset = 3; + const uint8_t string_width = canvas_string_width(canvas, str); + canvas_draw_str( + canvas, + canvas_width(canvas) - (string_width + horizontal_offset), + vertical_offset, + str); + } else { + canvas_draw_str(canvas, 79, 62, furi_string_get_cstr(model->preset_str)); + } +#else canvas_draw_str(canvas, 79, 62, furi_string_get_cstr(model->preset_str)); +#endif canvas_draw_str(canvas, 96, 62, furi_string_get_cstr(model->history_stat_str)); - break; + } break; } } diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 53f0c8dd0..aed21b698 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -517,4 +517,21 @@ uint32_t subghz_frequency_analyzer_get_frequency_to_save(SubGhzFrequencyAnalyzer false); return frequency; +} + +uint8_t subghz_frequency_analyzer_feedback_level( + SubGhzFrequencyAnalyzer* instance, + uint8_t level, + bool update) { + furi_assert(instance); + if(update) { + instance->feedback_level = level; + with_view_model( + instance->view, + SubGhzFrequencyAnalyzerModel * model, + { model->feedback_level = instance->feedback_level; }, + true); + } + + return instance->feedback_level; } \ No newline at end of file diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.h b/applications/main/subghz/views/subghz_frequency_analyzer.h index 5e00c6444..196d69c79 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.h +++ b/applications/main/subghz/views/subghz_frequency_analyzer.h @@ -19,3 +19,8 @@ void subghz_frequency_analyzer_free(SubGhzFrequencyAnalyzer* subghz_static); View* subghz_frequency_analyzer_get_view(SubGhzFrequencyAnalyzer* subghz_static); uint32_t subghz_frequency_analyzer_get_frequency_to_save(SubGhzFrequencyAnalyzer* instance); + +uint8_t subghz_frequency_analyzer_feedback_level( + SubGhzFrequencyAnalyzer* instance, + uint8_t level, + bool update); diff --git a/assets/icons/SubGhz/Scanning_123x52.png b/assets/icons/SubGhz/Scanning_123x52.png index ec785948d..485052c14 100644 Binary files a/assets/icons/SubGhz/Scanning_123x52.png and b/assets/icons/SubGhz/Scanning_123x52.png differ