mirror of
https://protopirate.net/ProtoPirate/ProtoPirate.git
synced 2026-08-27 22:35:17 +00:00
Fix more crashes
This commit is contained in:
+39
-13
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user