From 6f358d3077c2d950da438749df204159fa1ccee2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Jan 2026 04:50:31 +0300 Subject: [PATCH] Fix init and deinit functions --- protopirate_app.c | 80 +++++++++++++++++++++++++++++++++++++++++++-- protopirate_app_i.h | 1 + 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/protopirate_app.c b/protopirate_app.c index 24462af..86dd4f0 100644 --- a/protopirate_app.c +++ b/protopirate_app.c @@ -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)"); @@ -198,6 +199,47 @@ bool protopirate_radio_init(ProtoPirateApp* app) { FURI_LOG_D(TAG, "Radio already initialized"); return true; } + if(app->decoder_initialized) { + LOG_HEAP("Radio with decoder init start"); + app->txrx->worker = subghz_worker_alloc(); + LOG_HEAP("After worker alloc"); + // Initialize SubGhz devices + subghz_devices_init(); + + // Try external CC1101 first, fallback to internal + app->txrx->radio_device = + radio_device_loader_set(NULL, SubGhzRadioDeviceTypeExternalCC1101); + + if(!app->txrx->radio_device) { + FURI_LOG_E(TAG, "Failed to initialize any radio device!"); + return false; + } + +#ifndef REMOVE_LOGS + const char* device_name = subghz_devices_get_name(app->txrx->radio_device); + bool is_external = device_name && strstr(device_name, "ext"); + FURI_LOG_I( + TAG, + "Radio device initialized: %s (%s)", + device_name ? device_name : "unknown", + is_external ? "external" : "internal"); +#endif + + subghz_devices_reset(app->txrx->radio_device); + subghz_devices_idle(app->txrx->radio_device); + + // Set up worker callbacks + subghz_worker_set_overrun_callback( + app->txrx->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset); + subghz_worker_set_pair_callback( + app->txrx->worker, (SubGhzWorkerPairCallback)subghz_receiver_decode); + subghz_worker_set_context(app->txrx->worker, app->txrx->receiver); + + app->radio_initialized = true; + LOG_HEAP("Radio with decoder init complete"); + + return true; + } LOG_HEAP("Radio init start"); @@ -271,7 +313,7 @@ bool protopirate_radio_init(ProtoPirateApp* app) { } bool protopirate_decoder_init(ProtoPirateApp* app) { - if(app->radio_initialized) { + if(app->decoder_initialized) { FURI_LOG_D(TAG, "Decoder already initialized"); return true; } @@ -303,13 +345,39 @@ bool protopirate_decoder_init(ProtoPirateApp* app) { 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; } +bool protopirate_decoder_deinit(ProtoPirateApp* app) { + if(!app->decoder_initialized) { + FURI_LOG_D(TAG, "Decoder was not initialized"); + return true; + } + + LOG_HEAP("Decoder de init start"); + + subghz_receiver_free(app->txrx->receiver); + app->txrx->receiver = NULL; + + 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->decoder_initialized = false; + + LOG_HEAP("Decoder deinit complete"); + + return true; +} + // Deinitialize radio subsystem void protopirate_radio_deinit(ProtoPirateApp* app) { if(!app->radio_initialized) return; @@ -377,7 +445,13 @@ void protopirate_app_free(ProtoPirateApp* app) { protopirate_settings_save(&settings); // Deinitialize radio if it was initialized - protopirate_radio_deinit(app); + if(app->radio_initialized && !app->decoder_initialized) { + protopirate_radio_deinit(app); + } else if(app->decoder_initialized && !app->radio_initialized) { + protopirate_decoder_deinit(app); + } else if(app->decoder_initialized && app->radio_initialized) { + protopirate_radio_deinit(app); + } if(app->loaded_file_path) { furi_string_free(app->loaded_file_path); diff --git a/protopirate_app_i.h b/protopirate_app_i.h index 24df810..2db06c5 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; };