/* line: inpupd runn ix1 ix2 ... * ix1: 1..60 (24+24+12) */ void update_ctpins(char *line) { unsigned int runn; int ixc, ixl; char value[16]; enum Ttokentype t1; char emsg[100]; emsg[0]='\0'; ixl= 7; t1= nxtoken(line, value, &ixl); // runn if(t1==tINTNUM) { runn= str2int(value); } else { sprintf(emsg,"pydim update_ctpins: bad line:%60s",line); infolog_trg(LOG_ERROR, emsg); printf("%s\n",emsg); return; }; for(ixc=0; ixc<NCTPINPUTS; ixc++) { t1= nxtoken(line, value, &ixl); // 1..60 if(t1==tEOCMD) {break;}; if(t1==tINTNUM) { int ixin; ixin= str2int(value); ctpc_addinp(ixin, runn); } else { sprintf(emsg,"pydim update_ctpins: bad line:%60s",line); infolog_trg(LOG_ERROR, emsg); printf("%s\n",emsg); ctpc_delrun(runn); break; }; }; //updateCNAMES(); it is enough to update it in updateDAQDB }
/*-----------------*/ void CORDE_SETcmd(void *tag, void *msgv, int *size) { char errmsg[200]; char *msg= (char *)msgv; int rc; w32 cosh; char sshift[20]; int shift=0, origshift; if(*size>19) {rc=19;} else {rc=*size; }; strncpy(sshift,msg,rc); sshift[rc]='\0'; errno= 0; shift= strtol(sshift, (char **)NULL, 10); if ((errno == ERANGE && (shift == LONG_MAX || shift == LONG_MIN)) || (errno != 0 && shift == 0)) { sprintf(errmsg, "Error: incorrect shift:%s, not set", sshift); prtLog(errmsg); return; }; sprintf(errmsg, "CORDE_SETcmd: size:%d msg:%5.5s :%s:%d\n", *size, msg, sshift, shift); prtLog(errmsg); rc= authenticate(""); //rc=0; //prtLog("CORDE_SET not authenticated!\n"); if(rc!=0) { sprintf(errmsg, "CORDE shift forbidden\n"); prtLog(errmsg); return; }; if(shift==0) { sprintf(errmsg, "Error: Bad shift:%s, not set", sshift); prtLog(errmsg); return; }; cosh= corde_shift(CORDE_DELREG, shift, &origshift); //sprintf(errmsg, "corde_shift(,%d, %d)", shift, origshift); prtLog(errmsg); if(cosh>1023) { sprintf(errmsg, "Error: Corde reg. not set, corde_shift rc:0x%x\n", cosh); prtLog(errmsg); } else { w32 pol,halfns; char line[80]; // always, after shift resynchronize DLL on RF2TTC: // not here (called from miclock): //DLL_RESYNC(0); sprintf(errmsg, "corde_shift(%x, %d, ) orig:%d set to:%d.", CORDE_DELREG, shift, origshift, cosh); prtLog(errmsg); sprintf(errmsg,"CORDE shift: %d -> %d ps",origshift*10, cosh*10); infolog_trg(LOG_INFO, errmsg); // update $dbctp/clockshift, daqlogbook and SHIFTid service: // not done here (can we use DIM client library here?), but in miclock.py // which is not correct (it can get unsync!) //rc= dic_cmnd_callback("CTPRCFG/RCFG", message, strlen(message)+1, callback, 33); rc= dis_update_service(SHIFTid); sprintf(errmsg,"TTCMI/SHIFT updated for %d clients\n", rc); prtLog(errmsg); pol= i2cread_delay(BC_DELAY25_BCMAIN); halfns= pol-0x140; // update $dbctp/clockshift // run1 last values (12.2.201): 29 973 960 sprintf(line, "%d %d %d", halfns, cosh, origshift); writedbfile((char *)"/home/alice/trigger/v/vme/CFG/clockshift", line); shiftCommentInDAQ((int)halfns, origshift, (int)halfns, (int)cosh,"fine"); sprintf(errmsg,"DAQlogbook updated (rc:void).Corde: %d -> %d\n", origshift, cosh);prtLog(errmsg); }; }
int check_xcounters() { int ix, xrc; char xpid[20]=""; char emsg[ERRMSGL]; char *environ; environ= getenv("VMESITE"); if((strcmp(environ,"PRIVATE")==0) || (strcmp(environ,"SERVER2")==0)) return(0); // check xcountersdaq active: xrc= popenread((char *)"ps --no-headers -C xcountersdaq -o pid=", xpid, 20); for(ix=0; ix< (int)strlen(xpid); ix++) { if(xpid[ix]=='\n') xpid[ix]=' '; }; sprintf(emsg,"INFO DOrcfg xpid:%s popen rc:%d\n", xpid, xrc); printf("%s",emsg); if(xpid[0]=='\0') { infolog_trg(LOG_FATAL, "xcounters problem, stop all global runs, call CTP expert"); printf("ERROR xcounters problem, stop all global runs, call CTP expert\n"); xrc=1; } else { xrc=0; };return(xrc); }
/* Input: class runNumber clid1 classname1 clid2 classname2 ... \n from 28.7.2010: Input: class runNumber clid1 cg1 cgtime1 dsc1 classname1 clid2 cg2 cgtime2 dsc2 classname2 ... \n Operation: register clid:classname in DAQDB rc: 0: ok !=0: ERROR message printed to stdout 1: runNumber not found 2: classname expected 3: classid 1..NCLASS expected 4: DAQDB update call error 5: bad cg (0..20) allowed (anyhow, ctp_proxy allows only 0..9) 6: bad dsc factor. Expected: dec. number (32 bits, i.e. unsigned int) 7: bad dsc factor: >0x1fffff but bit31 not set 8: premature EOCMD (unfinished line) */ int updateDAQDB(char *line) { int ixl, ixiv, rcex=8; unsigned int runN; int ixc; char value[256]; enum Ttokentype t1,t2; printf("INFO updateDAQDB... effiout:0x%x\n", effiout); ixl=6; t1= nxtoken(line, value, &ixl); // runNumber if(t1==tINTNUM) { runN= str2int(value); ixiv= find_insver(runN); if(ixiv == -1) { printf("ERROR bad line (runN not found (pcfg req. missing?) ):%s",line); rcex=1; return(rcex); }; } else { printf("ERROR bad line (runN expected after class ):%s",line); rcex=1; return(rcex); }; infolog_SetStream(insver[ixiv].parname, runN); updateConfig(runN, insver[ixiv].parname, insver[ixiv].insname, insver[ixiv].insver); del_insver(runN); for(ixc=0; ixc<NCLASS; ixc++) { unsigned int classN, cg, cgtim; int rcdaq,daqlistpn; float cgtime; char dsctxt[24]; // (0.xxx% - 100%) or xxxus or xxx.xxxms char *dsctxtp; char *daqlist[MAXALIASES]; char **daqlistp; char msg[300]; t1= nxtoken(line, value, &ixl); // class number //printf("INFO ixc:%d token:%d tokenvalue:%s\n",ixc,t1,value); if(t1==tEOCMD) {rcex=0; break;}; if(t1==tINTNUM) { classN= str2int(value); if( (classN>NCLASS) || (classN<1) ) { rcex=3; break; }; } else { rcex=3; break; }; t1= nxtoken(line, value, &ixl); // class group if(t1==tEOCMD) break; if(t1==tINTNUM) { cg= str2int(value); if( cg>NCLASS ) { rcex=5; break; }; } else { rcex=5; break; }; t1= nxtoken(line, value, &ixl); // class time group if(t1==tEOCMD) break; if(t1==tINTNUM) { cgtim= str2int(value); } else { rcex=3; break; }; t1= nxtoken(line, value, &ixl); // dsc if(t1==tEOCMD) break; if(t1==tINTNUM) { unsigned int dsc; dsc= str2int(value); dsctxtp= dsctxt; if(dsc>0x1fffff) { // class busy int dscus; if((dsc & 0x80000000)!=0x80000000) { printf("ERROR in downscaling factor:0x%x\n", dsc); rcex=7; break; }; dscus= 10*(dsc & 0x1ffffff); sprintf(dsctxt, "%dus", dscus); } else if(dsc==0) { // not downscaled dsctxt[0]='\0'; dsctxtp= NULL; } else { // random downscaling float dscrat; dscrat= 100- dsc*100./0x1fffff; sprintf(dsctxt, "%2.3f%%", dscrat); } } else { rcex=6; break; }; t2= nxtoken1(line, value, &ixl); // classname if(t2!=tSYMNAME) {rcex=2; break;}; cgtime= cgtim; getClassAliases(value, daqlist); daqlistpn=0; if(daqlist[0]==NULL) { daqlistp=NULL; } else { char *dp; daqlistp=daqlist; dp= daqlist[0]; while(dp!=NULL) { daqlistpn++; dp=daqlist[daqlistpn]; }; }; if(ignoreDAQLOGBOOK) { rcdaq=0; } else { rcdaq= daqlogbook_update_triggerClassName(runN, //classN-1, value, cg, cgtime, (const char **)daqlistp); classN-1, value, cg, cgtime, dsctxtp, (const char **)daqlistp); }; sprintf(msg, "DAQlogbook_update_triggerClassName(%d,%d,%s,%d,%5.1f, %s, %d) rc:%d", runN, classN-1, value, cg, cgtime, dsctxt, daqlistpn, rcdaq); if(rcdaq!=0) { infolog_trg(LOG_ERROR, msg); printf("ERROR %s\n", msg); rcex=4; break; } else { printf("INFO %s\n", msg); // without the test below, server crashes (or \n received indicating STOP) // ??? Possible reason: cannot print 2 consequtive INFO lines? if(daqlistpn>0) printalist(daqlistp); }; ctpc_addclass(classN, value, runN); fflush(stdout); }; if(rcex!=0) { ctpc_delrun(runN); }; updateCNAMES(); infolog_SetStream("",0); return(rcex); }
/*--------------------------------------------------- updateConfig update following info in DAQlogbook:: - .rcfg + alignment - col. schedule - partition instance name/version (was sent in time of .pcfg) */ void updateConfig(int runn, char *pname, char *instname, char *instver) { int rc, rl; int bm; w32 globflags; char *mem; char *environ, *envWORK; char cfgname[200], aliname[200], itemname[200]; char emsg[1000]; #define MAXALIGNMENTLEN 4000 #define MAXRCFGLEN 30000 char alignment[MAXALIGNMENTLEN]; environ= getenv("VMESITE"); envWORK= getenv("VMEWORKDIR"); strcpy(cfgname, envWORK); if(strcmp(environ,"ALICE")==0) { strcpy(aliname, "/home/dl6/snapshot/alidcsvme001/home/alice/trigger/v/vme/WORK/"); } else if(strcmp(environ,"SERVER")==0) { strcpy(aliname, "/home/dl6/snapshot/altri1/home/alice/trigger/v/vme/WORK/"); } else { printf("INFO strange VMESITE env. var:%s using WORKDIR/WORK\n",environ); sprintf(aliname, "%s/WORK/", envWORK); }; strcat(aliname, "alignment2daq"); rl= readdbfile(aliname, alignment, MAXALIGNMENTLEN); alignment[rl]='\0'; if(alignment=='\0') { infolog_trg(LOG_FATAL, "Alignment info in DAQlogbook is empty"); printf("ERROR Alignment info in DAQlogbook is empty"); }; printf("INFO alignment file len:%d (MAX:%d)\n",rl, MAXALIGNMENTLEN ); sprintf(cfgname,"%s/WORK/RCFG/r%d.rcfg", envWORK, runn); mem= (char *)malloc(MAXRCFGLEN+1); mem[0]='\0'; rl= readdbfile(cfgname, mem, MAXRCFGLEN); mem[rl]='\0'; printf("INFO %s rcfg file len:%d (MAXlen:%d)\n",cfgname, rl, MAXRCFGLEN ); printf("INFO ctpshmbase2:%p\n", ctpshmbase); if(rl < 10) { sprintf(emsg, "updateConfig: File: %s read error\n",cfgname); infolog_trg(LOG_FATAL, emsg); printf("ERROR %s", emsg); } else { if(ignoreDAQLOGBOOK) { rc=0;} else { rc= daqlogbook_update_triggerConfig(runn, mem, alignment, effiout); printf("INFO daqlogbook_update_triggerConfig rc:%d\n", rc); }; if(rc!=0) { sprintf(emsg, "DAQlogbook_update_triggerConfig: rc:%d\n",rc); infolog_trg(LOG_FATAL, emsg); printf("ERROR %s", emsg); }; }; free(mem); printf("INFO ctpshmbase3:%p\n", ctpshmbase); cshmDetach(); printf("INFO shm detached.\n"); cshmInit(); /* without this line and with daqlogbook_update_triggerConfig above, server crashes in P2, but not in lab. In lab, repeated cshmInit leads to: [trigger@avmes logs]$ grep -e ctpshmbase -e attached pydimserver.log 02.10.2015 14:13:28 received:INFO shared memory attached at address 0x7f1028920000 02.10.2015 14:13:28 received:INFO ctpshmbase1:0x7f1028920000 02.10.2015 14:13:44 received:INFO ctpshmbase2:0x7f1028920000 02.10.2015 14:13:44 received:INFO ctpshmbase3:0x7f1028920000 02.10.2015 14:13:44 received:INFO shared memory attached at address 0x7f102891c000 02.10.2015 14:13:44 received:INFO ctpshmbase4:0x7f102891c000 - seems ok (reattached at diffrent address +0x4000) */ printf("INFO ctpshmbase4: detached+attached%p\n", ctpshmbase); bm= cshmBM(); globflags= cshmGlobFlags(); printf("INFO beammode:%d GlobalFlags:0x%x\n", bm, globflags); // todo:cs update only for 7(RAMP)..12(UNSTABLE BEAMS) if(ignoreDAQLOGBOOK) { rc=0; } else { if((bm>=7) && (bm<=12)) { rc= daqlogbook_update_cs(runn, CSString); } else { printf("INFO cs not updated ( bm<7 or bm>12)\n"); }; do_partitionCtpConfigItem(pname, itemname); rc= daqlogbook_update_ACTConfig(runn, itemname,instname,instver); }; }
/*--------------------*/ void DOcmd(void *tag, void *msg, int *size) { /* msg: string finished by "\n\0" */ //printf("DOcmd: tag:%d size:%d msg:%s<-endofmsg\n", *tag, *size,msg); char mymsg[400]; int stdoutyes=1; strncpy(mymsg, (char *)msg, 400); mymsg[398]='\n'; mymsg[399]='\0'; // force \n (if not given) if((strncmp(mymsg,"pcfg ",5)==0) || (strncmp(mymsg,"Ncfg ",5)==0) || (strncmp(mymsg,"Acfg ",5)==0) ) { /* pcfg RUNNUMBER partname -try ACT download (ECS INIT) Ncfg RUNNUMBER partname -NO ACT, change: Ncfg -> pcfg Acfg RUNNUMBER partname - abort \n -stop this server rcfgdel useDAQLOGBOOK rcfgdel ignoreDAQLOGBOOK rcfgdel ALL 0xc606 -ctpproxy restart rcfgdel PARTNAME RUNN -process in .py, (ECS STOP) rcfgdel reload -just reload parted csupdate aliasesupdate intupdate clockshift rcfg -OBSOLETE! resetclock -just write out */ char c; unsigned int rundec=0; int rc, infoerr, ix=0, runnactive=0; char instname[100]=""; char version[100]=""; char pname[60]=""; char runc[16]=""; char emsg[500]; //rc= getname_rn(mymsg, pname, rundec); moved to DOrcfg() while(1) { int cix; c=(mymsg)[5+ix]; if((c==' ') || (c=='\n') || (c=='\0')) { if(runnactive==0) { if(c==' ') { ix++; runnactive=1; cix=0; continue; } else { break; }; } else { if(runc[0]!='\0') { rundec=atoi(runc); break; }; }; }; if(runnactive==1) { runc[cix]=c; runc[cix+1]='\0'; cix++; } else { pname[ix]= c; pname[ix+1]='\0'; }; ix++; if(ix>=60) break; }; infolog_SetStream(pname, rundec); if(mymsg[0]=='p') { char filter[20000]=""; //actdb_open(); rc=actdb_getPartition(pname,filter, instname, version); //actdb_close(); if(rc==0) { sprintf(emsg,"INFO %s (run:%d inst:%s ver:%s) downloaded from ACT.", pname, rundec, instname, version); infoerr=LOG_INFO; } else if(rc==1) { sprintf(emsg,"ERROR %s (run:%d) not found in ACT, might be OK if shift leader disabled it in ACT (i.e. is in 'Local File' mode)", pname, rundec); infoerr=LOG_ERROR; } else { sprintf(emsg,"actdb_getPartition(%s) run:%d rc:%d (-2: partition not available in ACT)", pname,rundec,rc); infoerr=LOG_ERROR; }; } else if(mymsg[0]=='A') { //printf("INFO Acfg %s %d\n", pname, rundec); del_insver(rundec); } else { // Ncfg runnumber partname sprintf(emsg,"INFO %s (run:%d) not searched in ACT (ECS:ACT_CONFIG=NO)", pname, rundec); infoerr=LOG_INFO; mymsg[0]= 'p'; }; if(mymsg[0]=='p') { //prtLog(emsg); //myprtLog(emsg); infolog_trgboth(infoerr, emsg); rc= add_insver(rundec, pname, instname, version); if(rc==-1) { sprintf(emsg,"run:%d, instance/ver will not be stored in ACT", rundec); infolog_trg(LOG_FATAL, emsg); printf("ERROR %s", emsg); }; }; infolog_SetStream("",0); /*---- moved to .rcfg time if(ignoreDAQLOGBOOK==1) { rcdaq=0; } else { rcdaq= daqlogbook_open(); //rcdaq=0; if(rcdaq!=0) { printf("ERROR update_cs: DAQlogbook_open failed rc:%d",rcdaq); rc=4; //prtError("DAQlogbook_open failed"); }else{ char itemname[200]; rc= daqlogbook_update_cs(rundec, CSString); do_partitionCtpConfigItem(pname, itemname); rc_insert= daqlogbook_update_ACTConfig(rundec, itemname,instname,version); rcdaq= daqlogbook_close(); }; if((rc==0) && (rc_insert==0)) { infoerr=LOG_INFO; } else { infoerr=LOG_FATAL; }; sprintf(emsg,"daglogbook_update_cs rc:%d _update_ACTConfig rc:%d", rc, rc_insert); infolog_trg(infoerr, emsg); }; -------- moved to .rcfg */ // 1...,...10....,....20..3 } else if((strncmp(mymsg,"rcfgdel ignoreDAQLOGBOOK",23)==0)) { int rcdaq; ignoreDAQLOGBOOK=1; rcdaq= daqlogbook_close(); if(rcdaq==-1) { printf("ERROR DAQlogbook_close failed\n"); } else { printf("INFO DAQlogbook closed:rc:%d (ignoreDAQLOGBOOK from ctpproxy received)\n",rcdaq); }; stdoutyes=0; //cshmSetGlobFlag(FLGignoreDAQLOGBOOK); } else if((strncmp(mymsg,"rcfgdel useDAQLOGBOOK",20)==0)) { int rcdaq; rcdaq= daqlogbook_open(); //rcdaq=0; if(rcdaq!=0) { printf("ERROR DAQlogbook_open failed rc:%d",rcdaq); ignoreDAQLOGBOOK=1; cshmSetGlobFlag(FLGignoreDAQLOGBOOK); } else { ignoreDAQLOGBOOK=0; cshmClearGlobFlag(FLGignoreDAQLOGBOOK); }; stdoutyes=0; } else if((strncmp(mymsg,"rcfgdel ALL 0x...",11)==0)) { //ctpproxy [re]start //int irc; printf("INFO rcfgdel ALL 0x... (redis, readTables...)\n"); red_clear_detsinrun(0); reset_insver(); readTables(); ctpc_clear(); updateCNAMES(); /*irc=*/ check_xcounters(); } else if((strncmp(mymsg,"rcfgdel reload",14)==0)) { //reload parted // perhaps it is reasonable to clean (even if ctpproxy did not restart but is // without active partitions) //reset_insver(); //readTables(); //ctpc_clear(); updateCNAMES(); //printf("INFO rcfgdel reload\n"); ; } else if((strncmp(mymsg,"rcfgdel ",8)==0)) { // rcfgdel partname runn enum Ttokentype t1; int ixl, runn; char pname[16]; char intval[16];; char emsg[200]; emsg[0]='\0'; ixl=8; t1= nxtoken(mymsg, pname, &ixl); // runNumber if(t1==tSYMNAME) { t1= nxtoken(mymsg, intval, &ixl); // runNumber if(t1==tINTNUM) { runn= str2int(intval); // from 26.2. maybe not needed here, but seems ok when INIT brings ctpproxy to LOAD_FAILURE del_insver(runn); } else { sprintf(emsg,"pydimserver: bad run number in rcfgdel %s cmd", pname); }; } else { sprintf(emsg,"pydimserver: bad part. name in %s cmd", mymsg); }; if(emsg[0]=='\0') { red_clear_detsinrun(runn); ctpc_delrun(runn); updateCNAMES(); } else { infolog_trg(LOG_ERROR, emsg); printf("ERROR %s\n",emsg); }; } else if((strncmp(mymsg,"csupdate",8)==0)) { int csclients; // char *cs; /*cs=*/ readCS(); csclients= dis_update_service(CSid); printf("INFO CS update for %d clients\n", csclients); stdoutyes=0; } else if((strncmp(mymsg,"aliasesupdate",13)==0)) { int rc; rc= readAliases(); if(rc==-1) { char emsg[200]; strcpy(emsg,"aliasesupdate: info from aliases.txt not updated correctly"); infolog_trg(LOG_INFO, emsg); printf("ERROR %s\n",emsg); }; stdoutyes=0; } else if((strncmp(mymsg,"intupdate",9)==0)) { int rc1, rc2; rc1= getINT12fromcfg(INT1String, INT2String, MAXINT12LINE); printf("INFO rc:%d INT1:%s INT2:%s\n", rc1, INT1String, INT2String); rc1= dis_update_service(INT1id); rc2= dis_update_service(INT2id); printf("INFO INT1/INT2 update for %d/%d clients\n", rc1, rc2); stdoutyes=0; } else if((strncmp(mymsg,"clockshift ",11)==0)) { char halfns[20]; int ix,rc; unsigned int hns,cordeval,last_applied; /* char c; halfns[0]='\0'; for(ix=0; ix<40; ix++) { c= mymsg[11+ix]; if((c=='\0') || (c=='\n')) { halfns[ix]= '\0'; break; }; halfns[ix]= c; }; halfns[20]= '\0';*/ ix= sscanf(&mymsg[11], "%d %d %d\n", &hns, &cordeval, &last_applied); if( (ix<2) || (hns>63) || (cordeval>1023) ) { printf("ERROR set clockshift %d %d incorrect, not updated.\n",hns, cordeval); } else { //int csclients; sprintf(halfns, "%d %d %d", hns, cordeval, last_applied); rc= writedbfile("clockshift", halfns); // 2ints: halfns cordereg //csclients= dis_update_service(CSid); is not here printf("INFO set clockshift %s. rc(=chars):%d \n", halfns, rc); }; stdoutyes=0; } else if((strncmp(mymsg,"rcfg ",5)==0)) { // moved to DOrcfg() printf("ERROR rcfg cmd ignored (processed by CTPRCFG cmd\n"); stdoutyes=0; } else if((strncmp(mymsg,"resetclock",9)==0)) { ; }; if(strcmp(mymsg,"\n")==0) { //stopserving(); myprtLog("Quitting server..."); printf("stop\n"); fflush(stdout); //sleep(1); //exit(0); }; if(stdoutyes==1) { /* pcfg -prepare .pcfg (parted.py) - scp .pcfg rcfg partName NNN clu1 clu2 ... clu6 cl1 ... clNCLASS NewLine -prepare .rcfg (parted.py) - smaqmv */ printf("%s",mymsg); fflush(stdout); }; }
/*--------------------*/ void DOrcfg(void *tag, void *bmsg, int *size) { // bmsg: binary message TDAQInfo TDAQInfo *dain; int rc; unsigned int rundec; char pname[40]; //printf("INFO DOrcfg len:%d %lu\n", *size,sizeof(TDAQInfo)); if(*size != sizeof(TDAQInfo)){ char emsg[ERRMSGL]; sprintf(emsg, "DOrcfg: Structure dim size different from command size."); infolog_trg(LOG_FATAL, emsg); printf("ERROR %s\n", emsg); return ; } dain= (TDAQInfo *)bmsg; //printTDAQInfo(dain); printf("INFO DOrcfg msg:%s", dain->run1msg); rc= getname_rn(dain->run1msg, pname, &rundec); if(check_xcounters()) return; if(rc==0) { //printf("INFO effiout:0x%x\n", effiout); /*new from aug2015: effiout: bit pattern of inp. detectors effectively filtered out not used: prepared if DAQ wants in future 'per cluster' -in that case 'per cluster' info -should by passed in TDAQInfo structure from ctp proxy (now it is not) or -somehow, pydimserver.py should deliver 'per cluster' (now delivering 'per partition') red_update_detsinrun() invoked also in following call */ rc= daqlogbook_update_clusters(rundec, pname, dain, ignoreDAQLOGBOOK); //, effiout); printf("INFO Dorcfg rc=%i \n",rc); //printf("%s",dain->run1msg); fflush(stdout); moved down if(rc==0) { // inputs -> DAQ int level,maxinp,ix,ind,rcu; for(level=0; level<3; level++) { if(level==2) {maxinp=12; } else {maxinp=24; } for(ix=0; ix<maxinp; ix++) { ind= findInput(level, ix+1); if(ind==-1) continue; if(ignoreDAQLOGBOOK) { rcu=0; //printf("INFO L%d.%d %s\n", level, ix+1, validCTPINPUTs[ind].name); } else { rcu= daqlogbook_insert_triggerInput(rundec, ix+1, validCTPINPUTs[ind].name, level); printf("INFO L%d.%d %s\n", level, ix+1, validCTPINPUTs[ind].name); }; if(rcu != 0) { char emsg[ERRMSGL]; sprintf(emsg, "daqlogbook_insert_triggerInput(%d,%d,%s,%d) rc:%d", rundec,ix+1, validCTPINPUTs[ind].name, level, rcu); infolog_trg(LOG_FATAL, emsg); printf("ERROR %s\n", emsg); break; }; }; }; printf("%s",dain->run1msg); fflush(stdout); } else { char emsg[ERRMSGL]; sprintf(emsg,"DAQlogbook_update_cluster failed. rc:%d", rc); infolog_trgboth(LOG_FATAL, emsg); }; }; }
/*--------------------------------------------------- main */ int main(int argc, char **argv) { int rc,grc=0; //char *cs; char command[40]; char servername[40]; char cmd[80]; setlinebuf(stdout); if(argc!=3) { printf("ERROR: Usage: linux/server servername command\n"); return(8); }; infolog_SetFacility("CTP"); infolog_SetStream("",0); strcpy(servername, argv[1]); strcpy(command, argv[2]); sprintf(cmd, "%s/%s", servername, command); // CTPRCFG/RCFG // following line has to be 1st line printed! printf("DIM server:%s cmd:%s\n", servername, command); // should be 1st line reset_insver(); /*cs=*/ readCS(); rc= readAliases(); if(rc==-1) { char emsg[200]; strcpy(emsg,"aliases info from aliases.txt not updated correctly"); infolog_trg(LOG_ERROR, emsg); printf("ERROR %s\n",emsg); }; cshmInit(); readTables(); // + when ctpprxy restarted, i.e. in time of rcfgdel 0 ALL printf("INFO ctpshmbase1:%p\n", ctpshmbase); ctpc_clear(); ctpc_print(CNAMESString); //updateCNAMES(); rc= getINT12fromcfg(INT1String, INT2String, MAXINT12LINE); printf("INFO rc:%d INT1:%s INT2:%s\n", rc, INT1String, INT2String); rc= mydbConnect(); dis_add_error_handler(error_handler); dis_add_exit_handler(exit_handler); dis_add_client_exit_handler (client_exit_handler); // commands: CTPRCFGRCFGid= dis_add_cmnd(cmd,"C", DOcmd, 88); printf("INFO DIM cmd:%s id:%d\n", cmd, CTPRCFGRCFGid); sprintf(cmd, "%s", servername); // CTPRCFG binary (after LS1) RCFG request CTPRCFGid= dis_add_cmnd(cmd,NULL, DOrcfg, 89); printf("INFO DIM cmd:%s id:%d\n", cmd, CTPRCFGid); sprintf(cmd, "%s/LTUCFG", servername); // LTUCFG binary (after LS1) LTUCFGid= dis_add_cmnd(cmd,NULL, DOltucfg, 90); printf("INFO DIM cmd:%s id:%d\n", cmd, LTUCFGid); sprintf(cmd, "%s/COM2DAQ", servername); // CTPRCFG/COM2DAQ C2Did= dis_add_cmnd(cmd,"C", DOcom2daq, 91); printf("INFO DIM cmd:%s id:%d\n", cmd, C2Did); sprintf(cmd, "%s/SETBM", servername); // CTPRCFG/SETBM SETBMid= dis_add_cmnd(cmd,"C", DOsetbm, 92); printf("INFO DIM cmd:%s id:%d\n", cmd, SETBMid); /* sprintf(cmd, "%s/FSUPDATE", servername); // CTPRCFG/FSUPDATE FSUid= dis_add_cmnd(cmd,NULL, DOfsupdate, 92); printf("INFO DIM cmd:%s id:%d\n", cmd, FSUid); */ // services: sprintf(cmd, "%s/INT1", servername); // CTPRCFG/INT1 INT1id=dis_add_service(cmd,"C:99", INT1String, MAXINT12LINE, NULL, 4567); printf("INFO DIM service:%s id:%d\n", cmd, INT1id); sprintf(cmd, "%s/INT2", servername); // CTPRCFG/INT2 INT2id=dis_add_service(cmd,"C:99", INT2String, MAXINT12LINE, NULL, 4568); printf("INFO DIM service:%s id:%d\n", cmd, INT2id); sprintf(cmd, "%s/CS", servername); // CTPRCFG/CS CSid=dis_add_service(cmd,"C", CSString, MAXCSString, CScaba, 4569); printf("INFO DIM service:%s id:%d\n", cmd, CSid); sprintf(cmd, "%s/CNAMES", servername); // CTPRCFG/CNAMES CNAMESid=dis_add_service(cmd,"C", CNAMESString, MAXCNAMESString, CNAMEScaba, 4570); printf("INFO DIM service:%s id:%d\n", cmd, CNAMESid); dis_start_serving(servername); while(1) { char *frc; #define MAXLINECS 8000 char line[MAXLINECS]; //80 chars per class for NCLASS classes //sleep(10); frc= fgets(line, MAXLINECS, stdin); if(frc==NULL) break; if(strncmp(line,"quit",4)==0) { break; } else if(strncmp(line,"class ",6)==0) { int rcdaq; printf("INFO igDAQLOGBOOK:%d line:%s",ignoreDAQLOGBOOK, line); /* from 28.5.2013: DAQlogbook opened/closed when ctp_proxy restarted rcdaq= daqlogbook_open(); if(rcdaq==-1) { printf("ERROR DAQlogbook_open failed\n"); } else { if(ignoreDAQLOGBOOK==0) { rcdaq= updateDAQDB(line); if(rcdaq!=0) { printf("ERROR updateDAQLOGBOOK failed. rc=%d\n", rcdaq); }; rcdaq= daqlogbook_close(); if(rcdaq==-1) { printf("ERROR DAQlogbook_close failed\n"); }; }; };*/ rcdaq= updateDAQDB(line); if(rcdaq!=0) { printf("ERROR updateDAQLOGBOOK failed. rc=%d\n", rcdaq); }; } else if(strncmp(line,"inpupd ",7)==0) { update_ctpins(line); } else if(strncmp(line,"indets ",7)==0) { int ix, ix1, runnumb; char *efstart; ix1= sscanf(&line[7], "%d ", &runnumb); efstart= strstr(&line[7], "0x"); // indets runN 0xeffiout 0xindets ix= sscanf(efstart, "0x%x 0x%x\n", &effiout, &indets); printf("INFO ix1:%d runnumb:%d ix:%d effiout:0x%x indets:0x%x\n", ix1, runnumb, ix, effiout, indets); fflush(stdout); //rcupd= updeff_insver(runnumb, effiout); } else if(strncmp(line,"cmd ",4)==0) { int unsigned ix,rcsystem; for(ix=0; ix<strlen(line); ix++) { if(line[ix]=='\n'){ line[ix]='\0'; break; }; }; rcsystem= system(&line[4]); printf("INFO rc:%d cmd:%s\n", rcsystem, &line[4]); continue; } else { printf("ERROR %s", line); fflush(stdout); }; }; rc= daqlogbook_close(); if(rc==-1) { printf("ERROR DAQlogbook_close failed\n"); }; mydbDisconnect(); stopserving(); cshmDetach(); printf("INFO shm detached.\n"); return(grc); }
int main(int argc, char **argv) { TRBIF *grbif=NULL; int rc=0; FILE *cfgfile; char *env; char fnpath[MAXNAMELENGTH+40]; char pname[MAXNAMELENGTH]; char errmsg[300]=""; if(argc<=1) { printf("./main_TRBIF part_name\n"); return 1; } else { strcpy(pname, argv[1]); }; infolog_SetFacility("CTP"); infolog_SetStream("",0); cshmInit(); //setglobalflags(argc, argv); //if((rc=ctp_Initproxy())!=0) exit(8); rc= vmeopen("0x820000", "0xd000"); if(rc!=0) { printf("vmeopen CTP vme:%d\n", rc); exit(8); }; printf("main_TRBIF...\n"); checkCTP(); /* check which boards are in the crate - ctpboards */ readTables(); // enough only in ctp_proxy env= getenv("dbctp"); /*strcpy(fnpath, env); strcat(fnpath, "../pardefs/"); strcat(fnpath, pname); strcat(fnpath, ".pcfg"); */ sprintf(fnpath, "%s/../pardefs/%s.pcfg", env, pname); printf(":opening:%s:\n",fnpath); cfgfile=fopen(fnpath,"r"); while(1) { TRBIF *rcgrbif=NULL; char *okstr; char line[MAXLINECFG]; okstr= fgets(line, MAXLINECFG,cfgfile); if(okstr==NULL) break; if(strncmp("RBIF",line,4) == 0){ grbif=RBIF2Partition(line,grbif); if(grbif == NULL) { sprintf(errmsg,"ParseFile: RBIF2Partition error. line:%s",line); rc= 1; }; } else if(strncmp("L0F34",line, 5) == 0){ //rcgrbif= L0342Partition(line, grbif); if(rcgrbif == NULL) { sprintf(errmsg,"ParseFile: L0342Partition error."); rc= 1; }; }; }; fclose(cfgfile); vmeclose(); if(errmsg[0]!='\0') { infolog_trg(LOG_ERROR, errmsg); } else { //char m4[LEN_l0f34+1]; //printTRBIF(grbif); //combine34(grbif->lut34, m4); }; return(rc); }