@ -10,7 +10,6 @@
# endif
# include <stdio.h>
# include <list>
# include <sys/time.h>
# include "gui.h"
# include "modbussrv.h"
# include "guivalues.h"
@ -20,18 +19,9 @@
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 ;
} ;
//////////////////////////////////////////////////////////////////////////////////////////////////
@ -39,9 +29,11 @@ gboolean cb_timeout_doubleclick(gpointer data) {
// 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 ;
}
@ -104,91 +96,6 @@ 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;
@ -355,6 +262,7 @@ 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 ) ) ;
@ -431,21 +339,26 @@ 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 ;
gtk_text_buffer_create_tag ( textbuffer , " Date_Time " ,
tag_datetime = gtk_text_buffer_create_tag ( textbuffer , " Date_Time " ,
" foreground " , " blue " , " style " , PANGO_WEIGHT_BOLD , " family " , " Monospace " , NULL ) ;
gtk_text_buffer_create_tag ( textbuffer , " Data " ,
tag_data = gtk_text_buffer_create_tag ( textbuffer , " Data " ,
" foreground " , " black " , " style " , PANGO_WEIGHT_NORMAL , " family " , " Monospace " , NULL ) ;
gtk_text_buffer_create_tag ( textbuffer , " Info " ,
tag_info = gtk_text_buffer_create_tag ( textbuffer , " Info " ,
" foreground " , " green " , " style " , PANGO_WEIGHT_THIN , " family " , " Sans " , NULL ) ;
gtk_text_buffer_create_tag ( textbuffer , " Error " ,
tag_error = gtk_text_buffer_create_tag ( textbuffer , " Error " ,
" foreground " , " red " , " style " , PANGO_WEIGHT_BOLD , " family " , " Sans " , NULL ) ;
gtk_text_buffer_create_tag ( textbuffer , " Modbus " ,
tag_modbus = gtk_text_buffer_create_tag ( textbuffer , " Modbus " ,
" foreground " , " black " , " style " , PANGO_WEIGHT_NORMAL , " family " , " Sans " , NULL ) ;
}
strftime ( timetext , 255 , " %H:%M:%S " , curtime ) ;
@ -454,7 +367,7 @@ gboolean cb_thread_network_data_add (gpointer data) {
// build hex dump
//
text = " " ;
for ( size_ t i = 0 ; i < mbdata - > bufferlen ; i + + ) {
for ( in t i = 0 ; i < mbdata - > bufferlen ; i + + ) {
unsigned char c = mbdata - > buffer [ i ] ;
char hexnum [ ] = " 0123456789ABCDEF " ;
@ -553,7 +466,9 @@ 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 ;
GtkTextIter start , end ;
GtkTextTag * tag_datetime ;
GtkTextTag * tag_info ;
char * textprm = ( char * ) data ;
time_t _tm = time ( NULL ) ;
struct tm * curtime = localtime ( & _tm ) ;
@ -561,9 +476,9 @@ gboolean cb_thread_network_text_add (gpointer data) {
if ( _once = = 0 ) {
_once = 1 ;
gtk_text_buffer_create_tag ( textbuffer , " Date_Time " ,
tag_datetime = gtk_text_buffer_create_tag ( textbuffer , " Date_Time " ,
" foreground " , " blue " , " style " , PANGO_WEIGHT_BOLD , " family " , " Monospace " , NULL ) ;
gtk_text_buffer_create_tag ( textbuffer , " Connection " ,
tag_info = gtk_text_buffer_create_tag ( textbuffer , " Connection " ,
" foreground " , " red " , " style " , PANGO_WEIGHT_BOLD , " family " , " Sans " , NULL ) ;
}
@ -601,7 +516,10 @@ 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 " ) ) ;
gtk_text_view_get_buffer ( GTK_TEXT_VIEW ( textview ) ) ;
GtkTextBuffer * textbuffer = gtk_text_view_get_buffer ( GTK_TEXT_VIEW ( textview ) ) ;
printf ( " *************************** \n " ) ;
} ;
void cb_addvar_close ( GtkWidget * widget , gpointer data ) {
@ -626,7 +544,6 @@ 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 " ) ) ;
@ -659,7 +576,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 ) ;
g tk_dialog_run( GTK_DIALOG ( dlg ) ) ;
g int result = g tk_dialog_run( GTK_DIALOG ( dlg ) ) ;
gtk_widget_hide ( GTK_WIDGET ( dlg ) ) ;
return ;
@ -816,6 +733,8 @@ 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 ) ;
@ -855,88 +774,15 @@ 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 Int ( " fc " , & g. fc ) ;
value . GetValue Int ( " reg " , & g. reg ) ;
value . GetValue ( " fc " , & temp) ; g. fc = atoi ( temp . c_str ( ) ) ;
value . GetValue ( " reg " , & temp) ; g. reg = atoi ( temp . c_str ( ) ) ;
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 ) ) ;
} ;