///////////////////////////////////////////////////////////////////////////////// // // client.cc is part of TestModbus-Client. // ///////////////////////////////////////////////////////////////////////////////// #include #include "config.h" #include "client.h" #include "nwthread.h" #define BUILDER_FILE "testmodbus-client.ui" /************************************************************************************ * Global Variables */ GtkBuilder *_builder_ = NULL; // work around for the thread situation gboolean mbcli_thread_cb_net(gpointer data); // callback thread network data gboolean mbcli_thread_cb_error(gpointer data); // callback thread error void mbcli_connect_btn_sensitive (bool enable); // enable/disable connect buttons NetworkThread netthread; int main (int argc, char **argv) { GtkBuilder *builder; GObject *window; #ifdef BUILD_WINDOWS char buffer[16]; setvbuf (stdout, buffer, _IONBF, 16); #endif printf ("TestModbus-Client - %s\n", VERSION); printf (" https://steffen.gulpe.de/modbus-tcpip\n"); printf (" written by Steffen Pohle \n"); gtk_init (&argc, &argv); _builder_ = builder = gtk_builder_new (); gtk_builder_add_from_file (builder, BUILDER_FILE, NULL); gtk_builder_connect_signals(builder, builder); // // #if defined _WIN32 || defined _WIN64 || defined __CYGWIN__ // #else // #endif // window = gtk_builder_get_object (builder, "testmodbus-client"); gtk_widget_show_all (GTK_WIDGET(window)); gtk_main (); return 0; } /* * display error if somethin happened within a thread */ gboolean mbcli_thread_cb_error(gpointer data) { if (data == NULL) { displayerror ("unknown error"); } else { std::string text = (char*)data; free (data); displayerror (text); } return FALSE; }; void displayerror (std::string error) { GtkWidget *dialog; GtkWidget *window = GTK_WIDGET (gtk_builder_get_object (_builder_, "testmodbus-client")); dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, error.c_str()); gtk_window_set_title(GTK_WINDOW(dialog), "Error"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } /* * network thread callback */ gboolean mbcli_thread_cb_status(gpointer data) { GtkWidget *statusbar = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_statusbar")); mbcli_connect_btn_sensitive (netthread.GetState() == NWT_nothing); if (data) { gtk_label_set_label(GTK_LABEL(statusbar), (char*)data); free (data); } return FALSE; }; void mbcli_connect_btn_sensitive (bool enable) { GtkWidget *txthost = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_host")); GtkWidget *txtport = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_port")); GtkWidget *btnconnect = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_btnConnect")); GtkWidget *btndisconnect = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_btnDisconnect")); gtk_widget_set_sensitive(txthost, enable); gtk_widget_set_sensitive(txtport, enable); gtk_widget_set_sensitive(btnconnect, enable); gtk_widget_set_sensitive(btndisconnect, !enable); }; void mbcli_cb_connect (GtkWidget *widget, gpointer data) { GtkWidget *txthost = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_host")); GtkWidget *txtport = GTK_WIDGET (gtk_builder_get_object (_builder_, "cli_port")); mbcli_connect_btn_sensitive(false); netthread.Connect(gtk_entry_get_text(GTK_ENTRY(txthost)), gtk_entry_get_text(GTK_ENTRY(txtport))); }; void mbcli_cb_disconnect (GtkWidget *widget, gpointer data) { netthread.Disconnect(); };