diff --git a/src/tools/gui/stlink-gui.c b/src/tools/gui/stlink-gui.c index 34afb2c51..2be97ef10 100644 --- a/src/tools/gui/stlink-gui.c +++ b/src/tools/gui/stlink-gui.c @@ -92,6 +92,8 @@ stlink_gui_set_sensitivity (STlinkGUI *gui, gboolean sensitivity) if (sensitivity && gui->sl && gui->filename) gtk_widget_set_sensitive (GTK_WIDGET (gui->flash_button), sensitivity); + + gtk_widget_set_sensitive (GTK_WIDGET (gui->export_button), sensitivity && (gui->sl != NULL)); } static void @@ -575,6 +577,7 @@ static void stlink_gui_set_disconnected (STlinkGUI *gui) gtk_widget_set_sensitive (GTK_WIDGET (gui->device_frame), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (gui->flash_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (gui->export_button), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (gui->disconnect_button), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (gui->connect_button), TRUE); } @@ -712,6 +715,51 @@ flash_button_cb (GtkWidget *widget, gpointer data) } } +int export_to_file(const char*filename, const struct mem_t flash_mem) +{ + printf("%s\n", filename); + FILE * f=fopen(filename, "w"); + if(f==NULL) + return -1; + for(gsize i=0;iwindow, + GTK_FILE_CHOOSER_ACTION_SAVE, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Open", + GTK_RESPONSE_ACCEPT, + NULL); + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + gint res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + char *filename; + + filename = gtk_file_chooser_get_filename (chooser); + if(export_to_file (filename, gui->flash_mem)!=0) + stlink_gui_set_info_error_message(gui, "Failed to export flash"); + else + stlink_gui_set_info_error_message(gui, "Export successful"); + g_free (filename); + } + + gtk_widget_destroy (dialog); +} + static gboolean progress_pulse_timeout (STlinkGUI *gui) { if (gui->progress.activity_mode) { @@ -857,6 +905,11 @@ stlink_gui_build_ui (STlinkGUI *gui) { g_signal_connect (G_OBJECT (gui->flash_button), "clicked", G_CALLBACK (flash_button_cb), gui); + gui->export_button = + GTK_TOOL_BUTTON (gtk_builder_get_object (builder, "export_button")); + g_signal_connect (G_OBJECT (gui->export_button), "clicked", + G_CALLBACK (export_button_cb), gui); + gui->devmem_treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, "devmem_treeview")); mem_view_init_headers (gui->devmem_treeview); diff --git a/src/tools/gui/stlink-gui.h b/src/tools/gui/stlink-gui.h index 0c90648a4..30c503fd3 100644 --- a/src/tools/gui/stlink-gui.h +++ b/src/tools/gui/stlink-gui.h @@ -64,6 +64,7 @@ struct _STlinkGUI GtkToolButton *connect_button; GtkToolButton *disconnect_button; GtkToolButton *flash_button; + GtkToolButton *export_button; GtkToolButton *open_button; /* flash dialog */ @@ -89,5 +90,6 @@ struct _STlinkGUIClass }; GType stlink_gui_get_type (void); +int export_to_file(const char*filename, const struct mem_t flash_mem); #endif diff --git a/src/tools/gui/stlink-gui.ui b/src/tools/gui/stlink-gui.ui index 193925ce1..aa0051b07 100644 --- a/src/tools/gui/stlink-gui.ui +++ b/src/tools/gui/stlink-gui.ui @@ -173,6 +173,20 @@ True + + + True + False + Export device memory + __glade_unnamed_9 + True + gtk-save + + + False + True + + True