00001 #ifndef __LXGBX_H__
00002 #define __LXGBX_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <iccp2k.h>
00015 #include <rtsSystems.h>
00016 #include <RC_Config.h>
00017 #include <rtsLog.h>
00018 #include <time.h>
00019 #include <daqFormats.h>
00020 #include <daq100Decision.h>
00021
00022 class Lxgbx {
00023 public:
00024 int run_type;
00025 int cl_run;
00026 int raw_write;
00027 UINT32 dets_in_run_mask;
00028
00029 UINT32 tokenZeroTriggers;
00030
00031
00032 struct evpCfg {
00033 UINT32 groupdef[TRIGGERS_MAX][2];
00034 float rate[TRIGGERS_MAX];
00035 int policy;
00036 } evpCfg;
00037
00038 struct evpCtrs {
00039 UINT32 runStartTime;
00040 int cnt[TRIGGERS_MAX];
00041 } evpCtrs;
00042
00043 Lxgbx() {};
00044
00045
00046 int configEvp(STAR_CFG *cfg, int divisor=1)
00047 {
00048
00049 evpCtrs.runStartTime = (UINT32)-1;
00050 memset(evpCtrs.cnt, 0, sizeof(evpCtrs.cnt));
00051
00052
00053 EvpGroup *groups = cfg->trg_setup.evpGroup;
00054 evpCfg.policy = cfg->trg_run.EvpPolicy;
00055 for(int i=0;i<32;i++) {
00056
00057
00058 evpCfg.groupdef[i][0] = groups[i].definition[0];
00059 evpCfg.groupdef[i][1] = groups[i].definition[1];
00060
00061 evpCfg.rate[i] = groups[i].rate;
00062 if((evpCfg.rate[i] > 0.0) && (divisor > 1)) {
00063 evpCfg.rate[i] /= (float)divisor;
00064 }
00065
00066 if((int)(evpCfg.rate[i]*1000) > 0) {
00067 LOG(DBG, "configEvp: rate[%d]*1000 = %d",i,(int)(evpCfg.rate[i]*1000),0,0,0);
00068 }
00069 }
00070
00071 return 0;
00072 }
00073
00074
00075
00076 int config(STAR_CFG *cfg)
00077 {
00078 int ret;
00079
00080 ret = configEvp(cfg);
00081
00082 run_type = cfg->daq_setup.run_type;
00083 cl_run = cfg->daq_setup.detectors[TPX_ID].cl_done;
00084 raw_write = cfg->daq_setup.detectors[TPX_ID].raw_write;
00085
00086 dets_in_run_mask = 0;
00087
00088 for(int i=0;i<MAX_NODES;i++) {
00089 TASK *n = &cfg->subsys_tasks.nodes[i];
00090 if(!n->inrun) continue;
00091
00092 int sys = GET_SYSTEM(n->node);
00093
00094 if(sys == DAQ_SYSTEM) continue;
00095 if(sys == TRG_SYSTEM) continue;
00096
00097 dets_in_run_mask |= (1<<sys);
00098 }
00099
00100 tokenZeroTriggers = 0;
00101
00102 for(int i=0;i<TRIGGERS_MAX;i++) {
00103 Trigger *t = &cfg->trg_setup.triggers[i];
00104 if(t->userdata.tokenZero) {
00105 tokenZeroTriggers |= (1<<i);
00106 }
00107 }
00108
00109 return ret;
00110 }
00111
00112 UINT32 evpAssign(UINT32 trg_lo, UINT32 trg_hi)
00113 {
00114 if(evpCtrs.runStartTime == (UINT32)-1) {
00115 evpCtrs.runStartTime = time(NULL);
00116 }
00117
00118 #ifdef __vxworks
00119 UINT32 sec = time(NULL);
00120 UINT32 iet = sec - evpCtrs.runStartTime;
00121 float et = (float)iet;
00122 if(et < 1.0) et = 1;
00123
00124 LOG(DBG, "et=%d",(int)et,0,0,0,0);
00125 #else
00126 struct timeval tm;
00127 gettimeofday(&tm, NULL);
00128 float sec = tm.tv_sec;
00129 float usec = tm.tv_usec;
00130
00131 float currtime = sec + usec / 1000000.0;
00132
00133 float et = currtime - evpCtrs.runStartTime;
00134 if(et < 1.0) et = 1;
00135 #endif
00136
00137
00138 UINT32 grpmask = 0;
00139 for(int i=0;i<32;i++) {
00140 if((trg_lo & evpCfg.groupdef[i][0]) ||
00141 (trg_hi & evpCfg.groupdef[i][1])) {
00142 grpmask |= (1<<i);
00143 }
00144 }
00145
00146
00147 UINT32 firemask = 0;
00148 for(int i=0;i<32;i++) {
00149 if(!(grpmask & (1<<i))) continue;
00150
00151 float r = ((float)evpCtrs.cnt[i]/et);
00152
00153 if(r < evpCfg.rate[i]) {
00154 firemask |= (1<<i);
00155
00156 LOG(DBG, "Set fire mask because of rate[%d]: r*1000=%d rate*1000=%d, cnt=%d et=%d",i,(int)r*1000,(int)evpCfg.rate[i]*1000,evpCtrs.cnt[i],(int)et);
00157 }
00158
00159 if(evpCfg.rate[i] < 0) {
00160 LOG(DBG, "Set fire mask because of neg rate[%d]*1000 %d?",i,evpCfg.rate[i]*1000,0,0,0);
00161 firemask |= (1<<i);
00162 }
00163 }
00164
00165 if(evpCfg.policy == 1) {
00166 LOG(DBG, "Set fire mask because of take all",0,0,0,0,0);
00167 firemask |= 1;
00168 }
00169
00170 if(evpCfg.policy == 2) {
00171 float r = ((float)evpCtrs.cnt[0]/et);
00172 if(r < 10.0) {
00173 LOG(DBG, "Set fire mask because of 10hz",0,0,0,0,0);
00174 firemask |= 1;
00175 }
00176 else
00177 firemask = 0;
00178 }
00179
00180 if(firemask) firemask |= 1;
00181
00182 for(int i=0;i<32;i++) {
00183 if(firemask & (1<<i)) evpCtrs.cnt[i]++;
00184 }
00185
00186 return firemask;
00187 }
00188
00189
00190
00191
00192
00193
00194 int doEvent(gbPayload *pay, EvtDescData *evt, UINT32 l1trg_lo, UINT32 l2trg_lo, UINT32 l25abort, UINT32 token, UINT32 eventNumber, UINT32 l1trg_hi=0, UINT32 l2trg_hi=0)
00195 {
00196
00197 EvtDescData *paydesc = (EvtDescData *)pay->eventDesc;
00198 memcpy(paydesc, evt, sizeof(EvtDescData));
00199
00200 pay->gbPayloadVersion = l2h32(GB_PAYLOAD_VERSION);
00201 pay->eventNumber = l2h32(eventNumber);
00202 pay->token = l2h32(token);
00203
00204
00205 pay->L1summary[0] = l2h32(l1trg_lo);
00206 pay->L1summary[1] = l2h32(l1trg_hi);
00207 pay->L2summary[0] = l2h32(l2trg_lo);
00208 pay->L3summary[0] = l2h32(l2trg_lo);
00209 pay->L2summary[1] = l2h32(l2trg_hi);
00210 pay->L3summary[1] = l2h32(l2trg_hi);
00211
00212 pay->evp = l2h32(evpAssign(l2trg_lo, l2trg_hi));
00213 pay->L3summary[3] = pay->evp;
00214
00215 #ifdef __vxworks
00216 struct timespec tm;
00217 clock_gettime(CLOCK_REALTIME, &tm);
00218 pay->sec = l2h32(tm.tv_sec);
00219 pay->usec = l2h32(tm.tv_nsec * 1000);
00220 #else
00221 struct timeval tm;
00222 gettimeofday(&tm, NULL);
00223 pay->sec = tm.tv_sec;
00224 pay->usec = tm.tv_usec;
00225 #endif
00226
00227 LOG(DBG, "Payload: ver=0x%x token=%d trgcmd=%d daqcmd=0x%x",
00228 pay->gbPayloadVersion,
00229 pay->EventDescriptor.TrgToken,
00230 pay->EventDescriptor.actionWdTrgCommand,
00231 pay->EventDescriptor.actionWdDaqCommand,0);
00232
00233 pay->flags = daq100Decision(l2h32(pay->token), evt->actionWdDaqCommand, run_type, cl_run, raw_write);
00234
00235 if(l25abort & 0x1) {
00236 pay->flags |= EVBFLAG_L25ABORT;
00237 }
00238 if(l25abort & 0x2) {
00239 pay->flags |= EVBFLAG_L25TIMEOUT;
00240 }
00241
00242 pay->flags = l2h32(pay->flags);
00243
00244 UINT32 detmask = b2h16(evt->actionWdDetectorBitMask);
00245
00246 LOG(NOTE, "grp_mask = 0x%x",detmask,0,0,0,0);
00247
00248 detmask = grp2rts_mask(detmask);
00249
00250 LOG(NOTE, "potential det_mask = 0x%x",detmask,0,0,0,0);
00251
00252 detmask &= dets_in_run_mask;
00253 detmask |= (1<<TRG_SYSTEM);
00254
00255 LOG(NOTE, "final det_mask = 0x%x",detmask,0,0,0,0);
00256
00257 pay->rtsDetMask = l2h32(detmask);
00258
00259 if(pay->flags & EVBFLAG_L25ABORT) {
00260 LOG(DBG, "Sending L25Abort: token=%d event=%d 1l=0x%x l2=0x%x l2abort=%d",
00261 token, eventNumber, l1trg_lo, l2trg_hi, l25abort);
00262 }
00263
00264 return 0;
00265 }
00266
00267 int prepareTokenZeroPayload(gbPayload *pay, int eventNumber)
00268 {
00269 memset(pay, 0, sizeof(gbPayload));
00270
00271
00272 EvtDescData *des = (EvtDescData *)pay->eventDesc;
00273 des->TrgToken = b2h16(0);
00274 des->actionWdDetectorBitMask = b2h16(dets_in_run_mask);
00275 des->TrgDataFmtVer = FORMAT_VERSION & 0x000000ff;
00276
00277
00278 pay->gbPayloadVersion = GB_PAYLOAD_VERSION;
00279 pay->eventNumber = l2h32(eventNumber);
00280 pay->token = 0;
00281
00282
00283 pay->L1summary[0] = l2h32(tokenZeroTriggers);
00284 pay->L2summary[0] = l2h32(tokenZeroTriggers);
00285 pay->L3summary[0] = l2h32(tokenZeroTriggers);
00286 pay->evp = l2h32(1);
00287 pay->L3summary[3] = pay->evp;
00288
00289 #ifdef __vxworks
00290 struct timespec tm;
00291 clock_gettime(CLOCK_REALTIME, &tm);
00292 pay->sec = l2h32(tm.tv_sec);
00293 pay->usec = l2h32(tm.tv_nsec * 1000);
00294 #else
00295 struct timeval tm;
00296 gettimeofday(&tm, NULL);
00297 pay->sec = tm.tv_sec;
00298 pay->usec = tm.tv_usec;
00299 #endif
00300
00301 int detmask = grp2rts_mask(dets_in_run_mask);
00302 pay->rtsDetMask = l2h32(detmask);
00303
00304 return 0;
00305 }
00306 };
00307
00308 #endif