diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index df7d21680..b83ad700f 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -350,6 +350,10 @@ void subghz_scene_read_raw_on_exit(void* context) { subghz->state_notifications = SubGhzNotificationStateIDLE; notification_message(subghz->notifications, &sequence_reset_rgb); - //filter restoration +//filter restoration +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + subghz_last_settings_set_detect_raw_values(subghz); +#else subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); +#endif } \ No newline at end of file diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 0175cd0fd..6d6627743 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -29,10 +29,12 @@ const char* const detect_raw_text[DETECT_RAW_COUNT] = { "ON", }; +#ifndef SUBGHZ_SAVE_DETECT_RAW_SETTING const SubGhzProtocolFlag detect_raw_value[DETECT_RAW_COUNT] = { SubGhzProtocolFlag_Decodable, SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_RAW, }; +#endif #define RSSI_THRESHOLD_COUNT 7 const char* const rssi_threshold_text[RSSI_THRESHOLD_COUNT] = { @@ -105,6 +107,7 @@ uint8_t subghz_scene_receiver_config_hopper_value_index( } } +#ifndef SUBGHZ_SAVE_DETECT_RAW_SETTING uint8_t subghz_scene_receiver_config_detect_raw_value_index( const SubGhzProtocolFlag value, const SubGhzProtocolFlag values[], @@ -118,6 +121,7 @@ uint8_t subghz_scene_receiver_config_detect_raw_value_index( } return index; } +#endif uint8_t subghz_scene_receiver_config_rssi_threshold_value_index( const int value, @@ -186,12 +190,18 @@ static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, detect_raw_text[index]); +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + subghz->last_settings->detect_raw = index; + + subghz_last_settings_set_detect_raw_values(subghz); +#else subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[index]); subghz_protocol_decoder_raw_set_auto_mode( subghz_receiver_search_decoder_base_by_name( subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), (index == 1)); +#endif } static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item) { @@ -304,10 +314,14 @@ void subghz_scene_receiver_config_on_enter(void* context) { DETECT_RAW_COUNT, subghz_scene_receiver_config_set_detect_raw, subghz); +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + value_index = subghz->last_settings->detect_raw; +#else value_index = subghz_scene_receiver_config_detect_raw_value_index( subghz_receiver_get_filter(subghz->txrx->receiver), detect_raw_value, DETECT_RAW_COUNT); +#endif variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, detect_raw_text[value_index]); diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index f9500dc96..752fb8a92 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -21,11 +21,15 @@ void subghz_scene_start_on_enter(void* context) { if(subghz->state_notifications == SubGhzNotificationStateStarting) { subghz->state_notifications = SubGhzNotificationStateIDLE; } +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + subghz_last_settings_set_detect_raw_values(subghz); +#else subghz_protocol_decoder_raw_set_auto_mode( subghz_receiver_search_decoder_base_by_name( subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), false); subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); +#endif submenu_add_item( subghz->submenu, "Read", SubmenuIndexRead, subghz_scene_start_submenu_callback, subghz); diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index 33d93d380..176e9079e 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -193,11 +193,20 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz_last_settings_load( subghz->last_settings, subghz_setting_get_preset_count(subghz->setting)); #if FURI_DEBUG +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + FURI_LOG_D( + TAG, + "last frequency: %d, preset: %d, detect_raw: %d", + subghz->last_settings->frequency, + subghz->last_settings->preset, + subghz->last_settings->detect_raw); +#else FURI_LOG_D( TAG, "last frequency: %d, preset: %d", subghz->last_settings->frequency, subghz->last_settings->preset); +#endif #endif subghz_setting_set_default_frequency(subghz->setting, subghz->last_settings->frequency); } @@ -236,7 +245,11 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz->txrx->environment, EXT_PATH("subghz/assets/nice_flor_s")); subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment); +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + subghz_last_settings_set_detect_raw_values(subghz); +#else subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); +#endif subghz_worker_set_overrun_callback( subghz->txrx->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset); diff --git a/applications/main/subghz/subghz_last_settings.c b/applications/main/subghz/subghz_last_settings.c index 78bb702b7..91f6fc841 100644 --- a/applications/main/subghz/subghz_last_settings.c +++ b/applications/main/subghz/subghz_last_settings.c @@ -1,5 +1,8 @@ #include "subghz_last_settings.h" #include "subghz_i.h" +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +#include +#endif #define TAG "SubGhzLastSettings" @@ -11,9 +14,17 @@ #define SUBGHZ_LAST_SETTING_DEFAULT_PRESET 1 #define SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY 433920000 +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +#define SUBGHZ_LAST_SETTING_DEFAULT_READ_RAW 0 +#endif + #define SUBGHZ_LAST_SETTING_FIELD_FREQUENCY "Frequency" #define SUBGHZ_LAST_SETTING_FIELD_PRESET "Preset" +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +#define SUBGHZ_LAST_SETTING_FIELD_DETECT_RAW "DetectRaw" +#endif + SubGhzLastSettings* subghz_last_settings_alloc(void) { SubGhzLastSettings* instance = malloc(sizeof(SubGhzLastSettings)); return instance; @@ -35,6 +46,9 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count uint32_t temp_frequency = 0; int32_t temp_preset = 0; +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + uint32_t temp_read_raw = 0; +#endif if(FSE_OK == storage_sd_status(storage) && SUBGHZ_LAST_SETTINGS_PATH && flipper_format_file_open_existing(fff_data_file, SUBGHZ_LAST_SETTINGS_PATH)) { @@ -42,6 +56,10 @@ 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); +#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); +#endif } else { FURI_LOG_E(TAG, "Error open file %s", SUBGHZ_LAST_SETTINGS_PATH); } @@ -50,8 +68,14 @@ 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; +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + instance->detect_raw = SUBGHZ_LAST_SETTING_DEFAULT_READ_RAW; +#endif } else { instance->frequency = temp_frequency; +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + instance->detect_raw = temp_read_raw; +#endif if(temp_preset > (int32_t)preset_count - 1 || temp_preset < 0) { FURI_LOG_W(TAG, "Last used preset no found"); @@ -97,6 +121,12 @@ bool subghz_last_settings_save(SubGhzLastSettings* instance) { file, SUBGHZ_LAST_SETTING_FIELD_FREQUENCY, &instance->frequency, 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)) { + break; + } +#endif saved = true; } while(0); @@ -110,3 +140,17 @@ bool subghz_last_settings_save(SubGhzLastSettings* instance) { return saved; } + +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +void subghz_last_settings_set_detect_raw_values(void* context) { + furi_assert(context); + SubGhz* instance = (SubGhz*)context; + bool is_detect_raw = instance->last_settings->detect_raw > 0; + subghz_receiver_set_filter( + instance->txrx->receiver, is_detect_raw ? DETECT_RAW_TRUE : DETECT_RAW_FALSE); + subghz_protocol_decoder_raw_set_auto_mode( + subghz_receiver_search_decoder_base_by_name( + instance->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), + is_detect_raw); +} +#endif \ No newline at end of file diff --git a/applications/main/subghz/subghz_last_settings.h b/applications/main/subghz/subghz_last_settings.h index 7e42650c7..116eacadd 100644 --- a/applications/main/subghz/subghz_last_settings.h +++ b/applications/main/subghz/subghz_last_settings.h @@ -1,12 +1,23 @@ #pragma once +// Enable saving detect raw setting state +// #define SUBGHZ_SAVE_DETECT_RAW_SETTING 1 + #include #include #include #include +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +#include +#define DETECT_RAW_FALSE SubGhzProtocolFlag_Decodable +#define DETECT_RAW_TRUE SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_RAW +#endif typedef struct { uint32_t frequency; +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING + uint32_t detect_raw; +#endif int32_t preset; } SubGhzLastSettings; @@ -17,3 +28,6 @@ void subghz_last_settings_free(SubGhzLastSettings* instance); void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count); bool subghz_last_settings_save(SubGhzLastSettings* instance); +#ifdef SUBGHZ_SAVE_DETECT_RAW_SETTING +void subghz_last_settings_set_detect_raw_values(void* context); +#endif \ No newline at end of file