summaryrefslogtreecommitdiffstats
path: root/src/server/gtk.c
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2018-05-19 12:02:08 +0300
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2018-05-19 12:02:08 +0300
commit03b7473d4faddcb87a5e82205a42028768e7c177 (patch)
tree8c21b9d4ef03a82740fc63f7b0512200dbdd4a0d /src/server/gtk.c
parent224585cfb9502534032078f4f059588185490c09 (diff)
downloadcoffeetemp-03b7473d4faddcb87a5e82205a42028768e7c177.tar.gz
coffeetemp-03b7473d4faddcb87a5e82205a42028768e7c177.tar.bz2
coffeetemp-03b7473d4faddcb87a5e82205a42028768e7c177.zip
add support for "live"-flashing new settings.
Diffstat (limited to 'src/server/gtk.c')
-rw-r--r--src/server/gtk.c216
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", &gtkui.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);
}