Sub-GHz: Move Add Manually menu out of main app, transparently

This commit is contained in:
WillyJL
2026-06-01 15:12:38 +02:00
parent 1cbba8237e
commit 27015e81ea
11 changed files with 195 additions and 51 deletions
+37
View File
@@ -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"],
@@ -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);
@@ -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)
@@ -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");
@@ -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;
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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)
@@ -1,6 +1,7 @@
#include "../subghz_i.h"
#include "subghz_scene_start.h"
#include <dolphin/dolphin.h>
#include <loader/loader.h>
#include <lib/subghz/protocols/raw.h>
@@ -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);
+75 -2
View File
@@ -8,6 +8,8 @@
#include <applications/main/archive/helpers/archive_helpers_ext.h>
#include <momentum/momentum.h>
#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