Fix evil portal log hang and crash

This commit is contained in:
Willy-JL
2023-11-20 20:18:27 +00:00
parent ffd61fa56f
commit 8700b7ebc1
5 changed files with 22 additions and 12 deletions

View File

@@ -27,6 +27,7 @@ Evil_PortalApp* evil_portal_app_alloc() {
app->sent_reset = false;
app->portal_logs = furi_string_alloc();
app->portal_logs_mutex = furi_mutex_alloc(FuriMutexTypeRecursive);
app->capture_line = false;
app->captured_line = furi_string_alloc();
@@ -81,14 +82,6 @@ Evil_PortalApp* evil_portal_app_alloc() {
}
void evil_portal_app_free(Evil_PortalApp* app) {
// save latest logs
if(furi_string_utf8_length(app->portal_logs) > 0) {
write_logs(app->portal_logs);
furi_string_free(app->portal_logs);
}
furi_string_free(app->captured_line);
// Send reset event to dev board
evil_portal_uart_tx((uint8_t*)(RESET_CMD), strlen(RESET_CMD));
evil_portal_uart_tx((uint8_t*)("\n"), 1);
@@ -112,6 +105,17 @@ void evil_portal_app_free(Evil_PortalApp* app) {
evil_portal_uart_free(app->uart);
// save latest logs
furi_mutex_acquire(app->portal_logs_mutex, FuriWaitForever);
if(furi_string_size(app->portal_logs) > 0) {
write_logs(app->portal_logs);
furi_string_free(app->portal_logs);
}
furi_mutex_release(app->portal_logs_mutex);
furi_mutex_free(app->portal_logs_mutex);
furi_string_free(app->captured_line);
// Close records
furi_record_close(RECORD_GUI);

View File

@@ -34,6 +34,7 @@ struct Evil_PortalApp {
SceneManager* scene_manager;
FuriString* portal_logs;
FuriMutex* portal_logs_mutex;
FuriString* text_box_store;
size_t text_box_store_strlen;

View File

@@ -48,24 +48,28 @@ static int32_t uart_worker(void* context) {
if(uart->handle_rx_data_cb) {
uart->handle_rx_data_cb(uart->rx_buf, len, uart->app);
furi_mutex_acquire(uart->app->portal_logs_mutex, FuriWaitForever);
if(uart->app->sent_reset == false) {
furi_string_cat(uart->app->portal_logs, (char*)uart->rx_buf);
}
if(furi_string_utf8_length(uart->app->portal_logs) > 4000) {
if(furi_string_size(uart->app->portal_logs) > 4000) {
write_logs(uart->app->portal_logs);
furi_string_reset(uart->app->portal_logs);
}
furi_mutex_release(uart->app->portal_logs_mutex);
} else {
uart->rx_buf[len] = '\0';
furi_mutex_acquire(uart->app->portal_logs_mutex, FuriWaitForever);
if(uart->app->sent_reset == false) {
furi_string_cat(uart->app->portal_logs, (char*)uart->rx_buf);
}
if(furi_string_utf8_length(uart->app->portal_logs) > 4000) {
if(furi_string_size(uart->app->portal_logs) > 4000) {
write_logs(uart->app->portal_logs);
furi_string_reset(uart->app->portal_logs);
}
furi_mutex_release(uart->app->portal_logs_mutex);
}
}
}

View File

@@ -156,8 +156,7 @@ void write_logs(FuriString* portal_logs) {
File* file = storage_file_alloc(storage);
if(storage_file_open(file, seq_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
storage_file_write(
file, furi_string_get_cstr(portal_logs), furi_string_utf8_length(portal_logs));
storage_file_write(file, furi_string_get_cstr(portal_logs), furi_string_size(portal_logs));
}
storage_file_close(file);
storage_file_free(file);

View File

@@ -62,8 +62,10 @@ void evil_portal_scene_console_output_on_enter(void* context) {
const char* help_msg = "Logs saved.\n\n";
furi_string_cat_str(app->text_box_store, help_msg);
app->text_box_store_strlen += strlen(help_msg);
furi_mutex_acquire(app->portal_logs_mutex, FuriWaitForever);
write_logs(app->portal_logs);
furi_string_reset(app->portal_logs);
furi_mutex_release(app->portal_logs_mutex);
if(app->show_stopscan_tip) {
const char* msg = "Press BACK to return\n";
furi_string_cat_str(app->text_box_store, msg);