int main() { char *eof; char line[100]; int customer; cshmInit(); while(1) { printf("l cust u cust h[elp] p[rint] q[uit]:"); eof=fgets(line, 100, stdin); if(eof==NULL) break; if(line[0]=='q') break; if(line[0]=='l') { customer= atoi(&line[2]); lockBakery(&ctpshmbase->swtriggers, customer); } else if(line[0]=='u') { customer= atoi(&line[2]); unlockBakery(&ctpshmbase->swtriggers, customer); } else if(line[0]=='p') { printBakery(&ctpshmbase->swtriggers); } else if(line[0]=='h') { printf("Now l/u/p concerns swtriggers. bakery alg. used for\n\ 2 groups of tasks (initialised in main_ctp.c):\n\ initBakery(swtriggers,4): 0:SOD/EOD 1:gcalib 2:ctp.exe 3:dims\n\ initBakery(ccread,5): 0:proxy 1:dims 2:ctp+busytool 3:smaq 4:inputs\n\ "); } else { continue;
/* ------------------------------------------------------------ GenSwtrg orbitn[0]: orbit number read just before the first trigger generation, i.e. it is always <= of ORBITID of the sw. trigger event orbitn[1,2]: tsec tusec -ONLY IN CASE OF 'c' trigger ! RC: number of L2a successfully generated, or 12345678: cal. triggers stopped because det. is not in global run or 0xffffffxx: where xx is flag (see above). ONLY IN CASE of one 'c' trigger */ int GenSwtrg(int ntriggers,char trigtype, int roc, w32 BC,w32 detectors, int customer, w32 *orbitn ){ int flag,itr=0; int l0=0,l1=0,l2a=0,l2r=0, lm=0; w32 status, orbitnloc[3]; if(l0C0()) { status=vmer32(L0_TCSTATUS); } else { status=vmer32(L0_TCSTATUS); }; if((status&0x10)==0x10){ printf(" GenSwtrg: TC busy. L0 TC_STATUS:0x%x\n", status); return 0; } if(detectors & 0x20000) { printf("GenSwtrg: CTP (ECS number 17) cannot be sw triggered, bit17 removed\n"); detectors= detectors & (~0x20000); }; if(trigtype=='c') { w32 det2runn[NDETEC]; // not used here, just to satisfy next call... status= cshmGlobalDets(det2runn); //if(strcmp("ALICE", getenv("VMESITE"))==0) if(strcmp("ALICE", "ALICE")==0) { if((status & detectors)!=detectors) { printf("GenSwtrg: calibrated dets:%x but dets in global run(s):%x\n", detectors,status); return 12345678; //magic used in ctp/testclass.py }; } else { status= detectors; if(msgpres==0) { printf("Presence of dets in glob. run not checked!!!\n"); msgpres++; }; }; }; lockBakery(&ctpshmbase->swtriggers, customer); if( setswtrig(trigtype,roc,BC,detectors)!=0) { l2a=0; flag=11; goto RELEASERET; }; while(((itr<ntriggers) && ((flag=startswtrig(orbitnloc))))){ if(itr==0) { *orbitn= orbitnloc[0]; if(trigtype == 'c') { // also time in case of cal. trigger orbitn[1]= orbitnloc[1]; orbitn[2]= orbitnloc[2]; }; }; if(flag == 1)l0++; else if(flag == 2)l1++; else if(flag == 3)l2r++; else if(flag == 4)l2a++; else if(flag ==10)lm++; else { printf(" GenSwtrg: unexpected flag %i\n",flag); goto RELEASERET; } itr++; //usleep(60000000); }; if(DBGswtrg3==1) { int ifo; for(ifo=0;ifo<NFO;ifo++){ // set all FOs always //printf("FO:%d\n",ifo); if((notInCrate(ifo+FO1BOARD)==0)) { w32 vmeaddr,val; vmeaddr= FO_TESTCLUSTER+BSP*(ifo+1); val=vmer32(vmeaddr); //if((DBGswtrg3==1)&&(val!=0)) printf("setswtrig FOr:%d Raddr: 0x%x data: 0x%x\n", if(val!=ifoglob[ifo]) printf("ERROR setswtrig FOr:%d Raddr: 0x%x dataw r: 0x%x 0x%x\n", ifo, vmeaddr, ifoglob[ifo], val); } }; }; RELEASERET: unlockBakery(&ctpshmbase->swtriggers, customer); if(DBGswtrg4) { printf(" GenSwtrg: %i %c-triggers generated for detectors:0x%x.\n", itr,trigtype, detectors); printf("flag lm/l0,l1,l2r,l2a: %d %i %i %i %i \n",flag,l0,l1,l2r,l2a); }; TRIGTYPE='.'; if((trigtype=='c') && (ntriggers==1)) { // 1 calib. event, i.e. special RC: 0xffffff00 + flag // flag 0x4: ok -full cal. event successfully generated // see startswtrig() for possible flags return(0xffffff00 | flag); } else { return l2a; }; }