@@ -101,6 +101,8 @@ static void stlink_gui_set_sensitivity(STlinkGUI *gui, gboolean sensitivity) {
101101 gtk_widget_set_sensitive (GTK_WIDGET (gui -> reset_button ), sensitivity && (gui -> sl != NULL ));
102102
103103 gtk_widget_set_sensitive (GTK_WIDGET (gui -> export_button ), sensitivity && (gui -> sl != NULL ));
104+
105+ gtk_widget_set_sensitive (GTK_WIDGET (gui -> erase_button ), sensitivity && (gui -> sl != NULL ));
104106}
105107
106108static void mem_view_init_headers (GtkTreeView * view ) {
@@ -531,11 +533,12 @@ static void stlink_gui_set_disconnected(STlinkGUI *gui) {
531533 gtk_statusbar_push (gui -> statusbar , gtk_statusbar_get_context_id (gui -> statusbar , "conn" ), "Disconnected" );
532534
533535 gtk_widget_set_sensitive (GTK_WIDGET (gui -> device_frame ), FALSE);
534- gtk_widget_set_sensitive (GTK_WIDGET (gui -> flash_button ), FALSE);
535- gtk_widget_set_sensitive (GTK_WIDGET (gui -> export_button ), FALSE);
536- gtk_widget_set_sensitive (GTK_WIDGET (gui -> disconnect_button ), FALSE);
537536 gtk_widget_set_sensitive (GTK_WIDGET (gui -> connect_button ), TRUE);
537+ gtk_widget_set_sensitive (GTK_WIDGET (gui -> disconnect_button ), FALSE);
538+ gtk_widget_set_sensitive (GTK_WIDGET (gui -> flash_button ), FALSE);
538539 gtk_widget_set_sensitive (GTK_WIDGET (gui -> reset_button ), FALSE);
540+ gtk_widget_set_sensitive (GTK_WIDGET (gui -> export_button ), FALSE);
541+ gtk_widget_set_sensitive (GTK_WIDGET (gui -> erase_button ), FALSE);
539542}
540543
541544static void disconnect_button_cb (GtkWidget * widget , gpointer data ) {
@@ -614,7 +617,7 @@ static void open_button_cb(GtkWidget *widget, gpointer data) {
614617 stlink_gui_open_file (gui );
615618}
616619
617- static gboolean stlink_gui_write_flash_update (STlinkGUI * gui ) {
620+ static gboolean stlink_gui_restore_after_background_thread (STlinkGUI * gui ) {
618621 stlink_gui_set_sensitivity (gui , TRUE);
619622 gui -> progress .activity_mode = FALSE;
620623 gtk_widget_hide (GTK_WIDGET (gui -> progress .bar ));
@@ -634,7 +637,7 @@ static gpointer stlink_gui_write_flash(gpointer data) {
634637 stlink_gui_set_info_error_message (gui , "Failed to write to flash" );
635638 }
636639
637- g_idle_add ((GSourceFunc )stlink_gui_write_flash_update , gui );
640+ g_idle_add ((GSourceFunc )stlink_gui_restore_after_background_thread , gui );
638641 return (NULL );
639642}
640643
@@ -738,6 +741,42 @@ static void export_button_cb(GtkWidget *widget, gpointer data) {
738741 gtk_widget_destroy (dialog );
739742}
740743
744+ static gpointer stlink_gui_erase_flash (gpointer data ) {
745+ g_return_val_if_fail (STLINK_IS_GUI (data ), NULL );
746+ STlinkGUI * gui = STLINK_GUI (data );
747+
748+ g_return_val_if_fail ((gui -> sl != NULL ), NULL );
749+
750+ if (stlink_erase_flash_mass (gui -> sl ) < 0 ) {
751+ stlink_gui_set_info_error_message (gui , "Failed to mass erase flash" );
752+ } else {
753+ stlink_gui_set_info_error_message (gui , "Mass erased flash" );
754+ }
755+
756+ g_idle_add ((GSourceFunc )stlink_gui_restore_after_background_thread , gui );
757+ return (NULL );
758+ }
759+
760+ static void erase_button_cb (GtkWidget * widget , gpointer data ) {
761+ (void )widget ;
762+ STlinkGUI * gui ;
763+ gint result ;
764+
765+ gui = STLINK_GUI (data );
766+ g_return_if_fail (gui -> sl != NULL );
767+
768+ result = gtk_dialog_run (gui -> erase_dialog );
769+
770+ if (result == GTK_RESPONSE_OK ) {
771+ stlink_gui_set_sensitivity (gui , FALSE);
772+ gtk_progress_bar_set_text (gui -> progress .bar , "Mass erasing flash" );
773+ gui -> progress .activity_mode = TRUE;
774+ gtk_widget_show (GTK_WIDGET (gui -> progress .bar ));
775+
776+ g_thread_new ("erase_flash" , (GThreadFunc )stlink_gui_erase_flash , gui );
777+ }
778+ }
779+
741780static gboolean progress_pulse_timeout (STlinkGUI * gui ) {
742781 if (gui -> progress .activity_mode ) {
743782 gtk_progress_bar_pulse (gui -> progress .bar );
@@ -872,6 +911,9 @@ static void stlink_gui_build_ui(STlinkGUI *gui) {
872911 gui -> export_button = GTK_TOOL_BUTTON (gtk_builder_get_object (builder , "export_button" ));
873912 g_signal_connect (G_OBJECT (gui -> export_button ), "clicked" , G_CALLBACK (export_button_cb ), gui );
874913
914+ gui -> erase_button = GTK_TOOL_BUTTON (gtk_builder_get_object (builder , "erase_button" ));
915+ g_signal_connect (G_OBJECT (gui -> erase_button ), "clicked" , G_CALLBACK (erase_button_cb ), gui );
916+
875917 gui -> devmem_treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder , "devmem_treeview" ));
876918 mem_view_init_headers (gui -> devmem_treeview );
877919 devmem_store = gtk_list_store_new (5 ,
@@ -932,6 +974,12 @@ static void stlink_gui_build_ui(STlinkGUI *gui) {
932974 gui -> flash_dialog_cancel = GTK_BUTTON (gtk_builder_get_object (builder , "flash_dialog_cancel_button" ));
933975 gui -> flash_dialog_entry = GTK_ENTRY (gtk_builder_get_object (builder , "flash_dialog_entry" ));
934976
977+ /* Erase dialog */
978+ gui -> erase_dialog = GTK_DIALOG (gtk_builder_get_object (builder , "erase_dialog" ));
979+ g_signal_connect_swapped (gui -> erase_dialog , "response" , G_CALLBACK (gtk_widget_hide ), gui -> erase_dialog );
980+ gui -> erase_dialog_ok = GTK_BUTTON (gtk_builder_get_object (builder , "erase_dialog_ok_button" ));
981+ gui -> erase_dialog_cancel = GTK_BUTTON (gtk_builder_get_object (builder , "erase_dialog_cancel_button" ));
982+
935983 // make it so
936984 gtk_widget_show_all (GTK_WIDGET (gui -> window ));
937985 gtk_widget_hide (GTK_WIDGET (gui -> infobar ));
@@ -964,7 +1012,7 @@ int32_t main(int32_t argc, char **argv) {
9641012 }
9651013 if (argc == 1 && g_file_test (* argv , G_FILE_TEST_IS_REGULAR )){
9661014 /* Open hex file at app startup */
967- gui -> filename = g_strdup (* argv );
1015+ gui -> filename = g_strdup (* argv );
9681016 g_idle_add ((GSourceFunc )open_file_from_args , gui );
9691017 }
9701018 argc -- ;
0 commit comments