diff options
Diffstat (limited to 'src/server/gtk.c')
-rw-r--r-- | src/server/gtk.c | 216 |
1 files changed, 196 insertions, 20 deletions
diff --git a/src/server/gtk.c b/src/server/gtk.c index 36b36bb..f48d1d9 100644 --- a/src/server/gtk.c +++ b/src/server/gtk.c @@ -20,6 +20,7 @@ #include <gtk/gtk.h> #include <time.h> +#include <stdlib.h> #include <string.h> #include "util.h" #include "gtk.h" @@ -37,20 +38,45 @@ struct gtkui { GObject *voltage; GObject *reslabel; GObject *voltlabel; - GObject *showmorebutton; - GObject *button_on; - GObject *button_off; + GObject *show_more; + GObject *show_less; GObject *ticker; GError *error; int showmore; }; +struct gtkui_flash { + GtkBuilder *builder; + GObject *window; + GObject *ssid; + GObject *password; + GObject *htemp; + GObject *mhtemp; + GObject *mltemp; + GObject *ltemp; + GObject *flashdialog; + GObject *dialog_ok; + GObject *dialog_text; + const char *confdata[6]; + int close_with_dialog; +}; + static struct settings settings; static struct gtkui gtkui; +static struct gtkui_flash gtkui_flash; static int gtkui_update(void *data); static void gtkui_die(void *data); -static void gtkui_togglemore(void); +static int strtokel(const char * const s); +void gtkui_togglemore(void); +void gtkui_flashwindow_create(void); +void gtkui_flashwindow_destroy(void); +void gtkui_flashwindow_clean(void); +void gtkui_issue_flash_request(void); +void gtkui_readhtemp(void); +void gtkui_readmhtemp(void); +void gtkui_readmltemp(void); +void gtkui_readltemp(void); int gtkui_init(int *argc, char ***argv, int nd, struct timespec period) { @@ -66,10 +92,7 @@ int gtkui_init(int *argc, char ***argv, int nd, struct timespec period) gtkui.builder = gtk_builder_new(); - if (!gtk_builder_add_from_file(gtkui.builder, DATA_DIR "/gtklayout.ui", >kui.error)) { - ret = ERROR; - goto fail; - } + gtkui.builder = gtk_builder_new_from_file(DATA_DIR "/gtklayout.ui"); gtkui.window = gtk_builder_get_object(gtkui.builder, "window"); gtkui.tempvalue = gtk_builder_get_object(gtkui.builder, "tempvalue"); @@ -77,12 +100,13 @@ int gtkui_init(int *argc, char ***argv, int nd, struct timespec period) gtkui.voltage = gtk_builder_get_object(gtkui.builder, "voltage"); gtkui.reslabel = gtk_builder_get_object(gtkui.builder, "reslabel"); gtkui.voltlabel = gtk_builder_get_object(gtkui.builder, "voltlabel"); - gtkui.showmorebutton = gtk_builder_get_object(gtkui.builder, "showmore"); - gtkui.button_on = gtk_builder_get_object(gtkui.builder, "button_on"); - gtkui.button_off = gtk_builder_get_object(gtkui.builder, "button_off"); + gtkui.show_more = gtk_builder_get_object(gtkui.builder, "show_more"); + gtkui.show_less = gtk_builder_get_object(gtkui.builder, "show_less"); gtkui.ticker = gtk_builder_get_object(gtkui.builder, "ticker"); - g_signal_connect(gtkui.window, "destroy", G_CALLBACK(gtk_main_quit), NULL); - g_signal_connect(gtkui.showmorebutton, "toggled", G_CALLBACK(gtkui_togglemore), NULL); + gtk_builder_connect_signals(gtkui.builder, NULL); + g_object_unref(G_OBJECT(gtkui.builder)); + gtkui.builder = NULL; + gtkui.showmore = 1; /* we are setting this so we can toggle this off on the following call */ gtkui_togglemore(); @@ -137,13 +161,165 @@ static void gtkui_die(void *data) return; } -static void gtkui_togglemore(void) +static int strtokel(const char * const s) +{ + int ret; + + ret = atoi(s); + ret += 273; + ret *= 10; + + return ret; +} + +void gtkui_togglemore(void) { gtkui.showmore = !gtkui.showmore; - gtkui.showmore ? gtk_button_set_image(GTK_BUTTON(gtkui.showmorebutton), GTK_WIDGET(gtkui.button_on)) : - gtk_button_set_image(GTK_BUTTON(gtkui.showmorebutton), GTK_WIDGET(gtkui.button_off)); - gtk_widget_set_visible (GTK_WIDGET(gtkui.resistance), gtkui.showmore); - gtk_widget_set_visible (GTK_WIDGET(gtkui.voltage), gtkui.showmore); - gtk_widget_set_visible (GTK_WIDGET(gtkui.reslabel), gtkui.showmore); - gtk_widget_set_visible (GTK_WIDGET(gtkui.voltlabel), gtkui.showmore); + + /* this actually switches them around their state */ + gtk_widget_set_visible(GTK_WIDGET(gtkui.show_more), !gtkui.showmore); + gtk_widget_set_visible(GTK_WIDGET(gtkui.show_less), gtkui.showmore); + + gtk_widget_set_visible(GTK_WIDGET(gtkui.resistance), gtkui.showmore); + gtk_widget_set_visible(GTK_WIDGET(gtkui.voltage), gtkui.showmore); + gtk_widget_set_visible(GTK_WIDGET(gtkui.reslabel), gtkui.showmore); + gtk_widget_set_visible(GTK_WIDGET(gtkui.voltlabel), gtkui.showmore); +} + +void gtkui_flashwindow_create(void) +{ + if (gtkui_flash.window) { + goto fail; + } + + gtkui_flash.builder = gtk_builder_new_from_file(DATA_DIR "/gtklayout_flash.ui"); + gtkui_flash.window = gtk_builder_get_object(gtkui_flash.builder, "flashwindow"); + gtkui_flash.ssid = gtk_builder_get_object(gtkui_flash.builder, "ssid_entry"); + gtkui_flash.password = gtk_builder_get_object(gtkui_flash.builder, "pass_entry"); + gtkui_flash.htemp = gtk_builder_get_object(gtkui_flash.builder, "htemp_entry"); + gtkui_flash.mhtemp = gtk_builder_get_object(gtkui_flash.builder, "mhtemp_entry"); + gtkui_flash.mltemp = gtk_builder_get_object(gtkui_flash.builder, "mltemp_entry"); + gtkui_flash.ltemp = gtk_builder_get_object(gtkui_flash.builder, "ltemp_entry"); + gtkui_flash.flashdialog = gtk_builder_get_object(gtkui_flash.builder, "flashdialog"); + gtkui_flash.dialog_ok = gtk_builder_get_object(gtkui_flash.builder, "dialog_ok"); + gtkui_flash.dialog_text = gtk_builder_get_object(gtkui_flash.builder, "dialog_text"); + gtk_builder_connect_signals(gtkui_flash.builder, NULL); + g_object_unref(G_OBJECT(gtkui_flash.builder)); + gtkui_flash.builder = NULL; + +fail: + return; +} + +void gtkui_window_destroy(void *window) +{ + gtk_window_close(GTK_WINDOW(window)); +} + +void gtkui_flashwindow_clean(void) +{ + gtkui_flash.window = NULL; +} + +void gtkui_issue_flash_request(void) +{ + static const struct configuration def = {{{ + PADDING_START, + "ssid", /* ssid */ + "password", /* password */ + {3330, 3230, 3130, 3030}, /* calibration */ + PADDING_END + }}}; + + struct configuration conf; + size_t i; + size_t len; + const char *tmp; + + gtk_widget_set_visible(GTK_WIDGET(gtkui_flash.flashdialog), 1); + + for (i = 0; i < sizeof (gtkui_flash.confdata); ++i) { + switch (i) { + case 0: + tmp = gtkui_flash.confdata[i] ? gtkui_flash.confdata[i] : def.ssid; + len = strlen(tmp) > (sizeof(conf.ssid) - 1) ? sizeof(conf.ssid) - 1 : strlen(tmp); + memcpy(conf.ssid, tmp, len); + conf.ssid[len] = '\0'; + break; + case 1: + tmp = gtkui_flash.confdata[i] ? gtkui_flash.confdata[i] : def.password; + len = strlen(tmp) > (sizeof(conf.password) - 1) ? sizeof(conf.password) - 1 : strlen(tmp); + memcpy(conf.password, tmp, len); + conf.password[len] = '\0'; + break; + case 2: + case 3: + case 4: + case 5: + tmp = gtkui_flash.confdata[i] ? (char *) strlen(gtkui_flash.confdata[i]) : NULL; + conf.calibration[i - 2] = tmp ? strtokel(gtkui_flash.confdata[i]) : def.calibration[i -2]; + break; + default: + break; + } + + } + + write_settings(DATA_DIR "/fw.bin", &conf); +} + +void gtkui_readssid(void) +{ + gtkui_flash.confdata[0] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.ssid)); +} + +void gtkui_readpass(void) +{ + gtkui_flash.confdata[1] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.password)); +} + +void gtkui_readhtemp(void) +{ + gtkui_flash.confdata[2] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.htemp)); +} + +void gtkui_readmhtemp(void) +{ + gtkui_flash.confdata[3] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.mhtemp)); +} + +void gtkui_readmltemp(void) +{ + gtkui_flash.confdata[4] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.mltemp)); +} + +void gtkui_readltemp(void) +{ + gtkui_flash.confdata[5] = gtk_entry_get_text(GTK_ENTRY(gtkui_flash.ltemp)); +} + +void gtkui_manhandle_flashdialog(void *dialog) +{ + gtk_label_set_markup(GTK_LABEL(gtkui_flash.dialog_text), "Writing to flash... "); + if (gtkui_flash.close_with_dialog) { + gtk_widget_destroy(GTK_WIDGET(dialog)); + /* we also want to close tha parent */ + gtk_window_close(GTK_WINDOW(gtkui_flash.window)); + } else { + gtk_widget_set_visible(GTK_WIDGET(dialog), 0); + } +} + +void gtkui_dialog_done(int status) +{ + static const char * const text[2] = {"done", "FAIL"}; + static const char * const color[2] = {"#4E9A06", "#EF2929"}; + char msg[128]; + + status = status ? 1 : status; + gtkui_flash.close_with_dialog = !status; + sprintf(msg, "Writing to flash... <span foreground=\"%s\" font_weight=\"bold\">%s!</span>", color[status], text[status]); + + gtk_widget_set_sensitive(GTK_WIDGET(gtkui_flash.dialog_ok), 1); + gtk_label_set_markup(GTK_LABEL(gtkui_flash.dialog_text), msg); } |