You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.5 KiB

/////////////////////////////////////////////////////////////////////////////////
//
// client.cc is part of TestModbus-Client.
//
/////////////////////////////////////////////////////////////////////////////////
#include <sys/time.h>
#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 <steffen@gulpe.de>\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();
};