From 018b800117d48a6e0df7092b4c7b03440b1a9482 Mon Sep 17 00:00:00 2001 From: Maliakal Dhanya Date: Wed, 2 Jul 2014 10:55:32 +0200 Subject: [PATCH] eiger receiver, receiving many packets at a time, with 16,8, 4 bitmode sort of working --- slsDetectorSoftware/commonFiles/error_defs.h | 5 +- .../commonFiles/sls_detector_defs.h | 8 +- .../commonFiles/sls_detector_funcs.h | 5 +- .../EigerBackEndFunctions.c | 31 +- .../EigerHighLevelFunctions.c | 127 ++-- .../eigerDetectorServer/FebServer.cxx | 55 +- .../bin/eigerDetectorServer | Bin 134318 -> 141582 bytes .../eigerDetectorServer/bin/feb_debug | Bin 143009 -> 144721 bytes .../slsDetectorFunctionList.c | 596 ++++++++---------- .../slsDetectorServer_defs.h | 9 +- .../multiSlsDetector/multiSlsDetector.cpp | 17 + .../multiSlsDetector/multiSlsDetector.h | 6 + .../slsDetector/slsDetector.cpp | 92 ++- slsDetectorSoftware/slsDetector/slsDetector.h | 6 + .../slsDetector/slsDetectorCommand.cpp | 38 +- .../slsDetector/slsDetectorUtils.h | 7 + .../slsDetectorAnalysis/energyConversion.cpp | 5 + .../slsDetectorFunctionList.h | 11 + .../slsDetectorServer_funcs.c | 174 +++-- .../slsDetectorServer_funcs.h | 1 + 20 files changed, 703 insertions(+), 490 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 0f7c9608a..a6074df58 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -32,8 +32,9 @@ using namespace std; #define COULDNOT_ENABLE_COMPRESSION 0x0080000000000000ULL #define RECEIVER_DET_HOSTNAME_NOT_SET 0x0040000000000000ULL #define RECEIVER_DET_HOSTTYPE_NOT_SET 0x0020000000000000ULL +#define DETECTOR_TEN_GIGA 0x0010000000000000ULL - +// 0xFFFFFFFF00000000ULL #define COULD_NOT_CONFIGURE_MAC 0x0000000000000001ULL #define COULDNOT_SET_NETWORK_PARAMETER 0x0000000000000002ULL @@ -47,7 +48,9 @@ using namespace std; #define RECEIVER_ACQ_PERIOD_NOT_SET 0x0000000000000200ULL #define RECEIVER_FRAME_NUM_NOT_SET 0x0000000000000400ULL #define RECEIVER_DYNAMIC_RANGE 0x0000000000000800ULL +#define RECEIVER_TEN_GIGA 0x0000000000001000ULL +// 0x00000000FFFFFFFFULL /** @short class returning all error messages for error mask */ class errorDefs { diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index dd748845d..d4075c0d4 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -339,7 +339,8 @@ enum dacIndex { E_rxb_lb, /**< eiger */ E_Vcp, /**< eiger */ E_Vcn, /**< eiger */ - E_Vis /**< eiger */ + E_Vis, /**< eiger */ + IO_DELAY /**< eiger io delay */ }; /** @@ -413,7 +414,10 @@ enum readOutFlags { PUMP_PROBE_MODE=0x8,/**>24)&0xff,(detipad>>16)&0xff,(detipad>>8)&0xff,(detipad)&0xff); sprintf(dst_ip,"%d.%d.%d.%d",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff); - sprintf(src_mac,"%x:%x:%x:%x:%x:%x",(unsigned int)((detectormacadd>>40)&0xFF), + sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((detectormacadd>>40)&0xFF), (unsigned int)((detectormacadd>>32)&0xFF), (unsigned int)((detectormacadd>>24)&0xFF), (unsigned int)((detectormacadd>>16)&0xFF), (unsigned int)((detectormacadd>>8)&0xFF), (unsigned int)((detectormacadd>>0)&0xFF)); - sprintf(dst_mac,"%x:%x:%x:%x:%x:%x",(unsigned int)((macad>>40)&0xFF), + sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((macad>>40)&0xFF), (unsigned int)((macad>>32)&0xFF), (unsigned int)((macad>>24)&0xFF), (unsigned int)((macad>>16)&0xFF), @@ -129,7 +130,7 @@ int EigerSetupTableEntryLeft(int ipad, long long int macad, long long int detect if(((macad>>40)&0xFF)<9) sprintf(dst_mac,"0%s",macad); */ - strcpy(src_mac,"00:aa:bb:cc:dd:ee"); + //strcpy(src_mac,"00:aa:bb:cc:dd:ee"); printf("Seting up Table Entry Left:\n"); printf("src_port:%d\n",src_port); printf("dst_port:%d\n",dst_port); @@ -141,7 +142,7 @@ int EigerSetupTableEntryLeft(int ipad, long long int macad, long long int detect eiger_back_ret_val=0; - eiger_back_message_length = sprintf(eiger_back_message,"setuptableentry %d %d %d %s %s %d %s %s %d",34,0,0,src_mac,src_ip,src_port,dst_mac,dst_ip,dst_port); + eiger_back_message_length = sprintf(eiger_back_message,"setuptableentry %d %d %d %s %s %d %s %s %d",34,ten_giga,0,src_mac,src_ip,src_port,dst_mac,dst_ip,dst_port); return EigerBackSendCMD(); } @@ -153,20 +154,20 @@ int EigerSetupTableEntryRight(int ipad, long long int macad, long long int detec int dst_port = udpport+1; sprintf(src_ip,"%d.%d.%d.%d",(detipad>>24)&0xff,(detipad>>16)&0xff,(detipad>>8)&0xff,(detipad)&0xff); sprintf(dst_ip,"%d.%d.%d.%d",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff); - sprintf(src_mac,"%x:%x:%x:%x:%x:%x",(unsigned int)((detectormacadd>>40)&0xFF), + sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((detectormacadd>>40)&0xFF), (unsigned int)((detectormacadd>>32)&0xFF), (unsigned int)((detectormacadd>>24)&0xFF), (unsigned int)((detectormacadd>>16)&0xFF), (unsigned int)((detectormacadd>>8)&0xFF), (unsigned int)((detectormacadd>>0)&0xFF)); - sprintf(dst_mac,"%x:%x:%x:%x:%x:%x",(unsigned int)((macad>>40)&0xFF), + sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((macad>>40)&0xFF), (unsigned int)((macad>>32)&0xFF), (unsigned int)((macad>>24)&0xFF), (unsigned int)((macad>>16)&0xFF), (unsigned int)((macad>>8)&0xFF), (unsigned int)((macad>>0)&0xFF)); - strcpy(src_mac,"00:aa:bb:cc:dd:ee"); + //strcpy(src_mac,"00:aa:bb:cc:dd:ee"); printf("Seting up Table Entry Right:\n"); printf("src_port:%d\n",src_port); printf("dst_port:%d\n",dst_port); @@ -176,7 +177,7 @@ int EigerSetupTableEntryRight(int ipad, long long int macad, long long int detec printf("dst_mac:%s\n\n",dst_mac); eiger_back_ret_val=0; - eiger_back_message_length = sprintf(eiger_back_message,"setuptableentry %d %d %d %s %s %d %s %s %d",34,0,32,src_mac,src_ip,src_port,dst_mac,dst_ip,dst_port); + eiger_back_message_length = sprintf(eiger_back_message,"setuptableentry %d %d %d %s %s %d %s %s %d",34,ten_giga,32,src_mac,src_ip,src_port,dst_mac,dst_ip,dst_port); return EigerBackSendCMD(); } @@ -197,12 +198,22 @@ int SetDestinationParameters(int i){ int SetLeftDestinationParameters(int i){ eiger_back_ret_val=0; - eiger_back_message_length = sprintf(eiger_back_message,"setdstparameters %d %d %d",0,1,i); + eiger_back_message_length = sprintf(eiger_back_message,"setdstparameters %d %d %d",ten_giga,1,i); return EigerBackSendCMD(); } int SetRightDestinationParameters(int i){ eiger_back_ret_val=0; - eiger_back_message_length = sprintf(eiger_back_message,"setdstparameters %d %d %d",0,32,i); + eiger_back_message_length = sprintf(eiger_back_message,"setdstparameters %d %d %d",ten_giga,32,i); return EigerBackSendCMD(); } + + +void SetTenGigbaBitEthernet(int val){ + ten_giga = val; +} + + +int GetTenGigbaBitEthernet(){ + return ten_giga; +} diff --git a/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c b/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c index 860bd8574..9294adbfd 100644 --- a/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c +++ b/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c @@ -18,26 +18,38 @@ char eiger_message[1024]; int eiger_message_length = 0; int eiger_ret_val=0; +int eiger_nexposures = 0; +float eiger_exposuretime = 0; +float eiger_exposureperiod = 0; +int eiger_ncycles = 0; +int eiger_ngates = 0; +int eiger_getphotonenergy = 0; +int eiger_dynamicrange = 0; +int eiger_readoutspeed = 0; +int eiger_readoutmode = 0; +int eiger_highvoltage = 0; +int eiger_iodelay = 0; +int eiger_triggermode = 0; + const unsigned int ndacs = 16; const char* dac_names[16] = {"SvP","Vtr","Vrf","Vrs","SvN","Vtgstv","Vcmp_ll","Vcmp_lr","cal","Vcmp_rl","rxb_rb","rxb_lb","Vcmp_rr","Vcp","Vcn","Vis"}; -int eiger_nexposures = 1; int EigerGetNumberOfExposures(){return eiger_nexposures;} -float eiger_exposuretime = 1; float EigerGetExposureTime(){return eiger_exposuretime;} -float eiger_exposureperiod = 1; float EigerGetExposurePeriod(){return eiger_exposureperiod;} -unsigned int eigerdynamicrange = 16; -unsigned int EigerGetDynamicRange(){return eigerdynamicrange;} -int eigergetphotonenergy = 8000; -int EigerGetPhotonEnergy(){return eigergetphotonenergy;} -/* for later */ -int eigernumberofexposureseries = 1; -int EigerGetNumberOfExposureSeries(){return eigernumberofexposureseries;} -int EigerSetNumberOfExposureSeries(int i){eigernumberofexposureseries = i;return 1;} +int EigerGetNumberOfCycles(){return eiger_ncycles;} +/*int EigerGetNumberOfGates(){return eiger_ngates;}*/ +unsigned int EigerGetDynamicRange(){return eiger_dynamicrange;} +int EigerGetPhotonEnergy(){return eiger_getphotonenergy;} +int EigerGetReadoutSpeed(){return eiger_readoutspeed;} +int EigerGetReadoutMode(){return eiger_readoutmode;} +int EigerGetHighVoltage(){return eiger_highvoltage;} +int EigerGetIODelay(){return eiger_iodelay;} +int EigerGetTriggerMode(){return eiger_triggermode;} + @@ -116,13 +128,13 @@ const char* EigerGetDACName(int i){ int EigerSetDAC(const char* iname,int v){ eiger_ret_val=0; - eiger_message_length = sprintf(eiger_message,"setdacvalue %s %d",iname,v); + eiger_message_length = sprintf(eiger_message,"setdacvoltage %s %d",iname,v); //setdacvoltage return EigerSendCMD(); } int EigerGetDAC(const char* iname){ eiger_ret_val=1; - eiger_message_length = sprintf(eiger_message,"getdacvalue %s",iname); + eiger_message_length = sprintf(eiger_message,"getdacvoltage %s",iname);//getdacvoltage if(!EigerSendCMD()) return -1; return eiger_ret_val; } @@ -134,15 +146,6 @@ int EigerSetNumberOfExposures(unsigned int n){ return EigerSendCMD(); } -/* -int EigerGetNumberOfExposures(unsigned int n){ - eiger_ret_val=1; - eiger_message_length = sprintf(eiger_message,"getnumberofexposures %s",iname); - if(!EigerSendCMD()) return -1; - return eiger_ret_val; -} -*/ - int EigerSetExposureTime(float v){ eiger_exposuretime = v; eiger_ret_val=0; @@ -150,14 +153,6 @@ int EigerSetExposureTime(float v){ return EigerSendCMD(); } -/* -int EigerGetExposureTime(float v){ - eiger_ret_val=1; - eiger_message_length = sprintf(eiger_message,"getexposuretime"); - if(!EigerSendCMD()) return 0; - return eiger_ret_val; -} -*/ int EigerSetExposurePeriod(float v){ eiger_exposureperiod = v; @@ -166,52 +161,70 @@ int EigerSetExposurePeriod(float v){ return EigerSendCMD(); } +int EigerSetNumberOfCycles(unsigned int n){ + eiger_ncycles = n; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"setnumberofexposures %u",n); + return EigerSendCMD(); +} /* -int EigerGetExposurePeriod(float v){ - eiger_ret_val=1; - eiger_message_length = sprintf(eiger_message,"getexposuretime"); - if(!EigerSendCMD()) return 0; - return eiger_ret_val; +int EigerSetNumberOfGates(unsigned int n){ + eiger_ngates = n; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"setnumberofexposures %u",n); + return EigerSendCMD(); } */ - int EigerSetDynamicRange(unsigned int i){ - eigerdynamicrange = i; + eiger_dynamicrange = i; eiger_ret_val=0; eiger_message_length = sprintf(eiger_message,"setbitmode %u",i); return EigerSendCMD(); } -/* -int EigerGetDynamicRange(){ -} -*/ - int EigerSetPhotonEnergy(int in_eV){ - eigergetphotonenergy = in_eV; + eiger_getphotonenergy = in_eV; eiger_ret_val=0; eiger_message_length = sprintf(eiger_message,"setphotonenergy %d",in_eV); return EigerSendCMD(); } -/* -int EigerGetPhotonEnergy(int in_eV){ - eiger_ret_val=1; - eiger_message_length = sprintf(eiger_message,"the %s",iname); - if(!EigerSendCMD()) return -1; - return eiger_ret_val; -} -*/ - -/* -int EigerSetGainMode(int i){ +int EigerSetReadoutSpeed(int speed){ + eiger_readoutspeed = speed; eiger_ret_val=0; - eiger_message_length = sprintf(eiger_message,"setphotonenergy %f",v); + eiger_message_length = sprintf(eiger_message,"setreadoutspeed %d",speed); return EigerSendCMD(); } -get function too.... -*/ + +int EigerSetReadoutMode(int mode){ + eiger_readoutmode = mode; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"setreadoutmode %d",mode); + return EigerSendCMD(); +} + +int EigerSetHighVoltage(int hv){ + eiger_highvoltage = hv; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"sethighvoltage %d",hv); + return EigerSendCMD(); +} + +int EigerSetIODelay(int io){ + eiger_iodelay = io; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"setinputdelays %d",io); + return EigerSendCMD(); +} + +int EigerSetTriggerMode(int m){ + eiger_triggermode = m; + eiger_ret_val=0; + eiger_message_length = sprintf(eiger_message,"settriggermode %d",m); + return EigerSendCMD(); +} + int EigerStartAcquisition(){ eiger_ret_val=0; diff --git a/slsDetectorSoftware/eigerDetectorServer/FebServer.cxx b/slsDetectorSoftware/eigerDetectorServer/FebServer.cxx index 4e26a4dc9..e2d56d84b 100755 --- a/slsDetectorSoftware/eigerDetectorServer/FebServer.cxx +++ b/slsDetectorSoftware/eigerDetectorServer/FebServer.cxx @@ -26,10 +26,11 @@ using namespace std; enum cmd_string {evNotFound, evReinitialize,evReset, - // evSetInputDelays, + evSetInputDelays, evSetDACValue,evGetDACValue,evSetDACVoltage,evGetDACVoltage,evSetHighVoltage,//evGetHighVoltage, -// evSetTrimBits,evLoadTrimBitFile, + evSetTrimBits, + //evLoadTrimBitFile, evSetBitMode, evSetPhotonEnergy, @@ -41,7 +42,8 @@ enum cmd_string {evNotFound, // evNotFound1,evNotFound2,evNotFound3, evSetNumberOfExposures,evSetExposureTime,evSetExposurePeriod, - // evSetTriggerPolarityToPositive,evSetTriggerPolarityToNegative,evSetTriggerMode, + // evSetTriggerPolarityToPositive,evSetTriggerPolarityToNegative, + evSetTriggerMode, // evEnableExternalGatingWhenSignalsPositive,evEnableExternalGatingWhenSignalsNegative,evDisableExternalGating, evStartAcquisition,evStopAcquisition,evIsDaqStillRunning}; // evWaitUntilDaqFinished,evExitServer @@ -54,14 +56,14 @@ void init(){ enum_map["reinitialize"] = evReinitialize; enum_map["reset"] = evReset; - // enum_map["setinputdelays"] = evSetInputDelays; + enum_map["setinputdelays"] = evSetInputDelays; enum_map["setdacvalue"] = evSetDACValue; enum_map["getdacvalue"] = evGetDACValue; enum_map["setdacvoltage"] = evSetDACVoltage; enum_map["getdacvoltage"] = evGetDACVoltage; enum_map["sethighvoltage"] = evSetHighVoltage; - // enum_map["settrimbits"] = evSetTrimBits; + enum_map["settrimbits"] = evSetTrimBits; // enum_map["loadtrimbitfile"] = evLoadTrimBitFile; enum_map["setbitmode"] = evSetBitMode; @@ -82,8 +84,9 @@ void init(){ /* enum_map["settriggerpolaritytopositive"] = evSetTriggerPolarityToPositive; enum_map["settriggerpolaritytonegative"] = evSetTriggerPolarityToNegative; + */ enum_map["settriggermode"] = evSetTriggerMode; - +/* enum_map["enableexternalgatingwhensignalspositive"] = evEnableExternalGatingWhenSignalsPositive; enum_map["enableexternalgatingwhensignalsnegative"] = evEnableExternalGatingWhenSignalsNegative; enum_map["disableexternalgating"] = evDisableExternalGating; @@ -185,7 +188,21 @@ int main(int argc, char* argv[]){ break; - // case evSetInputDelays : + + case evSetInputDelays : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + + if(tmp_str[0].length()>0&&feb_controler->SetIDelays(0,n[0])){ + return_message.append("\tExecuted: SetInputDelays "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetInputDelays \n"); + ret_val = 1; + } + break; + + case evSetDACValue : tmp_str[0] = GetNextString(data); @@ -252,7 +269,17 @@ int main(int argc, char* argv[]){ } break; - // case evSetTrimBits : + case evSetTrimBits : + /*if(tmp_str[0].length()>0&&feb_controler->SetDynamicRange(n[0])){*/ + feb_controler->SetTrimbits(0,(unsigned char*)data); + return_message.append("\tExecuted: SetTrimBits "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + /*}else{ + return_message.append("\tError executing: SetTrimBits \n"); + ret_val = 1; + } */ + break; + // case evLoadTrimBitFile : case evSetBitMode : @@ -347,7 +374,17 @@ int main(int argc, char* argv[]){ break; // case evSetTriggerPolarityToPositive : // case evSetTriggerPolarityToNegative : - // case evSetTriggerMode : + case evSetTriggerMode : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetTriggerMode(n[0])){ + return_message.append("\tExecuted: SetTriggerMode "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetTriggerMode \n"); + ret_val = 1; + } + break; // case evEnableExternalGatingWhenSignalsPositive : // case evEnableExternalGatingWhenSignalsNegative : diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer index fd725f4a359e5e9669f351f376074bc69ae64e3b..b13560c477f148818dab0bb4b8e97302f9b7c4a7 100755 GIT binary patch delta 35569 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 delta 29335 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 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/feb_debug b/slsDetectorSoftware/eigerDetectorServer/bin/feb_debug index 2eee059e4b9f5e8205e31fc160dc2523691d2d07..aa7007eb39a4a7a168bdbb7ba54ec6e92abbfced 100755 GIT binary patch delta 42698 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 a){SfR%O3cbcwT?6_T~q_42*hjtp67j#|AzC delta 41019 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 K9{b{6JM|A%8Y{y9 diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 7b5d6ba7f..5b1e1f03f 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -12,17 +12,83 @@ #include "EigerBackEndFunctions.c" -enum detectorSettings thisSettings = STANDARD; +enum detectorSettings thisSettings; //static const string dacNames[16] = {"Svp","Svn","Vtr","Vrf","Vrs","Vtgstv","Vcmp_ll","Vcmp_lr","Cal","Vcmp_rl","Vcmp_rr","Rxb_rb","Rxb_lb","Vcp","Vcn","Vis"}; +sls_detector_module *detectorModules=NULL; +int *detectorChips=NULL; +int *detectorChans=NULL; +dacs_t *detectorDacs=NULL; +dacs_t *detectorAdcs=NULL; + + + int initDetector(){ + int imod,i,n; + n = getNModBoard(1); + printf("This is the EIGER Server\n"); + //#ifdef VERBOSE + printf("Board is for %d half modules\n",n); + //#endif + + + detectorModules=malloc(n*sizeof(sls_detector_module)); + detectorChips=malloc(n*NCHIP*sizeof(int)); + + detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); + detectorDacs=malloc(n*NDAC*sizeof(dacs_t)); + detectorAdcs=malloc(n*NADC*sizeof(dacs_t)); +#ifdef VERBOSE + printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); + printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); + printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); + printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); + printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); +#endif + for (imod=0; imoddacs=detectorDacs+imod*NDAC; + (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; + (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; + (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; + (detectorModules+imod)->ndac=NDAC; + (detectorModules+imod)->nadc=NADC; + (detectorModules+imod)->nchip=NCHIP; + (detectorModules+imod)->nchan=NCHIP*NCHAN; + (detectorModules+imod)->module=imod; + (detectorModules+imod)->gain=0; + (detectorModules+imod)->offset=0; + (detectorModules+imod)->reg=0; + /* initialize registers, dacs, retrieve sn, adc values etc */ + } + thisSettings = STANDARD;/**UNITIALIZED*/ + /*sChan=noneSelected; + sChip=noneSelected; + sMod=noneSelected; + sDac=noneSelected; + sAdc=noneSelected; +*/ + + //get dac values + for(i=0;i<(detectorModules)->ndac;i++) + (detectorModules)->dacs[i] = setDAC((enum detDacIndex)i,-1,(detectorModules)->module); + + /* initialize dynamic range etc. */ + + //set number of frames to 1 setTimer(FRAME_NUMBER,1); setTimer(ACQUISITION_TIME,1E9); setTimer(ACQUISITION_TIME,1E9); - return 1; + setDynamicRange(16); + setThresholdEnergy(8000,0); + setReadOutFlags(PARALLEL); + setSpeed(0,1);//clk_devider,half speed + setHighVolage(150,0); + setIODelay(675,0); + setTiming(AUTO_TIMING); + return 1; } @@ -164,6 +230,14 @@ int setDAC(enum detDacIndex ind, int val, int imod){ } +int setHighVolage(int val, int imod){ + if(val!=-1){ + printf(" Setting High Voltage: %d\n",val); + EigerSetHighVoltage(val); + } + return EigerGetHighVoltage(); +} + int getADC(enum detDacIndex ind, int imod){ //get adc value @@ -171,42 +245,67 @@ int getADC(enum detDacIndex ind, int imod){ } +int setIODelay(int val, int imod){ + if(val!=-1){ + printf(" Setting IO Delay: %d\n",val); + EigerSetIODelay(val); + } + return EigerGetIODelay(); +} + + +int enableTenGigabitEthernet(int val){ + if(val!=-1){ + if(val>0) + SetTenGigbaBitEthernet(1); + else + SetTenGigbaBitEthernet(0); + SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); + //configuremac called from client + } + return GetTenGigbaBitEthernet(); +} + int setModule(sls_detector_module myMod){ - - -#ifdef VERBOSE + #ifdef VERBOSE printf("Setting module with settings %d\n",myMod.reg); #endif - int i; for(i=0;indac;i++) - myMod->dacs[i]= dacvalues[i]; - //template getModulebyNumber() from mcb_funcs.c - */ +int getModule(sls_detector_module *myMod){ + if (detectorModules) + copyModule(myMod,detectorModules);/*copyModule(myMod,detectorModules+iMod);*/ + else + return FAIL; return OK; } + + + + + int getThresholdEnergy(int imod){ - printf("Threshold energy: %d\n",EigerGetPhotonEnergy()); + printf(" Getting Threshold energy\n"); return EigerGetPhotonEnergy(); } int setThresholdEnergy(int thr, int imod){ - printf("Setting threshold energy:%d\n",thr); + printf(" Setting threshold energy:%d\n",thr); EigerSetPhotonEnergy(thr); return EigerGetPhotonEnergy(); } @@ -214,12 +313,15 @@ int setThresholdEnergy(int thr, int imod){ enum detectorSettings setSettings(enum detectorSettings sett, int imod){ - if(sett != GET_SETTINGS) - printf("trying to set settings!\n"); + thisSettings = sett; return thisSettings; } + + + + int startStateMachine(){ printf("Going to start acquisition\n"); EigerStartAcquisition(); @@ -237,35 +339,38 @@ int stopStateMachine(){ int startReadOut(){ RequestImages(); - return FAIL; + return OK; } enum runStatus getRunStatus(){ int i = EigerRunStatus(); - printf("Status:%d ",i); if(i== 0){ - printf(" returning %d\n",IDLE); + printf("IDLE\n"); return IDLE; }else{ - printf(" returning %d\n",RUNNING); + printf("RUNNING\n"); return RUNNING; } } + char *readFrame(int *ret, char *mess){ int i = EigerRunStatus(); - printf("status:%d\n",i); while(i){ i = EigerRunStatus(); - printf("status:%d\n",i); usleep(1000);/* should be watiing in server*/ }*ret = (int)FINISHED; return NULL; } + + + + + int64_t setTimer(enum timerIndex ind, int64_t val){ switch(ind){ @@ -273,7 +378,7 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ if(val >= 0){ printf(" Setting number of frames: %d\n",(unsigned int)val); EigerSetNumberOfExposures((unsigned int)val); - SetDestinationParameters(val); + SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); }return EigerGetNumberOfExposures(); case ACQUISITION_TIME: if(val >= 0){ @@ -289,10 +394,12 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ if(val >= 0) EigerSetNumberOfExposures((unsigned int)val); return EigerGetNumberOfExposures(); + case GATES_NUMBER: if(val >= 0) - EigerSetNumberOfExposures((unsigned int)val); - return EigerGetNumberOfExposures(); + EigerSetNumberOfGates((unsigned int)val); + return EigerGetNumberOfGates(); + case PROBES_NUMBER: if(val >= 0) EigerSetNumberOfExposures((unsigned int)val); @@ -300,8 +407,9 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ case CYCLES_NUMBER: if(val >= 0){ printf(" Setting number of triggers: %d\n",(unsigned int)val); - EigerSetNumberOfExposureSeries((unsigned int)val); - }return EigerGetNumberOfExposureSeries(); + EigerSetNumberOfCycles((unsigned int)val); + SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); + }return EigerGetNumberOfCycles(); default: printf("unknown timer index: %d\n",ind); break; @@ -311,20 +419,15 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ } + + int64_t getTimeLeft(enum timerIndex ind){ - //template getDelay() from firmware_funcs.c - //reads from reg - //FRAME_NUMBER - //ACQUISITION_TIME - //FRAME_PERIOD - //DELAY_AFTER_TRIGGER - //GATES_NUMBER - //PROBES_NUMBER - //CYCLES_NUMBER + return -1; } + int setDynamicRange(int dr){ int r; if(dr > 0){ @@ -336,14 +439,32 @@ int setDynamicRange(int dr){ r= EigerGetDynamicRange(); if(r != EigerGetBitMode()) EigerSetBitMode(r); + return r; } enum readOutFlags setReadOutFlags(enum readOutFlags val){ - //template setStoreInRAM from firmware_funcs.c - return GET_READOUT_FLAGS; + int ret; + if(val!=GET_READOUT_FLAGS){ + switch(val){ + case PARALLEL: val=0; break; + case NONPARALLEL: val=1; break; + case SAFE: val=2; break; + default: val=0; break; + } + printf(" Setting Read out Flag: %d\n",val); + EigerSetReadoutMode(val); + } + switch(EigerGetReadoutMode()){ + case 0: ret=PARALLEL; break; + case 1: ret=NONPARALLEL; break; + case 2: ret=SAFE; break; + default:ret=-1; break; + } + + return ret; } @@ -356,21 +477,16 @@ int setROI(int n, ROI arg[], int *retvalsize, int *ret){ int setSpeed(enum speedVariable arg, int val){ - //template setClockDivider() from firmware_funcs.c - //CLOCK_DIVIDER - //WAIT_STATES - //SET_SIGNAL_LENGTH - //TOT_CLOCK_DIVIDER - //TOT_DUTY_CYCLE - - //returns eg getClockDivider from firmware_funcs.c - return 0; + if(val != -1){ + printf(" Setting Read out Speed: %d\n",val); + EigerSetReadoutSpeed(val); + } + return EigerGetReadoutSpeed(); } int executeTrimming(enum trimMode mode, int par1, int par2, int imod){ - // template trim_with_noise from trimming_funcs.c return FAIL; } @@ -383,9 +499,87 @@ int configureMAC(int ipad, long long int macad, long long int detectormacadd, in int calculateDataBytes(){ - return 0; + return setDynamicRange(-1)*16*1040; } + +int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ + + int ichip, idac, ichan, iadc; + int ret=OK; + +#ifdef VERBOSE + printf("Copying module %x to module %x\n",srcMod,destMod); +#endif + + if (srcMod->module>=0) { +#ifdef VERBOSE + printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); +#endif + destMod->module=srcMod->module; + } + if (srcMod->serialnumber>=0){ + + destMod->serialnumber=srcMod->serialnumber; + } + if ((srcMod->nchip)>(destMod->nchip)) { + printf("Number of chip of source is larger than number of chips of destination\n"); + return FAIL; + } + if ((srcMod->nchan)>(destMod->nchan)) { + printf("Number of channels of source is larger than number of channels of destination\n"); + return FAIL; + } + if ((srcMod->ndac)>(destMod->ndac)) { + printf("Number of dacs of source is larger than number of dacs of destination\n"); + return FAIL; + } + if ((srcMod->nadc)>(destMod->nadc)) { + printf("Number of dacs of source is larger than number of dacs of destination\n"); + return FAIL; + } + +#ifdef VERBOSE + printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); + printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); + printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); + printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); + +#endif + destMod->ndac=srcMod->ndac; + destMod->nadc=srcMod->nadc; + destMod->nchip=srcMod->nchip; + destMod->nchan=srcMod->nchan; + if (srcMod->reg>=0) + destMod->reg=srcMod->reg; +#ifdef VERBOSE + printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); +#endif + if (srcMod->gain>=0) + destMod->gain=srcMod->gain; + if (srcMod->offset>=0) + destMod->offset=srcMod->offset; + + for (ichip=0; ichip<(srcMod->nchip); ichip++) { + if (*((srcMod->chipregs)+ichip)>=0) + *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); + } + for (ichan=0; ichan<(srcMod->nchan); ichan++) { + if (*((srcMod->chanregs)+ichan)>=0) + *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); + } + for (idac=0; idac<(srcMod->ndac); idac++) { + if (*((srcMod->dacs)+idac)>=0) + *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); + } + for (iadc=0; iadc<(srcMod->nadc); iadc++) { + if (*((srcMod->adcs)+iadc)>=0) + *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); + } + return ret; +} + + int getTotalNumberOfChannels(){return getNumberOfChannelsPerModule();};//NCHIP*NCHAN*nModBoard;} int getTotalNumberOfChips(){return 4;};//NCHIP*nModBoard;} int getTotalNumberOfModules(){return 1;}//nModBoard;} @@ -402,8 +596,6 @@ int getNumberOfADCsPerModule(){return 0;}//NADC;} enum externalSignalFlag getExtSignal(int signalindex){ - //template getExtSignal from firmware_funcs.c - //return signals[signalindex]; return GET_EXTERNAL_SIGNAL_FLAG; } @@ -412,48 +604,6 @@ enum externalSignalFlag getExtSignal(int signalindex){ enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag flag){ - //template setExtSignal from firmware_funcs.c - - //in short..sets signals array, checks if agrees with timing mode, writes to fpga reg, calls synchronization and then settiming - /* - if (signalindex>=0 && signalindex<4) { - signals[signalindex]=flag; -#ifdef VERBOSE - printf("settings signal variable number %d to value %04x\n", signalindex, signals[signalindex]); -#endif - // if output signal, set it! - switch (flag) { - case GATE_IN_ACTIVE_HIGH: - case GATE_IN_ACTIVE_LOW: - if (timingMode==GATE_FIX_NUMBER || timingMode==GATE_WITH_START_TRIGGER)//timingMode = AUTO_TIMING by default and is set in setTiming() - setFPGASignal(signalindex,flag); //not implemented here, checks if flag within limits and writes to fpga reg - else - setFPGASignal(signalindex,SIGNAL_OFF); - break; - case TRIGGER_IN_RISING_EDGE: - case TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_EXPOSURE || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(signalindex,flag); - else - setFPGASignal(signalindex,SIGNAL_OFF); - break; - case RO_TRIGGER_IN_RISING_EDGE: - case RO_TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_READOUT) - setFPGASignal(signalindex,flag); - else - setFPGASignal(signalindex,SIGNAL_OFF); - break; - case MASTER_SLAVE_SYNCHRONIZATION: - setSynchronization(syncMode);//syncmode = NO_SYNCHRONIZATION by default and set with this function - break; - default: - setFPGASignal(signalindex,mode); - } - - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - } - */ return getExtSignal(signalindex); } @@ -463,254 +613,40 @@ enum externalSignalFlag setExtSignal(int signalindex, enum externalSignalFlag f enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ - enum externalCommunicationMode ret=GET_EXTERNAL_COMMUNICATION_MODE; - - ret = AUTO_TIMING; - + if(arg != GET_EXTERNAL_COMMUNICATION_MODE){ + switch((int)arg){ + case AUTO_TIMING: ret = 0; break; + case TRIGGER_EXPOSURE: ret = 2; break; + case TRIGGER_READOUT: ret = 1; break; + case GATE_FIX_NUMBER: ret = 3; break; + } + printf(" Setting Triggering Mode: %d\n",(int)ret); + //EigerSetTriggerMode(ret); + } +ret=0; + //ret = EigerGetTriggerMode(); + switch((int)ret){ + case 0: ret = AUTO_TIMING; break; + case 2: ret = TRIGGER_EXPOSURE; break; + case 1: ret = TRIGGER_READOUT; break; + case 3: ret = GATE_FIX_NUMBER; break; + default: + printf("Unknown trigger mode found %d\n",ret); + ret = 0; + } return ret; } enum masterFlags setMaster(enum masterFlags arg){ - //template setMaster from firmware_funcs.c - /* - int i; - switch(f) { - case NO_MASTER: - // switch of gates or triggers - masterMode=NO_MASTER; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - setFPGASignal(i,SIGNAL_OFF); - } - } - break; - case IS_MASTER: - // configure gate or trigger out - masterMode=IS_MASTER; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - switch (syncMode) { - case NO_SYNCHRONIZATION: - setFPGASignal(i,SIGNAL_OFF); - break; - case MASTER_GATES: - setFPGASignal(i,GATE_OUT_ACTIVE_HIGH); - break; - case MASTER_TRIGGERS: - setFPGASignal(i,TRIGGER_OUT_RISING_EDGE); - break; - case SLAVE_STARTS_WHEN_MASTER_STOPS: - setFPGASignal(i,RO_TRIGGER_OUT_RISING_EDGE); - break; - default: - ; - } - } - } - break; - case IS_SLAVE: - // configure gate or trigger in - masterMode=IS_SLAVE; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - switch (syncMode) { - case NO_SYNCHRONIZATION: - setFPGASignal(i,SIGNAL_OFF); - break; - case MASTER_GATES: - setFPGASignal(i,GATE_IN_ACTIVE_HIGH); - break; - case MASTER_TRIGGERS: - setFPGASignal(i,TRIGGER_IN_RISING_EDGE); - break; - case SLAVE_STARTS_WHEN_MASTER_STOPS: - setFPGASignal(i,TRIGGER_IN_RISING_EDGE); - break; - default: - ; - } - } - } - break; - default: - //do nothing - ; - } - - switch(masterMode) { - case NO_MASTER: - return NO_MASTER; - - - case IS_MASTER: - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - switch (syncMode) { - case NO_SYNCHRONIZATION: - return IS_MASTER; - case MASTER_GATES: - if (getFPGASignal(i)==GATE_OUT_ACTIVE_HIGH) - return IS_MASTER; - else - return NO_MASTER; - case MASTER_TRIGGERS: - if (getFPGASignal(i)==TRIGGER_OUT_RISING_EDGE) - return IS_MASTER; - else - return NO_MASTER; - case SLAVE_STARTS_WHEN_MASTER_STOPS: - if (getFPGASignal(i)==RO_TRIGGER_OUT_RISING_EDGE) - return IS_MASTER; - else - return NO_MASTER; - default: - return NO_MASTER; - } - - } - } - - case IS_SLAVE: - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - switch (syncMode) { - case NO_SYNCHRONIZATION: - return IS_SLAVE; - case MASTER_GATES: - if (getFPGASignal(i)==GATE_IN_ACTIVE_HIGH) - return IS_SLAVE; - else - return NO_MASTER; - case MASTER_TRIGGERS: - case SLAVE_STARTS_WHEN_MASTER_STOPS: - if (getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) - return IS_SLAVE; - else - return NO_MASTER; - default: - return NO_MASTER; - } - - } - } - - } - */ - return NO_MASTER; } enum synchronizationMode setSynchronization(enum synchronizationMode arg){ - /* - int i; - - switch(s) { - case NO_SYNCHRONIZATION: - syncMode=NO_SYNCHRONIZATION; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - setFPGASignal(i,SIGNAL_OFF); - } - } - break; - // disable external signals? - case MASTER_GATES: - // configure gate in or out - syncMode=MASTER_GATES; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER) - setFPGASignal(i,GATE_OUT_ACTIVE_HIGH); - else if (masterMode==IS_SLAVE) - setFPGASignal(i,GATE_IN_ACTIVE_HIGH); - } - } - - break; - case MASTER_TRIGGERS: - // configure trigger in or out - syncMode=MASTER_TRIGGERS; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER) - setFPGASignal(i,TRIGGER_OUT_RISING_EDGE); - else if (masterMode==IS_SLAVE) - setFPGASignal(i,TRIGGER_IN_RISING_EDGE); - } - } - break; - - - case SLAVE_STARTS_WHEN_MASTER_STOPS: - // configure trigger in or out - syncMode=SLAVE_STARTS_WHEN_MASTER_STOPS; - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER) - setFPGASignal(i,RO_TRIGGER_OUT_RISING_EDGE); - else if (masterMode==IS_SLAVE) - setFPGASignal(i,TRIGGER_IN_RISING_EDGE); - } - } - break; - - - default: - //do nothing - ; - } - - switch (syncMode) { - - case NO_SYNCHRONIZATION: - return NO_SYNCHRONIZATION; - - case MASTER_GATES: - - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER && getFPGASignal(i)==GATE_OUT_ACTIVE_HIGH) - return MASTER_GATES; - else if (masterMode==IS_SLAVE && getFPGASignal(i)==GATE_IN_ACTIVE_HIGH) - return MASTER_GATES; - } - } - return NO_SYNCHRONIZATION; - - case MASTER_TRIGGERS: - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER && getFPGASignal(i)==TRIGGER_OUT_RISING_EDGE) - return MASTER_TRIGGERS; - else if (masterMode==IS_SLAVE && getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) - return MASTER_TRIGGERS; - } - } - return NO_SYNCHRONIZATION; - - case SLAVE_STARTS_WHEN_MASTER_STOPS: - for (i=0; i<4; i++) { - if (signals[i]==MASTER_SLAVE_SYNCHRONIZATION) { - if (masterMode==IS_MASTER && getFPGASignal(i)==RO_TRIGGER_OUT_RISING_EDGE) - return SLAVE_STARTS_WHEN_MASTER_STOPS; - else if (masterMode==IS_SLAVE && getFPGASignal(i)==TRIGGER_IN_RISING_EDGE) - return SLAVE_STARTS_WHEN_MASTER_STOPS; - } - } - return NO_SYNCHRONIZATION; - - default: - return NO_SYNCHRONIZATION; - - } - - - */ return NO_SYNCHRONIZATION; } diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index 7e2fd734e..357941828 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -20,10 +20,9 @@ #define FIRMWAREREV 0xcaba //temporary should be in firmware -/* examples*/ -/* + #define NCHAN 256*256 -#define NCHIP 4*1 +#define NCHIP 4 #define NDAC 16 #define NADC 0 #define NMAXMODX 1 @@ -33,8 +32,8 @@ #define NDACS NDAC*NMAXMOD -#define DYNAMIC_RANGE 32 -*/ +#define DYNAMIC_RANGE 16 + enum detDacIndex{SVP,VTR,VRF,VRS,SVN,VTGSTV,VCMP_LL,VCMP_LR,CAL,VCMP_RL,RXB_RB,RXB_LB,VCMP_RR,VCP,VCN,VIS}; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 03df0e38d..3c66ae67a 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4767,3 +4767,20 @@ int multiSlsDetector::enableReceiverCompression(int i){ } return ret; } + + + +int multiSlsDetector::enableTenGigabitEthernet(int i){ + int ret=-100,ret1; + for (int idet=0; idetnumberOfDetectors; idet++) + if (detectors[idet]){ + ret1=detectors[idet]->enableTenGigabitEthernet(i); + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<reg=thisDetector->currentSettings; - ostfn << thisDetector->settingsDir << ssettings <<"/settings."<< setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER) << setbase(10); - oscfn << thisDetector->calDir << ssettings << "/calibration."<settingsDir << ssettings <<"/noise.sn"<< setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER) << setbase(10); + oscfn << thisDetector->calDir << ssettings << "/calibration.sn"<settingsDir<calDir <myDetectorType){ - case EIGER: case MOENCH: case GOTTHARD: ostfn << thisDetector->settingsDir << ssettings << ssettings << ".settings"; break; + case EIGER: default: ostfn << thisDetector->settingsDir << ssettings << ssettings << ".trim"; break; @@ -3556,9 +3556,9 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if (t>=0) thisDetector->timerValue[index]=t; } -#ifdef VERBOSE +//#ifdef VERBOSE std::cout<< "Timer " << index << " set to "<< thisDetector->timerValue[index] << "ns" << std::endl; -#endif +//#endif if ((thisDetector->myDetectorType==MYTHEN)&&(index==PROBES_NUMBER)) { setDynamicRange(); @@ -4102,12 +4102,12 @@ int slsDetector::setDynamicRange(int n){ if(thisDetector->myDetectorType==MYTHEN){ if (thisDetector->timerValue[PROBES_NUMBER]!=0) thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*4; + + if (retval==32) + thisDetector->dynamicRange=24; } - if (retval==32) - thisDetector->dynamicRange=24; - else thisDetector->dynamicRange=retval; @@ -5660,12 +5660,13 @@ int slsDetector::loadSettingsFile(string fname, int imod) { for (int im=mmin; immyDetectorType != EIGER){ + if (fname.find(".sn")==string::npos && fname.find(".trim")==string::npos && fname.find(".settings")==string::npos) { + ostfn << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER, im); + fn=ostfn.str(); + } + }else if (fname.find(".sn")==string::npos && fname.find(".trim")==string::npos && fname.find(".settings")==string::npos) { + ostfn << ".sn" << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER, im); fn=ostfn.str(); } myMod=readSettingsFile(fn, thisDetector->myDetectorType); @@ -5697,7 +5698,7 @@ int slsDetector::saveSettingsFile(string fname, int imod) { for (int im=mmin; immyDetectorType == EIGER) - ostfn << fname << "." << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER); + ostfn << fname << ".sn" << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER); else ostfn << fname << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER,im); if ((myMod=getModule(im))) { @@ -5725,10 +5726,11 @@ int slsDetector::loadCalibrationFile(string fname, int imod) { for (int im=mmin; immyDetectorType != EIGER){ + if (fname.find(".sn")==string::npos && fname.find(".cal")==string::npos) { + ostfn << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER, im); + } + }else if (fname.find(".sn")==string::npos && fname.find(".cal")==string::npos) { ostfn << "." << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER); } fn=ostfn.str(); @@ -5758,7 +5760,7 @@ int slsDetector::saveCalibrationFile(string fname, int imod) { for (int im=mmin; immyDetectorType == EIGER) - ostfn << fname << "." << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER); + ostfn << fname << ".sn" << setw(6) << hex << getId(DETECTOR_SERIAL_NUMBER); else ostfn << fname << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER,im); if ((myMod=getModule(im))) { @@ -6672,3 +6674,53 @@ void slsDetector::setDetectorHostname(){ } } + + +int slsDetector::enableTenGigabitEthernet(int i){ + int ret=FAIL; + int retval = -1; + int fnum=F_ENABLE_TEN_GIGA,fnum2 = F_ENABLE_RECEIVER_TEN_GIGA; + char mess[100]; + +#ifdef VERBOSE + std::cout<< std::endl<< "Enabling / Disabling 10Gbe" << endl; +#endif + + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&i,sizeof(i)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL){ + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(DETECTOR_TEN_GIGA)); + } + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + + + if(ret!=FAIL){ + //must also configuremac + if((i != -1)&&(retval == i)) + configureMAC(); + + ret = FAIL; + retval=-1; + if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ + #ifdef VERBOSE + std::cout << "Enabling / Disabling 10Gbe in receiver: " << i << std::endl; + #endif + if (connectData() == OK) + ret=thisReceiver->sendInt(fnum,retval,i); + if(ret==FAIL) + setErrorMask((getErrorMask())|(RECEIVER_TEN_GIGA)); + } + } + + return retval; +} diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index e707d7825..662d9ab14 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1627,6 +1627,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ void setDetectorHostname(); + /** enable/disable or 10Gbe + * @param i is -1 to get, 0 to disable and 1 to enable + /returns if 10Gbe is enabled + */ + int enableTenGigabitEthernet(int i = -1); + protected: diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 3493d8e28..879b5cd3b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -682,6 +682,9 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + descrToFuncMap[i].m_pFuncName="iodelay"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; + i++; @@ -854,6 +857,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + descrToFuncMap[i].m_pFuncName="tengiga"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; + i++; + numberOfCommands=i; @@ -3312,6 +3319,8 @@ string slsDetectorCommand::cmdDAC(int narg, char *args[], int action) { dac=E_Vcn; else if (cmd== "vis") dac=E_Vis; + else if (cmd== "iodelay") + dac=IO_DELAY; else return string("cannot decode dac ")+cmd; @@ -3849,6 +3858,12 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { flag=TOT_MODE; else if (sval=="continous") flag=CONTINOUS_RO; + else if (sval=="parallel") + flag=PARALLEL; + else if (sval=="nonparallel") + flag=NONPARALLEL; + else if (sval=="safe") + flag=SAFE; else return string("could not scan flag ")+string(args[1]); } @@ -3865,6 +3880,12 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { return string("tot"); case CONTINOUS_RO: return string("continous"); + case PARALLEL: + return string("parallel"); + case NONPARALLEL: + return string("nonparallel"); + case SAFE: + return string("safe"); default: return string("unknown"); } @@ -3898,13 +3919,13 @@ string slsDetectorCommand::helpAdvanced(int narg, char *args[], int action) { if (action==PUT_ACTION || action==HELP_ACTION) { os << "extsig:i mode \t sets the mode of the external signal i. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; - os << "flags mode \t sets the readout flags to mode. can be none, storeinram, tot, continous, unknown" << std::endl; + os << "flags mode \t sets the readout flags to mode. can be none, storeinram, tot, continous, parallel, nonparallel, safe, unknown" << std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "extsig:i \t gets the mode of the external signal i. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; - os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, unknown" << std::endl; + os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, safe, unknown" << std::endl; } return os.str(); @@ -4069,6 +4090,17 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { } + else if(cmd=="tengiga"){ + if (action==PUT_ACTION){ + if (!sscanf(args[1],"%d",&ival)) + return string("Could not scan tengiga input ")+string(args[1]); + if(ival>=0) + sprintf(answer,"%d",myDet->enableTenGigabitEthernet(ival)); + }else + sprintf(answer,"%d",myDet->enableTenGigabitEthernet()); + return string(answer); + + } return string("could not decode command"); @@ -4082,11 +4114,13 @@ string slsDetectorCommand::helpReceiver(int narg, char *args[], int action) { if (action==PUT_ACTION || action==HELP_ACTION) os << "receiver [status] \t starts/stops the receiver to listen to detector packets. - can be start or stop" << std::endl; os << "r_readfreq \t sets the gui read frequency of the receiver, 0 if gui requests frame, >0 if receiver sends every nth frame to gui" << std::endl; + os << "tengiga \t sets system to be configure for 10Gbe if set to 1, else 1Gbe if set to 0" << std::endl; if (action==GET_ACTION || action==HELP_ACTION){ os << "receiver \t returns the status of receiver - can be running or idle" << std::endl; os << "framescaught \t returns the number of frames caught by receiver(average for multi)" << std::endl; os << "frameindex \t returns the current frame index of receiver(average for multi)" << std::endl; os << "r_readfreq \t returns the gui read frequency of the receiver" << std::endl; + os << "tengiga \t returns 1 if the system is configured for 10Gbe else 0 for 1Gbe" << std::endl; } return os.str(); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 10ab20e4b..1da8cfdba 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -688,6 +688,13 @@ virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0; */ virtual int enableReceiverCompression(int i = -1)=0; +/** enable/disable or 10Gbe + * @param i is -1 to get, 0 to disable and 1 to enable + /returns if 10Gbe is enabled + */ +virtual int enableTenGigabitEthernet(int i = -1)=0; + + protected: diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index 196afe77b..b9e54e127 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -377,8 +377,13 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp outfile.open(fname.c_str(), ofstream::binary); if (outfile.is_open()) { iv = 1150; +#ifdef VERBOSE + for(int i=0;i=0) { - if (retval!=val) { + if (ret==OK){ + if ((retval!=val) && (val>=0)) { ret=FAIL; sprintf(mess,"could not change speed variable %d: should be %d but is %d \n",arg, val, retval); - } + }else if (differentClients) + ret=FORCE_UPDATE; + } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; } -#endif + //ret could be swapped during sendData ret1 = ret; @@ -3340,3 +3363,48 @@ int calibrate_pedestal(int file_des){ + + + + + + +int enable_ten_giga(int file_des) { + int n; + int retval; + int ret=OK,ret1=OK; + int arg = -1; + + sprintf(mess,"Can't enable/disable 10Gbe \n"); + /* receive arguments */ + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + /* execute action */ + if(ret != FAIL){ +#ifdef VERBOSE + printf("Enabling 10Gbe :%d \n",arg); +#endif +#ifdef SLS_DETECTOR_FUNCTION_LIST + retval=enableTenGigabitEthernet(arg); + if((arg != -1) && (retval != arg)) + ret=FAIL; + else if (differentClients==1 && ret==OK) { + ret=FORCE_UPDATE; + } +#endif + } + /* send answer */ + /* send OK/failed */ + //ret could be swapped during sendData + ret1 = ret; + n = sendData(file_des,&ret1,sizeof(ret),INT32); + if (ret==FAIL) + n += sendData(file_des,mess,sizeof(mess),OTHER); + /* send return argument */ + n += sendData(file_des,&retval,sizeof(retval),INT32); + /*return ok/fail*/ + return ret; +} diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index c4fc4743e..42814787c 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -80,5 +80,6 @@ int reset_counter_block(int); int start_receiver(int); int stop_receiver(int); int calibrate_pedestal(int); +int enable_ten_giga(int); #endif