From d2c8c0a2eb0a34e5eb763623799ff7b71cec3ef8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Oct 2018 15:53:30 +0200 Subject: [PATCH 1/3] gotthard server, moved communication_funcs to slsDetectorServer --- .../gotthardDetectorServer/Makefile | 17 +- .../communication_funcs.c | 2 +- .../communication_funcs.h | 2 +- .../slsDetectorServer/communication_funcs.c | 571 +++++++++++++++++- .../slsDetectorServer/communication_funcs.h | 48 +- slsSupportLib/include/communication_funcs.c | 570 ----------------- slsSupportLib/include/communication_funcs.h | 47 -- 7 files changed, 626 insertions(+), 631 deletions(-) mode change 120000 => 100755 slsDetectorServers/slsDetectorServer/communication_funcs.c mode change 120000 => 100755 slsDetectorServers/slsDetectorServer/communication_funcs.h delete mode 100755 slsSupportLib/include/communication_funcs.c delete mode 100755 slsSupportLib/include/communication_funcs.h diff --git a/slsDetectorServers/gotthardDetectorServer/Makefile b/slsDetectorServers/gotthardDetectorServer/Makefile index e343351d2..feaa65af0 100755 --- a/slsDetectorServers/gotthardDetectorServer/Makefile +++ b/slsDetectorServers/gotthardDetectorServer/Makefile @@ -1,19 +1,16 @@ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -DGOTTHARDD -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL - +CFLAGS += -Wall -DGOTTHARDD -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL PROGS= gotthardDetectorServer INSTDIR= /tftpboot INSTMODE= 0777 - BINS = testlib_sharedlibc -SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c -OBJS = $(SRCS:%.c=%.o) - +SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c +OBJS = $(SRCS:%.c=%.o) all: clean versioning $(PROGS) @@ -22,10 +19,10 @@ boot: $(OBJS) versioning: @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -$(PROGS): $(OBJS) -# echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) + +$(PROGS): $(OBJS) + echo $(OBJS) + $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) rm gotthardDetectorServer.gdb diff --git a/slsDetectorServers/gotthardDetectorServer/communication_funcs.c b/slsDetectorServers/gotthardDetectorServer/communication_funcs.c index eacf9f393..30435fdc4 120000 --- a/slsDetectorServers/gotthardDetectorServer/communication_funcs.c +++ b/slsDetectorServers/gotthardDetectorServer/communication_funcs.c @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.c \ No newline at end of file +../slsDetectorServer/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorServers/gotthardDetectorServer/communication_funcs.h b/slsDetectorServers/gotthardDetectorServer/communication_funcs.h index 72c567747..c0c144994 120000 --- a/slsDetectorServers/gotthardDetectorServer/communication_funcs.h +++ b/slsDetectorServers/gotthardDetectorServer/communication_funcs.h @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.h \ No newline at end of file +../slsDetectorServer/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.c b/slsDetectorServers/slsDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorServers/slsDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.c b/slsDetectorServers/slsDetectorServer/communication_funcs.c new file mode 100755 index 000000000..d9f5b3146 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/communication_funcs.c @@ -0,0 +1,570 @@ + + +#include "communication_funcs.h" +//#include +#include /* for TCP_NODELAY */ +#include +#include +#include +#include + +#include +char lastClientIP[INET_ADDRSTRLEN]; +char thisClientIP[INET_ADDRSTRLEN]; +int lockStatus; +int differentClients; + +//int socketDescriptor, file_des; +const int send_rec_max_size=SEND_REC_MAX_SIZE; +extern int errno; + + +char dummyClientIP[INET_ADDRSTRLEN]; + + +fd_set readset, tempset; +int isock=0, maxfd; + + +int myport=-1; + +//struct sockaddr_in address; +//#define VERBOSE + + +int bindSocket(unsigned short int port_number) { + int i; + + struct sockaddr_in addressS; + int socketDescriptor; + //int file_des; + + //file_des= -1; + + + + + + + + + + + if (myport==port_number) + return -10; + + + + + + socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp + + //socketDescriptor = socket(PF_INET, SOCK_STREAM, 0); + + + + if (socketDescriptor < 0) { + printf("Can not create socket\n"); + } else { + + i = 1; + setsockopt(socketDescriptor, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); + // setsockopt(socketDescriptor, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); + // TCP_CORK + + // Set some fields in the serverAddress structure. + addressS.sin_family = AF_INET; + addressS.sin_addr.s_addr = htonl(INADDR_ANY); + addressS.sin_port = htons(port_number); + + // memset(&address.sin_addr, 0, sizeof(address.sin_addr)); + + + if(bind(socketDescriptor,(struct sockaddr *) &addressS,sizeof(addressS))<0){ + + printf("Can not create socket\n"); + + socketDescriptor=-1; + } else { + if (listen(socketDescriptor, 5)==0) { + + if (isock==0) { + FD_ZERO(&readset); + } + + + FD_SET(socketDescriptor, &readset); + isock++; + maxfd = socketDescriptor; + printf ("%d port %d fd %d\n",isock, port_number,socketDescriptor); + myport=port_number; + } else + printf("error on listen"); + } + } + + + + //int getrlimit(int resource, struct rlimit *rlim); + + + + return socketDescriptor; + +} + + + + + +int getServerError(int socketDescriptor) +{ + if (socketDescriptor<0) return 1; + else return 0; +}; + + +int acceptConnection(int socketDescriptor) { + + + int j; + + + struct sockaddr_in addressC; + int file_des=-1; + struct timeval tv; + int result; + + + //socklen_t address_length; + socklen_t address_length=sizeof(struct sockaddr_in); + + if (socketDescriptor<0) + return -1; + + memcpy(&tempset, &readset, sizeof(tempset)); + tv.tv_sec = 10000000; + tv.tv_usec = 0; + result = select(maxfd + 1, &tempset, NULL, NULL, &tv); + + if (result == 0) { + printf("select() timed out!\n"); + } else if (result < 0 && errno != EINTR) { + printf("Error in select(): %s\n", strerror(errno)); + } else if (result > 0) { +#ifdef VERBOSE + printf("select returned!\n"); +#endif + for (j=0; j=0) + close(file_des); + FD_CLR(file_des, &readset); +} + +void exitServer(int socketDescriptor) { + if (socketDescriptor>=0) + close(socketDescriptor); +#ifdef VERY_VERBOSE + printf("Closing server\n"); +#endif + FD_CLR(socketDescriptor, &readset); + socketDescriptor=-1; + isock--; +} + + + + +void swapData(void* val,int length,intType itype){ + int i; + int16_t* c= (int16_t*)val; + int32_t* a= (int32_t*)val; + int64_t* b= (int64_t*)val; + for(i=0; length > 0; i++){ + switch(itype){ + case INT16: + c[i] = ((c[i] & 0x00FF) << 8) | ((c[i] & 0xFF00) >> 8); + length -= sizeof(int16_t); + break; + case INT32: + a[i]=((a[i] << 8) & 0xFF00FF00) | ((a[i] >> 8) & 0xFF00FF ); + a[i]=(a[i] << 16) | ((a[i] >> 16) & 0xFFFF); + length -= sizeof(int32_t); + break; + case INT64: + b[i] = ((b[i] << 8) & 0xFF00FF00FF00FF00ULL ) | ((b[i] >> 8) & 0x00FF00FF00FF00FFULL ); + b[i] = ((b[i] << 16) & 0xFFFF0000FFFF0000ULL ) | ((b[i] >> 16) & 0x0000FFFF0000FFFFULL ); + b[i] = (b[i] << 32) | ((b[i] >> 32) & 0xFFFFFFFFULL); + length -= sizeof(int64_t); + break; + default: + length = 0; + break; + } + } +} + +int sendData(int file_des, void* buf,int length, intType itype){ +#ifndef PCCOMPILE +#ifdef EIGERD + swapData(buf, length, itype); +#endif +#endif + return sendDataOnly(file_des, buf, length); +} + + +int receiveData(int file_des, void* buf,int length, intType itype){ + int ret = receiveDataOnly(file_des, buf, length); +#ifndef PCCOMPILE +#ifdef EIGERD + if (ret >= 0) swapData(buf, length, itype); +#endif +#endif + return ret; +} + + + int sendDataOnly(int file_des, void* buf,int length) { + if (!length) + return 0; + int ret = write(file_des, buf, length); //value of -1 is other end socket crash as sigpipe is ignored + if (ret < 0) cprintf(BG_RED, "Error writing to socket. Possible socket crash\n"); + return ret; +} + + + int receiveDataOnly(int file_des, void* buf,int length) { + + int total_received=0; + int nreceiving; + int nreceived; + if (file_des<0) return -1; +#ifdef VERY_VERBOSE + printf("want to receive %d Bytes\n", length); +#endif + + while(length > 0) { + nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length; // (condition) ? if_true : if_false + nreceived = read(file_des,(char*)buf+total_received,nreceiving); + if(!nreceived){ + if(!total_received) { + return -1; //to handle it + } + break; + } + length-=nreceived; + total_received+=nreceived; + } + + if (total_received>0) + strcpy(thisClientIP,dummyClientIP); + + if (strcmp(lastClientIP,thisClientIP)) + differentClients=1; + else + differentClients=0; + + return total_received; +} + + + + +int sendModule(int file_des, sls_detector_module *myMod) { + return sendModuleGeneral(file_des, myMod, 1); +} + + +int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll) { + int ts=0; +#ifdef VERBOSE + int idac; +#endif + int nChips=myMod->nchip; + int nChans=myMod->nchan; + int nAdcs=myMod->nadc; + int nDacs=myMod->ndac; + //ts+= sendDataOnly(file_des,myMod,sizeof(sls_detector_module)); + ts+=sendData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); + ts+=sendData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); + ts+=sendData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); + ts+=sendData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); + ts+=sendData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); + ts+=sendData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); + ts+=sendData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); + ts+=sendData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); + +#ifdef VERBOSE + printf("module of size %d sent\n",ts); +#endif + ts+= sendData(file_des,myMod->dacs,sizeof(int)*nDacs,INT32); +#ifdef VERBOSE + printf("dacs of size %d sent\n",ts); + int idac; + for (idac=0; idac< nDacs; idac++) + printf("dac %d is %d\n",idac,(int)myMod->dacs[idac]); +#endif + ts+= sendData(file_des,myMod->adcs,sizeof(int)*nAdcs,INT32); +#ifdef VERBOSE + printf("adcs of size %d sent\n", ts); +#endif + + /*some detectors dont require sending all trimbits etc.*/ + if(sendAll){ + ts+=sendData(file_des,myMod->chipregs,sizeof(int)*nChips,INT32); +#ifdef VERBOSE + printf("chips of size %d sent\n", ts); +#endif + ts+=sendData(file_des,myMod->chanregs,sizeof(int)*nChans,INT32); +#ifdef VERBOSE + printf("chans of size %d sent - %d\n", ts, myMod->nchan); +#endif + } + +#ifdef VERBOSE + printf("module of size %d sent register %x\n", ts, myMod->reg); +#endif + return ts; +} + + + +int receiveModule(int file_des, sls_detector_module* myMod) { + return receiveModuleGeneral(file_des,myMod,1); +} + +int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll) { + int ts=0; + int *dacptr=myMod->dacs; + int *adcptr=myMod->adcs; + int *chipptr=myMod->chipregs, *chanptr=myMod->chanregs; + int nChips, nchipold=myMod->nchip, nchipdiff; + int nChans, nchanold=myMod->nchan, nchandiff; + int nDacs, ndold=myMod->ndac, ndacdiff; + int nAdcs, naold=myMod->nadc, nadcdiff; + ts+=receiveData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); + ts+=receiveData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); + ts+=receiveData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); + ts+=receiveData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); + ts+=receiveData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); + ts+=receiveData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); + ts+=receiveData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); + ts+=receiveData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); + + myMod->dacs=dacptr; + myMod->adcs=adcptr; + myMod->chipregs=chipptr; + myMod->chanregs=chanptr; + +#ifdef EIGERD + //feature to exclude sending of trimbtis, nchips=0,nchans=0 in that case + if(myMod->nchip == 0 && myMod->nchan == 0) { + receiveAll=0; + nchipold=0; + nchanold=0; + } +#endif + + + nChips=myMod->nchip; + nchipdiff=nChips-nchipold; + if (nchipold!=nChips) { + printf("received wrong number of chips\n"); + } +#ifdef VERBOSE + else + printf("received %d chips\n",nChips); +#endif + + nChans=myMod->nchan; + nchandiff=nChans-nchanold; + if (nchanold!=nChans) { + printf("received wrong number of channels\n"); + } +#ifdef VERBOSE + else + printf("received %d chans\n",nChans); +#endif + + + nDacs=myMod->ndac; + ndacdiff=nDacs-ndold; + if (ndold!=nDacs) { + printf("received wrong number of dacs\n"); + } +#ifdef VERBOSE + else + printf("received %d dacs\n",nDacs); +#endif + + nAdcs=myMod->nadc; + nadcdiff=nAdcs-naold; + if (naold!=nAdcs) { + printf("received wrong number of adcs\n"); + } +#ifdef VERBOSE + else + printf("received %d adcs\n",nAdcs); +#endif + if (ndacdiff<=0) { + ts+=receiveData(file_des,myMod->dacs, sizeof(int)*nDacs,INT32); +#ifdef VERBOSE + printf("dacs received\n"); + int id; + for (id=0; iddacs[id]); + + +#endif + } else { + dacptr=(int*)malloc(ndacdiff*sizeof(int)); + myMod->ndac=ndold; + ts+=receiveData(file_des,myMod->dacs, sizeof(int)*ndold,INT32); + ts+=receiveData(file_des,dacptr, sizeof(int)*ndacdiff,INT32); + free(dacptr); + return FAIL; + } + + if (nadcdiff<=0) { + ts+=receiveData(file_des,myMod->adcs, sizeof(int)*nAdcs,INT32); +#ifdef VERBOSE + printf("adcs received\n"); +#endif + } else { + adcptr=(int*)malloc(nadcdiff*sizeof(int)); + myMod->nadc=naold; + ts+=receiveData(file_des,myMod->adcs, sizeof(int)*naold,INT32); + ts+=receiveData(file_des,adcptr, sizeof(int)*nadcdiff,INT32); + free(adcptr); + return FAIL; + } + + + /*some detectors dont require sending all trimbits etc.*/ + if(receiveAll){ + + if (nchipdiff<=0) { + ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nChips,INT32); +#ifdef VERBOSE + printf("chips received\n"); +#endif + } else { + chipptr=(int*)malloc(nchipdiff*sizeof(int)); + myMod->nchip=nchipold; + ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nchipold,INT32); + ts+=receiveData(file_des,chipptr, sizeof(int)*nchipdiff,INT32); + free(chipptr); + return FAIL; + } + + if (nchandiff<=0) { + ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nChans,INT32); +#ifdef VERBOSE + printf("chans received\n"); +#endif + } else { + chanptr=(int*)malloc(nchandiff*sizeof(int)); + myMod->nchan=nchanold; + ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nchanold,INT32); + ts+=receiveData(file_des,chanptr, sizeof(int)*nchandiff,INT32); + free(chanptr); + return FAIL; + } + } +#ifdef VERBOSE + printf("received module of size %d register %x\n",ts,myMod->reg); +#endif + + return ts; +} diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.h b/slsDetectorServers/slsDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorServers/slsDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.h b/slsDetectorServers/slsDetectorServer/communication_funcs.h new file mode 100755 index 000000000..4d41098cd --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/communication_funcs.h @@ -0,0 +1,47 @@ +#ifndef COMMUNICATION_FUNCS_H +#define COMMUNICATION_FUNCS_H + +#define SEND_REC_MAX_SIZE 4096 +#define DEFAULT_PORTNO 1952 +#include +#include + + +#include +#include +#include +#include + +#include "sls_detector_defs.h" + + + +typedef enum{ + INT16, + INT32, + INT64, + OTHER +}intType; + + + + +int bindSocket(unsigned short int port_number); +int acceptConnection(int socketDescriptor); +void closeConnection(int file_Des); +void exitServer(int socketDescriptor); + +void swapData(void* val,int length,intType itype); +int sendData(int file_des, void* buf,int length, intType itype); +int receiveData(int file_des, void* buf,int length, intType itype); +int sendDataOnly(int file_des, void* buf,int length); +int receiveDataOnly(int file_des, void* buf,int length); + + +int getServerError(int socketDescriptor); +int sendModule(int file_des, sls_detector_module *myMod); +int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll); +int receiveModule(int file_des, sls_detector_module* myMod); +int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll); + +#endif diff --git a/slsSupportLib/include/communication_funcs.c b/slsSupportLib/include/communication_funcs.c deleted file mode 100755 index d9f5b3146..000000000 --- a/slsSupportLib/include/communication_funcs.c +++ /dev/null @@ -1,570 +0,0 @@ - - -#include "communication_funcs.h" -//#include -#include /* for TCP_NODELAY */ -#include -#include -#include -#include - -#include -char lastClientIP[INET_ADDRSTRLEN]; -char thisClientIP[INET_ADDRSTRLEN]; -int lockStatus; -int differentClients; - -//int socketDescriptor, file_des; -const int send_rec_max_size=SEND_REC_MAX_SIZE; -extern int errno; - - -char dummyClientIP[INET_ADDRSTRLEN]; - - -fd_set readset, tempset; -int isock=0, maxfd; - - -int myport=-1; - -//struct sockaddr_in address; -//#define VERBOSE - - -int bindSocket(unsigned short int port_number) { - int i; - - struct sockaddr_in addressS; - int socketDescriptor; - //int file_des; - - //file_des= -1; - - - - - - - - - - - if (myport==port_number) - return -10; - - - - - - socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp - - //socketDescriptor = socket(PF_INET, SOCK_STREAM, 0); - - - - if (socketDescriptor < 0) { - printf("Can not create socket\n"); - } else { - - i = 1; - setsockopt(socketDescriptor, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); - // setsockopt(socketDescriptor, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); - // TCP_CORK - - // Set some fields in the serverAddress structure. - addressS.sin_family = AF_INET; - addressS.sin_addr.s_addr = htonl(INADDR_ANY); - addressS.sin_port = htons(port_number); - - // memset(&address.sin_addr, 0, sizeof(address.sin_addr)); - - - if(bind(socketDescriptor,(struct sockaddr *) &addressS,sizeof(addressS))<0){ - - printf("Can not create socket\n"); - - socketDescriptor=-1; - } else { - if (listen(socketDescriptor, 5)==0) { - - if (isock==0) { - FD_ZERO(&readset); - } - - - FD_SET(socketDescriptor, &readset); - isock++; - maxfd = socketDescriptor; - printf ("%d port %d fd %d\n",isock, port_number,socketDescriptor); - myport=port_number; - } else - printf("error on listen"); - } - } - - - - //int getrlimit(int resource, struct rlimit *rlim); - - - - return socketDescriptor; - -} - - - - - -int getServerError(int socketDescriptor) -{ - if (socketDescriptor<0) return 1; - else return 0; -}; - - -int acceptConnection(int socketDescriptor) { - - - int j; - - - struct sockaddr_in addressC; - int file_des=-1; - struct timeval tv; - int result; - - - //socklen_t address_length; - socklen_t address_length=sizeof(struct sockaddr_in); - - if (socketDescriptor<0) - return -1; - - memcpy(&tempset, &readset, sizeof(tempset)); - tv.tv_sec = 10000000; - tv.tv_usec = 0; - result = select(maxfd + 1, &tempset, NULL, NULL, &tv); - - if (result == 0) { - printf("select() timed out!\n"); - } else if (result < 0 && errno != EINTR) { - printf("Error in select(): %s\n", strerror(errno)); - } else if (result > 0) { -#ifdef VERBOSE - printf("select returned!\n"); -#endif - for (j=0; j=0) - close(file_des); - FD_CLR(file_des, &readset); -} - -void exitServer(int socketDescriptor) { - if (socketDescriptor>=0) - close(socketDescriptor); -#ifdef VERY_VERBOSE - printf("Closing server\n"); -#endif - FD_CLR(socketDescriptor, &readset); - socketDescriptor=-1; - isock--; -} - - - - -void swapData(void* val,int length,intType itype){ - int i; - int16_t* c= (int16_t*)val; - int32_t* a= (int32_t*)val; - int64_t* b= (int64_t*)val; - for(i=0; length > 0; i++){ - switch(itype){ - case INT16: - c[i] = ((c[i] & 0x00FF) << 8) | ((c[i] & 0xFF00) >> 8); - length -= sizeof(int16_t); - break; - case INT32: - a[i]=((a[i] << 8) & 0xFF00FF00) | ((a[i] >> 8) & 0xFF00FF ); - a[i]=(a[i] << 16) | ((a[i] >> 16) & 0xFFFF); - length -= sizeof(int32_t); - break; - case INT64: - b[i] = ((b[i] << 8) & 0xFF00FF00FF00FF00ULL ) | ((b[i] >> 8) & 0x00FF00FF00FF00FFULL ); - b[i] = ((b[i] << 16) & 0xFFFF0000FFFF0000ULL ) | ((b[i] >> 16) & 0x0000FFFF0000FFFFULL ); - b[i] = (b[i] << 32) | ((b[i] >> 32) & 0xFFFFFFFFULL); - length -= sizeof(int64_t); - break; - default: - length = 0; - break; - } - } -} - -int sendData(int file_des, void* buf,int length, intType itype){ -#ifndef PCCOMPILE -#ifdef EIGERD - swapData(buf, length, itype); -#endif -#endif - return sendDataOnly(file_des, buf, length); -} - - -int receiveData(int file_des, void* buf,int length, intType itype){ - int ret = receiveDataOnly(file_des, buf, length); -#ifndef PCCOMPILE -#ifdef EIGERD - if (ret >= 0) swapData(buf, length, itype); -#endif -#endif - return ret; -} - - - int sendDataOnly(int file_des, void* buf,int length) { - if (!length) - return 0; - int ret = write(file_des, buf, length); //value of -1 is other end socket crash as sigpipe is ignored - if (ret < 0) cprintf(BG_RED, "Error writing to socket. Possible socket crash\n"); - return ret; -} - - - int receiveDataOnly(int file_des, void* buf,int length) { - - int total_received=0; - int nreceiving; - int nreceived; - if (file_des<0) return -1; -#ifdef VERY_VERBOSE - printf("want to receive %d Bytes\n", length); -#endif - - while(length > 0) { - nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length; // (condition) ? if_true : if_false - nreceived = read(file_des,(char*)buf+total_received,nreceiving); - if(!nreceived){ - if(!total_received) { - return -1; //to handle it - } - break; - } - length-=nreceived; - total_received+=nreceived; - } - - if (total_received>0) - strcpy(thisClientIP,dummyClientIP); - - if (strcmp(lastClientIP,thisClientIP)) - differentClients=1; - else - differentClients=0; - - return total_received; -} - - - - -int sendModule(int file_des, sls_detector_module *myMod) { - return sendModuleGeneral(file_des, myMod, 1); -} - - -int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll) { - int ts=0; -#ifdef VERBOSE - int idac; -#endif - int nChips=myMod->nchip; - int nChans=myMod->nchan; - int nAdcs=myMod->nadc; - int nDacs=myMod->ndac; - //ts+= sendDataOnly(file_des,myMod,sizeof(sls_detector_module)); - ts+=sendData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); - ts+=sendData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); - ts+=sendData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); - ts+=sendData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); - ts+=sendData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); - ts+=sendData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); - ts+=sendData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); - ts+=sendData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); - -#ifdef VERBOSE - printf("module of size %d sent\n",ts); -#endif - ts+= sendData(file_des,myMod->dacs,sizeof(int)*nDacs,INT32); -#ifdef VERBOSE - printf("dacs of size %d sent\n",ts); - int idac; - for (idac=0; idac< nDacs; idac++) - printf("dac %d is %d\n",idac,(int)myMod->dacs[idac]); -#endif - ts+= sendData(file_des,myMod->adcs,sizeof(int)*nAdcs,INT32); -#ifdef VERBOSE - printf("adcs of size %d sent\n", ts); -#endif - - /*some detectors dont require sending all trimbits etc.*/ - if(sendAll){ - ts+=sendData(file_des,myMod->chipregs,sizeof(int)*nChips,INT32); -#ifdef VERBOSE - printf("chips of size %d sent\n", ts); -#endif - ts+=sendData(file_des,myMod->chanregs,sizeof(int)*nChans,INT32); -#ifdef VERBOSE - printf("chans of size %d sent - %d\n", ts, myMod->nchan); -#endif - } - -#ifdef VERBOSE - printf("module of size %d sent register %x\n", ts, myMod->reg); -#endif - return ts; -} - - - -int receiveModule(int file_des, sls_detector_module* myMod) { - return receiveModuleGeneral(file_des,myMod,1); -} - -int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll) { - int ts=0; - int *dacptr=myMod->dacs; - int *adcptr=myMod->adcs; - int *chipptr=myMod->chipregs, *chanptr=myMod->chanregs; - int nChips, nchipold=myMod->nchip, nchipdiff; - int nChans, nchanold=myMod->nchan, nchandiff; - int nDacs, ndold=myMod->ndac, ndacdiff; - int nAdcs, naold=myMod->nadc, nadcdiff; - ts+=receiveData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); - ts+=receiveData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); - ts+=receiveData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); - ts+=receiveData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); - ts+=receiveData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); - ts+=receiveData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); - ts+=receiveData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); - ts+=receiveData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); - - myMod->dacs=dacptr; - myMod->adcs=adcptr; - myMod->chipregs=chipptr; - myMod->chanregs=chanptr; - -#ifdef EIGERD - //feature to exclude sending of trimbtis, nchips=0,nchans=0 in that case - if(myMod->nchip == 0 && myMod->nchan == 0) { - receiveAll=0; - nchipold=0; - nchanold=0; - } -#endif - - - nChips=myMod->nchip; - nchipdiff=nChips-nchipold; - if (nchipold!=nChips) { - printf("received wrong number of chips\n"); - } -#ifdef VERBOSE - else - printf("received %d chips\n",nChips); -#endif - - nChans=myMod->nchan; - nchandiff=nChans-nchanold; - if (nchanold!=nChans) { - printf("received wrong number of channels\n"); - } -#ifdef VERBOSE - else - printf("received %d chans\n",nChans); -#endif - - - nDacs=myMod->ndac; - ndacdiff=nDacs-ndold; - if (ndold!=nDacs) { - printf("received wrong number of dacs\n"); - } -#ifdef VERBOSE - else - printf("received %d dacs\n",nDacs); -#endif - - nAdcs=myMod->nadc; - nadcdiff=nAdcs-naold; - if (naold!=nAdcs) { - printf("received wrong number of adcs\n"); - } -#ifdef VERBOSE - else - printf("received %d adcs\n",nAdcs); -#endif - if (ndacdiff<=0) { - ts+=receiveData(file_des,myMod->dacs, sizeof(int)*nDacs,INT32); -#ifdef VERBOSE - printf("dacs received\n"); - int id; - for (id=0; iddacs[id]); - - -#endif - } else { - dacptr=(int*)malloc(ndacdiff*sizeof(int)); - myMod->ndac=ndold; - ts+=receiveData(file_des,myMod->dacs, sizeof(int)*ndold,INT32); - ts+=receiveData(file_des,dacptr, sizeof(int)*ndacdiff,INT32); - free(dacptr); - return FAIL; - } - - if (nadcdiff<=0) { - ts+=receiveData(file_des,myMod->adcs, sizeof(int)*nAdcs,INT32); -#ifdef VERBOSE - printf("adcs received\n"); -#endif - } else { - adcptr=(int*)malloc(nadcdiff*sizeof(int)); - myMod->nadc=naold; - ts+=receiveData(file_des,myMod->adcs, sizeof(int)*naold,INT32); - ts+=receiveData(file_des,adcptr, sizeof(int)*nadcdiff,INT32); - free(adcptr); - return FAIL; - } - - - /*some detectors dont require sending all trimbits etc.*/ - if(receiveAll){ - - if (nchipdiff<=0) { - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nChips,INT32); -#ifdef VERBOSE - printf("chips received\n"); -#endif - } else { - chipptr=(int*)malloc(nchipdiff*sizeof(int)); - myMod->nchip=nchipold; - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nchipold,INT32); - ts+=receiveData(file_des,chipptr, sizeof(int)*nchipdiff,INT32); - free(chipptr); - return FAIL; - } - - if (nchandiff<=0) { - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nChans,INT32); -#ifdef VERBOSE - printf("chans received\n"); -#endif - } else { - chanptr=(int*)malloc(nchandiff*sizeof(int)); - myMod->nchan=nchanold; - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nchanold,INT32); - ts+=receiveData(file_des,chanptr, sizeof(int)*nchandiff,INT32); - free(chanptr); - return FAIL; - } - } -#ifdef VERBOSE - printf("received module of size %d register %x\n",ts,myMod->reg); -#endif - - return ts; -} diff --git a/slsSupportLib/include/communication_funcs.h b/slsSupportLib/include/communication_funcs.h deleted file mode 100755 index 4d41098cd..000000000 --- a/slsSupportLib/include/communication_funcs.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef COMMUNICATION_FUNCS_H -#define COMMUNICATION_FUNCS_H - -#define SEND_REC_MAX_SIZE 4096 -#define DEFAULT_PORTNO 1952 -#include -#include - - -#include -#include -#include -#include - -#include "sls_detector_defs.h" - - - -typedef enum{ - INT16, - INT32, - INT64, - OTHER -}intType; - - - - -int bindSocket(unsigned short int port_number); -int acceptConnection(int socketDescriptor); -void closeConnection(int file_Des); -void exitServer(int socketDescriptor); - -void swapData(void* val,int length,intType itype); -int sendData(int file_des, void* buf,int length, intType itype); -int receiveData(int file_des, void* buf,int length, intType itype); -int sendDataOnly(int file_des, void* buf,int length); -int receiveDataOnly(int file_des, void* buf,int length); - - -int getServerError(int socketDescriptor); -int sendModule(int file_des, sls_detector_module *myMod); -int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll); -int receiveModule(int file_des, sls_detector_module* myMod); -int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll); - -#endif From 565739f6a271ddd4c9af951cf18111b63b77c18f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Oct 2018 15:55:08 +0200 Subject: [PATCH 2/3] eiger server, moved comunication_funcs --- slsDetectorServers/eigerDetectorServer/communication_funcs.c | 2 +- slsDetectorServers/eigerDetectorServer/communication_funcs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/communication_funcs.c b/slsDetectorServers/eigerDetectorServer/communication_funcs.c index eacf9f393..30435fdc4 120000 --- a/slsDetectorServers/eigerDetectorServer/communication_funcs.c +++ b/slsDetectorServers/eigerDetectorServer/communication_funcs.c @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.c \ No newline at end of file +../slsDetectorServer/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorServers/eigerDetectorServer/communication_funcs.h b/slsDetectorServers/eigerDetectorServer/communication_funcs.h index 72c567747..c0c144994 120000 --- a/slsDetectorServers/eigerDetectorServer/communication_funcs.h +++ b/slsDetectorServers/eigerDetectorServer/communication_funcs.h @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.h \ No newline at end of file +../slsDetectorServer/communication_funcs.h \ No newline at end of file From c31c851e88ee545567625ec86b182615fef66356 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Oct 2018 15:58:49 +0200 Subject: [PATCH 3/3] moved communication, jungfrau --- slsDetectorServers/jungfrauDetectorServer/communication_funcs.c | 2 +- slsDetectorServers/jungfrauDetectorServer/communication_funcs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/communication_funcs.c b/slsDetectorServers/jungfrauDetectorServer/communication_funcs.c index eacf9f393..30435fdc4 120000 --- a/slsDetectorServers/jungfrauDetectorServer/communication_funcs.c +++ b/slsDetectorServers/jungfrauDetectorServer/communication_funcs.c @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.c \ No newline at end of file +../slsDetectorServer/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorServers/jungfrauDetectorServer/communication_funcs.h b/slsDetectorServers/jungfrauDetectorServer/communication_funcs.h index 72c567747..c0c144994 120000 --- a/slsDetectorServers/jungfrauDetectorServer/communication_funcs.h +++ b/slsDetectorServers/jungfrauDetectorServer/communication_funcs.h @@ -1 +1 @@ -../../slsSupportLib/include/communication_funcs.h \ No newline at end of file +../slsDetectorServer/communication_funcs.h \ No newline at end of file