diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index b56306697..314d43934 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -16,6 +16,7 @@ int slsDetector::initSharedMemory(detectorType type, int id) { int nch, nm, nc, nd; int sz; + //shmId=-1; switch(type) { case MYTHEN: @@ -72,6 +73,7 @@ int slsDetector::initSharedMemory(detectorType type, int id) { /** shm_id returns -1 is shared memory initialization fails */ + //shmId=shm_id; return shm_id; } @@ -93,6 +95,25 @@ int slsDetector::freeSharedMemory() { return OK; } + + + + + + + + + + + + + + + + + + + slsDetector::slsDetector(detectorType type, int id): thisDetector(NULL), @@ -150,6 +171,149 @@ slsDetector::slsDetector(detectorType type, int id): slsDetector::~slsDetector(){}; +slsDetector::slsDetector(char *name, int id, int cport) : + thisDetector(NULL), + detId(0), + shmId(-1), + controlSocket(NULL), + stopSocket(NULL), + dataSocket(NULL), + currentPosition(0), + currentPositionIndex(0), + currentI0(0), + mergingBins(NULL), + mergingCounts(NULL), + mergingErrors(NULL), + mergingMultiplicity(NULL), + ffcoefficients(NULL), + fferrors(NULL), + detectorModules(NULL), + dacs(NULL), + adcs(NULL), + chipregs(NULL), + chanregs(NULL), + badChannelMask(NULL) +{ + + detectorType type=(detectorType)getDetectorType(name, cport); + + + while (shmId<0) { + /**Initlializes shared memory \sa initSharedMemory + + if it fails the detector id is incremented until it succeeds + */ + shmId=initSharedMemory(type,id); + id++; + } + id--; +#ifdef VERBOSE + std::cout<< "Detector id is " << id << std::endl; +#endif + detId=id; + + + /**Initializes the detector stucture \sa initializeDetectorSize + */ + initializeDetectorSize(type); + + + + + pthread_mutex_t mp1 = PTHREAD_MUTEX_INITIALIZER; + + mp=mp1; + + pthread_mutex_init(&mp, NULL); + + setTCPSocket(name, cport); + +} + +detectorType slsDetector::getDetectorType(char *name, int cport) { + + int retval=FAIL; + detectorType t=GENERIC; + int fnum=F_GET_DETECTOR_TYPE; + MySocketTCP *s= new MySocketTCP(name, cport); + char m[1000]; + + if (s->Connect()>=0) { + s->SendDataOnly(&fnum,sizeof(fnum)); + s->ReceiveDataOnly(&retval,sizeof(retval)); + + if (retval==OK) + s->ReceiveDataOnly(&t,sizeof(t)); + else { + s->ReceiveDataOnly(m,sizeof(m)); + std::cout<< "Detector returned error: " << m << std::endl; + } + s->Disconnect(); + } else { + cout << "Cannot connect to server " << name << " over port " << cport << endl; + } + + delete s; + return t; + +} + +detectorType slsDetector::getDetectorType(int id) { + + detectorType t=GENERIC; + + + key_t mem_key=DEFAULT_SHM_KEY+id; + int shm_id; + int sz; + + sz=sizeof(sharedSlsDetector); + + shm_id = shmget(mem_key,sz,IPC_CREAT | 0666); // allocate shared memory + + if (shm_id < 0) { + std::cout<<"*** shmget error (server) ***"<< shm_id << std::endl; + return t; + } + + /** + thisDetector pointer is set to the memory address of the shared memory + */ + + sharedSlsDetector* det = (sharedSlsDetector*) shmat(shm_id, NULL, 0); /* attach */ + + if (det == (void*)-1) { + std::cout<<"*** shmat error (server) ***" << std::endl; + return t; + } + /** + shm_id returns -1 is shared memory initialization fails + */ + //shmId=shm_id; + + t=det->myDetectorType; + + + if (det->alreadyExisting==0) { + // Detach Memory address + if (shmdt(det) == -1) { + perror("shmdt failed\n"); + return t; + } + //printf("Shared memory %d detached\n", shmId); + // remove shared memory + if (shmctl(shm_id, IPC_RMID, 0) == -1) { + perror("shmctl(IPC_RMID) failed\n"); + return t; + } + //printf("Shared memory %d deleted\n", shmId); + } + return t; + + +} + + int slsDetector::initializeDetectorSize(detectorType type) { char *goff; goff=(char*)thisDetector; @@ -203,12 +367,12 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->dynamicRange=1; break; default: - thisDetector->nChans=65536; - thisDetector->nChips=8; - thisDetector->nDacs=16; - thisDetector->nAdcs=16; - thisDetector->nModMax[X]=6; - thisDetector->nModMax[Y]=6; + thisDetector->nChans=0; + thisDetector->nChips=0; + thisDetector->nDacs=0; + thisDetector->nAdcs=0; + thisDetector->nModMax[X]=0; + thisDetector->nModMax[Y]=0; thisDetector->dynamicRange=32; } thisDetector->nModsMax=thisDetector->nModMax[0]*thisDetector->nModMax[1]; @@ -987,26 +1151,26 @@ int slsDetector::setDetectorType(string const type){ return setDetectorType(dtype); }; -void slsDetector::getDetectorType(char *type){ +string slsDetector::getDetectorType(){ switch (thisDetector->myDetectorType) { case MYTHEN: - strcpy(type,"Mythen"); + return string("Mythen"); break; case PILATUS: - strcpy(type,"Pilatus"); + return string("Pilatus"); break; case EIGER: - strcpy(type,"Eiger"); + return string("Eiger"); break; case GOTTHARD: - strcpy(type,"Gotthard"); + return string("Gotthard"); break; case AGIPD: - strcpy(type,"Agipd"); + return string("Agipd"); break; default: - strcpy(type,"Unknown"); + return string("Unknown"); break; } }; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 68a068a4e..bc3933ecc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -309,6 +309,9 @@ typedef struct sharedSlsDetector { */ slsDetector(detectorType type=GENERIC, int id=0); + + + slsDetector(char *name, int id=0, int cport=DEFAULT_PORTNO); //slsDetector(string const fname); // ~slsDetector(){while(dataQueue.size()>0){}}; /** destructor */ @@ -329,13 +332,13 @@ typedef struct sharedSlsDetector { /sa mythenDetector::readConfigurationFile */ - virtual int readConfigurationFile(string const fname)=0; + virtual int readConfigurationFile(string const fname){}; /** Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::writeConfigurationFile */ - virtual int writeConfigurationFile(string const fname)=0; + virtual int writeConfigurationFile(string const fname){}; /* @@ -348,13 +351,13 @@ typedef struct sharedSlsDetector { Should be implemented in the specific detector class /sa mythenDetector::dumpDetectorSetup */ - virtual int dumpDetectorSetup(string const fname, int level=0)=0; + virtual int dumpDetectorSetup(string const fname, int level=0){}; /** Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::retrieveDetectorSetup */ - virtual int retrieveDetectorSetup(string const fname, int level=0)=0; + virtual int retrieveDetectorSetup(string const fname, int level=0){}; /** configure the socket communication and initializes the socket instances @@ -412,7 +415,7 @@ typedef struct sharedSlsDetector { \sa mythenDetector::readSettingsFile */ - virtual sls_detector_module* readSettingsFile(string fname, sls_detector_module* myMod=NULL)=0; + virtual sls_detector_module* readSettingsFile(string fname, sls_detector_module* myMod=NULL){}; /** Pure virtual function @@ -423,7 +426,7 @@ typedef struct sharedSlsDetector { \sa ::sls_detector_module mythenDetector::writeSettingsFile(string, sls_detector_module) */ - virtual int writeSettingsFile(string fname, sls_detector_module mod)=0; + virtual int writeSettingsFile(string fname, sls_detector_module mod){}; /** Pure virtual function @@ -433,7 +436,7 @@ typedef struct sharedSlsDetector { \returns OK or FAIL if the file could not be written \sa ::sls_detector_module sharedSlsDetector mythenDetector::writeSettingsFile(string, int) */ - virtual int writeSettingsFile(string fname, int imod)=0; + virtual int writeSettingsFile(string fname, int imod){}; /** @@ -511,7 +514,7 @@ typedef struct sharedSlsDetector { \sa mythenDetector::writeDataFile */ - virtual int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)=0; + virtual int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1){}; /** Pure virtual function @@ -521,7 +524,7 @@ typedef struct sharedSlsDetector { \returns OK or FAIL if it could not write the file or data=NULL \sa mythenDetector::writeDataFile */ - virtual int writeDataFile(string fname, int *data)=0; + virtual int writeDataFile(string fname, int *data){}; /** Pure virtual function @@ -537,7 +540,7 @@ typedef struct sharedSlsDetector { \sa mythenDetector::readDataFile */ - virtual int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)=0; + virtual int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0){}; /** Pure virtual function @@ -547,7 +550,7 @@ typedef struct sharedSlsDetector { \returns OK or FAIL if it could not read the file or data=NULL \sa mythenDetector::readDataFile */ - virtual int readDataFile(string fname, int *data)=0; + virtual int readDataFile(string fname, int *data){}; /** returns the location of the calibration files @@ -569,7 +572,7 @@ typedef struct sharedSlsDetector { \offset reference to the offset variable \sa sharedSlsDetector mythenDetector::readCalibrationFile */ - virtual int readCalibrationFile(string fname, float &gain, float &offset)=0; + virtual int readCalibrationFile(string fname, float &gain, float &offset){}; /** Pure virtual function writes a calibration file @@ -578,7 +581,7 @@ typedef struct sharedSlsDetector { \param offset \sa sharedSlsDetector mythenDetector::writeCalibrationFile */ - virtual int writeCalibrationFile(string fname, float gain, float offset)=0; + virtual int writeCalibrationFile(string fname, float gain, float offset){}; /** @@ -636,7 +639,7 @@ typedef struct sharedSlsDetector { normally the detector knows what type of detector it is \param type is the string where the detector type will be written ("Mythen", "Pilatus", "XFS", "Gotthard", Agipd") */ - void getDetectorType(char *type); + string getDetectorType(); // Detector configuration functions @@ -1041,6 +1044,17 @@ typedef struct sharedSlsDetector { */ int setDynamicRange(int n=-1); + /** + set/get dynamic range + \returns number of bytes sent by the detector + \sa sharedSlsDetector + */ + int getDataBytes(){return thisDetector->dataBytes;}; + + + + + /** set roi @@ -1511,62 +1525,23 @@ enum {GET_ACTION, PUT_ACTION, READOUT_ACTION}; + /** + returns the detector type from hostname and controlport + \param + \param action can be PUT_ACTION or GET_ACTION (from text client even READOUT_ACTION for acquisition) + */ + static detectorType getDetectorType(char *name, int cport=DEFAULT_PORTNO); + + /** + returns the detector type from hostname and controlport + \param + \param action can be PUT_ACTION or GET_ACTION (from text client even READOUT_ACTION for acquisition) + */ + static detectorType getDetectorType(int id); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + int getDetectorId() { return detId;}; + protected: