/* CreateCfgFile.cpp */ #include #include #include "G4SrcCfgIncl.h" #include "tooltiptext.h" #include "Quaternion.h" #include "config.h" #include #include static void cb_checkbox(GtkToggleButton*,gpointer); static void cb_open_cfg_file(GtkButton*,gpointer); static void cb_ld_attr(GtkButton*,gpointer); static void cb_create_cfg_file(GtkButton*,gpointer); static void cb_about(GtkButton*,gpointer); static void cb_pos_unit_chg(GtkToggleButton*,gpointer); static void cb_att_unit_chg(GtkToggleButton*,gpointer); gchar* browse4file(); const float IN2MET=0.02540f; const char* app_version=VERSION; typedef struct _CONTROL_STRUCT { GtkWidget* chkSrcButton; GtkWidget* srcPno[7]; GtkWidget* AttrLdButton; GtkWidget* hemCombo; GtkWidget* floorCompCombo; GtkWidget* AttrLoaded; GtkWidget* srcFreq; }*LPCONTROL_STRUCT,CONTROL_STRUCT; typedef struct _UNITS_STRUCT { LPCONTROL_STRUCT pcs; GtkWidget* label; int* patt_units; int* ppos_units; }*LPUNITS_STRUCT,UNITS_STRUCT; static void update_pos_vals(int,int,LPCONTROL_STRUCT); static void update_att_vals(int,int,LPCONTROL_STRUCT); const char* hemLab[6]={"POS X","POS Y","POS Z","NEG X","NEG Y","NEG Z"}; const char freqAlphaLab[MAX_SOURCES]={'A','B','C','D','E','F','G','H'}; const char* flrLab[4]={"None","50 cm","75 cm","100 cm"}; int main(int argc,char* argv[]){ CONTROL_STRUCT cs[MAX_SOURCES]; UNITS_STRUCT us; G4_SRC_DATA_STRUCT sds; GtkWidget *win,*table,*openButton,*create,*close; GtkWidget *chkLab,*ldLab,*pnoLab,*hemLabel,*flrLabel,*freqLab; GtkWidget* openImage,*saveImage,*about,*hsep,*vsep,*spacer; GtkWidget* bottom_hbox,*but_table,*pos_table,*ori_box,*vbox,*unit_table; GtkWidget *inches,*feet,*cm,*meters,*deg,*rads,*quats,*pos_frame,*ori_frame; int pos_units,att_units; int i,j,a; gtk_init(&argc,&argv); pos_units=G4_SRC_CFG_INCH; att_units=G4_SRC_CFG_EULER_DEGREE; g_object_set(gtk_settings_get_default(),"gtk_button_images",TRUE,NULL); /*show images*/ win=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Create G4 Source Configuration File"); gtk_widget_set_size_request(win,1100,600); gtk_container_set_border_width(GTK_CONTAINER(win),5); gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER); // gtk_window_set_default_icon_from_file("icon.png",NULL); table=gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(table),FALSE); gtk_grid_set_row_spacing(GTK_GRID(table),5); /* create, add labels */ chkLab=gtk_label_new("System\nSources"); pnoLab=gtk_label_new("Location X Y Z A E R (inches and degrees)"); hemLabel=gtk_label_new("Startup\nHemisphere"); flrLabel=gtk_label_new("Floor\nCompensation"); ldLab=gtk_label_new("Calibration\nStatus"); freqLab=gtk_label_new("Source\nFreq"); gtk_grid_attach(GTK_GRID(table),chkLab,0,0,1,1); gtk_grid_attach(GTK_GRID(table),pnoLab,1,0,7,1); gtk_grid_attach(GTK_GRID(table),hemLabel,10,0,2,1); gtk_grid_attach(GTK_GRID(table),flrLabel,12,0,2,1); gtk_grid_attach(GTK_GRID(table),ldLab,14,0,2,1); gtk_grid_attach(GTK_GRID(table),freqLab,16,0,1,1); gtk_grid_set_column_spacing(GTK_GRID(table),10); /* create, add ui widgets */ for (i=0;isrcPno[i],ckd); gtk_entry_set_text(GTK_ENTRY(pcs->srcPno[i]),ckd?"0.00":""); } gtk_widget_set_sensitive(pcs->AttrLdButton,ckd); gtk_widget_set_sensitive(pcs->AttrLoaded,ckd); gtk_widget_set_sensitive(pcs->srcFreq,ckd); gtk_widget_set_sensitive(pcs->hemCombo,ckd); gtk_widget_set_sensitive(pcs->floorCompCombo,ckd); } void cb_open_cfg_file(GtkButton* b,gpointer p){ LPCONTROL_STRUCT pcs=(LPCONTROL_STRUCT)p; LPG4_SRC_DATA_STRUCT pdata=(LPG4_SRC_DATA_STRUCT)g_object_get_data(G_OBJECT(b),"src_data_struct"); int rv,i,pos,len,a; GtkWidget* dlg; gchar* filename; gchar str[100]; GtkFileFilter *all,*g4c; int *ppos_units,*patt_units; int num_vals; char fstr[5]; ppos_units=(int*)g_object_get_data(G_OBJECT(b),"pos_units"); patt_units=(int*)g_object_get_data(G_OBJECT(b),"att_units"); if (*patt_units==G4_SRC_CFG_QUATERNION){ num_vals=7; strcpy(fstr,"%.4f"); } else { num_vals=6; strcpy(fstr,"%.3f"); } // get file to read all=gtk_file_filter_new(); g4c=gtk_file_filter_new(); gtk_file_filter_set_name(all,"All Files"); gtk_file_filter_set_name(g4c,"G4 Source Configuration Files (*.g4c)"); gtk_file_filter_add_pattern(all,"*"); gtk_file_filter_add_pattern(g4c,"*.g4c"); dlg=gtk_file_chooser_dialog_new("Select a Configuration File",NULL, GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dlg),g4c); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dlg),all); rv=gtk_dialog_run(GTK_DIALOG(dlg)); if (rv==GTK_RESPONSE_CANCEL){ gtk_widget_destroy(dlg); return; } filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dlg)); gtk_widget_destroy(dlg); // read the file rv=g4_read_source_cfg_file(*ppos_units,*patt_units,pdata,filename); if (rv){ dlg=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_WARNING,GTK_BUTTONS_OK, "Error reading Source Configuration File: %s",filename); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return; } g_free(filename); // update the interface for (i=0;isourceMap & (0x01<pos_ori[i][a]); gtk_editable_delete_text(GTK_EDITABLE(pcs[i].srcPno[a]),0,-1); gtk_editable_insert_text(GTK_EDITABLE(pcs[i].srcPno[a]),str,len,&pos); } gtk_combo_box_set_active(GTK_COMBO_BOX(pcs[i].hemCombo),pdata->start_hem[i]&0x07); gtk_combo_box_set_active(GTK_COMBO_BOX(pcs[i].floorCompCombo),(pdata->start_hem[i]>>4)&0x07); gtk_label_set_text(GTK_LABEL(pcs[i].AttrLoaded),"Loaded"); g_sprintf(str,"Freq %c",freqAlphaLab[pdata->freq[i]&0xff]); gtk_label_set_text(GTK_LABEL(pcs[i].srcFreq),str); } else{ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pcs[i].chkSrcButton),FALSE); for (a=0;aattr[index],1,ATTR_LEN,f); fclose(f); if (rv!=ATTR_LEN){ dlg=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_WARNING,GTK_BUTTONS_OK, "Error reading file: %s",filename); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return; } gtk_label_set_text(GTK_LABEL(pcs->AttrLoaded),"Loaded"); freq=g4_get_freq_sn_from_attr(pdata->attr[index],pdata->id[index]); g_sprintf(str,"Freq %c",freqAlphaLab[freq]); gtk_label_set_text(GTK_LABEL(pcs->srcFreq),str); pdata->freq[index]=freq&0xff; } #include void cb_create_cfg_file(GtkButton* b,gpointer p){ LPCONTROL_STRUCT pcs=(LPCONTROL_STRUCT)p; LPG4_SRC_DATA_STRUCT pdata=(LPG4_SRC_DATA_STRUCT)g_object_get_data(G_OBJECT(b),"src_data_struct"); int rv; GtkWidget* dlg; int i,a; const gchar* buf; gchar* file; int num_vals; int *ppos_units,*patt_units; file=browse4file(); if (file==NULL) return; ppos_units=(int*)g_object_get_data(G_OBJECT(b),"pos_units"); patt_units=(int*)g_object_get_data(G_OBJECT(b),"att_units"); num_vals=*patt_units==G4_SRC_CFG_QUATERNION?7:6; // set source map and start-up hem pdata->sourceMap=0; for (i=0;isourceMap|=(0x01<pos_ori[i][a]=strtod(buf,NULL); } // start-up hemisphere pdata->start_hem[i]=gtk_combo_box_get_active(GTK_COMBO_BOX(pcs[i].hemCombo))&0x07; // floor comp pdata->start_hem[i]|=((gtk_combo_box_get_active(GTK_COMBO_BOX(pcs[i].floorCompCombo))&0x07)<<4); } } rv=g4_create_source_cfg_file(*ppos_units,*patt_units,pdata,file); if (rv) dlg=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_WARNING,GTK_BUTTONS_OK, "Failure creating source configuration file. Error %d",rv); else dlg=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, "Source Configuration File Created Successfully:\n%s",file); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_free(file); } gchar* browse4file(){ GtkWidget* dlg; int rv; gchar* file; gchar* ret_file=NULL; GtkFileFilter *all,*g4c; all=gtk_file_filter_new(); g4c=gtk_file_filter_new(); gtk_file_filter_set_name(all,"All Files"); gtk_file_filter_set_name(g4c,"G4 Source Configuration Files (*.g4c)"); gtk_file_filter_add_pattern(all,"*"); gtk_file_filter_add_pattern(g4c,"*.g4c"); dlg=gtk_file_chooser_dialog_new("Select a path and name for the Configuration file",NULL, GTK_FILE_CHOOSER_ACTION_SAVE,GTK_STOCK_SAVE,GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dlg),g4c); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dlg),all); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dlg),TRUE); rv=gtk_dialog_run(GTK_DIALOG(dlg)); if (rv==GTK_RESPONSE_ACCEPT){ file=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dlg)); ret_file=g_strdup(file); g_free(file); } gtk_widget_destroy(dlg); return ret_file; } void cb_about(GtkButton* b,gpointer p){ const gchar* author[]={"James C. Farr","",NULL}; gtk_show_about_dialog(NULL,"program-name","Create G4 Src Cfg File","version",app_version,"website", "http://www.polhemus.com/","copyright","Copyright © 2010-2013 by Polhemus","comments", "Program to create G4 Source Configuration files", "authors",author,NULL); } void cb_pos_unit_chg(GtkToggleButton* b,gpointer g){ LPUNITS_STRUCT pus=(LPUNITS_STRUCT)g; LPCONTROL_STRUCT lcs; int pos_unit; char label[100]; char attLabel[50]; if (gtk_toggle_button_get_active(b)){ pos_unit=(int)(long)g_object_get_data(G_OBJECT(b),"pos_unit"); lcs=(LPCONTROL_STRUCT)g_object_get_data(G_OBJECT(b),"c_struct"); update_pos_vals(*pus->ppos_units,pos_unit,lcs); *pus->ppos_units=pos_unit; strcpy(label,"X Y Z "); if (*pus->patt_units==G4_SRC_CFG_QUATERNION){ strcat(label,"q0 q1 q2 q3 "); strcpy(attLabel," quaternions)"); } else { strcat(label,"A E R "); if (*pus->patt_units==G4_SRC_CFG_EULER_DEGREE) strcpy(attLabel," degrees)"); else strcpy(attLabel," radians)"); } switch (pos_unit){ case G4_SRC_CFG_INCH: strcat(label,"(inches and"); break; case G4_SRC_CFG_FOOT: strcat(label,"(feet and"); break; case G4_SRC_CFG_CM: strcat(label,"(centimeters and"); break; case G4_SRC_CFG_METER : strcat(label,"(meters and"); break; } strcat(label,attLabel); gtk_label_set_text(GTK_LABEL(pus->label),label); } } void cb_att_unit_chg(GtkToggleButton* b,gpointer g){ LPUNITS_STRUCT pus=(LPUNITS_STRUCT)g; int att_unit; char label[100]; char attLabel[50]; int i; LPCONTROL_STRUCT lcs; if (gtk_toggle_button_get_active(b)){ att_unit=(int)(long)g_object_get_data(G_OBJECT(b),"att_unit"); lcs=(LPCONTROL_STRUCT)g_object_get_data(G_OBJECT(b),"c_struct"); update_att_vals(*pus->patt_units,att_unit,lcs); *pus->patt_units=att_unit; strcpy(label,"X Y Z "); if (att_unit==G4_SRC_CFG_QUATERNION){ strcat(label,"q0 q1 q2 q3 "); strcpy(attLabel," quaternions)"); } else { strcat(label,"A E R "); if (att_unit==G4_SRC_CFG_EULER_DEGREE) strcpy(attLabel," degrees)"); else strcpy(attLabel," radians)"); } switch (*pus->ppos_units){ case G4_SRC_CFG_INCH: strcat(label,"(inches and"); break; case G4_SRC_CFG_FOOT: strcat(label,"(feet and"); break; case G4_SRC_CFG_CM: strcat(label,"(centimeters and"); break; case G4_SRC_CFG_METER : strcat(label,"(meters and"); break; } strcat(label,attLabel); gtk_label_set_text(GTK_LABEL(pus->label),label); // go thru and enable/disable 7th entry depending on att unit for (i=0;ipcs[i].chkSrcButton))){ if (att_unit==G4_SRC_CFG_QUATERNION) gtk_widget_set_sensitive(pus->pcs[i].srcPno[6],TRUE); else { gtk_editable_delete_text(GTK_EDITABLE(pus->pcs[i].srcPno[6]),0,-1); gtk_widget_set_sensitive(pus->pcs[i].srcPno[6],FALSE); } } } } } void update_pos_vals(int old_pos,int new_pos,LPCONTROL_STRUCT cs){ float factor=1.0f; float f[MAX_SOURCES][3]; int i,a; const gchar* text; gchar str[20]; // first change to meters then to new val if (old_pos!=new_pos){ switch (old_pos){ case G4_SRC_CFG_INCH: factor=IN2MET; break; case G4_SRC_CFG_FOOT: factor=IN2MET*12.0f; break; case G4_SRC_CFG_CM: factor=0.01f; } for (i=0;i