diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 8333f5343..cafa8b927 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -167,6 +167,7 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz_sleep(subghz); } subghz->txrx->hopper_state = SubGhzHopperStateOFF; + subghz_history_set_hopper_state(subghz->txrx->history, false); subghz->txrx->idx_menu_chosen = 0; subghz_receiver_set_rx_callback(subghz->txrx->receiver, NULL, subghz); diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index ab5cde516..f3664a46a 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -189,64 +189,64 @@ static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - if(subghz->txrx->hopper_state == 0) { - variable_item_set_current_value_text(item, detect_raw_text[index]); + //if(subghz->txrx->hopper_state == 0) { + 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->detect_raw = index; - subghz_last_settings_set_detect_raw_values(subghz); + subghz_last_settings_set_detect_raw_values(subghz); #else - subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[index]); + 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)); + subghz_protocol_decoder_raw_set_auto_mode( + subghz_receiver_search_decoder_base_by_name( + subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), + (index == 1)); #endif - } else { + /*} else { variable_item_set_current_value_index(item, 0); - } + }*/ } static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - if(subghz_receiver_get_filter(subghz->txrx->receiver) == SubGhzProtocolFlag_Decodable) { - variable_item_set_current_value_text(item, hopping_text[index]); - if(hopping_value[index] == SubGhzHopperStateOFF) { - char text_buf[10] = {0}; - snprintf( - text_buf, - sizeof(text_buf), - "%lu.%02lu", - subghz_setting_get_default_frequency(subghz->setting) / 1000000, - (subghz_setting_get_default_frequency(subghz->setting) % 1000000) / 10000); - variable_item_set_current_value_text( - (VariableItem*)scene_manager_get_scene_state( - subghz->scene_manager, SubGhzSceneReceiverConfig), - text_buf); - subghz->txrx->preset->frequency = - subghz_setting_get_default_frequency(subghz->setting); - variable_item_set_current_value_index( - (VariableItem*)scene_manager_get_scene_state( - subghz->scene_manager, SubGhzSceneReceiverConfig), - subghz_setting_get_frequency_default_index(subghz->setting)); - } else { - variable_item_set_current_value_text( - (VariableItem*)scene_manager_get_scene_state( - subghz->scene_manager, SubGhzSceneReceiverConfig), - " -----"); - variable_item_set_current_value_index( - (VariableItem*)scene_manager_get_scene_state( - subghz->scene_manager, SubGhzSceneReceiverConfig), - subghz_setting_get_frequency_default_index(subghz->setting)); - } - - subghz->txrx->hopper_state = hopping_value[index]; + //if(subghz_receiver_get_filter(subghz->txrx->receiver) == SubGhzProtocolFlag_Decodable) { + variable_item_set_current_value_text(item, hopping_text[index]); + if(hopping_value[index] == SubGhzHopperStateOFF) { + char text_buf[10] = {0}; + snprintf( + text_buf, + sizeof(text_buf), + "%lu.%02lu", + subghz_setting_get_default_frequency(subghz->setting) / 1000000, + (subghz_setting_get_default_frequency(subghz->setting) % 1000000) / 10000); + variable_item_set_current_value_text( + (VariableItem*)scene_manager_get_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig), + text_buf); + subghz->txrx->preset->frequency = subghz_setting_get_default_frequency(subghz->setting); + variable_item_set_current_value_index( + (VariableItem*)scene_manager_get_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig), + subghz_setting_get_frequency_default_index(subghz->setting)); } else { - variable_item_set_current_value_index(item, 0); + variable_item_set_current_value_text( + (VariableItem*)scene_manager_get_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig), + " -----"); + variable_item_set_current_value_index( + (VariableItem*)scene_manager_get_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig), + subghz_setting_get_frequency_default_index(subghz->setting)); } + + subghz->txrx->hopper_state = hopping_value[index]; + subghz_history_set_hopper_state(subghz->txrx->history, (index == 1)); + /*} else { + variable_item_set_current_value_index(item, 0); + }*/ } static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 6d3432357..9a42fc9bb 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -41,6 +41,7 @@ struct SubGhzHistory { uint8_t code_last_hash_data; FuriString* tmp_string; bool write_tmp_files; + bool is_hopper_running; Storage* storage; SubGhzHistoryStruct* history; }; @@ -134,6 +135,8 @@ SubGhzHistory* subghz_history_alloc(void) { instance->storage = furi_record_open(RECORD_STORAGE); instance->write_tmp_files = subghz_history_check_sdcard(instance); + instance->is_hopper_running = false; + if(!instance->write_tmp_files) { FURI_LOG_E(TAG, "Unstable work! Cannot use SD Card!"); } @@ -209,6 +212,12 @@ void subghz_history_reset(SubGhzHistory* instance) { instance->code_last_hash_data = 0; } +void subghz_history_set_hopper_state(SubGhzHistory* instance, bool hopper_state) { + furi_assert(instance); + + instance->is_hopper_running = hopper_state; +} + uint16_t subghz_history_get_item(SubGhzHistory* instance) { furi_assert(instance); return instance->last_index_write; @@ -354,16 +363,23 @@ bool subghz_history_add_to_history( item->protocol_name, "%s", furi_string_get_cstr(instance->tmp_string)); } if(!strcmp(furi_string_get_cstr(instance->tmp_string), "RAW")) { + // Check if hopper enabled we need to add little delay + if(instance->is_hopper_running) { + furi_delay_ms(40); + } + // Enable writing temp files to micro sd + tmp_file_for_raw = true; + // Write display name furi_string_printf( item->item_str, "RAW %03ld.%02ld", preset->frequency / 1000000 % 1000, preset->frequency / 10000 % 100); - + // Rewind if(!flipper_format_rewind(item->flipper_string)) { FURI_LOG_E(TAG, "Rewind error"); } - tmp_file_for_raw = true; + break; } else if(!strcmp(furi_string_get_cstr(instance->tmp_string), "KeeLoq")) { furi_string_set(instance->tmp_string, "KL "); diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 7bff3df5e..6ab3603d8 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -103,3 +103,10 @@ bool subghz_history_add_to_history( * @return SubGhzProtocolCommonLoad* */ FlipperFormat* subghz_history_get_raw_data(SubGhzHistory* instance, uint16_t idx); + +/** Set hopper state for internal usage in history + * + * @param instance - SubGhzHistory instance + * @param hopper_state - bool is hopper running? + */ +void subghz_history_set_hopper_state(SubGhzHistory* instance, bool hopper_state);