diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 796883d09..29c624b8d 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -10,6 +10,8 @@ //#include #include "sls_receiver_defs.h" +#define REQUIRED_FIRMWARE_VERSION 10 + /** default maximum string length */ #define MAX_SCAN_STEPS 2000 /** maxmimum number of modules per controller*/ @@ -19,6 +21,9 @@ /** header length for data :gotthard*/ #define HEADERLENGTH 12 +#define DEFAULT_SUBFRAME_EXPOSURE_VAL 2621440 /** default value for sub frame value 2.6ms*/ +#define MAX_SUBFRAME_EXPOSURE_VAL 0x1FFFFFFF /** 29 bit register for max subframe exposure value */ + /** maximum rois */ #define MAX_ROIS 100 diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index b0522622f..9e80e1307 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -154,7 +154,7 @@ void Beb_GetModuleCopnfiguration(int* master, int* top){ //open file pointer int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); if(fd < 0){ - cprintf(RED,"Module Configuration FAIL\n"); + cprintf(BG_RED,"Module Configuration FAIL\n"); }else{ //read data ret = Beb_Read32(baseaddr, MODULE_CONFIGURATION_MASK); @@ -177,21 +177,21 @@ u_int32_t Beb_GetFirmwareRevision(){ //open file pointer int fd = Beb_open(XPAR_VERSION,&baseaddr); if(fd < 0) - cprintf(RED,"Firmware Revision Read FAIL\n"); + cprintf(BG_RED,"Firmware Revision Read FAIL\n"); else{ //read revision existing bit value = Beb_Read32(baseaddr, REVISION_EXISTING_OFFSET); - printf("Firmware Revision Read OK\n"); + //printf("Firmware Revision Read OK\n"); //error reading if(!(value&REVISION_EXISTING_BIT)){ - cprintf(RED,"Firmware Revision Number does not exist in this version\n"); + cprintf(BG_RED,"Firmware Revision Number does not exist in this version\n"); value = 0; }else{ //read revision number value = Beb_Read32(baseaddr, 0); - printf("Firmware Revision Number Read OK\n"); - printf("Rev: 0x%x.%x\n\n",value & REVISION_MASK,value & SUB_REVISION_MASK); + //printf("Firmware Revision Number Read OK\n"); + //printf("Rev: 0x%x.%x\n\n",value & REVISION_MASK,value & SUB_REVISION_MASK); value &= REVISION_MASK; } } @@ -203,6 +203,27 @@ u_int32_t Beb_GetFirmwareRevision(){ return value; } + +void Beb_ResetFrameNumber(){ + //mapping new memory to read master top module configuration + u_int32_t baseaddr; + //open file pointer + int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); + if(fd < 0){ + cprintf(BG_RED,"Reset Frame Number FAIL\n"); + }else{ + //write a 1 + Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 1); + usleep(100000); //100ms + //write a 0 + Beb_Write32(baseaddr, FRAME_NUM_RESET_OFFSET, 0); + printf("Frame Number Reset OK\n"); + //close file pointer + Beb_close(fd); + } +} + + void Beb_ClearBebInfos(){ //unsigned int i; //for(i=0;ifull,1->half,2->quarter or 3->super_slow*/ - int Feb_Control_SetReadoutSpeed(unsigned int readout_speed); //0->full,1->half,2->quarter or 3->super_slow - /* int Feb_Control_SetReadoutMode(unsigned int readout_mode=0); //0->parallel,1->non-parallel,2-> safe_mode*/ - int Feb_Control_SetReadoutMode(unsigned int readout_mode); //0->parallel,1->non-parallel,2-> safe_mode - /* int Feb_Control_SetTriggerMode(unsigned int trigger_mode=0, int polarity=1);*/ - int Feb_Control_SetTriggerMode(unsigned int trigger_mode, int polarity); - /*int Feb_Control_SetExternalEnableMode(int use_external_enable=0, int polarity=1);*/ - int Feb_Control_SetExternalEnableMode(int use_external_enable, int polarity); + void Feb_Control_PrintAcquisitionSetup(); + int Feb_Control_SetNExposures(unsigned int n_images); + unsigned int Feb_Control_GetNExposures(); + int Feb_Control_SetExposureTime(double the_exposure_time_in_sec); + double Feb_Control_GetExposureTime(); + int Feb_Control_SetSubFrameExposureTime(int the_subframe_exposure_time_in_10nsec); + int Feb_Control_GetSubFrameExposureTime(); + int Feb_Control_SetExposurePeriod(double the_exposure_period_in_sec); + double Feb_Control_GetExposurePeriod(); + int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo); + unsigned int Feb_Control_GetDynamicRange(); + int Feb_Control_SetReadoutSpeed(unsigned int readout_speed); //0 was default, 0->full,1->half,2->quarter or 3->super_slow + int Feb_Control_SetReadoutMode(unsigned int readout_mode); ///0 was default,0->parallel,1->non-parallel,2-> safe_mode + int Feb_Control_SetTriggerMode(unsigned int trigger_mode, int polarity);//0 and 1 was default, + int Feb_Control_SetExternalEnableMode(int use_external_enable, int polarity);//0 and 1 was default, //functions for testing /*int Feb_Control_SetTestModeVariable(int on=1);*/ diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index a0380c848..77c5cb95b 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -17,7 +17,8 @@ #define DAQ_REG_NEXPOSURES 3 #define DAQ_REG_EXPOSURE_TIMER 4 // == (31 downto 3) * 10^(2 downto 0) #define DAQ_REG_EXPOSURE_REPEAT_TIMER 5 // == (31 downto 3) * 10^(2 downto 0) -#define DAQ_REG_STATUS 6 //also pg and fifo status register +#define DAQ_REG_SUBFRAME_EXPOSURES 6 +#define DAQ_REG_STATUS 7 //also pg and fifo status register #define DAQ_CTRL_RESET 0x80000000 #define DAQ_CTRL_START 0x40000000 @@ -136,3 +137,5 @@ #define REVISION_MASK 0x0FFFFFFF #define SUB_REVISION_MASK 0xF0000000 +#define FRAME_NUM_RESET_OFFSET 0xA0 + diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer index 45bfaa326..1a2700d2b 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer differ diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 0dc4eb80a..17f1889f0 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -40,12 +40,10 @@ int eiger_extgating = 0; int eiger_extgatingpolarity = 0; - int eiger_nexposures = 1; int eiger_ncycles = 1; - int send_to_ten_gig = 0; int ndsts_in_use=32; unsigned int nimages_per_request=1; @@ -65,14 +63,13 @@ int master = 0; #define TEN_GIGA_BUFFER_SIZE 4112 #define ONE_GIGA_BUFFER_SIZE 1040 + int initDetector(){ int imod,i,n; n = getNModBoard(1); - printf("This is the EIGER Server of revision %llx\n", getDetectorId(DETECTOR_SOFTWARE_VERSION)); - //#ifdef VERBOSE - printf("Board is for %d half modules\n",n); + printf("This Server is for 1 Eiger half module\n"); //#endif @@ -131,6 +128,7 @@ int initDetector(){ //setting default measurement parameters setTimer(FRAME_NUMBER,1); setTimer(ACQUISITION_TIME,1E9); + setTimer(SUBFRAME_ACQUISITION_TIME,DEFAULT_SUBFRAME_EXPOSURE_VAL); setTimer(FRAME_PERIOD,1E9); setDynamicRange(16); setThresholdEnergy(8000,0); @@ -483,6 +481,11 @@ enum detectorSettings setSettings(enum detectorSettings sett, int imod){ int startReceiver(int d){ + + //reset frame number + printf("Going to reset Frame Number\n"); + Beb_ResetFrameNumber(); + //if(master) Feb_Control_PrepareForAcquisition(); return OK; @@ -615,12 +618,22 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ nimages_per_request = eiger_nexposures * eiger_ncycles; } }return eiger_nexposures; + case ACQUISITION_TIME: if(val >= 0){ printf(" Setting exp time: %fs\n",val/(1E9)); Feb_Control_SetExposureTime(val/(1E9)); } return (Feb_Control_GetExposureTime()*(1E9)); + + case SUBFRAME_ACQUISITION_TIME: + if(val >= 0){ + printf(" Setting sub exp time: %dns\n",(int)val/10); + Feb_Control_SetSubFrameExposureTime(val/10); + } + return (Feb_Control_GetSubFrameExposureTime()*10); + + case FRAME_PERIOD: if(val >= 0){ printf(" Setting acq period: %fs\n",val/(1E9)); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 8c9d1d126..0b612e8c1 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3220,6 +3220,11 @@ int slsDetector::updateDetectorNoWait() { n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[ACQUISITION_TIME]=retval; + if(thisDetector->myDetectorType!= EIGER){ + //retval=setSubFrameExposureTime(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]=retval; +} //retval=setPeriod(tns); n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[FRAME_PERIOD]=retval; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 8f6e4d6db..98529bcaa 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -369,6 +369,7 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef */ virtual int64_t setTimer(timerIndex index, int64_t t=-1)=0; int64_t setExposureTime(int64_t t=-1){return setTimer(ACQUISITION_TIME,t);}; + int64_t setSubFrameExposureTime(int64_t t=-1){return setTimer(SUBFRAME_ACQUISITION_TIME,t);}; int64_t setExposurePeriod(int64_t t=-1){return setTimer(FRAME_PERIOD,t);}; int64_t setDelayAfterTrigger(int64_t t=-1){return setTimer(DELAY_AFTER_TRIGGER,t);}; int64_t setNumberOfGates(int64_t t=-1){return setTimer(GATES_NUMBER,t);}; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 0234bbf82..4f18a06f5 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -733,6 +733,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; + descrToFuncMap[i].m_pFuncName="subexptime"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + descrToFuncMap[i].m_pFuncName="period"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; @@ -3783,6 +3787,8 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) { if (cmd=="exptime") index=ACQUISITION_TIME; + else if (cmd=="subexptime") + index=SUBFRAME_ACQUISITION_TIME; else if (cmd=="period") index=FRAME_PERIOD; else if (cmd=="delay") @@ -3806,7 +3812,7 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) { ; else return string("cannot scan timer value ")+string(args[1]); - if (index==ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER) + if (index==ACQUISITION_TIME || index==SUBFRAME_ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER) t=(int64_t)(val*1E+9); else t=(int64_t)val; } @@ -3815,7 +3821,7 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); ret=myDet->setTimer(index,t); - if (index==ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER) + if (index==ACQUISITION_TIME || index==SUBFRAME_ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER) rval=(double)ret*1E-9; else rval=ret; @@ -3843,6 +3849,7 @@ string slsDetectorCommand::helpTimer(int narg, char *args[], int action) { ostringstream os; if (action==PUT_ACTION || action==HELP_ACTION) { os << "exptime t \t sets the exposure time in s" << std::endl; + os << "subexptime t \t sets the exposure time of subframe in s" << std::endl; os << "period t \t sets the frame period in s" << std::endl; os << "delay t \t sets the delay after trigger in s" << std::endl; os << "frames t \t sets the number of frames per cycle (e.g. after each trigger)" << std::endl; @@ -3855,6 +3862,7 @@ string slsDetectorCommand::helpTimer(int narg, char *args[], int action) { if (action==GET_ACTION || action==HELP_ACTION) { os << "exptime \t gets the exposure time in s" << std::endl; + os << "subexptime \t gets the exposure time of subframe in s" << std::endl; os << "period \t gets the frame period in s" << std::endl; os << "delay \t gets the delay after trigger in s" << std::endl; os << "frames \t gets the number of frames per cycle (e.g. after each trigger)" << std::endl; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 43baf223d..e1bdea683 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -37,7 +37,7 @@ using namespace std; #include "slsDetectorActions.h" #include "postProcessing.h" -#define MAX_TIMERS 11 +//#define MAX_TIMERS 11 #define MAXPOS 50 #define DEFAULT_HOSTNAME "localhost" diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer.c index 3bedf8fd0..acda828c2 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer.c @@ -22,6 +22,9 @@ int main(int argc, char *argv[]){ int portno, b; int retval=OK; int sd, fd; + + checkFirmwareCompatibility(); + #ifdef STOP_SERVER char cmd[100]; #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index c97f7652b..17b11eece 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -42,6 +42,24 @@ int dataBytes = 10; +void checkFirmwareCompatibility(){ + cprintf(BLUE,"\n\n********************************************************\n" + "**********************EIGER Server**********************\n" + "********************************************************\n"); + cprintf(BLUE,"\nFirmware Version: %llx\nSoftware Version: %llx\n\n", + getDetectorId(DETECTOR_FIRMWARE_VERSION), getDetectorId(DETECTOR_SOFTWARE_VERSION)); + + //check for firmware version compatibility + if(getDetectorId(DETECTOR_FIRMWARE_VERSION) < REQUIRED_FIRMWARE_VERSION){ + cprintf(RED,"FATAL ERROR: This firmware version is incompatible.\n" + "Please update it to v%d to be compatible with this server\n\n", + REQUIRED_FIRMWARE_VERSION); + + cprintf(RED,"Exiting Server. Goodbye!\n\n"); + exit(-1); + } +} + int init_detector(int b) { #ifdef VIRTUAL @@ -401,6 +419,10 @@ int send_update(int file_des) { retval=setTimer(ACQUISITION_TIME,GET_FLAG); #endif n += sendData(file_des,&retval,sizeof(int64_t),INT64); +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=setTimer(SUBFRAME_ACQUISITION_TIME,GET_FLAG); +#endif + n += sendData(file_des,&retval,sizeof(int64_t),INT64); #ifdef SLS_DETECTOR_FUNCTION_LIST retval=setTimer(FRAME_PERIOD,GET_FLAG); #endif @@ -2428,6 +2450,16 @@ int set_timer(int file_des) { sprintf(mess,"Detector locked by %s\n",lastClientIP); } else { switch(ind) { +#ifdef EIGERD + case SUBFRAME_ACQUISITION_TIME: + if (tns > MAX_SUBFRAME_EXPOSURE_VAL ){ + ret=FAIL; + strcpy(mess,"Sub Frame exposure time should not exceed 5.368 seconds\n"); + break; + } +#endif + retval = setTimer(ind,tns); + break; case PROBES_NUMBER: #ifndef MYTHEND ret=FAIL; @@ -2444,7 +2476,7 @@ int set_timer(int file_des) { break; default: ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); + sprintf(mess,"timer index unknown for this detector %d\n",ind); break; } diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index 7f1e44ab8..3de728aa8 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -11,6 +11,7 @@ //basic server functions +void checkFirmwareCompatibility(); int init_detector(int); int decode_function(int); int function_table();