#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ilc_sru.h" #include "typedefs.h" //#define __DEBUG_DCS //#define __DEBUG #define CONFIG_MAXLINE 512 #define IPEXPR "([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})" // CPLD regs. int mcm_adcclkdiv = 0; int mcm_lgsen = 0; int mcm_addr = 0; // int mcm_toti_h = 0; // Not used atm // int mcm_thyst_h = 0; // Not used atm int mcm_saltrochmask0 = 0; int mcm_saltrochmask1 = 0; int mcm_saltrochmask2 = 0; int mcm_saltrochmask3 = 0; int mcm_saltrochmask4 = 0; int mcm_saltrochmask5 = 0; int mcm_saltrochmask6 = 0; int mcm_saltrochmask7 = 0; int mcm_saltroctrl = 0; int psscan_mode = 0; int psscan_value = 0xB1; int psscan_channel = 0; unsigned int psscan_argument = 0; int chklimits(int value, int minval, int maxval) { if (value < minval) return 1; if (value > maxval) return 2; return 0; } void chartohex(char *buffer,int *buf) { int i; int num = 0, tot = 0, base = 1; for (i=7;i>=0;i--){ buffer[i] = toupper(buffer[i]); if (buffer[i] < '0' || buffer[i] > '9'){ if (buffer[i] > 'F') buffer[i] = 'F'; num = buffer[i] - 'A'; num += 10; } else num = buffer[i] - '0'; tot += num*base; base *= 16; } *buf = tot; } int validateIpAddress(char *ipaddress) { struct sockaddr_in sa; int result; result = inet_pton(AF_INET, ipaddress, &(sa.sin_addr)); return result; } /* Check response of each MCM - also those not set to be read */ unsigned int mcmRespondCheck(int handle,SRUSERVER *srv,unsigned int *nodesresponding) { FILE *fout; unsigned int dtcnode = 1; int nodeserror = 0; unsigned int value; int err; int j; *nodesresponding = 0; fout = fopen("/tmp/mcmrespondcheck.sru","w"); if (fout != NULL) fprintf(fout,"%s: %s\n",__FUNCTION__,srv->controlip); for (j = 0; j < FEC_RCU; j++) { value = 0; err = mcmReadRegister(handle,srv,j,MCM_REG_FMVER,&value); if (fout != NULL) { fprintf(fout,"NODE: %08X\n",dtcnode); fprintf(fout,"REGI: %08X\n",MCM_REG_FMVER); fprintf(fout,"VALU: %08X\n",value); fprintf(fout,"ERRO: %d\n",err); fprintf(fout,"----\n"); } if (err == 0) { if (value != 0) *nodesresponding |= dtcnode; } else { nodeserror |= dtcnode; } dtcnode = dtcnode << 1; } if (fout != NULL) fclose(fout); return 0; } // Set acl in MCM int mcmWriteActiveChannels(int handle,SRUSERVER *srv, int node, unsigned int *acl) { int j; int ret; unsigned int altrordomask; for ( j = 0; j <= 7; j++) { altrordomask = ~acl[j] & 0xFFFF; ret = mcmWriteRegister(handle,srv,node,MCM_REG_SALTROCHMASK0 + j,altrordomask); if (ret != 0) return ret; } return 0; } int sruWriteActiveChannels(int handle,SRUSERVER *srv, int node, unsigned int *acl) { int j; unsigned int altrordomask; int wrptr; int nbwrites = 0; unsigned int buf[128]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); wrptr = 0; if (node >= 20) { buf[wrptr++] = htonl(1 << (node - 20)); buf[wrptr++] = 0; } else { buf[wrptr++] = 0; buf[wrptr++] = htonl(1 << node); } for ( j = 0; j <= 7; j++) { altrordomask = ~acl[j] & 0xFFFF; buf[wrptr++] = htonl(MCM_REG_SALTROCHMASK0 + j); buf[wrptr++] = htonl(altrordomask); nbwrites++; } s_bytes = (wrptr << 2); if ( (s_sent = sendto(handle, buf, s_bytes, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } usleep(SRU_WAIT_WRITE * nbwrites); // wait after write to allow SRU to execute commands return 0; } int mcmReadActiveChannels(int handle,SRUSERVER *srv, int node, unsigned int *acl) { int j; int ret; unsigned int altrordomask; for ( j = 0; j <= 7; j++) { ret = mcmReadRegister(handle,srv,node,MCM_REG_SALTROCHMASK0 + j,&altrordomask); if (ret != 0) return ret; acl[j] = ~altrordomask & 0xFFFF; } return 0; } int mcmLoadPca16(int handle,SRUSERVER *srv,unsigned int nodes, unsigned int pasactrl, unsigned int *error) { int n; int nberr = 0; int ret1; *error = 0; for (n = 0; n <= 31; n++) { if ((nodes & (1 << n)) != 0) { ret1 = mcmWriteRegister(handle,srv,n,MCM_REG_SALTROCTRL,pasactrl | 0x300); // reset and bias are high if (ret1 != 0) { nberr++; *error |= (1 << n); #ifdef __DEBUG_MCM printf("%s: mcmWriteRegister node %d error %d\n",__FUNCTION__,n,ret1); #endif } } } return nberr; } int mcmVerifyPca16(int handle,SRUSERVER *srv,unsigned int nodes, unsigned int pasactrl, unsigned int *error) { int n; int nberr = 0; int ret1; unsigned int value; *error = 0; for (n = 0; n <= 31; n++) { if ((nodes & (1 << n)) != 0) { ret1 = mcmReadRegister(handle,srv,n,MCM_REG_SALTROCTRL,&value); if (ret1 != 0) { nberr++; *error |= (1 << n); #ifdef __DEBUG_MCM printf("%s: mcmReadRegister node %d register %d error %d (%s)\n",__FUNCTION__,n,MCM_REG_SALTROCTRL,ret1,strerror(errno)); #endif } else if ((value & 0xFF) != pasactrl) { // bit 8 = bias, 9 = global reset in value read nberr++; *error |= (1 << n); #ifdef __DEBUG_MCM printf("%s: mcmReadRegister node %d register %d read %X expected %X\n",__FUNCTION__,n,MCM_REG_SALTROCTRL,value,pasactrl); #endif } } } return nberr; } /* load which mcm to enable from the RU */ int sruLoadReadoutList(int handle,SRUSERVER *srv, unsigned int fecpower) { unsigned int dtcrdomask1; unsigned int dtcrdomask1r; unsigned int dtcrdomask2; unsigned int dtcrdomask2r; FILE *fout; int err; dtcrdomask1 = ~fecpower & 0xFFFFF; dtcrdomask1 &= 0xFFFFF; dtcrdomask2 = ~(fecpower >> 20); dtcrdomask2 &= 0xFFFFF; if ((fout = fopen("/tmp/readout.sru","w")) == NULL) return ERR_NOSUCHFILE; fprintf(fout,"%s\n",srv->controlip); fprintf(fout,"%08X\n%08X\n",NODESEL_SRU,0); fprintf(fout,"%08X\n%08X\n",SRU_REG_DTCRDOMASK1,dtcrdomask1); fprintf(fout,"%08X\n%08X\n",SRU_REG_DTCRDOMASK2, dtcrdomask2); fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCRDOMASK1,0); fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCRDOMASK2,0); fclose(fout); err = sruWriteRegister(handle,srv,SRU_REG_DTCRDOMASK1,dtcrdomask1); if (err != 0) return err; err = sruWriteRegister(handle,srv,SRU_REG_DTCRDOMASK2,dtcrdomask2); if (err != 0) return err; err = sruReadRegister(handle,srv,SRU_REG_DTCRDOMASK1,&dtcrdomask1r); if (err != 0) return err; err = sruReadRegister(handle,srv,SRU_REG_DTCRDOMASK2,&dtcrdomask2r); if (err != 0) return err; if (dtcrdomask1 != dtcrdomask1r) return dtcrdomask1r; if (dtcrdomask2 != dtcrdomask2r) return dtcrdomask2r; return 0; } int sruReadActiveMcm(int handle,SRUSERVER *srv, unsigned int *fecpower) { unsigned int dtcrdomask1r; unsigned int dtcrdomask2r; int err; *fecpower = 0; err = sruReadRegister(handle,srv,SRU_REG_DTCRDOMASK1,&dtcrdomask1r); if (err != 0) return err; err = sruReadRegister(handle,srv,SRU_REG_DTCRDOMASK2,&dtcrdomask2r); if (err != 0) return err; *fecpower = ((dtcrdomask2r & 0xFFF) << 20) | (dtcrdomask1r & 0xFFFFF); return 0; } int readSruReadoutList(char *filename,SRU_SETTINGS *sru, int id) { char *saveptr; char *pos,*arg; char tline[CONFIG_MAXLINE]; FILE *inf; int lnum = 0; int iarg; int i1,i2,j; int sruid = -1; int fec_id = -1; int altro_id = -1; // printf("%s readout list: %s\n",__FUNCTION__,filename); if ((inf = fopen(filename,"r")) == NULL) return -1; fgets(tline, CONFIG_MAXLINE, inf); while(!feof(inf)) { lnum++; pos = strtok_r(tline," \t\n",&saveptr); if (pos != NULL) { /* skip dummy lines */ if (*pos != '#') { /* skip commented lines */ if ((arg = strtok_r(NULL," \t\n",&saveptr)) != NULL) { // printf("%s: 1 %s%s\n",__FUNCTION__,pos,arg); if (!strcmp(pos,"SRU.ID")) { // printf("%s: 2 %s %s\n",__FUNCTION__,pos,arg); iarg = atoi(arg); if (chklimits(iarg,0,SRU_MAX_ID) != 0) { fclose(inf); lnum |= (1 << 16); return lnum; } if (id == iarg) { sruid = iarg; sru->sruid = sruid; } else { fclose(inf); lnum |= (2 << 16); return lnum; } } else if (sruid < 0) { fclose(inf); lnum |= (3 << 16); return lnum; } else if(!strcmp(pos,"SRU.POWER")) { sscanf(arg,"%X",&iarg); sru->power = iarg; } else if(!strcmp(pos,"SRU.READOUT")) { sscanf(arg,"%X",&iarg); sru->readout = iarg; } else if(!strcmp(pos,"SRU.ACL")) { sscanf(arg,"%X",&iarg); sru->defacl = iarg & 0xFFFF; } else if(!strcmp(pos,"FEC.ID")) { iarg = atoi(arg); if ((iarg < 0) || (iarg >= FEC_RCU)) { fclose(inf); lnum |= (4 << 16); return lnum; } fec_id = iarg; /* Default readout list */ if (sru->readout & ( 1 << fec_id)) { i1 = fec_id * ALTRO_FEC; i2 = i1 + ALTRO_FEC; for (j = i1; j < i2; j++) sru->acl[j] = sru->defacl; } } else if(!strcmp(pos,"ALTRO.ID")) { if (fec_id < 0) { fclose(inf); lnum |= (5 << 16); return lnum; } iarg = atoi(arg); if ((iarg < 0) || (iarg >= ALTRO_FEC)) { fclose(inf); lnum |= (6 << 16); return lnum; } altro_id = iarg; } else if(!strcmp(pos,"ALTRO.ACL")) { if ((fec_id < 0) || (altro_id < 0)) { fclose(inf); lnum |= (7 << 16); return lnum; } if (sru->readout & ( 1 << fec_id)) { sscanf(arg,"%X",&iarg); i1 = fec_id * ALTRO_FEC + altro_id; sru->acl[i1] = iarg; } } else { fclose(inf); lnum |= (8 << 16); return lnum; } } else { fclose(inf); lnum |= (9 << 16); return lnum; } } } fgets(tline,CONFIG_MAXLINE,inf); } fclose(inf); return 0; } int dumpSruReadoutList(SRU_SETTINGS *sr) { int i1,i2,j,k; FILE *outf; char outfile[512]; sprintf(outfile,"/tmp/rcu_%d-dump.cfg",sr->sruid); outf = fopen(outfile,"w"); if (outf == NULL) return -1; fprintf(outf,"SRU.ID %d\n",sr->sruid); fprintf(outf,"SRU.POWER %X\n",sr->power); fprintf(outf,"RCU.READOUT %X\n",sr->readout); // fprintf(outf,"RCU.ACL %X\n",sr->defacl); // fprintf(outf,"RCU.ZSUP %X\n",sr->defzsup); // fprintf(outf,"RCU.PEDSUB %X\n",sr->defpedsub); for (j =0; j < FEC_RCU; j++) { fprintf(outf,"FEC.ID %d\n",j); // fprintf(outf,"FEC.ZSUP %X\n",rs->zsup[j]); // fprintf(outf,"FEC.PEDSUB %X\n",rs->pedsub[j]); i1 = j * ALTRO_FEC; i2 = i1 + ALTRO_FEC; for (k = i1; k < i2; k++) { fprintf(outf,"ALTRO.ID %d\n",k); fprintf(outf,"ALTRO.ACL %X\n",sr->acl[k]); } } fclose(outf); return 0; } int writeSruActiveFile(char *filename,SRU *srv) { int i; FILE *fout; if ((fout = fopen(filename,"w")) == NULL) return ERR_NOSUCHFILE; fprintf(fout,"SRU.CONTROL.PORT\t%d\n",srv->controlport); fprintf(fout,"SRU.LISTEN.PORT\t%d\n",srv->listenport); fprintf(fout,"SRU.BROADCAST.IP\t%d\n",srv->listenport); for (i = 0; i <= SRU_MAX_ID; i++) { fprintf(fout,"SRU.ID\t%d\n",i); fprintf(fout,"SRU.STATUS\t%d\n",srv->sruserver[i].status); fprintf(fout,"SRU.ACTIVE\t%d\n",srv->sruserver[i].active); fprintf(fout,"SRU.LINKUP\t%d\n",srv->sruserver[i].linkup); fprintf(fout,"SRU.CONTROL.IP\t%s\n",srv->sruserver[i].controlip); fprintf(fout,"SRU.READOUT.IP\t%s\n",srv->sruserver[i].readoutip); } fclose(fout); return 0; } void dumpServerConfig(FILE *fout,SRU *srv) { int i; fprintf(fout,"SRUID\tSTATUS\tLINKUP\tACTIVE\tCONTROLIP\tPORT\tLISTEN\tREADOUTIP\n"); for (i = 0; i <= SRU_MAX_ID; i++) { fprintf(fout,"%d\t%d\t%d\t%d\t%s\t%d\t%d\t%s\n", i, srv->sruserver[i].status, srv->sruserver[i].linkup, srv->sruserver[i].active, srv->sruserver[i].controlip, srv->controlport, srv->listenport, srv->sruserver[i].readoutip); } } /* Routine that returns the (last) ipnumber and broadcas number for the given interface */ int findip(char *interface, char *ipaddress, char *bcaddress) { struct ifaddrs *ifaddr, *ifa; int s; int iffound = 0; if (getifaddrs(&ifaddr) == -1) { return errno; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; if((strcmp(ifa->ifa_name,interface)==0)&&(ifa->ifa_addr->sa_family==AF_INET)) { s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),ipaddress, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { return errno; } s=getnameinfo(ifa->ifa_broadaddr,sizeof(struct sockaddr_in),bcaddress, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { return errno; } iffound++; } } freeifaddrs(ifaddr); if (iffound != 1) return -(1+iffound); return 0; } int readServerConfig(char *filename, SRU *srv) { char *pos,*arg,*part1; int lnum = 0; int iarg; int sruid; char tline[512]; FILE *inf; regex_t re; unsigned int var1,var2,var3,var4; strcpy(srv->broadcastip,LOCAL_IP); strcpy(strrchr(srv->broadcastip,'.'),".255"); if ((inf = fopen(filename,"r")) == NULL) return ERR_NOSUCHFILE; fgets(tline, 512, inf); sruid = -1; while(!feof(inf)) { lnum++; pos = strtok(tline," \t\n"); if (pos != NULL) { /* skip dummy lines */ if (*pos != '#') { /* skip commented lines */ part1 = pos; if (!strcmp(part1,"SRU.ID")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; sruid = atoi(arg); if (chklimits(sruid,0,3) != 0) return lnum; } else if (sruid < 0) { if (!strcmp(part1,"SRU.CONTROL.PORT")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; iarg = atoi(arg); if (chklimits(iarg,0,0xFFFF) != 0) return lnum; srv->controlport = iarg; } else if (!strcmp(part1,"SRU.LISTEN.PORT")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; iarg = atoi(arg); if (chklimits(iarg,0,0xFFFF) != 0) return lnum; srv->listenport = iarg; } else if (!strcmp(part1,"SRU.READOUT.PORT")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; iarg = atoi(arg); if (chklimits(iarg,0,0xFFFF) != 0) return lnum; srv->readoutport = iarg; } else if (!strcmp(part1,"SRU.ROINIT.PORT")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; iarg = atoi(arg); if (chklimits(iarg,0,0xFFFF) != 0) return lnum; srv->roinitport = iarg; } else if (!strcmp(part1,"SRU.BROADCAST.IP")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; if (validateIpAddress(arg) == 0) { return lnum; } strcpy(srv->broadcastip,arg); } else if (!strcmp(part1,"SRU.LOCAL.IF")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; strcpy(srv->interface,arg); } else { return ERR_NOSRUID; } } else if (!strcmp(part1,"SRU.CONTROL.IP")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; if (validateIpAddress(arg) == 0) { srv->sruserver[sruid].status = 0; return lnum; } strcpy(srv->sruserver[sruid].controlip,arg); } else if (!strcmp(part1,"SRU.READOUT.IP")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; if (validateIpAddress(arg) == 0) { srv->sruserver[sruid].status = 0; return lnum; } /* compile regular expression */ if(regcomp(&re, IPEXPR, REG_EXTENDED) != 0) { srv->sruserver[sruid].status = 0; return lnum; } if(regexec(&re,arg, 0, NULL, 0) != 0) { srv->sruserver[sruid].status = 0; return lnum; } strcpy(srv->sruserver[sruid].readoutip,arg); sscanf(arg, "%d.%d.%d.%d", &var1, &var2, &var3, &var4); srv->sruserver[sruid].readoutipnb = (var1 << 24) + (var2 << 16) + (var3 << 8) + var4; } else if (!strcmp(part1,"SRU.STATUS")) { if ((arg = strtok(NULL," \t\n#")) == NULL) return lnum; iarg = atoi(arg); if (chklimits(iarg,0,1) != 0) return lnum; srv->sruserver[sruid].status = iarg; } } } fgets(tline, 512, inf); } return 0; } int sruReadFile(char *filename, char *ip, int *port, char *inbuf) { FILE *fin; int *buf,bytes=0; char buffer[100]; #ifdef __DEBUG printf("%s file %s\n",__FUNCTION__,filename); #endif if ((fin = fopen(filename,"r")) == NULL) return -1; memset(inbuf,0,SEND_BUFFER_SIZE); fgets(buffer,100,fin); snprintf(ip,100,"%s",strtok(buffer,"\n")); fgets(buffer,100,fin); *port = atoi(strtok(buffer,"\n")); buf = (int*)inbuf; while (fgets(buffer,100,fin) != NULL) { if (buffer[0] != '#') { chartohex(buffer,buf); *buf = htonl(*buf); buf++; bytes += 4; } } fclose(fin); return bytes; } int sruReceivePacket(SRU *srv) { int rlen; int j; int err = 0; struct sockaddr_in si_from; socklen_t si_fromlen=sizeof(si_from); unsigned char s_buffer[SEND_BUFFER_SIZE]; int packets = 0; int totlen = 0; totlen = 0; for (j = 0; j < srv->nbrdpackets; j++) { if ((rlen = recvfrom(srv->controlsocket, &s_buffer[totlen],SEND_BUFFER_SIZE, 0, (struct sockaddr *) &si_from, &si_fromlen))==-1) { err++; perror("sruReceivePacket"); } packets++; totlen += rlen; } printf("%d: Received packet length %d from %s: %d\n",packets,rlen, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); for (j = 0; j < totlen; j += 4) { printf("%02X %02X %02X %02X\n",s_buffer[j],s_buffer[j+1],s_buffer[j+2],s_buffer[j+3]); } srv->nbrdpackets = 0; return err; } int sruWriteBlock(int handle,SRUSERVER *srv,int node, unsigned int *inbuf, int length) { unsigned int *sbuf; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); s_bytes = 8 + (length << 2); sbuf = (unsigned int *)malloc((size_t) s_bytes); if (sbuf == NULL) { return -3; } if (node >= 20) { sbuf[0] = htonl(1 << (node - 20)); sbuf[1] = 0; } else { sbuf[0] = 0; sbuf[1] = htonl(1 << node); } memcpy(&sbuf[2],inbuf,length << 2); s_sent = sendto(handle, sbuf, s_bytes, 0, (struct sockaddr *)&srv->si_sru, s_length); free(sbuf); if (s_sent ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } return 0; } int sruWriteRegister(int handle,SRUSERVER *srv,int reg, unsigned int value) { unsigned int buf[4]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); buf[0] = htonl(NODESEL_SRU); buf[1] = 0; buf[2] = htonl(reg); buf[3] = htonl(value); s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } usleep(SRU_WAIT_WRITE); // wait after write to allow SRU to execute command return 0; } int sruReadRegister(int handle,SRUSERVER *srv,int reg, unsigned int *value) { unsigned int buf[20]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); struct sockaddr_in si_from; socklen_t si_fromlen=sizeof(si_from); int mynode,myreg; buf[0] = htonl(NODESEL_SRU); buf[1] = 0; buf[2] = htonl(reg | 0x80000000); buf[3] = 0; s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } if ((s_bytes = recvfrom(handle, buf,sizeof(buf), 0, (struct sockaddr *) &si_from, &si_fromlen))==-1) { return -3; } if (s_bytes != 12) { return -4; } if (si_from.sin_addr.s_addr == srv->si_sru.sin_addr.s_addr) { printf("%s: Received packet length %d from %s: %d\n",__FUNCTION__,s_bytes, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); } else { printf("%s: Received illegal packet length %d from %s: %d\n",__FUNCTION__,s_bytes, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); return -5; } mynode = ntohl(buf[0]); if (mynode != 41) { printf("%s: Received not expected node %08X expected %08X\n", __FUNCTION__,mynode,41); return -6; } myreg = ntohl(buf[1]); if (myreg != (reg | 0x80000000)) { printf("%s: Received not expected register %08X expected %08X\n", __FUNCTION__,myreg,reg | 0x80000000); return -7; } *value = ntohl(buf[2]); printf("%s: %08X %08X %08X\n",__FUNCTION__,mynode,myreg,*value); return 0; } int sruSendPacket(char *filename, int mysocket) { char s_server[100]; char s_buffer[SEND_BUFFER_SIZE]; int s_port; int s_bytes; int s_sent; struct sockaddr_in s_sru; socklen_t s_length=sizeof(s_sru); // TEST #ifdef __DEBUG int udpport; #endif char from[512]; struct sockaddr_in sockaddr; s_server[0] = '\0'; s_bytes = sruReadFile(filename,s_server,&s_port,s_buffer); #ifdef __DEBUG printf("SERV %s port %d\n",s_server,s_port); #endif if (s_bytes <= 0) return -5; memset((char *) &s_sru, 0, sizeof(s_sru)); s_sru.sin_family = AF_INET; s_sru.sin_port = htons(s_port); if (inet_aton(s_server, &s_sru.sin_addr)==0) { fprintf(stderr, "inet_aton() failed\n"); return -2; } if ( (s_sent = sendto(mysocket, s_buffer, s_bytes, 0, (struct sockaddr *) &s_sru, s_length)) ==-1) { return -3; } getsockname(mysocket,(struct sockaddr *) &sockaddr, &s_length); inet_ntop(AF_INET, &sockaddr.sin_addr,from,sizeof(from)); #ifdef __DEBUG udpport = ntohs(sockaddr.sin_port); printf("%s: SOCKPORT %s %d\n",__FUNCTION__,from,udpport); #endif if (s_sent != s_bytes) { return -4; } return 0; } int sendFileResult(char *filename, char *ip, int port) { FILE *fin; int s_sockfd; // Socket descriptor int length; struct sockaddr_in s_remote; socklen_t s_length=sizeof(s_remote); char result_buffer[512]; char tline[512]; unsigned int source; unsigned int value; unsigned int nodeaddress; int reg; int v1,v2,v3,v4; int mcm,chip,channel; struct timeval tmnow; struct tm *tm; char buf[30], usec_buf[6]; #ifdef __DEBUG printf("%s: %s-%d\n",__FUNCTION__,ip,port); #endif if ((s_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror(NULL); printf("SOCKET"); return 1; } s_remote.sin_family = AF_INET; s_remote.sin_port = htons(port); if (inet_aton(ip, &s_remote.sin_addr)==0) { perror(NULL); printf("inet_aton() failed\n"); return 2; } if (connect(s_sockfd, (struct sockaddr *)&s_remote, sizeof(s_remote)) < 0) { printf("%s: could not connect\n",__FUNCTION__); perror(NULL); close(s_sockfd); // return 3; } fin = fopen(filename,"r"); fgets(tline, 512, fin); sscanf(tline,"%X",&nodeaddress); fgets(tline, 512, fin); sscanf(tline,"%X",&source); fgets(tline, 512, fin); sscanf(tline,"%X",&value); fclose(fin); // strcpy(result_buffer,"SRU.ID \t\t1\n"); Not needed until we implement multiple SRUs sprintf(tline,"SRU.NODE\t\t%d\n",nodeaddress); //strcat(result_buffer,tline); Not needed until we implement multiple SRUs strcpy(result_buffer,tline); // printf("DEBUGX source = 0x%X, source & c0000000 = 0x%X\n", source, (source & 0xC0000000)); if (((source & 0xC0000000) == 0x80000000) & (nodeaddress == 0x29)) { // RD from SRU register reg = source & 0xFFFF; switch (reg) { case SRU_REG_SN: sprintf(tline,"SRU.RD.SN\t\t%X",value); break; case SRU_REG_IP: v4 = (value >> 24) & 0xFF; v3 = (value >> 16) & 0xFF; v2 = (value >> 8) & 0xFF; v1 = value & 0xFF; sprintf(tline,"SRU.RD.IP\t\t%d.%d.%d.%d\n",v4,v3,v2,v1); break; case SRU_REG_FMVER: sprintf(tline,"SRU.RD.FMVER\t\t%X",value); break; case SRU_REG_SRUST: sprintf(tline,"SRU.RD.SRUST\t\t%X",value); break; case SRU_REG_DTCERRFLAG1: sprintf(tline,"SRU.RD.DTCERRFLAG1\t\t%X",value); break; case SRU_REG_DTCERRFLAG2: sprintf(tline,"SRU.RD.DTCERRFLAG2\t\t%X",value); break; case SRU_REG_DTCRDOMASK1: sprintf(tline,"SRU.RD.DTCRDOMASK1\t\t%X",value); break; case SRU_REG_DTCRDOMASK2: sprintf(tline,"SRU.RD.DTCRDOMASK2\t\t%X",value); break; case SRU_REG_DTC_CLKEN1: sprintf(tline,"SRU.RD.DTC_CLKEN1\t\t%X",value); break; case SRU_REG_DTC_CLKEN2: sprintf(tline,"SRU.RD.DTC_CLKEN2\t\t%X",value); break; case SRU_REG_READOUT_IP: v4 = (value >> 24) & 0xFF; v3 = (value >> 16) & 0xFF; v2 = (value >> 8) & 0xFF; v1 = value & 0xFF; sprintf(tline,"SRU.RD.READOUT_IP\t\t%d.%d.%d.%d\n",v4,v3,v2,v1); break; case SRU_REG_TEST_PULSE_CFG: v3 = (value >> 26) & 0x1; v2 = (value >> 16) & 0x3FF; v1 = value & 0xFFFF; sprintf(tline,"SRU.RD.TESTPULSECFG\t\t START %d: WIDTH %d: EN %d\n",v1,v2,v3); break; } strcat(result_buffer,tline); } else if (((source & 0xC0000000) == 0x80000000) & (nodeaddress != 0x29)) { // RD from an CPLD register sprintf (tline, "Cpld rd not yet implement!"); strcat (result_buffer,tline); } // SALTRO reply on read command else if ((source & 0xC0000000) == 0xC0000000) { reg = source & 0x1F; channel = (source >> 5) & 0xF; chip = (source >> 9) & 0x7; mcm = (source >> 12) & 0x1F; sprintf(tline,"NODE.MCM%d\t1\n",mcm + 1); strcat(result_buffer,tline); sprintf(tline,"MCM.SALTRO%d\t1\n",chip); strcat(result_buffer,tline); sprintf(tline,"SALTRO.CH%d\t1\n",channel); strcat(result_buffer,tline); switch (reg) { case DPCFG_ADDR: sprintf(tline,"DPCFG.ZSENB\t%d\n",(value >> 19) & 1); strcat(result_buffer,tline); sprintf(tline,"DPCFG.ZSPRE\t%d\n",(value >> 17) & 3); strcat(result_buffer,tline); sprintf(tline,"DPCFG.ZSPOST\t%d\n",(value >> 14) & 7); strcat(result_buffer,tline); sprintf(tline,"DPCFG.GLITCH\t%d\n",(value >> 12) & 3); strcat(result_buffer,tline); sprintf(tline,"DPCFG.SBENB\t%d\n",(value >> 11) & 1); strcat(result_buffer,tline); sprintf(tline,"DPCFG.SBPOST\t%d\n",(value >> 7) & 15); strcat(result_buffer,tline); sprintf(tline,"DPCFG.SBPRE\t%d\n",(value >> 5) & 3); strcat(result_buffer,tline); sprintf(tline,"DPCFG.POLARITY\t%d\n",(value >> 4) & 1); strcat(result_buffer,tline); sprintf(tline,"DPCFG.FBCM\t%d\n",value & 15); strcat(result_buffer,tline); break; case ZSTHR_ADDR: sprintf(tline,"ZSTHR.OFFSET\t%d\n",(value >> 10) & 0x3FF); strcat(result_buffer,tline); sprintf(tline,"ZSTHR.ZS_THR\t%d\n",value & 0x3FF); strcat(result_buffer,tline); break; case ADEVL_ADDR: sprintf(tline,"ADEVL.HADDR\t%d\n",(value >> 8) & 0xFF); strcat(result_buffer,tline); sprintf(tline,"ADEVL.EVL\t%d\n", value & 0xFF); strcat(result_buffer,tline); break; case ERSTR_ADDR: sprintf(tline,"ERSTR.RDOERR\t%d\n", (value >> 19) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.INT2SEU\t%d\n", (value >> 18) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.INT1SEU\t%d\n", (value >> 17) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.MMU2SEU\t%d\n", (value >> 16) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.MMU1SEU\t%d\n", (value >> 15) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.TRIGOVERRLAP\t%d\n", (value >> 14) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.INSTERR\t%d\n", (value >> 13) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.PARERR\t%d\n", (value >> 12) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.EMPTY\t%d\n", (value >> 11) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.FULL\t%d\n", (value >> 10) & 0x1); strcat(result_buffer,tline); sprintf(tline,"ERSTR.REMBUFF\t%d\n", (value >> 6) & 0xF); strcat(result_buffer,tline); sprintf(tline,"ERSTR.WRPTR\t%d\n", (value >> 3) & 0x7); strcat(result_buffer,tline); sprintf(tline,"ERSTR.RDPTR\t%d\n", value & 0x7); strcat(result_buffer,tline); break; case TRCNT_ADDR: sprintf(tline,"TRCNT\t%d\n", value & 0xFFFF); strcat(result_buffer,tline); break; case TRCFG_ADDR: sprintf(tline,"TRCFG.ACQ_START\t%d\n",(value >> 10) & 0x3FF); strcat(result_buffer,tline); sprintf(tline,"TRCFG.ACQ_END\t%d\n", value & 0x3FF); strcat(result_buffer,tline); break; case VFPED_ADDR: sprintf(tline,"VFPED.VPD\t%d\n",(value >> 10) & 0x3FF); strcat(result_buffer,tline); sprintf(tline,"VFPED.FPD\t%d\n", value & 0x3FF); strcat(result_buffer,tline); break; case BFNPT_ADDR: sprintf(tline,"BFNPT.PWSV\t%d\n",(value >> 6) & 0x1); strcat(result_buffer,tline); sprintf(tline,"BFNPT.FLT_EN\t%d\n",(value >> 5) & 0x1); strcat(result_buffer,tline); sprintf(tline,"BFNPT.NBUF\t%d\n",(value >> 4) & 0x1); strcat(result_buffer,tline); sprintf(tline,"BFNPT.PTRG\t%d\n", value & 0xF); strcat(result_buffer,tline); break; } } // Getting the time of packet decode it is approximately time of receiving the packet. gettimeofday(&tmnow, NULL); tm = localtime(&tmnow.tv_sec); strftime(buf,30,"%H:%M:%S", tm); strcat(buf,"."); sprintf(usec_buf,"%d",(int)tmnow.tv_usec); strcat(buf,usec_buf); printf("[%s] ",buf); printf("%s: %s\n%s\n",__FUNCTION__,filename,result_buffer); length = strlen(result_buffer); if (sendto(s_sockfd, result_buffer, length, 0, (struct sockaddr *) &s_remote, s_length)==-1) { perror("SENDTO"); printf("SENDTO"); } close(s_sockfd); return 0; } int nodeconfig(int *mcmnodes1, int *mcmnodes2, int iarg) { char *part2; char c; int mcmnb; part2 = strtok(NULL,"."); if (part2 != NULL) { if (!strcmp(part2,"SET")) { return 1; } if (sscanf(part2, "MCM%d%c", &mcmnb, &c) == 1) { if (chklimits(mcmnb,0,39) != 0) return -1; if (iarg != 0) { if (mcmnb < 20) *mcmnodes1 |= (1 << (mcmnb)); else *mcmnodes2 |= (1 << (mcmnb - 20)); } return 0; // else { // if (mcmnb <= 20) *mcmnodes1 &= ~(1 << (mcmnb -1)); // else *mcmnodes2 &= ~(1 << (mcmnb - 21)); //} } else return -1; } else return -1; return 0; } int mcmconfig(FILE *fout, int *mcmsaltro, int iarg) { // Function for decoding the MCM commands. char *part2; char *part3; char c; int saltronb; part2 = strtok(NULL,"."); part3 = strtok(NULL,"."); if (part2 != NULL) { if (sscanf(part2, "SALTRO%d%c", &saltronb, &c) == 1) {// This sets up which SALTRO chip to access next. Support multiple chips in the same cmd file. if (chklimits(saltronb,0,7) != 0) return -1; if (iarg != 0) { *mcmsaltro |= (1 << saltronb); } else { *mcmsaltro &= ~(1 << saltronb); } } // Encoding of the MCM Register values. else if (!strcmp(part2,"ADCCLKDIV")) { if (chklimits(iarg,0,1) != 0) { return -1;} else { mcm_adcclkdiv = iarg; } } else if (!strcmp(part2,"LGSEN")) { if (chklimits(iarg,0,1) != 0) { return -1;} else { mcm_lgsen = iarg; } } else if (!strcmp(part2,"MCMADDR")) { if (chklimits(iarg,0,511) != 0) { return -1;} else { mcm_addr = iarg; } } else if (!strcmp(part2,"SALTROCHMASK0")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask0 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK1")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask1 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK2")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask2 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK3")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask3 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK4")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask4 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK5")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask5 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK6")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask6 = iarg; } } else if (!strcmp(part2,"SALTROCHMASK7")) { if (chklimits(iarg, 0, 0xFFFF) != 0) { return -1;} else { mcm_saltrochmask7 = iarg; } } else if (!strcmp(part2,"SALTROCTRL")) { if (chklimits(iarg,0, 0x3FF) != 0) { return -1;} else { mcm_saltroctrl = iarg; } } // WR part else if (!strcmp(part2,"WR")) { if (!strcmp(part3,"ADCCLKDIV")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_ADCCLKDIV, mcm_adcclkdiv); } else if (!strcmp(part3,"LGSEN")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_LGSEN, mcm_lgsen); } else if (!strcmp(part3,"MCMADDR")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_ADDR, mcm_addr); } else if (!strcmp(part3,"SALTROCHMASK0")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK0, mcm_saltrochmask0); } else if (!strcmp(part3,"SALTROCHMASK1")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK1, mcm_saltrochmask1); } else if (!strcmp(part3,"SALTROCHMASK2")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK2, mcm_saltrochmask2); } else if (!strcmp(part3,"SALTROCHMASK3")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK3, mcm_saltrochmask3); } else if (!strcmp(part3,"SALTROCHMASK4")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK4, mcm_saltrochmask4); } else if (!strcmp(part3,"SALTROCHMASK5")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK5, mcm_saltrochmask5); } else if (!strcmp(part3,"SALTROCHMASK6")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK6, mcm_saltrochmask6); } else if (!strcmp(part3,"SALTROCHMASK7")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCHMASK7, mcm_saltrochmask7); } else if (!strcmp(part3,"SALTROCTRL")) { fprintf(fout,"%08X\n%08X\n", MCM_REG_SALTROCTRL, mcm_saltroctrl); } else return -1; } // END WR //RD part else if (!strcmp(part2,"RD")) { if (iarg != 0) { // printf("iarg MCM RD: %d\n", iarg); if (!strcmp(part3,"ADCCLKDIV")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_ADCCLKDIV,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmadcclkdiv.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"LGSEN")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_LGSEN,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmlgsen.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"MCMADDR")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_ADDR,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmaddr.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK0")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK0,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask0.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK1")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK1,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask1.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK2")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK2,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask2.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK3")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK3,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask3.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK4")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK4,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask4.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK5")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK5,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask5.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK6")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK6,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask6.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCHMASK7")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCHMASK7,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltrochmask7.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SALTROCTRL")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | MCM_REG_SALTROCTRL,0); #ifdef __DEBUG_READ sendFileResult("dbg_mcmsaltroctrl.txt","130.235.185.179",4007); #endif } } else return -1; } // END RD else return -1; } else return -1; return 0; } int saltroconfig(int *saltrochannel,int iarg) { char *part2; char c; int channelnb; part2 = strtok(NULL,"."); if (part2 != NULL) { if (sscanf(part2, "CH%d%c", &channelnb, &c) == 1) { if (chklimits(channelnb,0,15) != 0) return -1; if (iarg != 0) *saltrochannel |= (1 << channelnb); else *saltrochannel &= ~(1 << channelnb); } else return -2; } else return -3; return 0; } int encodeSaltroRegister(int reg, int *value, int iarg) { char *part2; part2 = strtok(NULL,"."); printf("part2 %s\n", part2); if (part2 != NULL) { if (!strcmp(part2,"WR")) return 1; else if (!strcmp(part2,"RD")) return 2; if (reg == DPCFG_ADDR) { if (!strcmp(part2,"ZSENB")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= (iarg << 19); } else if (!strcmp(part2,"ZSPRE")) { if (chklimits(iarg,0,3) != 0) return -2; *value |= (iarg << 17); } else if (!strcmp(part2,"ZSPOST")) { if (chklimits(iarg,0,7) != 0) return -2; *value |= (iarg << 14); } else if (!strcmp(part2,"GLITCH")) { if (chklimits(iarg,0,3) != 0) return -2; *value |= (iarg << 12); } else if (!strcmp(part2,"SBENB")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= (iarg << 11); } else if (!strcmp(part2,"SBPOST")) { if (chklimits(iarg,0,15) != 0) return -2; *value |= (iarg << 7); } else if (!strcmp(part2,"SBPRE")) { if (chklimits(iarg,0,3) != 0) return -2; *value |= (iarg << 5); } else if (!strcmp(part2,"POLARITY")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= (iarg << 4); } else if (!strcmp(part2,"FBCM")) { if (chklimits(iarg,0,15) != 0) return -2; *value |= iarg; } else return -1; } else if (reg == ZSTHR_ADDR) { if (!strcmp(part2,"OFFSET")) { if (chklimits(iarg,0,1023) != 0) return -2; *value |= (iarg << 10); } else if (!strcmp(part2,"ZS_THR")) { if (chklimits(iarg,0,1023) != 0) return -2; *value |= iarg; } } else if (reg == TRCFG_ADDR) { if (!strcmp(part2,"ACQ_START")) { if (chklimits(iarg,0,1008) != 0) return -2; *value |= (iarg << 10); } else if (!strcmp(part2,"ACQ_END")) { if (chklimits(iarg,0,1008) != 0) return -2; *value |= iarg; } } else if (reg == VFPED_ADDR) { if (!strcmp(part2,"VPD")) { if (chklimits(iarg,0,1008) != 0) return -2; *value |= (iarg << 10); } else if (!strcmp(part2,"FPD")) { if (chklimits(iarg,0,1008) != 0) return -2; *value |= iarg; } } else if (reg == BFNPT_ADDR) { if (!strcmp(part2,"PWSV")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= iarg << 6; } else if (!strcmp(part2,"FLT_EN")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= iarg << 5; } else if (!strcmp(part2,"NBUF")) { if (chklimits(iarg,0,1) != 0) return -2; *value |= iarg << 4; } else if (!strcmp(part2,"PTRG")) { if (chklimits(iarg,0,15) != 0) return -2; *value |= iarg; } } else if (reg == PMADD_ADDR) { if (chklimits(iarg,0,1008) != 0) return -2; *value = iarg; } else if (reg == PMDTA_ADDR) { // if (chklimits(iarg,0,1023) != 0) return -2; *value = iarg; } } else return -1; return 0; } void makeSruSaltroCommand(FILE *fout,int rw,int mcmsaltro,int saltrochannel, int reg, int regvalue) { int ch, sa; unsigned int address; for (sa = 0; sa <= 7; sa++) { if ((mcmsaltro & (1 << sa)) != 0) { for (ch = 0; ch <= 15; ch++) { if ((saltrochannel & (1 << ch)) != 0) { address = (sa << 9) | (ch << 5) | reg; if (rw == 1) fprintf(fout,"%08X\n%08X\n",CTYPE_SALTRO | address,regvalue); else if (rw == 2) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | CTYPE_SALTRO | address,0); #ifdef __DEBUG_READ printf("%s: DEBUG_READ %X\n",__FUNCTION__,reg); if (reg == DPCFG_ADDR) sendFileResult("dpcfg.txt","130.235.185.179",4007); else if (reg == ZSTHR_ADDR) sendFileResult("zsthr.txt","130.235.185.179",4007); #endif } } } } } } int readSruConfig(char *filename, SRU *srv) { char c; char *pos,*arg,*part1,*part2,*part3; char tline[512]; char srufile[512]; FILE *inf; FILE *fout = stdout; int lnum = 0; int snum = 0; int errline = 0; int iarg; int value; int dtcrdomask1 = 0; int dtcrdomask2 = 0; int dtcclken1 = 0; int dtcclken2 = 0; int srucfg = 0; int trigl1tw = 0; int trigl2tw = 0; int testtrigcfg0 = 0; int testtrigcfg1 = 0; int testpulsecfg = 0; int ptrigcfg = 0; int mcmnodes1 = 0; int mcmnodes2 = 0; int mcmnodeset = 0; int mcmsaltro = 0; int saltrochannel = 0; int retval; int regvalue = 0; unsigned int readoutip = 0; sprintf(srufile,"%s.sru",filename); inf = fopen(filename,"r"); if (inf == NULL) return -1; fout = fopen(srufile,"w"); if (fout == NULL) { fclose(inf); return -2; } srv->nbrdpackets = 0; fgets(tline, 512, inf); while(!feof(inf) && (errline == 0)) { lnum++; pos = strtok(tline," \t\n"); if (pos != NULL) { /* skip dummy lines */ if (*pos != '#') { /* skip commented lines */ if ((arg = strtok(NULL," \t\n")) != NULL) { iarg = atoi(arg); if (!strcmp(pos,"SRU.ID")) { if (chklimits(iarg,0,SRU_MAX_ID) == 0) { // print here the IP number of SRU and UDP port fprintf(fout,"%s\n%d\n",srv->sruserver[iarg].controlip,srv->controlport); // Default readoutip is taken as given in sru.cfg // readoutip = srv->sruserver[iarg].readoutipnb; // readoutip = srv->localipnb; // Fetch from configfile. } else errline = lnum; } // END SRU.ID else { part1 = strtok(pos,"."); // Select nodes to access - must end with NODE.SET // may not set anythin after that if (!strcmp(part1,"NODE")) { if (mcmnodeset != 0) return lnum; retval = nodeconfig(&mcmnodes1,&mcmnodes2,iarg); if (retval < 0) return lnum; else if (retval > 0) { fprintf(fout,"%08X\n%08X\n",mcmnodes2,mcmnodes1); mcmnodeset = 1; }; } // Select MCM.SALTRO to access else if (!strcmp(part1,"MCM")) { retval = mcmconfig(fout, &mcmsaltro, iarg); #ifdef __DEBUG_DCS printf("SALTRO CHIP number %X %d\n", mcmsaltro, retval); #endif if (retval < 0) return lnum; } // Select SALTRO.CHn to access else if (!strcmp(part1,"SALTRO")) { retval = saltroconfig(&saltrochannel, iarg); #ifdef __DEBUG_DCS printf("SALTRO %X %d\n",saltrochannel,retval); #endif if (retval < 0) return lnum; } // Select DPCFG register else if (!strcmp(part1,"DPCFG")) { retval = encodeSaltroRegister(DPCFG_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval > 0) { #ifdef __DEBUG_DCS printf("SALTRO %X CH %X VALUE %X\n",mcmsaltro,saltrochannel,regvalue); #endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,DPCFG_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"ZSTHR")) { retval = encodeSaltroRegister(ZSTHR_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,ZSTHR_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"TRCFG")) { retval = encodeSaltroRegister(TRCFG_ADDR, ®value, iarg); printf("TRCFG %X\n", retval); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,TRCFG_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"ADEVL")) { //READ only reg retval = encodeSaltroRegister(ADEVL_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval == 2) { // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,ADEVL_ADDR,regvalue); regvalue = 0; } else return -1; } else if (!strcmp(part1,"ERSTR")) { //READ only reg retval = encodeSaltroRegister(ERSTR_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval == 2) { // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,ERSTR_ADDR,regvalue); regvalue = 0; } else return -1; } else if (!strcmp(part1,"TRCNT")) { //READ only reg retval = encodeSaltroRegister(TRCNT_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval == 2) { // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,TRCNT_ADDR,regvalue); regvalue = 0; } else return -1; } else if (!strcmp(part1,"ERCLR")) { //READ only reg retval = encodeSaltroRegister(ERCLR_ADDR ,®value,iarg); if (retval < 0) return lnum; if (retval == 1) { // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro, 1, ERCLR_ADDR, 0); regvalue = 0; } else return -1; } else if (!strcmp(part1,"VFPED")) { retval = encodeSaltroRegister(VFPED_ADDR, ®value, iarg); // printf("VFPED %X\n", retval); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS //printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,VFPED_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"BFNPT")) { retval = encodeSaltroRegister(BFNPT_ADDR, ®value, iarg); //printf("BFNPT %X\n", retval); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS // printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,1,BFNPT_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"PMADD")) { retval = encodeSaltroRegister(PMADD_ADDR, ®value, iarg); printf("PMADD %X\n", retval); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,PMADD_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"PMDTA")) { retval = encodeSaltroRegister(PMDTA_ADDR, ®value, iarg); printf("PMDTA %X\n", retval); if (retval < 0) return lnum; if (retval > 0) { //#ifdef __DEBUG_DCS printf("SALTRO %X CH %X VAL %X\n",mcmsaltro,saltrochannel,regvalue); //#endif // HERE WRITE TO FILE makeSruSaltroCommand(fout,retval,mcmsaltro,saltrochannel,PMDTA_ADDR,regvalue); regvalue = 0; } } else if (!strcmp(part1,"SRU")) { part2 = strtok(NULL,"."); part3 = strtok(NULL,"."); if (snum == 0) fprintf(fout,"%08X\n%08X\n",NODESEL_SRU,0); snum++; if ((part2 != NULL) && (part3 != NULL)) { if (!strcmp(part2,"RD")) { if (iarg != 0) { srv->nbrdpackets++; if (!strcmp(part3,"SN")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_SN,0); #ifdef __DEBUG_READ sendFileResult("dbg_srusn.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"IP")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_IP,0); #ifdef __DEBUG_READ sendFileResult("dbg_sruip.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"FMVER")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_FMVER,0); #ifdef __DEBUG_READ sendFileResult("dbg_srufmver.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SRUST")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_SRUST,0); #ifdef __DEBUG_READ sendFileResult("dbg_srusrust.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"DTCERRFLAG1")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCERRFLAG1,0); } else if (!strcmp(part3,"DTCERRFLAG2")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCERRFLAG2,0); } else if (!strcmp(part3,"DTCRDOMASK1")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCRDOMASK1,0); #ifdef __DEBUG_READ sendFileResult("dbg_srudtcrdomask1.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"DTCRDOMASK2")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTCRDOMASK2,0); #ifdef __DEBUG_READ sendFileResult("dbg_srudtcrdomask2.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"DTCCLKEN1")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTC_CLKEN1,0); #ifdef __DEBUG_READ sendFileResult("dbg_srudtcclken1.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"DTCCLKEN2")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_DTC_CLKEN2,0); #ifdef __DEBUG_READ sendFileResult("dbg_srudtcclken2.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"SRUREGCFG")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_CFG, 0); #ifdef __DEBUG_READ sendFileResult("dbg_srucfg.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"TRIGL1TW")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_TRIG_L1_TW, 0); #ifdef __DEBUG_READ sendFileResult("dbg_trigl1tw.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"TRIGL2TW")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_TRIG_L2_TW, 0); #ifdef __DEBUG_READ sendFileResult("dbg_trigl2tw.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"TESTTRIGCFG0")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_TEST_TRIG_CFG0, 0); #ifdef __DEBUG_READ sendFileResult("dbg_testtrigcfg0.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"TESTTRIGCFG1")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_TEST_TRIG_CFG1, 0); #ifdef __DEBUG_READ sendFileResult("dbg_testtrigcfg1.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"PTRIGCFG")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_PTRIG_CFG, 0); #ifdef __DEBUG_READ sendFileResult("dbg_ptrigcfg.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"TESTPULSECFG")) { fprintf(fout,"%08X\n%08X\n", RD_COMMAND | SRU_REG_TEST_PULSE_CFG, 0); #ifdef __DEBUG_READ sendFileResult("dbg_testpulsecfg.txt","130.235.185.179",4007); #endif } else if (!strcmp(part3,"READOUTIP")) { fprintf(fout,"%08X\n%08X\n",RD_COMMAND | SRU_REG_READOUT_IP,0); #ifdef __DEBUG_READ sendFileResult("dbg_readout_ip.txt","130.235.185.179",4007); #endif } else errline = lnum; } } // END RD else if (!strcmp(part2,"WR")) { // printf("DEBUG PART2 %s, PART 3 %s:\n", part2, part3); if (!strcmp(part3,"DTCRDOMASK1")) { fprintf(fout,"%08X\n%08X\n",SRU_REG_DTCRDOMASK1,dtcrdomask1); } else if (!strcmp(part3,"DTCRDOMASK2")) { fprintf(fout,"%08X\n%08X\n",SRU_REG_DTCRDOMASK2, dtcrdomask2); } else if (!strcmp(part3,"WALIGN")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_WALIGN, 0x0000); } else if (!strcmp(part3,"STRIGCMD")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_STRIG_CMD, 0x0000); } else if (!strcmp(part3,"DTCCLKEN1")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_DTC_CLKEN1, dtcclken1); } else if (!strcmp(part3,"DTCCLKEN2")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_DTC_CLKEN2, dtcclken2); } else if (!strcmp(part3,"SRUREGCFG")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_CFG, srucfg); } else if (!strcmp(part3,"TRIGL1TW")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_TRIG_L1_TW, trigl1tw); } else if (!strcmp(part3,"TRIGL2TW")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_TRIG_L2_TW, trigl2tw); } else if (!strcmp(part3,"TESTTRIGCFG0")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_TEST_TRIG_CFG0, testtrigcfg0); } else if (!strcmp(part3,"TESTTRIGCFG1")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_TEST_TRIG_CFG1, testtrigcfg1); } else if (!strcmp(part3,"PTRIGCFG")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_PTRIG_CFG, ptrigcfg); } else if (!strcmp(part3,"READOUTIP")) { //printf("DEBUG PART2 %s, PART 3 %s %08X:\n", part2, part3,readoutip); fprintf(fout,"%08X\n%08X\n", SRU_REG_READOUT_IP, readoutip); } else if (!strcmp(part3,"TESTPULSECFG")) { fprintf(fout,"%08X\n%08X\n", SRU_REG_TEST_PULSE_CFG, testpulsecfg); } else if (!strcmp(part3,"PSSCAN")) { psscan_argument = (unsigned int) ((psscan_channel << 24) | (psscan_mode << 16) | psscan_value); fprintf(fout,"%08X\n%08X\n", SRU_REG_PSSCAN, psscan_argument); } // TODO: add more registers } // END WR // Decoding the register fields! else if (!strcmp(part2,"RDOMASK")) { if (sscanf(part3, "DTC%d %c", &value, &c) == 1) { if (chklimits(value,0,19) == 0) { if (iarg != 0 ) dtcrdomask1 |= (1 << value); else dtcrdomask1 &= ~(1 << value); } else if (chklimits(value,20,39) == 0) { value -= 20; if (iarg != 0 ) dtcrdomask2 |= (1 << value); else dtcrdomask2 &= ~(1 << value); } else errline = lnum; } else errline = lnum; } // END RDOMASK else if (!strcmp(part2,"DTCCLKEN")) { if (sscanf(part3, "DTC%d %c", &value, &c) == 1) { if (chklimits(value,0,19) == 0) { if (iarg != 0 ) dtcclken1 |= (1 << value); else dtcclken1 &= ~(1 << value); //printf("value = %d, dtcclken1 = %X\n", value, dtcclken1); } else if (chklimits(value,20,39) == 0) { value -= 20; if (iarg != 0 ) dtcclken2 |= (1 << value); else dtcclken2 &= ~(1 << value); //printf("value = %d, dtcclken2 = %X\n", value, dtcclken2); } else errline = lnum; } else errline = lnum; } // END CLKEN else if (!strcmp(part2,"SRUCFG")) { if (!strcmp(part3, "CLKSRCSEL")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "RDOCMDOPT")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg << 3; } else errline = lnum; } else if (!strcmp(part3, "TRIGMODE")) { if (chklimits(iarg,0,2) == 0) { srucfg |= iarg << 4; } else errline = lnum; } /* Removed by JONAS, Busy inputs have been removed else if (!strcmp(part3, "BUSYINEN")) { if (chklimits(iarg,0,3) == 0) { srucfg |= iarg << 6; } else errline = lnum; } */ // Added by Jonas ///////////////////////////////// else if (!strcmp(part3, "EVENT_ACK_EN")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg << 6; } else errline = lnum; } else if (!strcmp(part3, "SPILLEN")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg << 8; } else errline = lnum; } else if (!strcmp(part3, "EVENTNUMBERSEL")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg << 9; } else errline = lnum; } // End of Jonas additions ////////////////////////// else if (!strcmp(part3, "PARREQ")) { if (chklimits(iarg,0,127) == 0) { srucfg |= iarg << 16; } else errline = lnum; } else if (!strcmp(part3, "CDHVER")) { if (chklimits(iarg,0,1) == 0) { srucfg |= iarg << 24; } else errline = lnum; } else errline = lnum; } // END SRUCFG else if (!strcmp(part2,"TRIGL1TW")) { if (!strcmp(part3, "LOW")) { if (chklimits(iarg,0,65535) == 0) { trigl1tw |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "HIGH")) { if (chklimits(iarg,0,65535) == 0) { trigl1tw |= iarg << 16; } else errline = lnum; } else errline = lnum; } // END TRIGL1TW else if (!strcmp(part2,"TRIGL2TW")) { if (!strcmp(part3, "LOW")) { if (chklimits(iarg,0,65535) == 0) { trigl2tw |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "HIGH")) { if (chklimits(iarg,0,65535) == 0) { trigl2tw |= iarg << 16; } else errline = lnum; } else errline = lnum; } // END TRIGL2TW else if (!strcmp(part2,"TESTTRIGCFG0")) { if (!strcmp(part3, "L0LATENCY")) { if (chklimits(iarg,0,65535) == 0) { testtrigcfg0 |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "L1LATENCY")) { if (chklimits(iarg,0,65535) == 0) { testtrigcfg0 |= iarg << 16; } else errline = lnum; } else errline = lnum; } // END TESTTRIGCFG0 else if (!strcmp(part2,"TESTPULSECFG")) { if (!strcmp(part3, "START")) { if (chklimits(iarg,0,65535) == 0) { testpulsecfg |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "WIDTH")) { if (chklimits(iarg,0,1023) == 0) { testpulsecfg |= iarg << 16; } else errline = lnum; } else if (!strcmp(part3, "EN")) { if (chklimits(iarg,0,1) == 0) { testpulsecfg |= iarg << 26; } else errline = lnum; } else errline = lnum; } // END TESTPULSECFG else if (!strcmp(part2,"TESTTRIGCFG1")) { if (!strcmp(part3, "L2LATENCY")) { if (chklimits(iarg,0,65535) == 0) { testtrigcfg1 |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "TRIGSEQSET")) { if (chklimits(iarg,0,0xF) == 0) { testtrigcfg1 |= iarg << 16; } else errline = lnum; } else errline = lnum; } // END TESTTRIGCFG1 else if (!strcmp(part2,"PTRIGCFG")) { if (!strcmp(part3, "PERIOD")) { if (chklimits(iarg,0,65535) == 0) { ptrigcfg |= iarg; //chklimits takes care of issueing an error if it's not a valid range. That is why no need for a mask. } else errline = lnum; } else if (!strcmp(part3, "PTRIGEN")) { if (chklimits(iarg,0,1) == 0) { ptrigcfg |= iarg << 16; } else errline = lnum; } else errline = lnum; } // END PTRIGCFG else if (!strcmp(part2,"READOUTIP")) { // printf("Debug readout ip: part3: %s; iarg 0x%X; readoutip = 0x%X\n", part3, iarg, readoutip); if (!strcmp(part3, "IP1")) { if (chklimits(iarg,1,255) == 0) { readoutip |= iarg << 24; } else errline = lnum; } else if (!strcmp(part3, "IP2")) { if (chklimits(iarg,0,255) == 0) { readoutip |= iarg << 16; } else errline = lnum; } else if (!strcmp(part3, "IP3")) { if (chklimits(iarg,0,255) == 0) { readoutip |= iarg << 8; } else errline = lnum; } else if (!strcmp(part3, "IP4")) { if (chklimits(iarg,1,254) == 0) { readoutip |= iarg; //printf("Debug readout ip last readoutip = 0x%X\n",readoutip); } else errline = lnum; } else errline = lnum; } // END READOUTIP else if (!strcmp(part2,"PSSCAN")) { // START PSSCAN if (!strcmp(part3, "VALUE")) { if (chklimits(iarg,1,32767) == 0) { psscan_value = iarg; } else errline = lnum; } else if (!strcmp(part3, "MODE")) { if (iarg == 0) psscan_mode = 0; else psscan_mode = 1; } else if (!strcmp(part3, "CHANNEL")) { if (chklimits(iarg,0,39) == 0) { psscan_channel = iarg; } else errline = lnum; } } //END PSSCAN else errline = lnum; } // END part2 && part3 else errline = lnum; } // END part1 else errline = lnum; } // END else SRU.ID } // END arg else errline = lnum; } // END # } // END if (pos != NULL fgets(tline, 512, inf); } // END while fclose(inf); fclose(fout); return errline; } /* MCM part */ int mcmWriteRegister(int handle,SRUSERVER *srv,int node, int reg, unsigned int value) { unsigned int buf[4]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); if (node >= 20) { buf[0] = htonl(1 << (node - 20)); buf[1] = 0; } else { buf[0] = 0; buf[1] = htonl(1 << node); } buf[2] = htonl(reg); buf[3] = htonl(value); s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } usleep(SRU_WAIT_WRITE); // wait after write to allow SRU to execute command return 0; } int mcmReadRegister(int handle,SRUSERVER *srv,int node, int reg, unsigned int *value) { unsigned int buf[20]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); struct sockaddr_in si_from; socklen_t si_fromlen=sizeof(si_from); unsigned int myreg,mynode; if (node >= 20) { buf[0] = htonl(1 << (node - 20)); buf[1] = 0; } else { buf[0] = 0; buf[1] = htonl(1 << node); } buf[2] = htonl((unsigned int) reg | 0x80000000); buf[3] = 0; s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } if ((s_bytes = recvfrom(handle, buf,sizeof(buf), 0, (struct sockaddr *) &si_from, &si_fromlen))==-1) { return -3; } if (s_bytes != 12) { return -4; } if (si_from.sin_addr.s_addr == srv->si_sru.sin_addr.s_addr) { printf("%s: Received packet length %d from %s: %d\n",__FUNCTION__,s_bytes, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); } else { printf("%s: Received illegal packet length %d from %s: %d\n",__FUNCTION__,s_bytes, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); return -5; } mynode = ntohl(buf[0]); if (mynode != node) { printf("%s: Received not expected node %08X expected %08X\n", __FUNCTION__,mynode,node); return -6; } myreg = ntohl(buf[1]); if (myreg != ((unsigned int) reg | 0x80000000)) { printf("%s: Received not expected register %08X expected %08X\n", __FUNCTION__,myreg,(unsigned int) reg | 0x80000000); return -7; } *value = ntohl(buf[2]); printf("%s: %08X %08X %08X\n",__FUNCTION__,mynode,myreg,*value); return 0; } /* SALTRO part */ int saltroWriteRegister(int handle,SRUSERVER *srv,int broadcast, int node, int chip, int channel, int reg, unsigned int value) { unsigned int buf[4]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); unsigned int myreg; if (node >= 20) { buf[0] = htonl(1 << (node - 20)); buf[1] = 0; } else { buf[0] = 0; buf[1] = htonl(1 << node); } myreg = (node << 12) | (chip << 9) | (channel << 5) | reg; buf[2] = htonl(myreg | 0x40000000); buf[3] = htonl(value); s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } usleep(SRU_WAIT_WRITE); return 0; } int saltroReadRegister(int handle, SRUSERVER *srv, int node, int chip, int channel, int reg, unsigned int *value) { unsigned int buf[20]; int s_sent,s_bytes; socklen_t s_length=sizeof(srv->si_sru); struct sockaddr_in si_from; socklen_t si_fromlen=sizeof(si_from); unsigned int myreg,mynode; unsigned int myregrd; if (node >= 20) { buf[0] = htonl(1 << (node - 20)); buf[1] = 0; } else { buf[0] = 0; buf[1] = htonl(1 << node); } myregrd = (node << 12) | (chip << 9) | (channel << 5) | reg; buf[2] = htonl(myregrd | 0xC0000000); buf[3] = 0; s_bytes = 16; if ( (s_sent = sendto(handle, buf, 16, 0, (struct sockaddr *)&srv->si_sru, s_length)) ==-1) { return -1; } if (s_sent != s_bytes) { return -2; } if ((s_bytes = recvfrom(handle, buf,sizeof(buf), 0, (struct sockaddr *) &si_from, &si_fromlen))==-1) { return -3; } if (s_bytes != 12) { return -4; } if (si_from.sin_addr.s_addr != srv->si_sru.sin_addr.s_addr) { printf("%s: Received illegal packet (lengh = %d) from %s: %d\n",__FUNCTION__,s_bytes, inet_ntoa(si_from.sin_addr), ntohs(si_from.sin_port)); return -5; } mynode = ntohl(buf[0]); if (mynode != node) { printf("%s: Received not expected node %08X expected %08X\n", __FUNCTION__,mynode,node); return -6; } myreg = ntohl(buf[1]); if (myreg != (myregrd | 0xC0000000)) { printf("%s: Received not expected register %08X expected %08X\n", __FUNCTION__,myreg,myregrd | 0xC0000000); return -7; } *value = ntohl(buf[2]); return 0; }