/* program to read/write SRU registers Options --sruip,-s (default is: 192.168.4.4) --sruif,-i (default is: eth0) --cfgfile,-c (default is: srupup-0.cfg) Modify LOCAL_IP SRU_IP to proper addresses modify SRU_WAIT_WRITE to test the needed time between writes. compile: gcc -Wall -o srupup srupup.c ilc_sru.c execute ./srupup --sruif --sruip --cfgfile */ #include #include #include #include #include #include #include #include #include #include #include #include "ilc_sru.h" //#define LOCAL_IP "130.235.185.193" //#define SRU_IP "130.235.185.193" //#define LOCAL_IP "192.168.4.11" #define SRU_IP "192.168.4.4" #define NODESEL_SRU 0x00100000 //#define SRU_IF "wlp5s0" #define SRU_IF "eth0" #define CFG_FILE "srupup-0.cfg" unsigned int valuerd,valuewr; char sruip[64]; char cfgfile[256]; char sruif[64]; int write_readoutip; // if set write local readout ip to SRU // Declarations void signal_handler(int signum); int scSruConnect(SRU *srus); void signal_handler(int signum) { switch(signum) { case SIGQUIT: case SIGTERM: case SIGINT: printf("\nSIGAL CAUGHT %d",signum); break; default: printf("\nUNKNOWN CAUGHT %d",signum); break; } } // HERE: read/decode/encode SRU configfile // HERE: send SRU decode commands int decodeParameters(int argc, char **argv) { int c; int option_index = 0; char *short_options = "c:hi:s:"; const struct option long_options[]= { {"cfgfile",1,0,'c'}, {"help",0,0,'h'}, {"sruif",1,0,'i'}, {"sruip",1,0,'s'}, {0, 0, 0, 0} }; strcpy(sruip,SRU_IP); strcpy(cfgfile,CFG_FILE); strcpy(sruif,SRU_IF); write_readoutip = 0; if (argc > 1) { while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != EOF) { switch (c) { case 's': strncpy(sruip,optarg,sizeof(sruip)); break; case 'h': puts("Options"); printf("--sruip,-s (default is: %s)\n",sruip); printf("--sruif,-i (default is: %s)\n",sruif); printf("--cfgfile,-c (default is: %s)\n",cfgfile); return 1; break; case 'i': strncpy(sruif,optarg,sizeof(sruif)); write_readoutip = 1; break; case 'c': strncpy(cfgfile,optarg,sizeof(cfgfile)); break; default: printf("Unkown paramater\n"); return 1; } } } return 0; } int scSruConnect(SRU *srus) { int s; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 100000; if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) { printf("%s: socket error %s\n",__FUNCTION__,strerror(errno)); return -1; } setsockopt(s, SOL_SOCKET, SO_RCVTIMEO,&timeout,sizeof(timeout)); memset((char *) &srus->si_controlme, 0, sizeof(struct sockaddr)); srus->si_controlme.sin_family = AF_INET; srus->si_controlme.sin_port = htons(srus->listenport); // if (inet_aton(srus->sruserver[0].controlip, &srus->si_controlme.sin_addr)==0) { if (inet_aton(srus->localip, &srus->si_controlme.sin_addr)==0) { printf("%s: Controlip: %s listenport: %d gives inet_aton error\n",__FUNCTION__,srus->sruserver[0].controlip,srus->listenport); close(s); return -2; } if (bind(s, (struct sockaddr *)&srus->si_controlme, sizeof(struct sockaddr)) != 0) { printf("%s: %s %d bind error %s\n",__FUNCTION__,srus->sruserver[0].controlip,srus->listenport,strerror(errno)); close(s); return -3; } srus->controlsocket = s; memset((char *) &srus->sruserver[0].si_sru, 0, sizeof(struct sockaddr_in)); srus->sruserver[0].si_sru.sin_family = AF_INET; srus->sruserver[0].si_sru.sin_port = htons(srus->controlport); if (inet_aton(srus->sruserver[0].controlip, &srus->sruserver[0].si_sru.sin_addr)==0) { printf("%s: sru inet_aton error %s\n",__FUNCTION__,strerror(errno)); close(s); srus->controlsocket = 0; return -4; } return 0; } int main(int argc, char **argv){ unsigned int ipaddress; SRU srus; int errst = 0; signal(SIGINT,signal_handler); signal(SIGQUIT,signal_handler); signal(SIGTERM,signal_handler); if (decodeParameters(argc,argv)) return 0; printf("Parameters:\nSRU IP %s\nSRU power config file: %s\n",sruip,cfgfile); strcpy(srus.sruserver[0].controlip,sruip); strcpy(srus.interface,sruif); srus.controlport = 4097; srus.listenport = 4101; errst = findip(srus.interface,srus.localip,srus.broadcastip); if (errst > 0) { printf("ERR: %s findip error %s\n",argv[0],strerror(errst)); return(1); } else if (errst == -1) { printf("ERR: %s findip %s interface not found\n",argv[0],sruif); return(1); } else if (errst != 0) { printf("ERR: %s findip multiple %s interface found %d\n",argv[0],sruif,-(errst+1)); return(1); } printf("\t Interface: <%s>\n",srus.interface); printf("\t Address : <%s>\n",srus.localip); printf("\t broadcast : <%s>\n",srus.broadcastip); printf("SRU configuration file: %s\n",cfgfile); /* int v4,v3,v2,v1; sscanf(srus.localip,"%d.%d.%d.%d",&v4,&v3,&v2,&v1); ipaddress = (v4 << 24) | (v3 << 16) | (v2 << 8) | v1; printf("IP: %d %d %d %d %8X\n",v4,v3,v2,v1,ipaddress); */ errst = readSruConfig(cfgfile,&srus); if (errst != 0) { if (errst > 0) printf("ERR %s: readSruConfig Error in line %d\n",argv[0],errst); else printf("ERR %s: readSruCOnfig Error number %d\n",argv[0],errst); return(1); } errst = scSruConnect(&srus); if (errst != 0) { printf("ERR %s: scSruConnect error %d\n",argv[0],errst); return(2); } strcat(cfgfile,".sru"); printf("SRU configuration hexfile: %s\n",cfgfile); errst = sruSendPacket(cfgfile,srus.controlsocket); if (errst != 0) { printf("ERR %s: sruSendPacket err %d\n",argv[0],errst); close(srus.controlsocket); return(3); } errst = sruReceivePacket(&srus); if (errst != 0) { printf("ERR %s: sruReceivePacket err %d\n",argv[0],errst); } usleep(1000); // To allowd SRU to synch DTC link // Write my local ip to SRU int v4,v3,v2,v1; sscanf(srus.localip,"%d.%d.%d.%d",&v4,&v3,&v2,&v1); ipaddress = (v4 << 24) | (v3 << 16) | (v2 << 8) | v1; errst = sruWriteRegister(srus.controlsocket,srus.sruserver,SRU_REG_READOUT_IP,ipaddress); if (errst != 0) printf("ERR %s: sruWriteRegister SRU_REG_READOUT_IP err %d\n",argv[0],errst); close(srus.controlsocket); puts("\nEXIT"); return 0; }