diff --git a/protopirate_app.c b/protopirate_app.c index 24462af..b3d1960 100644 --- a/protopirate_app.c +++ b/protopirate_app.c @@ -106,7 +106,7 @@ ProtoPirateApp* protopirate_app_alloc() { LOG_HEAP("After receiver views"); - // Init setting - KEEP THIS, it's small + // Init setting app->setting = subghz_setting_alloc(); app->loaded_file_path = NULL; subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user")); @@ -186,6 +186,7 @@ ProtoPirateApp* protopirate_app_alloc() { // Mark as not initialized app->radio_initialized = false; + app->decoder_initialized = false; LOG_HEAP("App alloc complete (radio deferred)"); @@ -201,6 +202,10 @@ bool protopirate_radio_init(ProtoPirateApp* app) { LOG_HEAP("Radio init start"); + if(app->decoder_initialized) { + protopirate_decoder_deinit(app); + } + // Allocate history app->txrx->history = protopirate_history_alloc(); LOG_HEAP("After history alloc"); @@ -271,45 +276,63 @@ bool protopirate_radio_init(ProtoPirateApp* app) { } bool protopirate_decoder_init(ProtoPirateApp* app) { - if(app->radio_initialized) { - FURI_LOG_D(TAG, "Decoder already initialized"); + if(app->radio_initialized || app->decoder_initialized) { + FURI_LOG_D(TAG, "Decoder/Radio already initialized"); return true; } LOG_HEAP("Decoder init start"); app->txrx->history = protopirate_history_alloc(); - LOG_HEAP("After history alloc"); - app->txrx->worker = NULL; app->txrx->environment = subghz_environment_alloc(); - LOG_HEAP("After environment alloc"); - FURI_LOG_I(TAG, "Registering %zu ProtoPirate protocols", protopirate_protocol_registry.size); subghz_environment_set_protocol_registry( app->txrx->environment, (void*)&protopirate_protocol_registry); subghz_environment_load_keystore(app->txrx->environment, PROTOPIRATE_KEYSTORE_DIR_NAME); - LOG_HEAP("After keystore load"); protopirate_keys_load(app->txrx->environment); - FURI_LOG_I(TAG, "Loaded ProtoPirate secure keys"); - LOG_HEAP("After keys load"); app->txrx->receiver = subghz_receiver_alloc_init(app->txrx->environment); - LOG_HEAP("After receiver alloc"); subghz_receiver_set_filter(app->txrx->receiver, SubGhzProtocolFlag_Decodable); app->txrx->radio_device = NULL; - app->radio_initialized = true; + app->decoder_initialized = true; LOG_HEAP("Decoder init complete"); - return true; } +void protopirate_decoder_deinit(ProtoPirateApp* app) { + if(!app->decoder_initialized) return; + + FURI_LOG_I(TAG, "Deinitializing decoder"); + + if(app->txrx->receiver) { + subghz_receiver_free(app->txrx->receiver); + app->txrx->receiver = NULL; + } + + if(app->txrx->environment) { + subghz_environment_free(app->txrx->environment); + app->txrx->environment = NULL; + } + + if(app->txrx->history) { + protopirate_history_free(app->txrx->history); + app->txrx->history = NULL; + } + + app->txrx->worker = NULL; + app->txrx->radio_device = NULL; + app->decoder_initialized = false; + + LOG_HEAP("Decoder deinit complete"); +} + // Deinitialize radio subsystem void protopirate_radio_deinit(ProtoPirateApp* app) { if(!app->radio_initialized) return; @@ -379,6 +402,9 @@ void protopirate_app_free(ProtoPirateApp* app) { // Deinitialize radio if it was initialized protopirate_radio_deinit(app); + //Deinitialize decoder if it was initialized + protopirate_decoder_deinit(app); + if(app->loaded_file_path) { furi_string_free(app->loaded_file_path); app->loaded_file_path = NULL; diff --git a/protopirate_app_i.h b/protopirate_app_i.h index 24df810..55a910f 100644 --- a/protopirate_app_i.h +++ b/protopirate_app_i.h @@ -82,6 +82,7 @@ struct ProtoPirateApp { FuriString* loaded_file_path; bool auto_save; bool radio_initialized; + bool decoder_initialized; ProtoPirateSettings settings; }; @@ -110,3 +111,4 @@ void protopirate_tx_stop(ProtoPirateApp* app); bool protopirate_radio_init(ProtoPirateApp* app); bool protopirate_decoder_init(ProtoPirateApp* app); void protopirate_radio_deinit(ProtoPirateApp* app); +void protopirate_decoder_deinit(ProtoPirateApp* app); diff --git a/scenes/protopirate_scene_sub_decode.c b/scenes/protopirate_scene_sub_decode.c index d195cec..0c4f0aa 100644 --- a/scenes/protopirate_scene_sub_decode.c +++ b/scenes/protopirate_scene_sub_decode.c @@ -1067,7 +1067,9 @@ bool protopirate_scene_sub_decode_on_event(void* context, SceneManagerEvent even void protopirate_scene_sub_decode_on_exit(void* context) { ProtoPirateApp* app = context; - subghz_receiver_set_rx_callback(app->txrx->receiver, NULL, NULL); + if(app->txrx->receiver) { + subghz_receiver_set_rx_callback(app->txrx->receiver, NULL, NULL); + } if(g_decode_ctx) { if(g_decode_ctx->raw_reader) { @@ -1089,14 +1091,11 @@ void protopirate_scene_sub_decode_on_exit(void* context) { free(g_decode_ctx); g_decode_ctx = NULL; } - - if(app->txrx->history) { - protopirate_history_reset(app->txrx->history); - } - + view_set_draw_callback(app->view_about, NULL); view_set_input_callback(app->view_about, NULL); widget_reset(app->widget); - protopirate_view_receiver_reset_menu(app->protopirate_receiver); + + protopirate_decoder_deinit(app); }