diff --git a/Changelog b/Changelog index 03b7cf7..cdf9d0c 100644 --- a/Changelog +++ b/Changelog @@ -1,9 +1,10 @@ Version 1.0.5 -2025-11-28: +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 diff --git a/README.md b/README.md index b68369a..2395e2d 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ 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 functions - bulk load -- Bulk load of csv files works. +# some usefull functions +Bulk load of csv files works. NAME,TYPE,FC,REGISTER,VALUE =================================================== @@ -45,3 +45,5 @@ For precompiled windows binarys look at this [link](https://steffen.gulpe.de/mod TEST_FC4_4,FLOAT,4,4,2.6 TEST_FC4_6,FLOAT,4,6,15.6 + + diff --git a/gui.cc b/gui.cc index 95472f9..2bcc9f0 100644 --- a/gui.cc +++ b/gui.cc @@ -431,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); @@ -459,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"; @@ -558,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); @@ -568,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); } @@ -608,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) { @@ -669,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; @@ -826,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); @@ -867,14 +855,21 @@ 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, ®stowrite, regvals)) { + modbussrv.SetRegValue(g.fc, g.reg, regstowrite, (uint16_t*)regvals); + } } }; @@ -884,9 +879,7 @@ void load_bulkfile(std::string fn) { FILE *f; char buffer[FILEBUFFER]; - char field[LEN_FIELD]; char *pos, *next; - int i; JSONParse json; JSONParse value; std::string temp; @@ -941,7 +934,7 @@ void load_bulkfile(std::string fn) { 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); + else printf ("%s add %s without value\n", __FUNCTION__, g.name.c_str()); } fclose (f); } diff --git a/guimodbusdata.cc b/guimodbusdata.cc index b1019b1..4def1ff 100644 --- a/guimodbusdata.cc +++ b/guimodbusdata.cc @@ -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)); diff --git a/guivalues.cc b/guivalues.cc index f78e3f3..9c059ee 100644 --- a/guivalues.cc +++ b/guivalues.cc @@ -397,7 +397,6 @@ std::string Value_GetValue(int fc, int reg, string type) { /// @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) @@ -426,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; diff --git a/json.cc b/json.cc index 31c6043..b930965 100644 --- a/json.cc +++ b/json.cc @@ -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); diff --git a/mbsconfig.h b/mbsconfig.h index a18886d..3913133 100644 --- a/mbsconfig.h +++ b/mbsconfig.h @@ -9,7 +9,7 @@ */ #ifndef _MBSCONFIG_H_ -#define _MBDCONFIG_H_ +#define _MBSCONFIG_H_ #include "config.h" #include "modbussrv.h" diff --git a/modbussrv.cc b/modbussrv.cc index e4237ca..ac12705 100644 --- a/modbussrv.cc +++ b/modbussrv.cc @@ -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; diff --git a/server.cc b/server.cc index 15265a7..394f948 100644 --- a/server.cc +++ b/server.cc @@ -45,7 +45,6 @@ int main (int argc, char **argv) { #if defined _WIN32 || defined _WIN64 || defined __CYGWIN__ #else GSettings *settings; - GError *error = NULL; // from the google KI :) // Das Schema (Schema) für die Mauseinstellungen erstellen