@ -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 ) ) ;
@ -544,6 +636,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 " ) ) ;
@ -786,3 +879,71 @@ void load_file(std::string fn) {
} ;
void load_bulkfile ( std : : string fn ) {
GuiValue g ;
FILE * f ;
char buffer [ FILEBUFFER ] ;
char field [ LEN_FIELD ] ;
char * pos , * next ;
int i ;
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 ) ;
}
fclose ( f ) ;
}
else printf ( " error on open bulk: %s \n " , strerror ( errno ) ) ;
} ;