diff --git a/applications/main/subghz/application.fam b/applications/main/subghz/application.fam index e143217b4..1b62541db 100644 --- a/applications/main/subghz/application.fam +++ b/applications/main/subghz/application.fam @@ -16,6 +16,14 @@ App( "!subghz_cli.c", "!helpers/subghz_chat.c", "!subghz_extended_freq.c", + "!subghz_gen_info.c", + "!subghz_txrx_create_protocol_key.c", + "!subghz_scene_set_button.c", + "!subghz_scene_set_counter.c", + "!subghz_scene_set_key.c", + "!subghz_scene_set_seed.c", + "!subghz_scene_set_serial.c", + "!subghz_scene_set_type.c", ], requires=["region"], resources="resources", @@ -36,6 +44,35 @@ App( # fap_category="Sub-GHz", # ) +App( + appid="subghz_add_manually", + name="Sub-GHz Add Manually", + apptype=FlipperAppType.EXTERNAL, + targets=["f7"], + entry_point="subghz_add_manually", + stack_size=3 * 1024, + sources=[ + "subghz.c", + "subghz_i.c", + "helpers/subghz_gen_info.c", + "helpers/subghz_txrx.c", + "helpers/subghz_txrx_create_protocol_key.c", + "scenes/subghz_scene.c", + "scenes/subghz_scene_set_button.c", + "scenes/subghz_scene_set_counter.c", + "scenes/subghz_scene_set_key.c", + "scenes/subghz_scene_set_seed.c", + "scenes/subghz_scene_set_serial.c", + "scenes/subghz_scene_set_type.c", + "scenes/subghz_scene_save_name.c", + "scenes/subghz_scene_save_success.c", + "scenes/subghz_scene_show_error.c", + "scenes/subghz_scene_show_error_sub.c", + ], + cdefines=["SUBGHZ_ADD_MANUALLY"], + fap_category="assets", +) + App( appid="subghz_gps", targets=["f7"], diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index 1da282793..4a7d6bd77 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -59,11 +59,13 @@ SubGhzTxRx* subghz_txrx_alloc(void) { instance->worker, (SubGhzWorkerPairCallback)subghz_receiver_decode); subghz_worker_set_context(instance->worker, instance->receiver); +#ifndef SUBGHZ_ADD_MANUALLY //set default device External subghz_devices_init(); instance->radio_device_type = SubGhzRadioDeviceTypeInternal; instance->radio_device_type = subghz_txrx_radio_device_set(instance, SubGhzRadioDeviceTypeExternalCC1101); +#endif return instance; } @@ -71,12 +73,14 @@ SubGhzTxRx* subghz_txrx_alloc(void) { void subghz_txrx_free(SubGhzTxRx* instance) { furi_assert(instance); +#ifndef SUBGHZ_ADD_MANUALLY if(instance->radio_device_type != SubGhzRadioDeviceTypeInternal) { subghz_txrx_radio_device_power_off(instance); subghz_devices_end(instance->radio_device); } subghz_devices_deinit(); +#endif subghz_worker_free(instance->worker); subghz_receiver_free(instance->receiver); diff --git a/applications/main/subghz/scenes/subghz_scene_config.h b/applications/main/subghz/scenes/subghz_scene_config.h index 0e95fd261..c855a9b2b 100644 --- a/applications/main/subghz/scenes/subghz_scene_config.h +++ b/applications/main/subghz/scenes/subghz_scene_config.h @@ -1,22 +1,13 @@ +#ifndef SUBGHZ_ADD_MANUALLY ADD_SCENE(subghz, start, Start) ADD_SCENE(subghz, receiver, Receiver) ADD_SCENE(subghz, receiver_config, ReceiverConfig) ADD_SCENE(subghz, receiver_info, ReceiverInfo) -ADD_SCENE(subghz, save_name, SaveName) -ADD_SCENE(subghz, save_success, SaveSuccess) ADD_SCENE(subghz, saved, Saved) ADD_SCENE(subghz, transmitter, Transmitter) -ADD_SCENE(subghz, show_error, ShowError) -ADD_SCENE(subghz, show_error_sub, ShowErrorSub) ADD_SCENE(subghz, saved_menu, SavedMenu) ADD_SCENE(subghz, delete, Delete) ADD_SCENE(subghz, delete_success, DeleteSuccess) -ADD_SCENE(subghz, set_type, SetType) -ADD_SCENE(subghz, set_key, SetKey) -ADD_SCENE(subghz, set_serial, SetSerial) -ADD_SCENE(subghz, set_button, SetButton) -ADD_SCENE(subghz, set_counter, SetCounter) -ADD_SCENE(subghz, set_seed, SetSeed) ADD_SCENE(subghz, frequency_analyzer, FrequencyAnalyzer) ADD_SCENE(subghz, radio_settings, ExtModuleSettings) ADD_SCENE(subghz, read_raw, ReadRAW) @@ -27,3 +18,16 @@ ADD_SCENE(subghz, need_saving, NeedSaving) ADD_SCENE(subghz, rpc, Rpc) ADD_SCENE(subghz, show_gps, ShowGps) ADD_SCENE(subghz, signal_settings, SignalSettings) +#else +ADD_SCENE(subghz, set_type, SetType) +ADD_SCENE(subghz, set_key, SetKey) +ADD_SCENE(subghz, set_serial, SetSerial) +ADD_SCENE(subghz, set_button, SetButton) +ADD_SCENE(subghz, set_counter, SetCounter) +ADD_SCENE(subghz, set_seed, SetSeed) +#define SubGhzSceneStart SubGhzSceneSetType +#endif +ADD_SCENE(subghz, save_name, SaveName) +ADD_SCENE(subghz, save_success, SaveSuccess) +ADD_SCENE(subghz, show_error, ShowError) +ADD_SCENE(subghz, show_error_sub, ShowErrorSub) diff --git a/applications/main/subghz/scenes/subghz_scene_save_name.c b/applications/main/subghz/scenes/subghz_scene_save_name.c index fed134512..5589ad4b5 100644 --- a/applications/main/subghz/scenes/subghz_scene_save_name.c +++ b/applications/main/subghz/scenes/subghz_scene_save_name.c @@ -25,11 +25,17 @@ void subghz_scene_save_name_on_enter(void* context) { char file_name_buf[SUBGHZ_MAX_LEN_NAME] = {0}; DateTime* datetime = subghz->save_datetime_set ? &subghz->save_datetime : NULL; subghz->save_datetime_set = false; +#ifdef SUBGHZ_ADD_MANUALLY + name_generator_make_auto_datetime( + file_name_buf, SUBGHZ_MAX_LEN_NAME, SUBGHZ_APP_FILENAME_PREFIX, datetime); + furi_string_set(file_name, file_name_buf); + furi_string_set(subghz->file_path, SUBGHZ_APP_FOLDER); + dev_name_empty = true; +#else if(!subghz_path_is_file(subghz->file_path)) { SubGhzProtocolDecoderBase* decoder_result = subghz_txrx_get_decoder(subghz->txrx); if(subghz->last_settings->protocol_file_names && decoder_result != NULL && - strlen(decoder_result->protocol->name) != 0 && - !scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneSetType)) { + strlen(decoder_result->protocol->name) != 0) { name_generator_make_auto_datetime( file_name_buf, SUBGHZ_MAX_LEN_NAME, decoder_result->protocol->name, datetime); } else { @@ -62,6 +68,7 @@ void subghz_scene_save_name_on_enter(void* context) { } furi_string_set(subghz->file_path, dir_name); } +#endif strlcpy(subghz->file_name_tmp, furi_string_get_cstr(file_name), SUBGHZ_MAX_LEN_NAME); text_input_set_header_text(text_input, "Name signal"); @@ -89,6 +96,7 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { // Set file path to default furi_string_set(subghz->file_path, SUBGHZ_APP_FOLDER); // +#ifndef SUBGHZ_ADD_MANUALLY if(!(strcmp(subghz->file_name_tmp, "") == 0) || scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != SubGhzCustomEventManagerNoSet) { @@ -96,6 +104,7 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { furi_string_set(subghz->file_path, subghz->file_path_tmp); } } +#endif scene_manager_previous_scene(subghz->scene_manager); @@ -113,24 +122,26 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { return false; } } else { - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneSetType) != - SubGhzCustomEventManagerNoSet) { - subghz_save_protocol_to_file( - subghz, - subghz_txrx_get_fff_data(subghz->txrx), - furi_string_get_cstr(subghz->file_path)); - scene_manager_set_scene_state( - subghz->scene_manager, - SubGhzSceneSetType, - SubGhzCustomEventManagerNoSet); - } else { - subghz_save_protocol_to_file( - subghz, - subghz_history_get_raw_data(subghz->history, subghz->idx_menu_chosen), - furi_string_get_cstr(subghz->file_path)); +#ifdef SUBGHZ_ADD_MANUALLY + if(!subghz_save_protocol_to_file( + subghz, + subghz_txrx_get_fff_data(subghz->txrx), + furi_string_get_cstr(subghz->file_path))) { + return true; } +#else + if(!subghz_save_protocol_to_file( + subghz, + subghz_history_get_raw_data(subghz->history, subghz->idx_menu_chosen), + furi_string_get_cstr(subghz->file_path))) { + return true; + } +#endif } +#ifdef SUBGHZ_ADD_MANUALLY + subghz_file_name_clear(subghz); +#else if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != SubGhzCustomEventManagerNoSet) { subghz_protocol_raw_gen_fff_data( @@ -142,19 +153,21 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { } else { subghz_file_name_clear(subghz); } +#endif scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveSuccess); +#ifdef SUBGHZ_ADD_MANUALLY + dolphin_deed(DolphinDeedSubGhzAddManually); +#else if(scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneSavedMenu)) { // Nothing, do not count editing as saving } else if(scene_manager_has_previous_scene( subghz->scene_manager, SubGhzSceneMoreRAW)) { // Ditto, for RAW signals - } else if(scene_manager_has_previous_scene( - subghz->scene_manager, SubGhzSceneSetType)) { - dolphin_deed(DolphinDeedSubGhzAddManually); } else { dolphin_deed(DolphinDeedSubGhzSave); } +#endif return true; } else { furi_string_set(subghz->error_str, "No name file"); diff --git a/applications/main/subghz/scenes/subghz_scene_save_success.c b/applications/main/subghz/scenes/subghz_scene_save_success.c index 9a71c74a7..8c316981d 100644 --- a/applications/main/subghz/scenes/subghz_scene_save_success.c +++ b/applications/main/subghz/scenes/subghz_scene_save_success.c @@ -24,6 +24,12 @@ bool subghz_scene_save_success_on_event(void* context, SceneManagerEvent event) SubGhz* subghz = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventSceneSaveSuccess) { +#ifdef SUBGHZ_ADD_MANUALLY + while(scene_manager_previous_scene(subghz->scene_manager)) + ; + scene_manager_stop(subghz->scene_manager); + view_dispatcher_stop(subghz->view_dispatcher); +#else if(!scene_manager_has_previous_scene(subghz->scene_manager, SubGhzSceneDecodeRAW)) { if(!scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneReceiver)) { @@ -59,6 +65,7 @@ bool subghz_scene_save_success_on_event(void* context, SceneManagerEvent event) scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); } } +#endif return true; } } diff --git a/applications/main/subghz/scenes/subghz_scene_set_counter.c b/applications/main/subghz/scenes/subghz_scene_set_counter.c index be13499b8..130f9b048 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_counter.c +++ b/applications/main/subghz/scenes/subghz_scene_set_counter.c @@ -296,8 +296,6 @@ bool subghz_scene_set_counter_on_event(void* context, SceneManagerEvent event) { } else { subghz_file_name_clear(subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSetType, SubGhzCustomEventManagerSet); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); } } diff --git a/applications/main/subghz/scenes/subghz_scene_set_key.c b/applications/main/subghz/scenes/subghz_scene_set_key.c index 690c62182..a760e8ffa 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_key.c +++ b/applications/main/subghz/scenes/subghz_scene_set_key.c @@ -76,8 +76,6 @@ bool subghz_scene_set_key_on_event(void* context, SceneManagerEvent event) { } else { subghz_file_name_clear(subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSetType, SubGhzCustomEventManagerSet); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); } } diff --git a/applications/main/subghz/scenes/subghz_scene_set_seed.c b/applications/main/subghz/scenes/subghz_scene_set_seed.c index b3bd447e6..0d844d0dc 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_seed.c +++ b/applications/main/subghz/scenes/subghz_scene_set_seed.c @@ -119,8 +119,6 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { } else { subghz_file_name_clear(subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSetType, SubGhzCustomEventManagerSet); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); } } diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index 7ee72ea21..6b44d39e4 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -104,9 +104,6 @@ void subghz_scene_set_type_on_enter(void* context) { subghz->submenu, submenu_names[i], i, subghz_scene_set_type_submenu_callback, subghz); } - submenu_set_selected_item( - subghz->submenu, scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneSetType)); - view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdMenu); } @@ -275,8 +272,6 @@ bool subghz_scene_set_type_generate_protocol_from_infos(SubGhz* subghz) { if(generated_protocol) { subghz_file_name_clear(subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneSetType, SubGhzCustomEventManagerSet); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); } else { furi_string_set(subghz->error_str, "Function requires\nan SD card with\nfresh databases."); @@ -293,16 +288,15 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { if(event.event >= SetTypeMAX) { return false; } - scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneSetType, event.event); subghz_gen_info_reset(subghz->gen_info); subghz_scene_set_type_fill_generation_infos(subghz->gen_info, event.event); - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneStart) == + if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneSetType) == SubmenuIndexAddManually) { generated_protocol = subghz_scene_set_type_generate_protocol_from_infos(subghz); } else if( - scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneStart) == + scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneSetType) == SubmenuIndexAddManuallyAdvanced) { switch(subghz->gen_info->type) { case GenData: // Key (u64) diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index 8c77eacd2..9816562f0 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -1,6 +1,7 @@ #include "../subghz_i.h" #include "subghz_scene_start.h" #include +#include #include @@ -75,11 +76,28 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubmenuIndexSaved) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); return true; - } else if(event.event == SubmenuIndexAddManually) { - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); - return true; - } else if(event.event == SubmenuIndexAddManuallyAdvanced) { - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); + } else if( + event.event == SubmenuIndexAddManually || + event.event == SubmenuIndexAddManuallyAdvanced) { + const char* arg = (event.event == SubmenuIndexAddManuallyAdvanced) ? + "AddManuallyAdvanced" : + "AddManually"; + FuriString* self_path = furi_string_alloc(); + Loader* loader = furi_record_open(RECORD_LOADER); + furi_check(loader_get_application_launch_path(loader, self_path)); + loader_enqueue_launch( + loader, + EXT_PATH("apps/assets/subghz_add_manually.fap"), + arg, + LoaderDeferredLaunchFlagGui); + loader_enqueue_launch( + loader, furi_string_get_cstr(self_path), arg, LoaderDeferredLaunchFlagGui); + furi_record_close(RECORD_LOADER); + furi_string_free(self_path); + while(scene_manager_previous_scene(subghz->scene_manager)) + ; + scene_manager_stop(subghz->scene_manager); + view_dispatcher_stop(subghz->view_dispatcher); return true; } else if(event.event == SubmenuIndexFrequencyAnalyzer) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneFrequencyAnalyzer); diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index e6d32013e..9b0507bf5 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -8,6 +8,8 @@ #include #include +#include "scenes/subghz_scene_start.h" + #include "subghz_fap.h" #define TAG "SubGhzApp" @@ -128,12 +130,14 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { view_dispatcher_add_view( subghz->view_dispatcher, SubGhzViewIdMenu, submenu_get_view(subghz->submenu)); +#ifndef SUBGHZ_ADD_MANUALLY // Receiver subghz->subghz_receiver = subghz_view_receiver_alloc(); view_dispatcher_add_view( subghz->view_dispatcher, SubGhzViewIdReceiver, subghz_view_receiver_get_view(subghz->subghz_receiver)); +#endif } // Popup subghz->popup = popup_alloc(); @@ -162,12 +166,14 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { //Dialog subghz->dialogs = furi_record_open(RECORD_DIALOGS); +#ifndef SUBGHZ_ADD_MANUALLY // Transmitter subghz->subghz_transmitter = subghz_view_transmitter_alloc(); view_dispatcher_add_view( subghz->view_dispatcher, SubGhzViewIdTransmitter, subghz_view_transmitter_get_view(subghz->subghz_transmitter)); +#endif if(!alloc_for_tx_only) { // Variable Item List subghz->variable_item_list = variable_item_list_alloc(); @@ -176,6 +182,7 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { SubGhzViewIdVariableItemList, variable_item_list_get_view(subghz->variable_item_list)); +#ifndef SUBGHZ_ADD_MANUALLY // Frequency Analyzer // View knows too much subghz->subghz_frequency_analyzer = subghz_frequency_analyzer_alloc(subghz->txrx); @@ -183,7 +190,10 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz->view_dispatcher, SubGhzViewIdFrequencyAnalyzer, subghz_frequency_analyzer_get_view(subghz->subghz_frequency_analyzer)); +#endif } + +#ifndef SUBGHZ_ADD_MANUALLY // Read RAW subghz->subghz_read_raw = subghz_read_raw_alloc(alloc_for_tx_only); view_dispatcher_add_view( @@ -238,8 +248,6 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz_rx_key_state_set(subghz, SubGhzRxKeyStateIDLE); - subghz->gen_info = malloc(sizeof(GenInfo)); - if(!alloc_for_tx_only) { subghz->remove_duplicates = subghz->last_settings->remove_duplicates; subghz->ignore_filter = subghz->last_settings->ignore_filter; @@ -263,6 +271,9 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz->last_settings->rssi = SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_TRIGGER; } } +#else + subghz->gen_info = malloc(sizeof(GenInfo)); +#endif #if SUBGHZ_MEASURE_LOADING load_ticks = furi_get_tick() - load_ticks; FURI_LOG_I(TAG, "Loaded: %ld ms.", load_ticks); @@ -270,9 +281,11 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { //Init Error_str subghz->error_str = furi_string_alloc(); +#ifndef SUBGHZ_ADD_MANUALLY if(subghz->last_settings->gps_baudrate != 0) { subghz->gps = subghz_gps_plugin_init(subghz->last_settings->gps_baudrate); } +#endif return subghz; } @@ -280,6 +293,7 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { furi_assert(subghz); +#ifndef SUBGHZ_ADD_MANUALLY if(subghz->rpc_ctx) { rpc_system_app_set_callback(subghz->rpc_ctx, NULL, NULL); rpc_system_app_send_exited(subghz->rpc_ctx); @@ -290,11 +304,14 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { subghz_txrx_speaker_off(subghz->txrx); subghz_txrx_stop(subghz->txrx); subghz_txrx_sleep(subghz->txrx); +#endif if(!alloc_for_tx_only) { +#ifndef SUBGHZ_ADD_MANUALLY // Receiver view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdReceiver); subghz_view_receiver_free(subghz->subghz_receiver); +#endif // TextInput view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdTextInput); @@ -311,21 +328,27 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { //Dialog furi_record_close(RECORD_DIALOGS); +#ifndef SUBGHZ_ADD_MANUALLY // Transmitter view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdTransmitter); subghz_view_transmitter_free(subghz->subghz_transmitter); +#endif if(!alloc_for_tx_only) { // Variable Item List view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); variable_item_list_free(subghz->variable_item_list); +#ifndef SUBGHZ_ADD_MANUALLY // Frequency Analyzer view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdFrequencyAnalyzer); subghz_frequency_analyzer_free(subghz->subghz_frequency_analyzer); +#endif } +#ifndef SUBGHZ_ADD_MANUALLY // Read RAW view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdReadRAW); subghz_read_raw_free(subghz->subghz_read_raw); +#endif if(!alloc_for_tx_only) { // Submenu view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdMenu); @@ -345,6 +368,7 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { furi_record_close(RECORD_GUI); subghz->gui = NULL; +#ifndef SUBGHZ_ADD_MANUALLY // threshold rssi subghz_threshold_rssi_free(subghz->threshold_rssi); @@ -352,7 +376,9 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { subghz_history_free(subghz->history); } +#else free(subghz->gen_info); +#endif //TxRx subghz_txrx_free(subghz->txrx); @@ -368,18 +394,32 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { furi_string_free(subghz->file_path); furi_string_free(subghz->file_path_tmp); +#ifndef SUBGHZ_ADD_MANUALLY // GPS if(subghz->gps) { subghz_gps_plugin_deinit(subghz->gps); } subghz_last_settings_free(subghz->last_settings); +#endif // The rest free(subghz); } +#ifndef SUBGHZ_ADD_MANUALLY int32_t subghz_app(char* p) { + enum SubmenuIndex start_scene_state = 0; + if(p) { + if(!strcmp(p, "AddManually")) { + start_scene_state = SubmenuIndexAddManually; + p = NULL; + } else if(!strcmp(p, "AddManuallyAdvanced")) { + start_scene_state = SubmenuIndexAddManuallyAdvanced; + p = NULL; + } + } + bool alloc_for_tx; if(p && strlen(p)) { alloc_for_tx = true; @@ -432,6 +472,7 @@ int32_t subghz_app(char* p) { view_dispatcher_attach_to_gui( subghz->view_dispatcher, subghz->gui, ViewDispatcherTypeFullscreen); furi_string_set(subghz->file_path, SUBGHZ_APP_FOLDER); + scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneStart, start_scene_state); if(subghz_txrx_is_database_loaded(subghz->txrx)) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneStart); } else { @@ -459,3 +500,35 @@ int32_t subghz_app(char* p) { return 0; } +#else +int32_t subghz_add_manually(void* p) { + enum SubmenuIndex add_manually_scene_state = 0; + if(p) { + if(!strcmp(p, "AddManually")) { + add_manually_scene_state = SubmenuIndexAddManually; + } else if(!strcmp(p, "AddManuallyAdvanced")) { + add_manually_scene_state = SubmenuIndexAddManuallyAdvanced; + } + } + if(!add_manually_scene_state) return 0; + + bool alloc_for_tx = false; + SubGhz* subghz = subghz_alloc(alloc_for_tx); + UNUSED(subghz_rpc_command_callback); + UNUSED(subghz_load_custom_presets); + + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneSetType, add_manually_scene_state); + + view_dispatcher_attach_to_gui( + subghz->view_dispatcher, subghz->gui, ViewDispatcherTypeFullscreen); + furi_string_set(subghz->file_path, SUBGHZ_APP_FOLDER); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetType); + + view_dispatcher_run(subghz->view_dispatcher); + + subghz_free(subghz, alloc_for_tx); + + return 0; +} +#endif