Compare commits

..

6 Commits

@ -1,3 +1,13 @@
Version 1.0.5
2025-11-29:
- double click on the variable list works.
- added bulk load of CSV files.
- set values within the saved file and thier content
Version 1.0.4
2024-11-08:
- fixed single coil / word write. Response was not correct.

@ -27,7 +27,7 @@ This configuration file will be needed on all meson based builds.
cpu = 'x86_64'
endian = 'little'
[properties]
[built-in options]
c_args = []
c_link_args = []
@ -39,7 +39,7 @@ This configuration file will be needed on all meson based builds.
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
windres = '/usr/bin/x86_64-w64-mingw32-windres'
ld = '/usr/bin/x86_64-w64-mingw32-ld'
exe_wrapper = 'wine64'
exe_wrapper = 'wine'
## lib-glib
@ -48,8 +48,8 @@ Compile the library using the following steps.
mkdir build
cd build
meson --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
mseon compile
meson setup --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
meson compile
if an error like `glib/glibconfig.h:65:51: error: missing binary operator before token "("` occures edit the line and delete the **G_GNUC_EXTENSION** expression.
@ -65,7 +65,7 @@ The flags -Dintrospection=false will tell meson to disable some building options
mkdir build
cd build
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson --buildtype=release -Dintrospection=false -Ddocs=false --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson setup --buildtype=release -Dintrospection=false -Ddocs=false --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
meson compile
meson install
@ -73,14 +73,22 @@ Copy manualy all compiled `*.dll` files to the destination
cp `find -name "*.dll"` /opt/W64-cross-compile/lib/
## pango
Compile the library using the following steps. This will also download and compile some more librarys like `libpng` and `cairo` librarys.
mkdir build
cd build
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
meson compile
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson setup --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
For some reason the **harfbuzz** library wants to compile with the **HAVE_FT_GET_TRANSFORM** definition set. While this function is not defined in the sources at all. The workaround is to comment out the following line in `build/subprojects/harfbuzz/config.h` file.
// #define HAVE_FT_GET_TRANSFORM 1
Add `#include <cairo-dwrite.h> in file `../pango/pangocairo-dwrite-font.cpp` and start the compilation.
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson compile
In case of an error with unresolved symbols like undefined reference to '__strcat_chk'. You need to edit the `cross-file.ini` and add the linker flags/option `-lssp` to the `c_link_args` parameters. Remove the build directory and restart configuring and compiling this libraray again.
@ -91,7 +99,7 @@ In case of an error with unresolved symbols like undefined reference to '__strca
mkdir build
cd build
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
PKG_CONFIG_PATH=/opt/W64-cross-compile/lib/pkgconfig meson setup --buildtype=release --prefix=/opt/W64-cross-compile/ --cross-file ../../cross-file.ini
meson compile
meson install
cp `find -name "*.dll"` /opt/W64-cross-compile/lib/

@ -1,5 +1,5 @@
.SILENT: help
VERSION = 1.0.4
VERSION = 1.0.5
-include Makefile.rules

@ -9,7 +9,6 @@ newer version of this software at https://steffen.gulpe.de/modbus-tcpip/
![Image_01](https://steffen.gulpe.de/modbus-tcpip/screenshot-winver1-0-0-regs.PNG)
![Image_02](https://steffen.gulpe.de/modbus-tcpip/screenshot-winver1-0-0-values.PNG)
# Compilation on Linux
As requirement to compile this application you need to install the gnome3-devel packages. If this is done you can compile and run the application with the following commands:
@ -35,3 +34,16 @@ needed librarys (needs to prepared, see Makefile for some hints).
For precompiled windows binarys look at this [link](https://steffen.gulpe.de/modbus-tcpip/).
# some usefull functions
Bulk load of csv files works.
NAME,TYPE,FC,REGISTER,VALUE
TEST_FC3_0,FLOAT,3,0,1.5
TEST_FC3_2,FLOAT,3,2,1.6
TEST_FC4_4,FLOAT,4,4,2.6
TEST_FC4_6,FLOAT,4,6,15.6

214
gui.cc

@ -10,6 +10,7 @@
#endif
#include <stdio.h>
#include <list>
#include <sys/time.h>
#include "gui.h"
#include "modbussrv.h"
#include "guivalues.h"
@ -19,9 +20,18 @@
extern GtkBuilder *_builder_; // work around for threads
extern void addvar_displaywithvalues (gpointer data, GuiValue *v);
extern int gnome_dblclick_timeout;
int gui_double_click = 0;
struct timeval doubleclick_time;
/// @brief function is too slow i need <400ms .... :( but we will resit the value jzst in case...
/// @param data
/// @return
gboolean cb_timeout_doubleclick(gpointer data) {
gui_double_click = 0;
return FALSE;
};
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -29,11 +39,9 @@ extern void addvar_displaywithvalues (gpointer data, GuiValue *v);
// call back functions
//
gboolean cb_window_delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) {
// GtkBuilder *builder = (GtkBuilder *) data;
gboolean cb_window_delete_event (GtkWidget *widget, gpointer data) {
cb_menu_save(widget, data);
return FALSE;
}
@ -96,6 +104,91 @@ void cb_menu_open (GtkWidget *widget, gpointer data) {
};
void cb_menu_openbulk (GtkWidget *widget, gpointer data) {
GtkBuilder *builder = (GtkBuilder *) data;
GtkWindow *window = GTK_WINDOW (gtk_builder_get_object (builder, "testmodbus-server"));
GtkWidget *dialog;
GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
GtkFileFilter *filter;
gint res;
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
dialog = gtk_file_chooser_dialog_new ("Open Bulk File",
window,
action,
"_Cancel",
GTK_RESPONSE_CANCEL,
"_Open",
GTK_RESPONSE_ACCEPT,
NULL);
filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter, "*.csv");
gtk_file_filter_set_name(filter, "CSV File");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter, "*.*");
gtk_file_filter_set_name(filter, "All Files");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
res = gtk_dialog_run (GTK_DIALOG (dialog));
if (res == GTK_RESPONSE_ACCEPT) {
char *filename;
GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
filename = gtk_file_chooser_get_filename (chooser);
load_bulkfile(filename);
g_free(filename);
}
gtk_widget_destroy (dialog);
};
gboolean cb_vars_btnrelease (GtkWidget *widget, gpointer user_data) {
//
// selfhandling double click :) seem to work
if (gui_double_click == 1 && get_cycletime(&doubleclick_time) < gnome_dblclick_timeout) {
GuiValue v;
GtkTreeIter iter;
GtkTreeModel *model;
GtkWidget *vars = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vars_tv"));
gchar *v_name;
gchar *v_fc;
gchar *v_reg;
gchar *v_type;
gchar *v_sim;
gchar *v_value;
GtkTreeSelection *sel;
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(vars));
if (sel && gtk_tree_selection_get_selected(GTK_TREE_SELECTION(sel), &model, &iter)) {
gtk_tree_model_get (model, &iter,
VALDATA_COL_NAME, &v_name,
VALDATA_COL_FC, &v_fc,
VALDATA_COL_REGSTART, &v_reg,
VALDATA_COL_TYPE, &v_type,
VALDATA_COL_SIM, &v_sim,
VALDATA_COL_VALUE, &v_value,
-1);
v.name = v_name;
v.reg = atoi (v_reg);
v.fc = atoi (v_fc);
v.type = v_type;
v.sim = v_sim;
v.value = v_value;
addvar_displaywithvalues(_builder_, &v);
}
}
else {
gui_double_click = 1;
gettimeofday(&doubleclick_time, NULL);
g_timeout_add(gnome_dblclick_timeout, cb_timeout_doubleclick, _builder_);
}
return FALSE;
};
void cb_menu_save (GtkWidget *widget, gpointer data) {
// GtkBuilder *builder = (GtkBuilder *) data;
@ -262,7 +355,6 @@ void addvar_displaywithvalues (gpointer data, GuiValue *v) {
if (Value_SetValue(vn.value, vn.type, vn.fc, &regstowrite, regvals)) {
modbussrv.SetRegValue(vn.fc, vn.reg, regstowrite, (uint16_t*)regvals);
}
}
}
gtk_widget_hide(GTK_WIDGET(dlg));
@ -339,26 +431,21 @@ gboolean cb_thread_network_data_add (gpointer data) {
struct modbus_data *mbdata = (struct modbus_data *)data;
std::string text;
char timetext[255];
GtkTextTag *tag_datetime;
GtkTextTag *tag_data;
GtkTextTag *tag_info;
GtkTextTag *tag_modbus;
GtkTextTag *tag_error;
time_t _tm =time(NULL);
struct tm * curtime = localtime (&_tm);
static int _once = 0;
if (_once == 0) {
_once = 1;
tag_datetime = gtk_text_buffer_create_tag (textbuffer, "Date_Time",
gtk_text_buffer_create_tag (textbuffer, "Date_Time",
"foreground", "blue", "style", PANGO_WEIGHT_BOLD, "family", "Monospace", NULL);
tag_data = gtk_text_buffer_create_tag (textbuffer, "Data",
gtk_text_buffer_create_tag (textbuffer, "Data",
"foreground", "black", "style", PANGO_WEIGHT_NORMAL, "family", "Monospace", NULL);
tag_info = gtk_text_buffer_create_tag (textbuffer, "Info",
gtk_text_buffer_create_tag (textbuffer, "Info",
"foreground", "green", "style", PANGO_WEIGHT_THIN, "family", "Sans", NULL);
tag_error = gtk_text_buffer_create_tag (textbuffer, "Error",
gtk_text_buffer_create_tag (textbuffer, "Error",
"foreground", "red", "style", PANGO_WEIGHT_BOLD, "family", "Sans", NULL);
tag_modbus = gtk_text_buffer_create_tag (textbuffer, "Modbus",
gtk_text_buffer_create_tag (textbuffer, "Modbus",
"foreground", "black", "style", PANGO_WEIGHT_NORMAL, "family", "Sans", NULL);
}
strftime (timetext, 255, "%H:%M:%S", curtime);
@ -367,7 +454,7 @@ gboolean cb_thread_network_data_add (gpointer data) {
// build hex dump
//
text = "";
for (int i = 0; i < mbdata->bufferlen; i++) {
for (size_t i = 0; i < mbdata->bufferlen; i++) {
unsigned char c = mbdata->buffer[i];
char hexnum[] = "0123456789ABCDEF";
@ -466,9 +553,7 @@ gboolean cb_thread_network_text_add (gpointer data) {
char timetext[255];
GtkWidget *textview = GTK_WIDGET(gtk_builder_get_object (_builder_, "network_text"));
GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
GtkTextIter start, end;
GtkTextTag *tag_datetime;
GtkTextTag *tag_info;
GtkTextIter start;
char *textprm = (char*) data;
time_t _tm =time(NULL);
struct tm * curtime = localtime (&_tm);
@ -476,9 +561,9 @@ gboolean cb_thread_network_text_add (gpointer data) {
if (_once == 0) {
_once = 1;
tag_datetime = gtk_text_buffer_create_tag (textbuffer, "Date_Time",
gtk_text_buffer_create_tag (textbuffer, "Date_Time",
"foreground", "blue", "style", PANGO_WEIGHT_BOLD, "family", "Monospace", NULL);
tag_info = gtk_text_buffer_create_tag (textbuffer, "Connection",
gtk_text_buffer_create_tag (textbuffer, "Connection",
"foreground", "red", "style", PANGO_WEIGHT_BOLD, "family", "Sans", NULL);
}
@ -516,10 +601,7 @@ gboolean cb_thread_status (gpointer data) {
void cb_networkdata_show (GtkWidget *widget, gpointer data) {
GtkWidget *textview = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(data), "network_text"));
GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
printf ("*************************** \n");
gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
};
void cb_addvar_close (GtkWidget *widget, gpointer data) {
@ -544,6 +626,7 @@ void displayerror (string error) {
gtk_widget_destroy(dialog);
}
void cb_addvar_addedit (GtkWidget *widget, gpointer data) {
GtkBuilder *builder = (GtkBuilder *) data;
GtkWidget *dlg = GTK_WIDGET (gtk_builder_get_object (builder, "addvar"));
@ -576,7 +659,7 @@ void cb_menu_about(GtkWidget *widget, gpointer data) {
GtkWidget *dlg = GTK_WIDGET (gtk_builder_get_object (builder, "dlgabout"));
GtkWidget *label = GTK_WIDGET (gtk_builder_get_object (builder, "dlgabout_version"));
gtk_label_set_text(GTK_LABEL(label), VERSION);
gint result = gtk_dialog_run(GTK_DIALOG(dlg));
gtk_dialog_run(GTK_DIALOG(dlg));
gtk_widget_hide(GTK_WIDGET(dlg));
return;
@ -733,8 +816,6 @@ void load_file(std::string fn) {
GtkWidget *guiautovalue = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "conf_autoaddvalues"));
GtkWidget *guiport = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "port_entry"));
GuiValue g;
int autoadd = 0;
modbussrv.EnableAll(0);
MBData_EnableAll(0);
@ -774,15 +855,88 @@ void load_file(std::string fn) {
for (i = 0; json.GetObjectIdx("values", i, &value); i++) {
uint16_t regvals[4];
int regstowrite = 1;
value.GetValue("name", &g.name);
value.GetValue("type", &g.type);
value.GetValue("sim", &g.sim);
value.GetValue("value", &g.value);
value.GetValue("fc", &temp); g.fc = atoi(temp.c_str());
value.GetValue("reg", &temp); g.reg = atoi(temp.c_str());
value.GetValueInt("fc", &g.fc);
value.GetValueInt("reg", &g.reg);
Value_Add(&g);
if (Value_SetValue(g.value, g.type, g.fc, &regstowrite, regvals)) {
modbussrv.SetRegValue(g.fc, g.reg, regstowrite, (uint16_t*)regvals);
}
}
};
void load_bulkfile(std::string fn) {
GuiValue g;
FILE *f;
char buffer[FILEBUFFER];
char *pos, *next;
JSONParse json;
JSONParse value;
std::string temp;
uint16_t regvals[4];
int regstowrite = 1;
printf ("%s\n", __FUNCTION__);
f = fopen(fn.c_str(),"r");
if (f != NULL) {
while (!feof(f)) {
// NAME,TYPE,FC,REG,VALUE
fgets (buffer, FILEBUFFER, f);
// name
pos = buffer;
if ((next = strchr(pos, ',')) == NULL) {
printf ("load bulk: could not find ','\n");
continue;
}
*next = 0;
g.name = pos;
// type
pos = next+1;
if ((next = strchr(pos, ',')) == NULL) continue;
*next = 0;
g.type = pos;
// fc
pos = next+1;
if ((next = strchr(pos, ',')) == NULL) continue;
*next = 0;
g.fc = atoi(pos);
// reg
pos = next+1;
if ((next = strchr(pos, ',')) == NULL) continue;
*next = 0;
g.reg = atoi(pos);
// value
pos = next+1;
g.value = pos;
printf ("%s -> %s\n", pos, g.value.c_str());
g.sim = "NONE";
Value_Add(&g);
printf ("%s -> %s\n", pos, g.value.c_str());
regstowrite = 1;
if (Value_SetValue(g.value, g.type, g.fc, &regstowrite, regvals)) {
modbussrv.SetRegValue(g.fc, g.reg, regstowrite, (uint16_t*)regvals);
printf ("%s add %s type:%s with value %s\n", __FUNCTION__, g.name.c_str(), g.type.c_str(), g.value.c_str());
}
else printf ("%s add %s without value\n", __FUNCTION__, g.name.c_str());
}
fclose (f);
}
else printf ("error on open bulk: %s\n", strerror(errno));
};

@ -17,10 +17,14 @@
#include "guivalues.h"
#include "guimodbusdata.h"
#define LEN_FIELD 128
std::string to_hex16 (int v);
extern uint16_t modbusdata[4][0x10000];
void load_file(std::string fn);
void load_bulkfile(std::string fn);
void save_file(std::string fn);
void displayerror (string error);
@ -34,10 +38,10 @@ extern "C" {
// main windows call backs
//
G_MODULE_EXPORT void cb_window_show (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT gboolean cb_window_delete_event (GtkWidget *widget,
GdkEvent *event, gpointer data);
G_MODULE_EXPORT gboolean cb_window_delete_event (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_new (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_open (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_openbulk (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_save (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_saveas (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_menu_quit (GtkWidget *widget, gpointer data);
@ -57,6 +61,7 @@ G_MODULE_EXPORT void cb_btn_delvar (GtkWidget *widget, gpointer data);
// Add Variable Dialog
G_MODULE_EXPORT void cb_addvar_close (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT void cb_addvar_addedit (GtkWidget *widget, gpointer data);
G_MODULE_EXPORT gboolean cb_vars_btnrelease (GtkWidget *widget, gpointer user_data);
//
// Register Buttons

@ -166,11 +166,10 @@ void MBData_ChangeRegs (int fc, int regstart, int count, ModbusRegister *r) {
GtkWidget *mbdata = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "regs_tv"));
GtkTreeIter iter;
GtkTreeModel *model;
int i,j;
int i;
gchar *v_fcreg = NULL;
string path;
char value[16] = "0000";
char hex[] = "0123456789ABCDEF";
model = gtk_tree_view_get_model(GTK_TREE_VIEW(mbdata));

@ -310,7 +310,6 @@ void Value_Add(GuiValue *g) {
void Value_ModStore(GtkTreeModel *model, GtkTreeIter *iter, GuiValue *g) {
g->value = Value_GetValue(g->fc, g->reg, g->type);
gtk_list_store_set(GTK_LIST_STORE(model), iter,
VALDATA_COL_NAME, g->name.c_str(),
VALDATA_COL_FC, std::to_string(g->fc).c_str(),
@ -323,7 +322,7 @@ void Value_ModStore(GtkTreeModel *model, GtkTreeIter *iter, GuiValue *g) {
///////////////////////////////////////////////////
// return valuze as string
// return value as string
std::string Value_GetValue(int fc, int reg, string type) {
std::string result = "";
@ -373,6 +372,9 @@ std::string Value_GetValue(int fc, int reg, string type) {
int c;
for (result = "", c = 0; c < 16; c++) {
if (c % 8 == 0 && c != 0) result = ":" + result;
else if (c % 4 == 0 && c != 0) result = "." + result;
if (modbusdata[fc-1][reg] & (1<<c)) result = "1" + result;
else result = "0" + result;
}
@ -386,9 +388,15 @@ std::string Value_GetValue(int fc, int reg, string type) {
}
/// @brief convert the value to the memory representation of the register
/// @param value value to convert
/// @param type type
/// @param fc function code
/// @param regcnt return: contains number of changed registers
/// @param regvalues return: contains registers to change (must be at last 4 bytes wide)
/// @return
int Value_SetValue(string value, string type, int fc, int *regcnt, uint16_t *regvalues) {
uint8_t data[4];
if (fc == 1 || fc == 2) {
*regcnt = 1;
if (value.compare("false") == 0 || value.compare("0") == 0)
@ -417,6 +425,19 @@ int Value_SetValue(string value, string type, int fc, int *regcnt, uint16_t *reg
memcpy (regvalues, &i16, 2);
*regcnt = 1;
}
else if (type.compare("BOOL") == 0) {
uint16_t i16;
int ival;
std::size_t c;
for (ival = 0, c = 0; c < value.length(); c++) {
if (value[c] == '0') ival = ival << 1;
else if (value[c] == '1') ival = (ival << 1) + 1;
}
i16 = (uint16_t) ival;
memcpy (regvalues, &i16, 2);
*regcnt = 1;
}
}
return 1;

@ -43,7 +43,7 @@ void JSONParse::Clear() {
// read every element and keep only this in memory.
//
int JSONParse::Set(string json) {
int i;
std::size_t i;
int step;
int level;
bool ignorenext;
@ -205,23 +205,21 @@ int JSONParse::GetValue(string varname, string *dest) {
int JSONParse::GetValueInt(string varname, int *dest) {
string s;
int res = GetValue(varname, &s);
if (res) {
*dest = atoi (s.c_str());
return 1;
}
return 0;
if (res) *dest = atoi (s.c_str());
return res;
};
int JSONParse::GetValueInt64(string varname, int64_t *dest) {
string s;
int res = GetValue(varname, &s);
if (res) {
*dest = atol (s.c_str());
return 1;
}
return 0;
if (res) *dest = atol (s.c_str());
return res;
};
@ -244,7 +242,8 @@ int JSONParse::GetObject(string varname, JSONParse *dest) {
#define MAXRECURSIVE 255
int JSONParse::GetIdx(string src, int idx, string *dest) {
char recursive[MAXRECURSIVE];
int i = 0, rcnt = 0, cnt = 0;
int rcnt = 0, cnt = 0;
std::size_t i;
(*dest) = "";
// printf("\n***************************************idx:%d\n", idx);

@ -9,7 +9,7 @@
*/
#ifndef _MBSCONFIG_H_
#define _MBDCONFIG_H_
#define _MBSCONFIG_H_
#include "config.h"
#include "modbussrv.h"

@ -448,8 +448,6 @@ int ModbusSrv::WorkerAndEncodeRead(struct modbus_data *mbin, struct modbus_data
int ModbusSrv::WorkerAndEncodeWriteSingle(struct modbus_data *mbin, struct modbus_data *mbout) {
uint16_t i16;
int pos = 0;
int error = 0;
// transaction
@ -814,8 +812,6 @@ void ModbusSrv::EnableAll(int onoff) {
void ModbusSrv::SetRegValue(int fc, int regstart, int count, uint16_t *values) {
int reg;
if (fc <= 0 || fc > 4) {
printf ("%s:%d fc(%d) is set out of range\n", __FILE__, __LINE__, fc);
return;

@ -4,6 +4,10 @@
//
/////////////////////////////////////////////////////////////////////////////////
#include <gio/gio.h>
#include <stdio.h>
#include <glib.h>
#include "config.h"
#include "mbsconfig.h"
#include "gui.h"
@ -20,7 +24,7 @@ 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
int gnome_dblclick_timeout = 500;
gboolean modbus_callback(gpointer data);
int main (int argc, char **argv) {
@ -36,6 +40,26 @@ int main (int argc, char **argv) {
printf (" https://steffen.gulpe.de/modbus-tcpip\n");
printf (" written by Steffen Pohle <steffen@gulpe.de>\n");
//
// read out some gnome defined values
#if defined _WIN32 || defined _WIN64 || defined __CYGWIN__
#else
GSettings *settings;
// from the google KI :)
// Das Schema (Schema) für die Mauseinstellungen erstellen
// In neueren GNOME-Versionen ist das Schema: 'org.gnome.desktop.peripherals.mouse'
// In älteren Versionen könnte es 'org.gnome.settings-daemon.peripherals.mouse' sein
settings = g_settings_new("org.gnome.desktop.peripherals.mouse");
if (settings == NULL) {
fprintf(stderr, "Fehler beim Laden des GSettings-Schemas.\n");
return 1;
}
gnome_dblclick_timeout = g_settings_get_int(settings, "double-click");
printf("Die aktuelle Doppelklickzeit beträgt: %d ms\n", gnome_dblclick_timeout);
g_object_unref(settings);
#endif
gtk_init (&argc, &argv);
_builder_ = builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, BUILDER_FILE, NULL);

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save