diff --git a/server.cc b/server.cc new file mode 100644 index 0000000..8e08332 --- /dev/null +++ b/server.cc @@ -0,0 +1,107 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// main.cc is part of TestModbus-Server. +// +///////////////////////////////////////////////////////////////////////////////// + +#include + +#include "config.h" +#include "mbsconfig.h" +#include "gui.h" +#include "modbus.h" + +////////////////////////////////////////////////////////////////////////////////////////////////// +// +// global variables +// + +Config config; +ModbusSrv modbussrv; +GtkBuilder *_builder_ = NULL; // work around for the thread situation +uint16_t modbusdata[4][0x10000]; // needed for work with the gui will by synced by the modbus call back functions + +gboolean modbus_callback(gpointer data); + +int main (int argc, char **argv) { + GtkBuilder *builder; + GObject *window; + +#ifdef BUILD_WINDOWS + char buffer[16]; + setvbuf (stdout, buffer, _IONBF, 16); +#endif + + printf ("TestModbus-Server - %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 + // + + modbussrv.SetCallback(&modbus_callback); + window = gtk_builder_get_object (builder, "testmodbus-server"); + gtk_widget_show_all (GTK_WIDGET(window)); + + if (argc == 2) { + printf ("Load File:%s\n", argv[1]); + config.SetFilename(argv[1]); + load_file(config.GetFilename()); + } + else { + printf ("Load File:default.modbus\n"); + config.SetFilename("default.modbus"); + load_file(config.GetFilename()); + } + + gtk_main (); + + return 0; +} + +string to_hex16 (int v) { + char HEX[] = "0123456789ABCDEF"; + int i = v; + int n; + string txt = ""; + + for (n = 0; n < 4; n++) { + txt = HEX[i%16]+ txt; + i = i / 16; + } + + return txt; +} + + +gboolean modbus_callback(gpointer data) { + struct modbus_callback_data *mdata = (struct modbus_callback_data *) data; + + MBData_ChangeRegs(mdata->fc, mdata->regstart, mdata->count, mdata->r); + Values_ChangeRegs(mdata->fc, mdata->regstart, mdata->count, mdata->r); + + if (mdata->r) free (mdata->r); + free (mdata); + + return FALSE; +}; + + +float get_cycletime(struct timeval *t) { + struct timeval t1; + float f = 0.0; + + t1 = *t; + gettimeofday(t, NULL); + f = (float)(t->tv_sec - t1.tv_sec) + ((t->tv_usec - t1.tv_usec) / 1000000.0); + + return f; +}