/*-----------------------------------------------*/ void newclock(void *tag) { /* this thread started with 2 events( only 1 available in one time): - clock change - DLL_RESYNC */ printf("newclock thread started. clocktran:%d tag:%d quit:%d\n", clocktran, *(int *)tag, quit); fflush(stdout); while(clocktran>=0) { int nclients; nclients= dis_update_service(MICLOCK_TRANSITIONid); printf("updated MICLOCK_TRANSITION clients:%d clocktran:%d\n", nclients, clocktran); if(clocktran==0) break; dtq_sleep(SLOT_S); clocktran--; sprintf(clocktransition,"%d", clocktran); if(clocktran==0) { if(*(int *)tag==0) { /*int rc; char cmd[]="$VMECFDIR/ttcmidaemons/sctel.py MININF"; DLL_RESYNC(DLL_info); // commented 19092014 //printf("DLL_RESYNC + clearing the scope persistance\n"); rc= system(cmd); commented 19092014 printf("DLL_RESYNC + MININF not done!\n"); */ DLL_RESYNC(DLL_info); } else { setbcorbit(*(int *)tag); nclients= dis_update_service(MICLOCKid); printf("updated MICLOCK clients:%d\n", nclients); }; }; if(quit==1) clocktran=0; }; }
int update_qpll() { int rc,rcret=0; w32 stat; //int mainerr,mainlck,bc1err,bc1lck; char buffer[50]; if(envcmp("VMESITE", "ALICE")==0) { if(micratepresent()& 0x2) { stat= readstatus(); } else { stat=0xfff; }; // update freqs: if(micratepresent()& 0x1) { getRFRX(vspRFRX[0], rfrx1); getRFRX(vspRFRX[1], rfrx2); freqs[0]= rfrx1[2].freq; freqs[1]= rfrx2[2].freq; freqs[2]= rfrx1[1].freq; freqs[3]= rfrx2[1].freq; }; //printf("ref bc1 orbit1\n"); printf("--- bc2 orbit2\n"); } else { /* simulate change: stat= qpllstat+1; rfrx1[2].freq= rfrx1[2].freq + 1; rfrx2[2].freq= rfrx2[2].freq + 1; rfrx1[1].freq= rfrx1[1].freq + 10; rfrx2[1].freq= rfrx2[1].freq + 10; */ ; // do not change }; if((freqs[0] != rfrx1[2].freq) || (freqs[1] != rfrx2[2].freq) || (freqs[3] != rfrx1[1].freq) || (freqs[4] != rfrx2[1].freq) ) { rc= dis_update_service(FREQSid); }; //stat=qpllstat+1; //simulate change if(stat != qpllstat) { char msg[100]; qpllstat= stat; sprintf(qpllnow,"%3.3x", qpllstat); rc= dis_update_service(QPLLid); if((stat | REF_MASK) != (qpllstat | REF_MASK)) { sprintf(msg, "QPLL update (ref ignored here) rc:%d qpllstat:0x%x", rc,qpllstat); prtLog(msg); }; /* mainerr= (qpllstat & 0x2)>>1; mainlck= (qpllstat & 0x1); bc1err= (qpllstat & 0x80)>>7; bc1lck= (qpllstat & 0x40)>>6; sprintf(buffer, "mon ds006:ds007:ds008:ds009 N:%d:%d:%d:%d", mainerr, mainlck, bc1err, bc1lck); rc= udpsend(udpsock, (unsigned char *)buffer, strlen(buffer)+1); prtLog(buffer); */ }; nlogqpll++; if((nlogqpll % 36000)==0) { // 3600:log 1 per 2 hours char msg[100]; sprintf(msg, "qpllstat%d:0x%x", nlogqpll, qpllstat); prtLog(msg); }; if(quit!=0) rcret=10; return(rcret); }
/*-----------------------------------------------*/ void newclock(void *tag) { /* this thread started with 2 events( only 1 available in one time): - clock change - DLL_RESYNC */ rcnewclock= 888; newclockstarts++; printf("newclock thread started. clocktran:%d tag:%d quit:%d\n", clocktran, *(int *)tag, quit); fflush(stdout); while(clocktran>=0) { int nclients; nclients= dis_update_service(MICLOCK_TRANSITIONid); printf("updated MICLOCK_TRANSITION clients:%d clocktran:%d\n", nclients, clocktran); if(clocktran==0) break; dtq_sleep(SLOT_S); clocktran--; sprintf(clocktransition,"%d", clocktran); if(clocktran==0) { if(*(int *)tag==0) { /*int rc; char cmd[]="$VMECFDIR/ttcmidaemons/sctel.py MININF"; DLL_RESYNC(DLL_info); // commented 19092014 //printf("DLL_RESYNC + clearing the scope persistance\n"); rc= system(cmd); commented 19092014 printf("DLL_RESYNC + MININF not done!\n"); */ DLL_RESYNC(DLL_info); } else { #define reslen 3200 int rc; char server[24]; char cmd[80]; char result[reslen]; if(envcmp("VMESITE", "ALICE")==0) { strcpy(server, getenv("SERVER_NODE")); } else { strcpy(server, "adls"); }; infolog_trgboth(LOG_WARNING, "ALICE clock changed, restaring ctpproxy (25s)..."); sprintf(cmd, "ssh trigger@%s ctpproxy.py restart nomasks", server); setbcorbit(*(int *)tag); nclients= dis_update_service(MICLOCKid); printf("updated MICLOCK clients:%d\n", nclients); //printf("updated MICLOCK clients:%d, now ctpproxy.py restart nomasks...\n", nclients); rc= popenread(cmd, result, reslen); if(rc==EXIT_FAILURE) { printf("ERROR cmd:%s rc:%d\n", cmd, rc); } else { printf("result(len:%d):%s\n", strlen(result), result); }; }; }; if(quit==1) clocktran=0; }; clocktran_s=0; rcnewclock= 0; }
---------------------------------------*/ int setbcorbit(int tag) { int rc; char buffer[50]; printf("setting ttcmi clock:%d\n", tag); if(micratepresent()==0) { #define MAXdbhns 40 char dbhns[MAXdbhns]; int ldbhns; ldbhns= readclockshift(dbhns, MAXdbhns); printf("mi crate not present. readclockshift:%d:%s:\n", ldbhns,dbhns); if(tag==1) {bcmvme=3; omvme=0; } else if(tag==2) {bcmvme=2; omvme=1; } else if(tag==3) {bcmvme=1; omvme=2; } else if(tag==4) {bcmvme=0; omvme=2; } else { printf("novme setbcorbit: bad tag:%d bcmvme:%x omvme:%x\n", tag, bcmvme, omvme); return(0); }; } else { setbcorbitMain(tag); }; rc= dis_update_service(SHIFTid); printf("TTCMI/SHIFT updated for %d clients\n", rc); sprintf(buffer, "mon ds005 N:%d", tag); rc= udpsend(udpsock, (unsigned char *)buffer, strlen(buffer)+1); getclocknow(); return(tag); }
/*-----------------*/ 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); }; }
/*------------------*/ void refresh(void *tag, void *msgv, int *size) { Tenablemsg *msg= (Tenablemsg *)msgv; int nclients,ixt; char base[12]; ixt= findbase(msg->name, base); //HW_enable(base, msg->mask); nclients= dis_update_service(fanis[ixt].dimserid); printf("refresh: name:%s size:%d updated clients:%d\n", msg->name, *size, nclients); fflush(stdout); }
int main(void) { DIR *dir; struct dirent *dirent; char dev[16]; // Dev ID char devPath[128]; // Path to device char buf[256]; // Data from device char tmpData[6]; // Temp C * 1000 reported by device char path[] = "/sys/bus/w1/devices"; ssize_t numRead; (void) signal(SIGINT, ex_program); intializeDIM(); // initialiseDb("/usr/local/lib/dbd","/data/online/TemperatureLogger","TC08_temperatures.sqlite"); dir = opendir (path); if (dir != NULL) { while ((dirent = readdir (dir))) // 1-wire devices are links beginning with 10- if (dirent->d_type == DT_LNK && strstr(dirent->d_name, "10-") != NULL) { strcpy(dev, dirent->d_name); printf("\nDevice: %s\n", dev); } (void) closedir (dir); } else { perror ("Couldn't open the w1 devices directory"); return 1; } // Assemble path to OneWire device sprintf(devPath, "%s/%s/w1_slave", path, dev); // Read temp continuously // Opening the device's file triggers new reading while(1) { int fd = open(devPath, O_RDONLY); if(fd == -1) { perror ("Couldn't open the w1 device."); return 1; } while((numRead = read(fd, buf, 256)) > 0) { strncpy(tmpData, strstr(buf, "t=") + 2, 5); float tempC = strtof(tmpData, NULL); printf("Device: %s - Temp: %.3f C \n", dev,tempC / 1000); FormatedData = tempC / 1000; dis_update_service(ServiceId); } usleep(1000000); close(fd); } return 0; }
/*--------------------*/ 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 updateCNAMES() { int nclients; ctpc_print(CNAMESString); nclients= dis_update_service(CNAMESid); printf("INFO CNAMES update for %d clients\n", nclients); }