/* * Description: STM32 Microcontroller flashing utility * Author: Mario Hüttel * * Version: 0.1 * License: -- * * */ #include #include #include #include #include #define ISOPT(var) (!strcmp(argv[i], var)) #define GETOPT(var) if (++i < argc) strcpy(var, argv[i]) #define MAXPARAMLENGTH 100 enum ValueAvail {hasNoVal, hasVal}; typedef struct _parameter { char *name; enum ValueAvail hasValue; void *value; } parameter; typedef struct _builderWidget { char *widgetId; GtkWidget **widget; }builderWidget; typedef struct _flasher { GtkWidget **progressBar; GtkWidget **fileEntry; GtkWidget **portEntry; }flasher; static gboolean main_window_close(GtkWidget *widget, gpointer foo) { gtk_widget_destroy(widget); gtk_main_quit(); return TRUE; } void parseParams(parameter *progParams, int argc, char **argv); void parseBuilder(GtkBuilder *builder, builderWidget *builderWidgets); void startFlash(); int main(int argc, char *argv[]) { static int gui = 0; static char port[MAXPARAMLENGTH] = {0}; static char fileName[MAXPARAMLENGTH] = {0}; static GtkWidget *startButton; static GtkWidget *fileDialogButton; static GtkWidget *main_window; static GtkWidget *fileEntry; static GtkWidget *portEntry; static GtkWidget *progressBar; static GtkWidget *fileDialog; static flasher stmFlasher; static parameter progParams[] = { { .name = "--gui", .hasValue = hasNoVal, .value = (void*)&gui }, {.name = "--port",.hasValue = hasVal,.value = (void*)port},{.name = "--file",.hasValue = hasVal,.value = (void*)fileName},{.name = NULL}}; static builderWidget builderWidgets[] = { { .widgetId = "startButton", .widget = &startButton }, { .widgetId = "fileDialogButton", .widget = &fileDialogButton }, { .widgetId = "fileEntry", .widget = &fileEntry }, { .widgetId = "portEntry", .widget = &portEntry }, { .widgetId = "progressBar", .widget = &progressBar }, { .widgetId = "Dialog", .widget = &fileDialog }, { .widgetId = "mainWindow", .widget = &main_window }, { .widgetId = NULL, .widget = NULL } }; GtkBuilder *builder; parseParams(progParams, argc, argv); // Create flasher and fill elements stmFlasher.fileEntry = &fileEntry; stmFlasher.portEntry = &portEntry; // TODO: above gui = 1; if (gui) { gtk_init(&argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "window.glade", NULL); //Get Widgets from Builder parseBuilder(builder, builderWidgets); g_signal_connect(startButton, "clicked", G_CALLBACK(startFlash), &stmFlasher); g_signal_connect(main_window, "delete-event", G_CALLBACK(main_window_close), NULL); gtk_main(); } else { startFlash(&stmFlasher); } return 0; } void startFlash(flasher *flashObj) { printf("Flasher started\n"); return; } void parseParams(parameter* progParams, int argc, char **argv) { int i = 0; parameter* paramptr = NULL; for (i = 0; i < argc; i++) { for (paramptr = progParams; paramptr->name; paramptr++) { if (paramptr->hasValue == hasNoVal) *(int*)paramptr->value = 0; if (ISOPT(paramptr->name)) { if (paramptr->hasValue == hasNoVal) { *(int*)paramptr->value = 1; } else { printf("setting\n"); GETOPT((char*)paramptr->value); } } } } } void parseBuilder(GtkBuilder *builder, builderWidget *builderWidgets) { builderWidget *ptr = NULL; for (ptr = builderWidgets; ptr->widgetId;ptr++) { *(ptr->widget) = GTK_WIDGET(gtk_builder_get_object(builder, (gchar*)ptr->widgetId)); } }