#include "trigConf.h" #define isthis(A) !strncmp(name,A,strlen(A)) void ReadMLUData(FILE* f); int SaveToFile(ClientData clientData,Tcl_Interp *interp,int argc,const char *argv[]) { FILE *f; int i,j; // Return if no filename is passed. This will happen if user selects "cancel" if(argc<2)return TCL_OK; if(strlen(argv[1])<1)return TCL_OK; // Open file to write to f = fopen(argv[1],"w"); if(!f){ char cmd[1024]; sprintf(cmd,"tk_dialog .fileopenerror \"Error\" \"Error saving to file:\n %s \n\" error 0 \"Oops!\"",argv[1]); Tcl_Evaluate(cmd); return TCL_OK; } // Write to file time_t t = time(NULL); char time_str[32]; strcpy(time_str,ctime(&t)); time_str[strlen(time_str)-1]=0; fprintf(f,"## GlueX Trigger Supervisor Configuration File ##\n"); fprintf(f,"## this file generated by trigConf ##\n"); fprintf(f,"##"); for(i=0;i<(int)(46-strlen(time_str))/2;i++)fprintf(f," "); fprintf(f,"%s", time_str); for(i+=strlen(time_str);i<46;i++)fprintf(f," "); fprintf(f,"##\n\n"); // Write out trig enabled settings for(i=1;i<=12;i++)fprintf(f,"enable_trig%d=%d\n",i,trig_enable[i]); fprintf(f,"\n"); // Write out trig prescale settings for(i=1;i<=8;i++)fprintf(f,"prescale_trig%d=%d\n",i,trig_prescale[i]); fprintf(f,"\n"); // ALWAYS bypass MLU fprintf(f,"FastTriggerMode=1\n\n"); // Write out SYNC event settings fprintf(f,"sync_enable=%d\n",sync_enable); fprintf(f,"sync_period=%d\n\n",sync_period); // Write out externalbusy and busy timer settings fprintf(f,"busyfrontendenable=%d\n",busyfrontendenable); fprintf(f,"busytimer=%d\n",(busytimer*1000)/40); fprintf(f,"busytimerenable=%d\n\n",busytimerenable); // Write out scaler assignments for(i=13;i<=18;i++)fprintf(f,"scaler%d=%d\n",i,scaler_assignments[i]); fprintf(f,"\n"); // Write out branch settings int enablereg; sscanf(Tcl_GetVar(interp,"enablereg",0),"0x%x", &enablereg); fprintf(f,"branchenable=%d\n", enablereg); sscanf(Tcl_GetVar(interp,"roc_enable_b5r0",0),"%d", &enablereg); fprintf(f,"branch5enable=%d\n", enablereg); fprintf(f,"\n"); // Write out ROCLock settings for(int i=1;i<=5;i++)fprintf(f,"roc_lock%d=%d\n", i, roc_lock[i]); fprintf(f,"\n"); // Write out entire 16 kB of MLU fprintf(f,"\nMLU-data\n"); int values_per_row=4; for(i=0;i<4096/values_per_row;i++){ for(j=0;j1 || i<1 || i>12){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set t%d_enable %d",i,val); Tcl_Evaluate(cmd); } void SetTrigPrescale(char* name, int val) { int i, bad_value=0; char cmd[256]; i=atoi(&name[strlen("prescale_trig")]); bad_value = i<1 || i>12; bad_value |= val<0 || val>=(1<<(i<=4 ? 24:16)); if(bad_value){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set t%d_prescale %d",i,val); Tcl_Evaluate(cmd); } void SetSyncEnable(char* name, int val) { char cmd[256]; if(val<0 || val>1){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set sync_enable %d",val); Tcl_Evaluate(cmd); } void SetSyncPeriod(char* name, int val) { char cmd[256]; if(val<0 || val>=(1<<16)){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set sync_period %d",val); Tcl_Evaluate(cmd); } void SetScaler(char* name, int val) { int i, bad_value=0; char cmd[256]; i=atoi(&name[strlen("scaler")]); bad_value = i<13 || i>18; // only scalers 13-18 are programmable bad_value |= val<0 || val>0x0F; if(bad_value){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set scaler%d %d ; ReverseMapScalers",i,val); Tcl_Evaluate(cmd); } void SetBusyTimer(char* name, int val) { char cmd[256]; if(val<0 || val>=(1<<16)){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} val = (val*40)/1000; sprintf(cmd,"set busytimer %d",val); Tcl_Evaluate(cmd); } void SetBusyTimerEnable(char* name, int val) { char cmd[256]; sprintf(cmd,"set busytimerenable %d",val); Tcl_Evaluate(cmd); } void SetFrontEndBusyEnable(char* name, int val) { char cmd[256]; sprintf(cmd,"set busyfrontendenable %d",val); Tcl_Evaluate(cmd); } void SetBranchEnable(char* name, int val) { char cmd[256]; for(int branch=1; branch<=4 ;branch++){ for(int roc=0;roc<8;roc++){ int enabled = (val>>((branch-1)*8+roc))&0x01; sprintf(cmd,"set roc_enable_b%dr%d %d", branch, roc, enabled); Tcl_Evaluate(cmd); } } Tcl_Evaluate("UpdateBranchStatistics"); } void SetBranch5Enable(char* name, int val) { char cmd[256]; if(val<0 || val>1){printf("%s:%d Bad value in \"%s\"\n",__FILE__,__LINE__,name);return;} sprintf(cmd,"set roc_enable_b5r0 %d", val); Tcl_Evaluate(cmd); Tcl_Evaluate("UpdateBranchStatistics"); } void SetROCLock(char* name, int val) { int i, bad_value=0; char cmd[256]; i=atoi(&name[strlen("roc_lock")]); bad_value = i<1 || i>5; bad_value |= val<0 || val>1; if(bad_value){printf("%s:%d Bad value in \"%s\" (i=%d,val=%d)\n",__FILE__,__LINE__,name,i,val);return;} sprintf(cmd,"set roc_lock%d %d",i,val); Tcl_Evaluate(cmd); } void ReadMLUData(FILE* f) { int i; int n_conv; for(i=0;i<4096;i++){ n_conv = fscanf(f,"%x",&TS_MLU[i]); if(n_conv !=1){ printf("%s:%d MLU section short of values !!\n",__FILE__,__LINE__); break; } } }