diff --git a/slsDetectorSoftware/slsDetectorServer/Makefile b/slsDetectorSoftware/slsDetectorServer/Makefile index 9f8c63c8b..8c3ee8d97 100644 --- a/slsDetectorSoftware/slsDetectorServer/Makefile +++ b/slsDetectorSoftware/slsDetectorServer/Makefile @@ -1,12 +1,12 @@ CC = gcc -CLAGS += -Wall -DVIRTUAL -DDACS_INT -DGENERIC # -DSLS_DETECTOR_FUNCTION_LIST +CLAGS += -Wall -DVIRTUAL -DDACS_INT -DGENERICD # -DSLS_DETECTOR_FUNCTION_LIST LDLIBS += -lm PROGS = genericDetectorServer DESTDIR ?= bin INSTMODE = 0777 -SRC_CLNT = slsDetectorServer.c slsDetectorServer_funcs.c communication_funcs.c slsDetector_firmware.c slsDetectorFunctionList.c +SRC_CLNT = slsDetectorServer.c slsDetectorServer_funcs.c communication_funcs.c slsDetectorFunctionList.c OBJS = $(SRC_CLNT:.cpp=.o) diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.c index ec8817edc..5cf0f9f9a 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.c @@ -7,37 +7,39 @@ #include - - -extern int nModX; -extern int nModBoard; -extern int dataBytes; -extern int dynamicRange; const int nChans=NCHAN; const int nChips=NCHIP; const int nDacs=NDAC; const int nAdcs=NADC; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; const int allSelected=-2; const int noneSelected=-1; - sls_detector_module *detectorModules=NULL; int *detectorChips=NULL; int *detectorChans=NULL; dacs_t *detectorDacs=NULL; dacs_t *detectorAdcs=NULL; +int nModY = NMAXMOD; +int nModX = NMAXMOD; +int dynamicRange= DYNAMIC_RANGE; +int dataBytes = NMAXMOD*NCHIP*NCHAN*2; +int masterMode = NO_MASTER; +int syncMode = NO_SYNCHRONIZATION; +int timingMode = AUTO_TIMING; + + + +enum detectorSettings thisSettings; +int sChan, sChip, sMod, sDac, sAdc; +int nModBoard; +extern int dataBytes; + int initializeDetector(){ int imod; - int n=getNModBoard(X)*getNModBoard(Y); - /*nModX=n;*/ - #ifdef VERBOSE printf("Board is for %d modules\n",n); #endif @@ -299,16 +301,21 @@ int setDynamicRange(int dr){ return 0; } -int setROI(int mask){ //////????????????????? - return FAIL; + +enum readOutFlags setReadOutFlags(enum readOutFlags val){ + //template setStoreInRAM from firmware_funcs.c + return -1; } -int getROI(int *mask){ //////////????????????????????? + + +int setROI(int n, ROI arg[], int *retvalsize, int *ret){ return FAIL; } + int setSpeed(enum speedVariable arg, int val){ //template setClockDivider() from firmware_funcs.c //CLOCK_DIVIDER @@ -322,11 +329,6 @@ int setSpeed(enum speedVariable arg, int val){ } -enum readOutFlags setReadOutFlags(enum readOutFlags val){ - //template setStoreInRAM from firmware_funcs.c - return -1; -} - int executeTrimming(enum trimMode mode, int par1, int par2, int imod){ // template trim_with_noise from trimming_funcs.c @@ -358,6 +360,16 @@ int resetCounterBlock(int startACQ){ return FAIL; } +int startReceiver(int d){ + + return 0; +} + +int calibratePedestal(int frames){ + + return 0; +} + int calculateDataBytes(){ return 0; } diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 1f2d3de8f..a5a7aecd2 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -35,16 +35,9 @@ Here are the definitions, but the actual implementation should be done for each int mapCSP0(void); int initializeDetector(); -enum masterFlags setMaster(enum masterFlags arg); -enum synchronizationMode setSynchronization(enum synchronizationMode arg); - int setNMod(int nm, enum dimension dim); int getNModBoard(enum dimension arg); -enum externalSignalFlag getExtSignal(int signalindex); -enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag flag); -enum externalCommunicationMode setTiming( enum externalCommunicationMode arg); - int64_t getModuleId(enum idMode arg, int imod); int64_t getDetectorId(enum idMode arg); int moduleTest( enum digitalTestMode arg, int imod); @@ -53,18 +46,28 @@ int detectorTest( enum digitalTestMode arg); double setDAC(enum dacIndex ind, double val, int imod); double getADC(enum dacIndex ind, int imod); -bus_w() -bus_r() + +#if defined(MYTHEND) || defined(GOTTHARDD) +u_int32_t writeRegister(u_int32_t offset, u_int32_t data); +u_int32_t readRegister(u_int32_t offset); +#endif + +#ifdef MYTHEND int setChannel(sls_detector_channel myChan); int getChannel(sls_detector_channel *myChan); int setChip(sls_detector_chip myChip); int getChip(sls_detector_chip *myChip); +#endif + int setModule(sls_detector_module myChan); int getModule(sls_detector_module *myChan); enum detectorSettings setSettings(enum detectorSettings sett, int imod); + +#if defined(MYTHEND) || defined(EIGERD) int getThresholdEnergy(int imod); int setThresholdEnergy(int thr, int imod); +#endif int startStateMachine(); int stopStateMachine(); @@ -76,11 +79,19 @@ char *readFrame(int *ret, char *mess); int64_t setTimer(enum timerIndex ind, int64_t val); int64_t getTimeLeft(enum timerIndex ind); + int setDynamicRange(int dr); +int setROI(int n, ROI arg[], int *retvalsize, int *ret); + + +#ifdef MYTHEND enum readOutFlags setReadOutFlags(enum readOutFlags val); -int setROI(int mask); int setSpeed(enum speedVariable arg, int val); +#endif + +#if defined(EIGERD) || defined(MYTHEND) int executeTrimming(enum trimMode mode, int par1, int par2, int imod); +#endif #ifdef GOTTHARDD int configureMAC(int ipad, long long int imacadd, long long int iservermacadd, int dtb); @@ -103,6 +114,12 @@ int getNumberOfDACsPerModule(); int getNumberOfADCsPerModule(); +enum externalSignalFlag getExtSignal(int signalindex); +enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag flag); +enum externalCommunicationMode setTiming( enum externalCommunicationMode arg); +enum masterFlags setMaster(enum masterFlags arg); +enum synchronizationMode setSynchronization(enum synchronizationMode arg); + #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_defs.h new file mode 100644 index 000000000..543f305e5 --- /dev/null +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_defs.h @@ -0,0 +1,31 @@ +/* + * slsDetectorServer_defs.h + * + * Created on: Jan 24, 2013 + * Author: l_maliakal_d + */ + +#ifndef SLSDETECTORSERVER_DEFS_H_ +#define SLSDETECTORSERVER_DEFS_H_ + +#include "sls_detector_defs.h" +#include + +#define GOODBYE -200 + + +/* examples*/ +#define NCHAN 1 +#define NCHIP 1 +#define NDAC 1 +#define NADC 1 +#define NMAXMODX 1 +#define NMAXMODY 1 +#define NMAXMOD NMAXMODX*NMAXMODY +#define NCHANS NCHAN*NCHIP*NMAXMOD +#define NDACS NDAC*NMAXMOD + + + + +#endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 947d28643..f8982bc0f 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -14,6 +14,9 @@ +//#if defined(EIGERD) || defined(GOTTHARDD) +//#endif + // Global variables int (*flist[256])(int); //defined in the detector specific file @@ -36,9 +39,9 @@ extern char thisClientIP[INET_ADDRSTRLEN]; extern int differentClients; */ //global variables for optimized readout +char mess[1000]; char *dataretval=NULL; int dataret; -char mess[1000]; int dataBytes; @@ -49,7 +52,7 @@ int init_detector(int b) { printf("This is a VIRTUAL detector\n"); #endif #ifdef SLS_DETECTOR_FUNCTION_LIST - mapCSP0(); + //mapCSP0(); #endif //only for control server if(b){ @@ -893,7 +896,7 @@ int get_id(int file_des) { int digital_test(int file_des) { - int retval; + int retval=-1; int ret=OK; int imod=-1; int n=0; @@ -926,6 +929,10 @@ int digital_test(int file_des) { #ifdef VERBOSE printf("of module %d\n", imod); #endif +#ifndef MYTHEND + ret = FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); +#else #ifdef SLS_DETECTOR_FUNCTION_LIST if (imod>=0 && imod=getNumberOfChannelsPerChip()) { ret=FAIL; @@ -1408,6 +1440,7 @@ int get_channel(int file_des) { if (ret==OK) ret=getChannel(&retval); +#endif #endif if (differentClients && ret==OK) ret=FORCE_UPDATE; @@ -1454,6 +1487,7 @@ int set_chip(int file_des) { printf("Setting chip\n"); #endif ret=receiveChip(file_des, &myChip); +#ifdef MYTHEND #ifdef VERBOSE printf("Chip received\n"); #endif @@ -1482,6 +1516,7 @@ int set_chip(int file_des) { } else { retval=setChip(myChip); } +#endif #endif /* Maybe this is done inside the initialization funcs */ //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); @@ -1529,6 +1564,7 @@ int get_chip(int file_des) { ichip=arg[0]; imod=arg[1]; +#ifdef MYTHEND #ifdef SLS_DETECTOR_FUNCTION_LIST if (ichip>=getNumberOfChipsPerModule()) { ret=FAIL; @@ -1544,6 +1580,7 @@ int get_chip(int file_des) { if (ret==OK) ret=getChip(&retval); +#endif #endif if (differentClients && ret==OK) ret=FORCE_UPDATE; @@ -1844,7 +1881,7 @@ int get_threshold_energy(int file_des) { ret=FAIL; } - +#if defined(MYTHEND) || defined(EIGERD) #ifdef VERBOSE printf("Getting threshold energy of module %d\n", imod); #endif @@ -1859,7 +1896,7 @@ int get_threshold_energy(int file_des) { #ifdef VERBOSE printf("Threshold is %d eV\n", retval); #endif - +#endif if (differentClients==1 && ret==OK) ret=FORCE_UPDATE; @@ -1899,6 +1936,7 @@ int set_threshold_energy(int file_des) { ethr=arg[0]; imod=arg[1]; isett=arg[2]; +#if defined(MYTHEND) || defined(EIGERD) #ifdef SLS_DETECTOR_FUNCTION_LIST if (imod>=getTotalNumberOfModules()) { ret=FAIL; @@ -1923,6 +1961,7 @@ int set_threshold_energy(int file_des) { printf("Setting threshold of module %d: wrote %d but read %d\n", imod, ethr, retval); sprintf(mess,"Setting threshold of module %d: wrote %d but read %d\n", imod, ethr, retval); } +#endif #endif if (ret==OK && differentClients==1) ret=FORCE_UPDATE; @@ -2204,32 +2243,26 @@ int set_timer(int file_des) { sprintf(mess,"Detector locked by %s\n",lastClientIP); } else { switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; case PROBES_NUMBER: - retval=setProbes(tns); +#ifndef MYTHEND + ret=FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); break; +#endif + case FRAME_NUMBER: + case ACQUISITION_TIME: + case FRAME_PERIOD: + case DELAY_AFTER_TRIGGER: + case GATES_NUMBER: case CYCLES_NUMBER: - retval=setTrains(tns); + retval = setTimer(ind,tns); break; default: ret=FAIL; sprintf(mess,"timer index unknown %d\n",ind); break; } + } } #endif @@ -2291,6 +2324,12 @@ int get_time_left(int file_des) { #ifdef SLS_DETECTOR_FUNCTION_LIST if (ret==OK) { switch(ind) { + case PROBES_NUMBER: +#ifndef MYTHEND + ret=FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); + break; +#endif case FRAME_NUMBER: case ACQUISITION_TIME: case FRAME_PERIOD: @@ -2298,15 +2337,9 @@ int get_time_left(int file_des) { case GATES_NUMBER: case CYCLES_NUMBER: case PROGRESS: - retval=getTimeLeft(ind); - break; - case PROBES_NUMBER: case ACTUAL_TIME: case MEASUREMENT_TIME: - if (myDetectorType==MYTHEN) { - retval=getTimeLeft(ind); - break; - } + getTimeLeft(ind); break; default: ret=FAIL; @@ -2402,7 +2435,10 @@ int set_readout_flags(int file_des) { sprintf(mess,"Error reading from socket\n"); ret=FAIL; } - +#ifndef MYTHEND + ret = FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); +#else #ifdef VERBOSE printf("setting readout flags to %d\n",arg); #endif @@ -2437,7 +2473,7 @@ int set_readout_flags(int file_des) { sprintf(mess,"Could not change readout flag: should be %d but is %d\n", arg, retval); } } - +#endif n = sendDataOnly(file_des,&ret,sizeof(ret)); if (ret==FAIL) { @@ -2453,6 +2489,72 @@ int set_readout_flags(int file_des) { int set_roi(int file_des) { + + int ret=OK; + ROI arg[MAX_ROIS]; + ROI* retval=0; + int nroi=-1, n=0, retvalsize=0; +#ifdef VERBOSE + int i; +#endif + strcpy(mess,"Could not set/get roi\n"); + + n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + + if(nroi!=-1){ + n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); + if (n != (nroi*sizeof(ROI))) { + sprintf(mess,"Received wrong number of bytes for ROI\n"); + ret=FAIL; + } + } +#ifndef GOTTHARDD + ret = FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); +#else +#ifdef VERBOSE + printf("Setting ROI to:"); + for( i=0;i