From 828a2dbd1753956dbc668c68c963c8af4d21abc8 Mon Sep 17 00:00:00 2001 From: Maliakal Dhanya Date: Fri, 11 Jul 2014 13:06:48 +0200 Subject: [PATCH] 10Gbe, some functions in gotthard and eiger servers including mv in dacs, mv in dacs, changing settings file --- slsDetectorSoftware/commonFiles/error_defs.h | 7 + .../EigerBackEndFunctions.c | 23 +- .../EigerHighLevelFunctions.c | 300 ++++--- .../eigerDetectorServer/FebServer.cxx | 825 +++++++++--------- .../bin/eigerDetectorServer | Bin 141582 -> 142552 bytes .../eigerDetectorServer/bin/feb_debug | Bin 144721 -> 146305 bytes .../slsDetectorFunctionList.c | 55 +- .../gotthardDetectorServer/mcb_funcs.c | 165 +--- .../gotthardDetectorServer/mcb_funcs.h | 4 +- .../gotthardDetectorServer/server_funcs.c | 53 +- .../multiSlsDetector/multiSlsDetector.cpp | 4 +- .../multiSlsDetector/multiSlsDetector.h | 4 +- .../slsDetector/slsDetector.cpp | 52 +- slsDetectorSoftware/slsDetector/slsDetector.h | 6 +- .../slsDetector/slsDetectorActions.cpp | 2 +- .../slsDetector/slsDetectorActions.h | 13 +- .../slsDetector/slsDetectorCommand.cpp | 23 +- .../slsDetector/slsDetectorUtils.cpp | 151 +++- .../slsDetector/slsDetectorUtils.h | 3 +- .../slsDetectorFunctionList.h | 6 +- .../slsDetectorServer_funcs.c | 34 +- 21 files changed, 867 insertions(+), 863 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index a6074df58..770a5a405 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -101,6 +101,9 @@ public: if(slsErrorMask&RECEIVER_DET_HOSTTYPE_NOT_SET) retval.append("Could not send the detector type to the receiver.\n"); + if(slsErrorMask&DETECTOR_TEN_GIGA) + retval.append("Could not enable/disable 10GbE in the detector.\n"); + @@ -140,6 +143,10 @@ public: if(slsErrorMask&RECEIVER_DYNAMIC_RANGE) retval.append("Could not set dynamic range in receiver.\n"); + if(slsErrorMask&RECEIVER_TEN_GIGA) + retval.append("Could not enable/disable 10GbE in the receiver.\n"); + + return retval; diff --git a/slsDetectorSoftware/eigerDetectorServer/EigerBackEndFunctions.c b/slsDetectorSoftware/eigerDetectorServer/EigerBackEndFunctions.c index 17ce9be3a..cafafbee1 100644 --- a/slsDetectorSoftware/eigerDetectorServer/EigerBackEndFunctions.c +++ b/slsDetectorSoftware/eigerDetectorServer/EigerBackEndFunctions.c @@ -124,13 +124,6 @@ int EigerSetupTableEntryLeft(int ipad, long long int macad, long long int detect (unsigned int)((macad>>8)&0xFF), (unsigned int)((macad>>0)&0xFF)); -/* - if(((detectormacadd>>40)&0xFF)<9) - sprintf(src_mac,"0%s",detectormacadd); - if(((macad>>40)&0xFF)<9) - sprintf(dst_mac,"0%s",macad); -*/ - //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); @@ -167,7 +160,6 @@ int EigerSetupTableEntryRight(int ipad, long long int macad, long long int detec (unsigned int)((macad>>8)&0xFF), (unsigned int)((macad>>0)&0xFF)); - //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); @@ -187,24 +179,13 @@ int EigerSetupTableEntryRight(int ipad, long long int macad, long long int detec int RequestImages(){ printf("Going to request images\n"); eiger_back_ret_val=0; - eiger_back_message_length = sprintf(eiger_back_message,"requestimages %d",0); + eiger_back_message_length = sprintf(eiger_back_message,"requestimages %d",0); // dst_number return EigerBackSendCMD(); } int SetDestinationParameters(int i){ - SetLeftDestinationParameters(i); - return SetRightDestinationParameters(i); -} - -int SetLeftDestinationParameters(int i){ eiger_back_ret_val=0; - 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",ten_giga,32,i); + eiger_back_message_length = sprintf(eiger_back_message,"setdstparameters %d %d %d",ten_giga,32,i);// number of dsts return EigerBackSendCMD(); } diff --git a/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c b/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c index 9294adbfd..524fe9a42 100644 --- a/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c +++ b/slsDetectorSoftware/eigerDetectorServer/EigerHighLevelFunctions.c @@ -18,10 +18,10 @@ char eiger_message[1024]; int eiger_message_length = 0; int eiger_ret_val=0; -int eiger_nexposures = 0; +int eiger_nexposures = 1; float eiger_exposuretime = 0; float eiger_exposureperiod = 0; -int eiger_ncycles = 0; +int eiger_ncycles = 1; int eiger_ngates = 0; int eiger_getphotonenergy = 0; int eiger_dynamicrange = 0; @@ -30,6 +30,8 @@ int eiger_readoutmode = 0; int eiger_highvoltage = 0; int eiger_iodelay = 0; int eiger_triggermode = 0; +int eiger_extgating = 0; +int eiger_extgatingpolarity = 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"}; @@ -49,123 +51,133 @@ int EigerGetReadoutMode(){return eiger_readoutmode;} int EigerGetHighVoltage(){return eiger_highvoltage;} int EigerGetIODelay(){return eiger_iodelay;} int EigerGetTriggerMode(){return eiger_triggermode;} - - +int EigerGetExternalGating(){return eiger_extgating;} +int EigerGetExternalGatingPolarity(){return eiger_extgatingpolarity;} int EigerInit(){ - static int passed = 0; + static int passed = 0; - if(!passed){ - struct hostent *dst_host; - if((dst_host = gethostbyname("localhost")) == NULL){ //or look into getaddrinfo(3) - fprintf(stderr,"ERROR, no such host\n"); - return 0; - }else{ - //struct sockaddr_in eiger_socket_addr; - int port = FEB_PORT; - bzero((char *) &eiger_socket_addr, sizeof(eiger_socket_addr)); - eiger_socket_addr.sin_family = AF_INET; - bcopy((char *)dst_host->h_addr,(char *)&eiger_socket_addr.sin_addr.s_addr,dst_host->h_length); - eiger_socket_addr.sin_port = htons(port); - passed = 1; - } - } + if(!passed){ + struct hostent *dst_host; + if((dst_host = gethostbyname("localhost")) == NULL){ //or look into getaddrinfo(3) + fprintf(stderr,"ERROR, no such host\n"); + return 0; + }else{ + //struct sockaddr_in eiger_socket_addr; + int port = FEB_PORT; + bzero((char *) &eiger_socket_addr, sizeof(eiger_socket_addr)); + eiger_socket_addr.sin_family = AF_INET; + bcopy((char *)dst_host->h_addr,(char *)&eiger_socket_addr.sin_addr.s_addr,dst_host->h_length); + eiger_socket_addr.sin_port = htons(port); + passed = 1; + } + } - return passed; + return passed; } int EigerSendCMD(){ - if(!EigerInit()||eiger_message_length<=0) return 0; + if(!EigerInit()||eiger_message_length<=0) return 0; - int sockfd = socket(AF_INET,SOCK_STREAM,0); - if(sockfd<0){ - fprintf(stderr,"ERROR opening socket\n"); - return 0; - } + int sockfd = socket(AF_INET,SOCK_STREAM,0); + if(sockfd<0){ + fprintf(stderr,"ERROR opening socket\n"); + return 0; + } - if(connect(sockfd,(struct sockaddr *) &eiger_socket_addr,sizeof(eiger_socket_addr))<0){ - fprintf(stderr,"ERROR connecting\n"); - return 0; - } + if(connect(sockfd,(struct sockaddr *) &eiger_socket_addr,sizeof(eiger_socket_addr))<0){ + fprintf(stderr,"ERROR connecting\n"); + return 0; + } - int n = write(sockfd,eiger_message,eiger_message_length); - int ret_length = read(sockfd,eiger_message,eiger_max_message_length); + int n = write(sockfd,eiger_message,eiger_message_length); + int ret_length = read(sockfd,eiger_message,eiger_max_message_length); - close(sockfd); + close(sockfd); - if(n<0||ret_length<0) return 0; + if(n<0||ret_length<0) return 0; - //fprintf(stdout,"%s\n",eiger_message); - if(eiger_ret_val>0){ - int i=0; - eiger_message[1]='\0'; - if(atoi(eiger_message)!=0) return 0; + //fprintf(stdout,"%s\n",eiger_message); + if(eiger_ret_val>0){ + int i=0; + eiger_message[1]='\0'; + if(atoi(eiger_message)!=0) return 0; - for(i=2;i0&&i0&&i enum_map; void init(){ - enum_map["reinitialize"] = evReinitialize; - enum_map["reset"] = evReset; - - 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["loadtrimbitfile"] = evLoadTrimBitFile; - - enum_map["setbitmode"] = evSetBitMode; - enum_map["setphotonenergy"] = evSetPhotonEnergy; - // enum_map["setphotonenergycalibrationparameters"] = evSetPhotonEnergyCalibrationParameters; - // enum_map["activateratecorrection"] = evActivateRateCorrection; - // enum_map["deactivateratecorrection"] = evDeactivateRateCorrection; - // enum_map["setratecorrectiontau"] = evSetRateCorrectionTau; - - enum_map["setreadoutspeed"] = evSetReadoutSpeed; - enum_map["setreadoutmode"] = evSetReadoutMode; - - - enum_map["setnumberofexposures"] = evSetNumberOfExposures; - enum_map["setexposuretime"] = evSetExposureTime; - enum_map["setexposureperiod"] = evSetExposurePeriod; - - /* - enum_map["settriggerpolaritytopositive"] = evSetTriggerPolarityToPositive; - enum_map["settriggerpolaritytonegative"] = evSetTriggerPolarityToNegative; - */ - enum_map["settriggermode"] = evSetTriggerMode; -/* - enum_map["enableexternalgatingwhensignalspositive"] = evEnableExternalGatingWhenSignalsPositive; - enum_map["enableexternalgatingwhensignalsnegative"] = evEnableExternalGatingWhenSignalsNegative; - enum_map["disableexternalgating"] = evDisableExternalGating; - */ - - enum_map["startacquisition"] = evStartAcquisition; - enum_map["stopacquisition"] = evStopAcquisition; - enum_map["isdaqstillrunning"] = evIsDaqStillRunning; - // enum_map["waituntildaqfinished"] = evWaitUntilDaqFinished; - // enum_map["exitserver"] = evExitServer; + enum_map["reinitialize"] = evReinitialize; + enum_map["reset"] = evReset; + 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["loadtrimbitfile"] = evLoadTrimBitFile; + enum_map["setbitmode"] = evSetBitMode; + enum_map["setphotonenergy"] = evSetPhotonEnergy; + // enum_map["setphotonenergycalibrationparameters"] = evSetPhotonEnergyCalibrationParameters; + // enum_map["activateratecorrection"] = evActivateRateCorrection; + // enum_map["deactivateratecorrection"] = evDeactivateRateCorrection; + // enum_map["setratecorrectiontau"] = evSetRateCorrectionTau; + enum_map["setreadoutspeed"] = evSetReadoutSpeed; + enum_map["setreadoutmode"] = evSetReadoutMode; + enum_map["setnumberofexposures"] = evSetNumberOfExposures; + enum_map["setexposuretime"] = evSetExposureTime; + enum_map["setexposureperiod"] = evSetExposurePeriod; + // enum_map["settriggerpolaritytopositive"] = evSetTriggerPolarityToPositive; + // enum_map["settriggerpolaritytonegative"] = evSetTriggerPolarityToNegative; + enum_map["settriggermode"] = evSetTriggerMode; + enum_map["setexternalgating"] = evSetExternalGating; + enum_map["startacquisition"] = evStartAcquisition; + enum_map["stopacquisition"] = evStopAcquisition; + enum_map["isdaqstillrunning"] = evIsDaqStillRunning; + enum_map["waituntildaqfinished"] = evWaitUntilDaqFinished; + enum_map["exitserver"] = evExitServer; } int server_list_s; @@ -112,458 +99,466 @@ void AddNumber(string& str, int n, int location=-1, bool space_after=0);//-1 mea void AddNumber(string& str, float v, int location=-1, bool space_after=0);//-1 means append int main(int argc, char* argv[]){ - cout< "< "<0){ - int ret_parameter = 0; - return_start_pos = return_message.length(); + int return_start_pos; + while(cmd.length()>0){ + int ret_parameter = 0; + return_start_pos = return_message.length(); - switch(enum_map.find(LowerCase(cmd))->second){ + switch(enum_map.find(LowerCase(cmd))->second){ - case evReinitialize : - if(feb_controler->Init()){ - return_message.append("\tExecuted: Reinitialize\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: Reinitialize\n"); - ret_val = 1; - } - break; + case evReinitialize : + if(feb_controler->Init()){ + return_message.append("\tExecuted: Reinitialize\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: Reinitialize\n"); + ret_val = 1; + } + break; - case evReset : - if(feb_controler->Reset()){ - return_message.append("\tExecuted: Reset\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: Reset\n"); - ret_val = 1; - } - break; + case evReset : + if(feb_controler->Reset()){ + return_message.append("\tExecuted: Reset\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: Reset\n"); + ret_val = 1; + } + break; - case evSetInputDelays : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); + 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; + 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); - tmp_str[1] = GetNextString(data); - n[0] = atoi(tmp_str[1].data()); - - if(tmp_str[0].length()>0&&tmp_str[1].length()>0&&feb_controler->SetDAC(tmp_str[0],n[0])){ - return_message.append("\tExecuted: SetDACValue "); return_message.append(tmp_str[0]+" "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetDACValue \n"); - ret_val = 1; - } - break; + case evSetDACValue : + tmp_str[0] = GetNextString(data); + tmp_str[1] = GetNextString(data); + n[0] = atoi(tmp_str[1].data()); - case evGetDACValue : - tmp_str[0] = GetNextString(data); - - if(tmp_str[0].length()>0&&feb_controler->GetDAC(tmp_str[0],ret_parameter)){ - return_message.append("\tExecuted: GetDACValue "); return_message.append(tmp_str[0]+" -> ");AddNumber(return_message,ret_parameter); return_message.append(" mV\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: GetDACValue \n"); - ret_val = 1; - } - break; + if(tmp_str[0].length()>0&&tmp_str[1].length()>0&&feb_controler->SetDAC(tmp_str[0],n[0])){ + return_message.append("\tExecuted: SetDACValue "); return_message.append(tmp_str[0]+" "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetDACValue \n"); + ret_val = 1; + } + break; - case evSetDACVoltage : - tmp_str[0] = GetNextString(data); - tmp_str[1] = GetNextString(data); - n[0] = atoi(tmp_str[1].data()); + case evGetDACValue : + tmp_str[0] = GetNextString(data); - if(tmp_str[0].length()>0&&tmp_str[1].length()>0&&feb_controler->SetDAC(tmp_str[0],n[0],1)){ - return_message.append("\tExecuted: SetDACVoltage "); return_message.append(tmp_str[0]+" "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetDACVoltage \n"); - ret_val = 1; - } - break; + if(tmp_str[0].length()>0&&feb_controler->GetDAC(tmp_str[0],ret_parameter)){ + return_message.append("\tExecuted: GetDACValue "); return_message.append(tmp_str[0]+" -> ");AddNumber(return_message,ret_parameter); return_message.append(" mV\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: GetDACValue \n"); + ret_val = 1; + } + break; - case evGetDACVoltage : - tmp_str[0] = GetNextString(data); - - if(tmp_str[0].length()>0&&feb_controler->GetDAC(tmp_str[0],ret_parameter,1)){ - return_message.append("\tExecuted: GetDACVoltage "); return_message.append(tmp_str[0]+" -> ");AddNumber(return_message,ret_parameter); return_message.append(" mV\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: GetDACVoltage \n"); - ret_val = 1; - } - break; + case evSetDACVoltage : + tmp_str[0] = GetNextString(data); + tmp_str[1] = GetNextString(data); + n[0] = atoi(tmp_str[1].data()); - case evSetHighVoltage : - tmp_str[0] = GetNextString(data); - v[0] = atof(tmp_str[0].data()); - - if(tmp_str[0].length()>0&&feb_controler->SetHighVoltage(v[0])){ - return_message.append("\tExecuted: SetHighVoltage "); AddNumber(return_message,v[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetHighVoltage \n"); - ret_val = 1; - } - break; + if(tmp_str[0].length()>0&&tmp_str[1].length()>0&&feb_controler->SetDAC(tmp_str[0],n[0],1)){ + return_message.append("\tExecuted: SetDACVoltage "); return_message.append(tmp_str[0]+" "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetDACVoltage \n"); + ret_val = 1; + } + break; - 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{ + case evGetDACVoltage : + tmp_str[0] = GetNextString(data); + + if(tmp_str[0].length()>0&&feb_controler->GetDAC(tmp_str[0],ret_parameter,1)){ + return_message.append("\tExecuted: GetDACVoltage "); return_message.append(tmp_str[0]+" -> ");AddNumber(return_message,ret_parameter); return_message.append(" mV\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: GetDACVoltage \n"); + ret_val = 1; + } + break; + + case evSetHighVoltage : + tmp_str[0] = GetNextString(data); + v[0] = atof(tmp_str[0].data()); + + if(tmp_str[0].length()>0&&feb_controler->SetHighVoltage(v[0])){ + return_message.append("\tExecuted: SetHighVoltage "); AddNumber(return_message,v[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetHighVoltage \n"); + ret_val = 1; + } + break; + + 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; + break; - // case evLoadTrimBitFile : + // case evLoadTrimBitFile : - case evSetBitMode : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); + case evSetBitMode : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetDynamicRange(n[0])){ - return_message.append("\tExecuted: SetBitMode "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetBitMode \n"); - ret_val = 1; - } - break; + if(tmp_str[0].length()>0&&feb_controler->SetDynamicRange(n[0])){ + return_message.append("\tExecuted: SetBitMode "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetBitMode \n"); + ret_val = 1; + } + break; - case evSetPhotonEnergy : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetPhotonEnergy(n[0])){ - return_message.append("\tExecuted: SetPhotonEnergy "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetPhotonEnergy \n"); - ret_val = 1; - } - break; + case evSetPhotonEnergy : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetPhotonEnergy(n[0])){ + return_message.append("\tExecuted: SetPhotonEnergy "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetPhotonEnergy \n"); + ret_val = 1; + } + break; - // case evSetPhotonEnergyCalibrationParameters : - // case evActivateRateCorrection : - // case evDeactivateRateCorrection : - // case evSetRateCorrectionTau : + // case evSetPhotonEnergyCalibrationParameters : + // case evActivateRateCorrection : + // case evDeactivateRateCorrection : + // case evSetRateCorrectionTau : - case evSetReadoutSpeed : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetReadoutSpeed(n[0])){ - return_message.append("\tExecuted: SetReadoutSpeed "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetReadoutSpeed \n"); - ret_val = 1; - } - break; + case evSetReadoutSpeed : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetReadoutSpeed(n[0])){ + return_message.append("\tExecuted: SetReadoutSpeed "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetReadoutSpeed \n"); + ret_val = 1; + } + break; - case evSetReadoutMode : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetReadoutMode(n[0])){ - return_message.append("\tExecuted: SetReadoutMode "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetReadoutMode parallel,1->non-parallel,2-> safe_mode>\n"); - ret_val = 1; - } - break; + case evSetReadoutMode : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetReadoutMode(n[0])){ + return_message.append("\tExecuted: SetReadoutMode "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetReadoutMode parallel,1->non-parallel,2-> safe_mode>\n"); + ret_val = 1; + } + break; - case evSetNumberOfExposures : - tmp_str[0] = GetNextString(data); - n[0] = atoi(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetNExposures(n[0])){ - return_message.append("\tExecuted: SetNumberOfExposures "); AddNumber(return_message,n[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetNumberOfExposures \n"); - ret_val = 1; - } - break; - - case evSetExposureTime : - tmp_str[0] = GetNextString(data); - v[0] = atof(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetExposureTime(v[0])){ - return_message.append("\tExecuted: SetExposureTime "); AddNumber(return_message,v[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetExposureTime \n"); - ret_val = 1; - } - break; + case evSetNumberOfExposures : + tmp_str[0] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetNExposures(n[0])){ + return_message.append("\tExecuted: SetNumberOfExposures "); AddNumber(return_message,n[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetNumberOfExposures \n"); + ret_val = 1; + } + break; - case evSetExposurePeriod : - tmp_str[0] = GetNextString(data); - v[0] = atof(tmp_str[0].data()); - if(tmp_str[0].length()>0&&feb_controler->SetExposurePeriod(v[0])){ - return_message.append("\tExecuted: SetExposurePeriod "); AddNumber(return_message,v[0]); return_message.append("\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: SetExposurePeriod \n"); - ret_val = 1; - } - break; - // case evSetTriggerPolarityToPositive : - // case evSetTriggerPolarityToNegative : - 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 evSetExposureTime : + tmp_str[0] = GetNextString(data); + v[0] = atof(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetExposureTime(v[0])){ + return_message.append("\tExecuted: SetExposureTime "); AddNumber(return_message,v[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetExposureTime \n"); + ret_val = 1; + } + break; - // case evEnableExternalGatingWhenSignalsPositive : - // case evEnableExternalGatingWhenSignalsNegative : - // case evDisableExternalGating : + case evSetExposurePeriod : + tmp_str[0] = GetNextString(data); + v[0] = atof(tmp_str[0].data()); + if(tmp_str[0].length()>0&&feb_controler->SetExposurePeriod(v[0])){ + return_message.append("\tExecuted: SetExposurePeriod "); AddNumber(return_message,v[0]); return_message.append("\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: SetExposurePeriod \n"); + ret_val = 1; + } + break; + // case evSetTriggerPolarityToPositive : + // case evSetTriggerPolarityToNegative : + 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 evSetExternalGating : + tmp_str[0] = GetNextString(data); + tmp_str[1] = GetNextString(data); + n[0] = atoi(tmp_str[0].data()); + n[1] = atoi(tmp_str[1].data()); + if(tmp_str[0].length()<1 || tmp_str[1].length()<1 || (n[0]!=0&&n[0]!=1) || (n[1]!=0&&n[1]!=1)){ + return_message.append("\tError executing: setexternalgating \n"); + ret_val = 1; + } + feb_controler->SetExternalEnableMode(n[0],n[1]); + ret_val = 0; + break; + + case evStartAcquisition : + if(feb_controler->StartAcquisition()){ + return_message.append("\tExecuted: StartAcquisition\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: StartAcquisition\n"); + ret_val = 1; + } + break; + + case evStopAcquisition : + if(feb_controler->StopAcquisition()){ + return_message.append("\tExecuted: StopAcquisition\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: StopAcquisition\n"); + ret_val = 1; + } + break; - case evStartAcquisition : - if(feb_controler->StartAcquisition()){ - return_message.append("\tExecuted: StartAcquisition\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: StartAcquisition\n"); - ret_val = 1; - } - break; - - case evStopAcquisition : - if(feb_controler->StopAcquisition()){ - return_message.append("\tExecuted: StopAcquisition\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: StopAcquisition\n"); - ret_val = 1; - } - break; + case evIsDaqStillRunning : + return_message.append("\tExecuted: evIsDaqStillRunning\n"); + ret_parameter = feb_controler->AcquisitionInProgress(); + ret_val = 0; + break; - case evIsDaqStillRunning : - return_message.append("\tExecuted: evIsDaqStillRunning\n"); - ret_parameter = feb_controler->AcquisitionInProgress(); - ret_val = 0; - break; - - /* - case evWaitUntilDaqFinished : - if(feb_controler->WaitForFinishedFlag()){ - return_message.append("\tExecuted: WaitUntilDaqFinished\n"); - ret_val = 0; - }else{ - return_message.append("\tError executing: WaitUntilDaqFinished\n"); - ret_val = 1; - } - break; + case evWaitUntilDaqFinished : + if(feb_controler->WaitForFinishedFlag()){ + return_message.append("\tExecuted: WaitUntilDaqFinished\n"); + ret_val = 0; + }else{ + return_message.append("\tError executing: WaitUntilDaqFinished\n"); + ret_val = 1; + } + break; - case evExitServer : - return_message.append("\tExiting Server ....\n"); - stop = 1; - ret_val = -200; - break; - */ + case evExitServer : + return_message.append("\tExiting Server ....\n"); + stop = 1; + ret_val = -200; + break; - default : - return_message.append("\tWarning command \""); - return_message.append(cmd); - return_message.append("\" not found.\n"); - return_message.append("\t\tValid commands: "); - map::iterator it = enum_map.begin(); - while(it!=enum_map.end()){ - return_message.append((it++)->first); - return_message.append(" "); - } - ret_val=-100; - break; - } + default : + return_message.append("\tWarning command \""); + return_message.append(cmd); + return_message.append("\" not found.\n"); + return_message.append("\t\tValid commands: "); + map::iterator it = enum_map.begin(); + while(it!=enum_map.end()){ + return_message.append((it++)->first); + return_message.append(" "); + } - // return_message.append("\n"); - //AddNumber(return_message,ret_parameter,return_start_pos); - AddNumber(return_message,ret_val,return_start_pos,1); - AddNumber(return_message,ret_parameter,0,1); - if(ret_val!=0) break; + ret_val=-100; + break; + } - cmd = GetNextString(data); - } - return_message.append("\n\n\n"); + // return_message.append("\n"); + //AddNumber(return_message,ret_parameter,return_start_pos); + AddNumber(return_message,ret_val,return_start_pos,1); + AddNumber(return_message,ret_parameter,0,1); + if(ret_val!=0) break; - AddNumber(return_message,ret_val,0,1); - cout<0) return sub; - } - - return ""; + sub.erase(remove_if(sub.begin(),sub.end(), ::isspace ),sub.end()); + + if(sub.length()>0) return sub; + } + + return ""; } void AddNumber(string& str, int n, int location, bool space_after){ - static char retval_st[100]; - if(space_after) sprintf(retval_st,"%d ",n); - else sprintf(retval_st,"%d",n); + static char retval_st[100]; + if(space_after) sprintf(retval_st,"%d ",n); + else sprintf(retval_st,"%d",n); - if(location<0) str.append(retval_st); - else str.insert(location,retval_st); + if(location<0) str.append(retval_st); + else str.insert(location,retval_st); } void AddNumber(string& str, float v, int location, bool space_after){ - static char retval_st[100]; - if(space_after) sprintf(retval_st,"%f ",v); - else sprintf(retval_st,"%f",v); + static char retval_st[100]; + if(space_after) sprintf(retval_st,"%f ",v); + else sprintf(retval_st,"%f",v); - if(location<0) str.append(retval_st); - else str.insert(location,retval_st); + if(location<0) str.append(retval_st); + else str.insert(location,retval_st); } bool SetupListenSocket(unsigned short int port){ - server_list_s=0; - server_conn_s=0; + server_list_s=0; + server_conn_s=0; - if((server_list_s = socket(AF_INET, SOCK_STREAM, 0))<0) return 0; - - struct sockaddr_in servaddr; /* socket address structure */ - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(port); + if((server_list_s = socket(AF_INET, SOCK_STREAM, 0))<0) return 0; - if(bind(server_list_s,(struct sockaddr *) &servaddr,sizeof(servaddr))<0) return 0; + struct sockaddr_in servaddr; /* socket address structure */ + memset(&servaddr, 0, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); - if(listen(server_list_s,32) < 0){ // 1024 /* Backlog for listen() */ - return 0; - } + if(bind(server_list_s,(struct sockaddr *) &servaddr,sizeof(servaddr))<0) return 0; - return 1; + if(listen(server_list_s,32) < 0){ // 1024 /* Backlog for listen() */ + return 0; + } + + return 1; } int AccpetConnectionAndWaitForData(char* buffer, int maxlength){ - if(server_list_s==0||maxlength<=0) return 0; + if(server_list_s==0||maxlength<=0) return 0; - if((server_conn_s = accept(server_list_s,NULL,NULL))< 0) return 0; + if((server_conn_s = accept(server_list_s,NULL,NULL))< 0) return 0; - int nread = read(server_conn_s,buffer,maxlength-1); + int nread = read(server_conn_s,buffer,maxlength-1); - if(nread<0) return 0; + if(nread<0) return 0; - buffer[nread]='\0'; - return nread; + buffer[nread]='\0'; + return nread; } bool WriteNClose(const char* buffer, int length){ - if(server_conn_s==0||length<=0) return 0; - - int nsent = write(server_conn_s,buffer,length); - if(close(server_conn_s)<0) return 0; - - server_conn_s=0; - return (nsent==length); + if(server_conn_s==0||length<=0) return 0; + + int nsent = write(server_conn_s,buffer,length); + if(close(server_conn_s)<0) return 0; + + server_conn_s=0; + return (nsent==length); } diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer index b13560c477f148818dab0bb4b8e97302f9b7c4a7..c3eb10c03c7e4564c9ec5a6d22d8cd073c5a1102 100755 GIT binary patch delta 29950 zcmb__4}4U`wg1e`A2yqRHz6b;gk%XxNFanwOyUB8B*>qYpau;H7A5=%B>WA68Z@{G z1s__dfk77(Ft%Xf3C~cW!4_-Uq75z9(4qy4HS|Hn_uv^U_MxKt`<}UTH@lnA*Wdg7 z_Ty#doS8Xu=KPy;=iXeu|9i{XbC%{oVG)e60>*FJx2De@UoeevT#SV(DN*ttX1C`2{*RE)mQZ&l`rm)IS4PJT4oqI9$HJ5C8*k^~W{T zr-3+2!8KUnhM>&E6^knYR}!u?!L|O8VW=hJqF;=-!tWPTwB!&SP&Bn?SW!#FH4qp5 zB5|eS3dW`3vfvs-J;m#qosSn6wYfvgzH&OW{~Ip(qv;`uDPm#J_?c{q&IcX=92_Ib z^4YQ#|EO+uf0)hmhdHq!e@1`St!s{SVF@lTBa!*Gtkv1@<3KpjGaThnqt!dp@Blbb zY!6<^Z+|^Fq=1W((8c0Mp(*0mp}8*7Y7jb)!$mS;k+rp?6G($UL^!}CU-aQM3Z{OL z6n_{c)3w58n26LPu?zK)?tm}aj6S4Gs&B^-v%U-DRNYmy7ju~n2SLcJLyrB-I#y~i z>n9isGwY`qvzqlY5QJGj&sc<6zlbH7^(%};nf2?ihXD-hC+=>-R8+(5!4RTZkANYX z^*9)-Sx<%moAq=Upjpp>X_@r`n3!2FhJl*(i7-#IJ`M8^Hi1f5xLKbAn>6bS;VEW) z8Dm4t`WjfgS#N;1nDq_tGPAxJ-e%Uf!((K9`w&legGGC#nX`;I@e5{gYB_JZI6?-rS)wj1C9|M% z?4Ju}m2~Nv>!a?9rV>Yv>(B9ZWB=^&xSsAVE#1X(#(Eq%;z-zV4I{e3?hY-O<5*BI zM-*5e*9!NGR%?ouQ!6^H@u35cfvH2{iZye1&K3uZr!|!&I;t20dSgS?p!()imfVuc zvMO2d_=cdMdZ#wxeNh~ql#~-j&9n?mm|VFIwip=`M%Choq@u!(JR9S3pf#v|>+r%3syCG|3lZ8n zqVN=8o>w)n)9llPK4No3((vJjCC6dG<7Jc4eZLciMMLat;6-C4!=DzN5kIgxE>kzj zN<(ClmVH?4h)kJTc#7tCq_XsNL(A*O+2C|fJ1#p~5DeNGYv@O!$bPQb#q`EhrmIC6 z6I2bnj<%PbENGXvZ5OL>YFURwL{!r7BxpTr3(2P;3^G9^HTcQeN;ucA{#M@*EXjw7 zil|)8aalA*O{L;gR1p=y(V4ES5KJ8b@)3p#_zqgzZS6@mr#5U=Z`#8i@uxlPs_O4R z|1#NM>W8tO`G=iETZS(!JM-Ke(a5UH#DVBY*C0znm=;IsXd1y7(X%s!3k!PX?#5u7 z#8o9N1D&Igf0u$A0q+A$s)N}iZ36rp;C2P?0K5@!tAbkqKLWT#!TSMMJK@yL3egJ0 z40LEz@G-!X0M{wF9dIGwDg~bcoB_B(!Dj&v09>lzF2Esx?Fzo^)H1&SY*TPI;7d9X zx;tE#ovPr-9|xH88$?9PDRwElfK&CSO^2e&MO65*FcVbdm>I z*4YdzYYr7wYZV5-%MK{6qFIn^;%Sh2+n?piiO$hwa7AYIeVrSd8a5HzFv!{7AJ;} z*CGa!7)0ubv1x;ykYOUZzOmTwtB8)KLU^8S@G{XbA}uOn2qHwX;lAPH#K94ncMo0z zRN}e?->F}hj?p3H$<{ATv6LEOfz=NNK71!pg;=gYEJSs0z^tQ%Ehm3`;rT|ynQ~9p zPLqt1E|Gy;!ZRGq;{lm^C(~x5EG8)%!KLuLXwI1&UwEFFEcaYmM>ApA8E}QbpEEi3 zM=@&hE*fQLqie*(kwy7~yA9CcXsTuG>1-BEL2v6~sLm2pzcY&kt6?`(Kc_f25;oH* z>NX7((RU<@=-j#5xC&91n;)CPurR$xoR)o}*)~+Xb~;RS<;KR3t00T5WcnD2DC2B8 z8=ZYyhv>YVAW}y~yT(-*sDgur)yTjAPECAay}~nt6%+5+rSM1m@ng;^{4sz0*kuZT z+z;={o^Vk$wEHz=-!W0)X*2R+XwoKy@ASt{G3iLR?peT{m8yS)fB*9Hgm-NnAp?!i z1b4Nn0n(p(2vwX>cxz)W zAHQ(3!b_9vVQA4Qg?IY*uW3~HX+3xsnZpv3P-Ra8;g{Z217`W-mz$!l^2a}HE?}WQ z{xKDi*fM|o+T#r_nL)_S#77cOw5W;K_z!q;jl$Ra;Q8q6#)S&s;E!MLRQN`J{05uC zZ*ciHY-~^soBZ)l)hPUCfBYtMg607H4%L6VKYnww!tYRc7r7r+@T|$vF8=}BOhPUG z_~-U3LVNx3JFh7Get-P#O$vX|AMg5sOfujFC;S`s9ajT7{P71&M$h=;Uo~yztUvyc ziT5>9EcmrLgZ>Da7?`?8L#t_A=lu!2o-R6Xn`})FPyi(fFy749CuNk*HIYZ|o<@5RM`kx3iQD zqf3HrngLvL(c*A8HTDR$8`2k%+a+e*o*SC7*O3}@6Dzli_5#d-JvnuvlYh0*hc7en zBbAaaq$re{J4M&}cvs4XzS;h229~%6n`-i?#vo7GZYHP5v!&J$Zd?__v2=8eH$mZF zW#FdI>f~SER#8`4r0qE^ z_M_PSh3G0BueD?gTiImor3<39Y?yeqELD4HC#t|qmzdNEz=Vm?36r%wzd$ieyf$G_ znqkaXWHNEo+aj-5iz^d;Vog0^G<#iTlE0zUi0;YOc&}?#Qg5$0=u-^v_5e;4LJ zYBT}@d-a^CnlfHYm?W*ZYSL5IR29iEb@wDVt#6?DUr*b;%75Ae`!MYTq^9FjFy&3} zYP(x1MT^rKTX+z+Ji1&KG}dT^X{}8Ve{e3PF{O7tY_%EjkaE=SNyVb^_1naVsj2Zc z$2c2#xZ%BxZ{Y@vU!5narslf5!Od4%rbCsIaZv6|Hi(?sj;Up^^Cd^@*kv%da>?`# zxh@xOz+YlUdk5D_hinu(J4l{Z_FS8 zH+~FbqEit5$)}Kp5t@vx!`zihO=*Fze<0OQ4v55xToO>-_jARgI48k^+AFZ2Gd)6@ zo}^v6COW4;NYnj=H2sA!wwp#^zqF-_;Sd1vKrN;KbzSa(Y}X+r$T*S`?dv2+GOv4< zTEw$cqQ$m*<;>^reb_prz$?o3%_YKppPwl8qNU>Y$^>o0r=p@VDRv0mDkk?tq`!P5 z8Y*!klar&h|OZ*@j@_?yd~e#}MCkmbSh3d7Hwi^EOjLPUd1a0R&?*I;QGI zohGLGMbtG_KZ|;hs-HqVMAh3-4^{OesP|L#{is`1eHZFss@{xxgsN{q-P-IjCaVV! zt{Rr19;xb8s7I-KCF;?t?ld%%M&{LX`ocfVQxXV_^NCLW;W~_$QpMsdRj?6^jc}<5 za25m2J<^Q&#!k=^t0=W9Z7N~KzB_?Q)R_2I?)D)a-mD>JF<%tu5aX28yXp}`lb!6z zY!!CW(Q%sUILfD^*-swrKnm0^T{43@#bQd*$TkpgZ8G4phD)Ghocr!!M^LxXViC{j zC^`!?ETn%j>vRH87B`j938S+DEBsm-<1T6L65qg_6(A5&x|_wJpH~WC(sVg8SdET- z8ZF+<1O24!z|fi9S6X?tw5rAhn3OymQqYNexyyLK89!SKhR9fQ;9ogdq3N~Czm82; z{zWU~Sd|_9ND^j0i{XdI@Sx$uV+P)!~V<~auFPMp9Km-M= z(JodcD&|hL4o#NBXs_HmcM3lsx(nldBO`_Q)bB(FJK5%QVpG-dyLu7@(UqZ>u@(v&FQ)gGNK&dz(tI<&^SqSEPOZ61GvgRJsNz_E>6BlxuSkt9f$@A9M znz?*qplIy1fxC0myLb65*|;0EOgBA4@o{Ldy4{xoga;+VgJ_|$U%BVCYP2Ip7~a>L z&x54KL1N{S5^eqaqIF5Uc518WSduz;H;q%SZoxPx#XmQQ`t6sJLHSq^9TaZeNv8q~N8x@=_ffMmYIzGsN-bL&c~_tB8CcDFo?tQ?;-yi`RZTL^zfW zZzeTyWI2Rk>W(%n4TL^BRw_l*kpS8z^(SncaUDP0)*kZ(Iqk+D)m2C zc>5@3sv|#lvZYcknBCvca~>TbUR$N}Rib^>Fn*`Fyeeh9uU+jMObdXPl9gR08+LW# zU6cqNC*DShD172glnA&dj*5v7PhIpxH4W?0!ihJO9H70&<%Z(Zwp+D9drwRc7}uoQ zpuHz%2eef~dxJ#u>hRtg)CW{RGq#Rnt^0l-YqNVQR(!L zrcR&d<4^U{`uyTy%hM#D-kNG3ZD^`J&(KtRwxOx^A>!<#bNPdTfs!`sUp>}8KD}9O z5OLT_q3O5Eoa~WD#FfWVih6C|)V#`> zyq3OKbk@gfKQ9w4>*D22;3&?8eQlE8roH=|(4R~YE7!*HLq2<^Mf_=PB4TB)t-A)9 z$io*zBR_tQ@P_LwkYNL^L-$Hv&B!In&FkyO6Zzm?OuhJpWa_>r z;t;euXU`VDcp{#^*_)ZAVnIWKR(DBs|1e>;+6Q_G7#{XhN@cJ|q@VZI3-VZa-A^Cv z#aSQco3}jB`Y9bd)0U==D(3w{0z zxaL(-f_QITV)mUdSjwBt%!6(!``8F}4uPPCYdgM>`{eyk-eJw?am&*Al}5l)o1ikR zUNJK5Rx$F}omd;9PSsta!WD1L=<)43mpo@~{%)@39x2+t>u*!;5TUPs$ePhik~Q`Q zWL+QKks!`D`kWdXj2O(xV0}wQeo}2P^3Y*}k^Nr6SfkkA6h&DhG4tG=y_k6pA|hr^ zc*htiV1j60|BslNa4V@CX)>63FouGPkB+L8uFw0;wB?lq(fD1(;V9ZH0;DDGG#I?@ z9agbny!M^bqIpA7d?xNwe*6X|G&HFmtcdmvqj;I<-rz6yZ3Cs-jM~^=+jjUbLZV%f*6R6-wCu5Y+ZXn!foA=F#F2HbJ{4$d=dQ&D{JqJOred?wP9;qiF#07E-8r6Gq1ZTDj*LO7bJ*Erf9&Y7wt(?q|(x^pX92yeUw+ z&C^$lA8i>MaQC<50B!Q6#I~`q&ZM_%%+n6J^P>ZiS{pj*hs*^aRm)9Px!^c=CoTH z#Vgngn^W?KCCW2Kzk_3i^L?j}Wp<3SsRtO{%}LrTk-}Cn2zS$7N!_?EjZ;#zjgg{dihrcta7j$tmdf9j!Wh=#rCd7y zevvBT_`E=^_Bu%KmEPS_9zT3UByXRPTk*b1=aJ!==hwrIW0`TiUEqfyV)ORN`NJ+Z zl`uMT(#MtJ=w}I@vo6HTU~nW-gp>bZw^#Q)=ANrHebZ~bP4A02&!zICqT#uRty$7T z)V^LRrahm)^ZHuvmFG)%t;lhc(agfXF=B&zxaPVfTHRwZvmB<{){Ou^*ioQ|EdP5j zJie@393S8bxqIHlilimexgd$&O!$>`CjtkD&#H3rJ=aA2j$yFomL2{Id=l1-2JE3b zMu9Qg&f(g+ODGb=f}L^v4Ox2@wJl=r&K1_II`P2Fd0mWr(ke1QI9wy4=PVNBNX zCYKDLr2ph`kdmVY`k#1T{km${Kqh1kojdspZ}w>ej}Pu;18ct!#k*6qwJ?R<55#BP zbn=}loM!hJM0d*!F=S8t$OjSobVCo>#ppSNm?iz-4bx484|w=tzITy5&B=G{6rFog zNAB|>Q3ouY*8Wo@8lBvIL2P;{O}pzT-5Cs);nB{r_l~m#o`AY>jQEnz-ZhaF?G00S zvEi0(>7F5qTQcVt9#mU8Z7Ftjdyz;7&B*SN^Gv2gWZEUB8LQ4dLH&9%jpx-{2?oBm zD?k4(;#s0N-(t1;iTUB&?5=?2;K=Ivf$$>va;R6UD)|@9FU#cfWq&_-1jiOH&$njx z1V(@Mm0qG@Nt<@q}5GM#ktZC4dOCr4=>ck|om_SZ1fJ*>gWia9wi1Q>#N zgV5E; z^!<-8wHc*leDJP|QmRiDBxozJg#E+lxcOE8wXK*f+V?-{U0YA^Z9nkXkV*d=ZZ=0M zZs;*iAUC<%(vL*(t10n?eXM@zfnMw_T?h8=5G$V?VI98ND|d=~wFd`iOTGz=|9wd3 z>9=nw9lDLJeXiGCV(oHadu@?*_wol}yXiq6;>HH4f&h6j1mLqlZfX*p z|2B*d={4WtFOB(5c;{<=ZNBeTY&$e)g+M6=9MTdILv}hx4Rn2EL7V)30 z(bnNz-dXA8n$p8#;RpdoQGG~t!$}{0{Iy*1<57HPubg(_DtW{F){o=(B=6zZ(AN{J zBbXlpjjxYMTR{F~-tPAu3-zMKd30!FJ};~X5rni6bok@*40-(lf{ipjYr2?ots0dX(&tb4teiPA}(2ZabQ(&ATMBj!xDJkBPdY!?nUIM$v5)$Bp8q zQQVM45i^Qlqp%o7gi+{55oZ*MC=x_T+n{(yf!qo9aCHkY0=E#Z=R{pw{P+iD6$lLuD1){~Ki85r&-0D#VGlA`QjOwxYYsDvdk2Cufr| zy?^k z>L4XXQrkJg_?tF+RT+}2hUY}qPcyZ$I#Kb{G%D8obWCR1!)OTe-V$LD4mmCpA(IH; zi=yIux@bKeu`M!8ME)!$wy+)hYAHmUPCfH%g%!g7GrXKyAu4|6a5cYWtj34JWhhy0 zmxxRbjNx`R;^H_PWonQD9t9wovLKnl>YlhOfSZdjC#gb=xp9jz1AWGX(Go6}dv0#s zcDiJ?`R72iCd`^+$lhmGCx859pV8)EX@-U$7%%OC3qwanoV_eMe>UM>DJmkH9LN~R zM)oHA^+vB9?YSk{0@3~Rum#55skB*NLDDkvY&mw68og-Rw4~6mYvX|!-cjct7#U_+ zow>(5`PyDWE%$u&wy68CSR6kcHM8&vkqeyWw)Pw+ERJrP-)wkhXuY`{GAGxGzsZ|S zd0NBk51DObc82)B%D`WC4G_EE96htJ`xfNs^*DgNjXeMexp-iL$r3E8cGcLfQo&3>reUO?CQj;eX-sp>4klD}& znd!aB{P#&orbupMeQ>j*HOz^T)tNal~9x z3EuLNQY=cm1+zB;XE7q&>ORc*I?f1xIU&}FCwaD!atey&IJ_<1_N%B+ifDiPNGv;n zKM8m*PL%&Dyr**(%`ZE**5rwuzZz)t9xaaj3PJg@s5^nzdN3&bgwLR2@1U#`ZL9D#=Ph}7*=>Pg4agv>ZjnJ4G1SN)>@tHWN*2lQq`I#C?-Ga= z++f`=fv7SPh~@HhM@pq9A?YNE5_65=z6r^EGl5ucW+XldM3H>KU>pUSrzfcdVmS{; zAWrlo5N4lc-}EF9%csi(qDa2UhZpez5{OBCBoLF3KrBP{i3DPjkwBoJ1Y!~rh-I_= zU8l%K3+r(^h_&MUSTVOFe1dGkhBT2D>2F3rFIp2q<0I9VQcnjm}Q$VPGH?>wtXh1GQ!zP~rTQI;^Y$QgWSDGuM7^TEbwMAK?;ytN@h*POCPX`K26rXz7 zkVbjf8*;QEjH%Ye)dVVOykK4Q3oqFGn-^S*21~Fi7w34@^jwTo7)uW5YNRIDs?FOlNH{G+-`#=aL{?|Ez_`;Y#YUQ3UMq`7a)H*4&C~LHf*+l2jG!06odofpHj0=A#g_nMVo0Nm& z$UAqhlP@rgndP=C^TaL6e0d~Q$?W;^u9MII(l-nmf0I;{LwR^5vlXd6@_B=Kv!%Su zZuDu1M;{kXkLMrmgHVCd$vfE=zdpvc=#ZcG;Pbs7h>&uUd2JEB&nxd)@HgZ#^PtI_ zMo0$nr`ez@|1{eL|F11_Pz;!nZO>mfVrrbR660^1`W}Qa*+s>wpA1E}>{nZ4H)z|6 zd}ybe3T<-r;z%-7U<_)B_ZcKN;l3t99Mlyvh9mc}QW-0yWQ=bXm~>navsWDG6s!oz z^vLYw+h<%)AB%St0gE8!6&-e~KE%-IQYKzJ6WfpOGKLr76E9~ny!Ea#$y?=kz+n_$?{jX%%_ zyK$oX(>SsDeXGk$lHRP0Fiv+p^<-$|vLFj@3A>ZLhT!7%u`g7;^BbfSVTFC*h5&~r zZ4oa!s!~gFkb!=o7Ytk^wJ|!}aIz?(_q=Ssodq3oRB1mnItP!YPEHoTMadu;C7sOE z)8b_5Vl3e#;Y8gz8{I&^UiHBWu02>SI{z4-|KJRDPf1?g<>YhT9bF>Dhd`Tq#oQM_ z%3>rsbC!$5vp*Cs?MoDYOo((fd+?T|I%F#Mbj>CY1ObaV(8<4Z4ej!cx-z_hF9{iM ze<$O18=Gm@ZWCATxiEvG6Z&V7S>dmr8P#uV$Lq$#0LG!u+cZaWiu@a&k?JiBXha&c ze0?v`M`>A2*~T#h5fkmNriy3JjY`VxCR%uj4H5A>1L*#*-1FDv<(?1m_lq(TMu@5p z`ibZdrzDMv=;`{vI@R?-be$oy^6sApi`EarGt$ARaR|Me=}-v%7U%E#AlV2~4(dB` z(XFmSIQ|svn$|RzS(?U6ZoS`tF!ol)fG1OpSa$~=p{d8Hrl}(LD5IIoPoZZh+G^(^mLbGBF30*jiF6OpE!VDIrA4ZGYKZ=ernUFk`isldS z9@={eQKPDy{QkrET1QB^=ku$g`J*w`Q4K)VLNh}E76b#o3KhI3{pYws%8q-^NWCY` zqjos?%yZ-jkUibLz^X?fy_)$pa3MG?DG;TJ!Eu;|HYy85BfVZ42YtiCm1q?MKAt^( z)P6L_^%(Jt-2@v3c)qOM^M^|f4TE5eXXeQ*Cz*d>v|U?^wv*!E$C**1Iv@)5uAW{d zx;{?P1`giV6(2Ptq^BYJ8#JWmoimRfXhwQ;>SVXc7nIeEk)S$S&Lm$G&gVofe#n=- zheh2f_IIU3jq385<1U(mXK(9Dh$QtWp74zr5Xn!t)SF2D5Oc0_&!65b_x#@2JmuVZ zk;dF1y@y5OLDPklMWb%|%kIAEJ+k}Lg>uj7ordgwZ>-QOyU#{qCiw`fAtk83fqh%o zFc=Sx@wY)zkIXKgi5X6N?>EBsmlvkmiXSIp z{MXn}`+1pd^Mw8KF!8rfiupIM+b_F=`3BK(Wl3_L zxhllNDQ_4uIWwf(^XoU8U1IXpWl?$C)v~EWo@l?CBU;}~tboMjZ4rG8i|PnV!A2xu z%yb@@E==gx*{0-;&}8(d$X@Pw=YrG_BD!dP(Pz@$^W{3%z&@&M>$K?&-(Z2HRcA|6LDGoale3Zu3nP|bol?< zUK7ZiD*#a+00&6spJFcSAJA|Fv<(cH;ChGZ;A}fPkQap{73O$6MZp1AG2lvfRw{qR zHDpJM;uj9u=;7Y`mj?0d#*wfE5#)-=I zwn`iSHpsQa;_=jCr0*4o3xs|9QvH8w5A5#)_mdMZv9z5{=Z%_WdG+emV=`7--Ic@m zjo3*m=FMMLyJE2|&pu^-wQWqsLigk>{?5?V)oT{cTkz<-Wsg+bGFIC%@Bv7+*bm3t z;o1Bz@zrap>(^92ykg$6#q-t>p^Sz2&;6g-e00KN^J>>TvSLl`vW4?jEvj8nySk>D z=(G(T&bRQkizE0un(I`D$Mai=@VCvl&KTt>NY4vX8!m}M`zff!dqF+#Z^o5lTz`Z~ ze6UMh`#l~nj5^^7KC_|c`k;X?9uzbdEY;wO@O=BhS(J?)PdmYwsN)98;~q~ZKB~zv z_%!wy4qg8q?HrSyrR-{x$J2ENWvjWT@%%gWzvA&+I__>B#na+H z0G_4eq92u@@zyDK$0$CG7r47e@hRChj7X+t{B&HP+L`5pn*|(ZI9=ebvh(lo7WZ*G zA2yvvwBw>5M)5fw&&M68AD0*dR|h`p0MnZ2NBtm-3zaClB*wt)0N+R41$jKpm3IUu zCf9pDx63&CnOCl=k3$)uGYicZi6FWGWw6dTsT$wB4T(S*sxxgDN__a1KG`e37fY*? z-vUJ$gb$!jL`k1?-GMR=S3h<;K5MG8es%&-CZe>ULo3QKToEfho^N#)dKRSzFh|)9 zc#}IOpWh~QEo7R`M>ud5<0{295tkDe;VW^?!L<-q4X!#|^|%^wZNjw~S2L(G>=Q%i zi^A^ae4ZL2SMNTU&&#xH%>7wDPtmUJcSqlb@^ia;lq`3-@1gSREceRW_~0O}Rk@!f zL{NkKH7bL5xZk7Fy3qX@mHjR5=mIJ`+@q+B+u**3$^i}Tl~g9oaX%}|Zue_cCeCrc zSHQDE>^cjxyKffodD_4u?zx40i1ixOdTl?r9_F4_#cgf>TFC#Rg&J7*HV0oEdTqbX zKDW1d96TmS0q*!>{*?7|koz1;3VGW*^m)zw?t?tmy`qFygc|Mc6D53A=;yn1hUJYd z<)>A>Ew+p&@CUv~$Jc;^Kj1k!yMB|u#r zd8h}rz?I`#!Qt^3Jo=n=e&kZsRSqj`hRgT@ti>s|aUYd=ieZxgKfOZP{2^CY*p zo0o?6YX)+M``q39vrsFH4od&sJrJK!Z`)VF2l59Zb$qs2ijRkvQkBHV!xO1W;^X>d zs*?D4L?u;8d_4RVRY`n2d=phkd_3v|RY`n2{H#0iUVhZt--3zZr~{+iFFwTIjj`U( zhmu7vBYvpKee^#5skMKH&g0<6NlT37E}4Pl8c6pOGteP!gU$!Qkq7;pIwZF}GZV@W zHLz_zx}PU;>i`HfVGh16oZ;;f$@QB&o#vZK!>PS3_yHcqtqF4gbmQa0EdjQ7f2h&q z9{vz)H=!Ge+8nq0A%5PhubsztsW{Gp)7ZJXTl z8hMI)rXbB5+&3|7Bn&qc7rPr5b*CSFl$@?g3b|CLu#0|Y-OjK0&=5rCeu?fn zRKx73;^I5pyS_rWgsoXR-0jqYDR6PU-hJgOo)U_E0(*s9|C*;+2ku3EFJp<#?&7b} zmX8m>=VOOMTWEd@>Mia~R5v~c?{1a#O2!K+sh;5e>}%L(!5kpwJb#n=RiRqt?)(;Q zB{!+94v0E;1vM7p3oV6CcfG7Pqu%UpLETyiCU9Y6cAvTlCJH+MceuN$4Vx3{SXP%i z`5Uz18{^bg`VGgoY&zUEvi!{5Oy%vLxsOq~aFx4@%12&sTfRlPGskVG@`YvYSyb+y z>Taa+^Sj;qsr>3E#4yTt+&8}E8T~X;TzscH-2|hV~3NO2I7(j+QV!-mhR?!N@@5c!VpA*PuuPM)a3(6_ucGeAL~Ay;vbA zO~3$X6hCy3>4fn$cnQ-N{;Az$kiH^MFf=LKVYdX!)Pu&$Z|vhyWx8soFZz3bXdgs? z+s3sYyNpG^rDze9AIL=jrbUc07Xg?SQA`^(O7bC+;=Pz73nfQ8%`p#f4$5E!uS9>T zHP!zaz}L}kj(=WvF>A38LaLJBVCK1o;zwYhf?yCN29d`VNFf0xE&MWo!QWAAr2cBc zi-2o-H4wDbV@ zcEEM2KQyY9>g>=>j9vrLL0Z~9(AY(^)Bn-{Olk`O%f;BF#2UDflgH<#4i)4n?p-4OjmU1??l9EhPpo ztNwr0*+BI7&i6S!%KGz0Aody^f~4mW5y1EbB~c~<0*d3HH2)O@4VT^UkLo{OXFoXx zFh|k5S7$TqSipV-&xN`mIYzk^798Y)0kuM8TB$;;*BSj$1>3IRW*r-#55XVlOn$zN zCL{uF%Izr^Blzb!`>#$gJWIhHP{CQ6&`?RxAK*le9@rJsg$`t~W{0a_;5=X@kznNW z3pe*L7(4*RLj)-Qfky8zV3$TB7jF4Wn4vYiG6Pt@73VKcl+!H~!=gVEnmp^F7C z(%C!hK(wk38+3NI6|hNgtIq!14S0@f->b7tB%ulgAJW-VkPz=u@G+fj+W|@F3jPfk z^rd%3XXm>xUfPrkE5M4!!l;7U)qub2?Bf=6a2jxk1roXpSV<@(UdOwpfRzM7vQU>l zoBTHfH$%qHCX0}Ah@5KX_=j|MwG=R^%mtl=tf5x=0fAr0vy|hZ(r#FF$csArBm(de z#n65bq)APJhjsQUtX!kfV~BV(aQ z==hKb=tlcn=uavvbzuPZqR^8%n++=tQEnG{8deSwc^UdM23!GbO5hsYtQ4?vyM9)k z**1Y;X;et8aLS;5GdmaO>@8b}1e8yI*II0oINiEAB_3lSHIe z)Ni%U{zPtRPS6Ab?LBVQ?|V=|vg)6R3HG5be}=^R{X}QSj{u<-*zcD*n*@eknsTdt zAE^E&#|V{OIlws-Lx0m*M<*CmfyEN6vtPxbU5VHd2RAJStQfSU=42dDe#c>J0|0 z19g|YS-0#}9k7|aHxV6_5m}LrMG%2vHJ}`I`7SyzEU zc!SBH^=X~`77`1pQT=~_{eNQvI$TkRqdL0-3}{LM)^?qpqZOV~?Z1PSlSG^fz5o?$ z0IXDC{TfD91Gv%f^Y9>@mE>T;V@Ch*Xq_!O1-Dh9Jlr)11JW^oM2Nr;J`#2L!vOrk zOQ3>ds3;YLS71ftc1q;oRnYk|z>0xzg*S!!cD3_BB8vEP!fyS4T%-|j7JVRh8U8O5dI(WCI(Ccg2ia$mk~%9KDPr@ zMilXZ&fe+(yjM+td?A5WsEjD$OH7~xRt!dBLo0=+0}w*wESk%7`Kxb#0Q51S18kycO-r zCL*EY-(~?e8F(Fa`J??GzsR=@(Dd8L_jUG%E5Mlqt{^4zvGU04I@^i%pk0c=Z*}&2 zny}G;qatv!mxE2Hz+l+;-)PYsXvZ%q0}>~R2FGCjL?96PvX*FwNqs{eB2h)_|`4Fx}@v!B(YT?L+~f5D@~KyT zF13PaO0h^JXrTMT=pj_6pD|(dZO8%J0hSsQL{COwIty4@G5W)1PMiR&j5K-$jO-xb zX{tZv2L*tYkw)*-*;+`z#V@K3|As&Uk$E|MLuaqSsLXr2=wE|D5}9(V==V{VKgA$c z*j5aLTA_}Gq+x~qIt==Hl+GHVB6B`H6*guk``fHKIKW{#2q+HqGQcn*FFYLy2?&^O zrz4Giq6Kl{j2ge%IOxQEfQ?!I@y1VLcD<$b^|sU z_?^yP2SZwwYDW%uCnRF3NdI@lezJOV#W$#pe&~;1j74X7ZHaNGF+L_yqVbPv&(+xk z*G0f;f*9;}XGy2ZXkwfY5s6%RLCjp8?E@UNP!U{$Hu+NopFn=F28d;<{VAPoZpH$d z6}(+%4==;|l+DDz$Xy9!6ehv_I?IL8gs9LPgZwMjj`kCZ0FuVHNJV=UjQzi`9k8;A zn2&XKZ#O0^RqcQEH|m(H*z7K&zuFyRzQFze8#WA3I*QeF_JcUAaKAwyR@a$h7ut&z zoD3T{1p*Zc&eYkG%@A>&f=8iE{s7|_>x2!_0+dQ)XG%1+$VzMtlExx33bVuGIvaEa z3>;JhHyX$5?1o`fv3OQBt^(cFW)%xJ`WaSiN+@=p&Za=6UWOpS|AG;kIb>|7&XR~> zrSe!8w$G~zeLCRA;!YTirs6_>q)gIoDh-DE$3dh=6vMdF=|2*YaxY+|)BfYoe!{2y zJE+T_vEu$K=p_m;&~4Dm?7!MPM+5@ri2c_>A~uXr66wDgY4^0YGXu00JhITi>gKIp zUA-{3Apf?udlIy0Eqzk$;_8Q|RIiy>cE|FW%!DSXN6k~@qh|Mm1GVN0T8#x(+0BCcdyV{!TabO4dK#u$|vixVI5o5eKE#$$y`OHLmRM3RAI z(YV`ih2qk1S#YHYu8j}}G&`RqdbHcQO;m=Y@dd&aQXw7=jg7rl=LsKCn^;Eexl8nf zriuRw(MQq{*?F7dvm zAM%BcP%yJu?!z}NE zPR(*V3}cp$GG;Z)UC@D9KFL^=S?t=V$5<6W5cQJCP^=2@h~TkE)iEOj_`!Ds9GcJkqKIfO*kV{vkIM4-z%(|)}w3g zbG_Bg(@HYk?rh3pNm4em-woRcS>q^_04%}OWQ(dI=caigXDf9Wj%YyON zQkzl_3j=+5AH7&MEIQ6{ShjtZRimwDXC*GNdDu-FZau>sbkk##+>XPAHpYpd$r`e5 z+jz%eDmPDqAj1IXIgV1tg|1N+lcpIo<{&oQ@y&G`GUu&p3JY21d7q4sy+Pt4Ln|b` z!J`$fV(5sCN-+kWeWM2hXc9Z;r;3-~j22h(EutrCc~(gewIg9S&k7qR=TC62fAaWU5qtFkbbl3U@9G5=}H&MRHO2NTjgXS zt$nywR_)ZrttK7P&^^N#Lz__eRw+c{MO~vRftPk9u{_C$y~bF^-AIkxzxvxcG9HND z5;-viT1k(njhRcg?$}9mI~$X=AoFzy6opQsq(H5FmttP))G|wC=fu2^cjn|k-kHY~ zeIw|@MD_55@XVb~ZR{nna(IS2v9c*rizo4$^B5yaJ5zO$Aeiep8-4_aGQdA02ewDCtFm-MO37Nz@y+^z_EZE z6?_FS2kbK7#88akGr-jf)&YM2xKhE1fL{k}SFjE6alkeO=Kwyaqe52|c2w*Ut$Idk zNj3Zd{4#cu+M8HGV-w>$%Hc1Qmthv1)y>J^a2#!(#-iLFCrxV02AknkEs>6+Xlbz{ zRnV+M2b$p_j-z66>}?4db%Y+kSX$jBEOFN-q#yq}ihXezn5>01pU-5Cd3RWNMkOEm zB5rD!mRu*=KPeUMqby=gVwUFEC0Y|5TG9p4op@7LNi~h6bXiHI;e1Ii5fi(sgfyku zJtgqk_(=radJvz}6J{pFNnX^ao;b)}-*H6cnEmyQqj>qL+!&RCJ*@LFm~_w5VfZ zP4-4@*jwUC_HA^l&Dp3~KNDwjZlhaSE}&@9m3xzB9VrsWZ`2|SMeFzq&GG>aUVJfr zYDSU=noFb!ZVbI^nM+Ltrk6_GDUkqQoVn^^|=5_}o~l>M8j6)!$-jh>Yp>L)>1k8WaaMSfY}w%rJiR^_vuZSs?wLrfHmk z^$jv(VZc@W^=@*7+dxOP#;*o_KKok8CbvmaFbhx z7a8yUM)uGy)nH9vgNIF@Sm#&IC+B(=EBdCu`i+&U-V<2ADN)sLat9(FU84}21M44i zsrs#f^_$HOT7v3Z6#b6C`mLK){VrASrs;A?CQnLcqQu>M7}-rq?v-~-hLpFEkn zP1^&}ZhG(8Kt_i`#lE81*5t)T^(5E!Cu?-GELT|Ew?`~4&d?A$J;lqDlGmu(NKheK zCvP&Th3%FyQCVUo%Bqs>)?{TRfYndmC%!pp*my@Lg@3H-5~)#BI2K#sjxLoF;*m1q z4dz!r7cG+#wB&ZNZ&Jlv*@{;_%g)PISX+7`WGkwpc*X53xpVTgkgH~xmLj#4*q!{V z=}0VO9TN4luz#aKOFk=H-}t39`KqL%oZ#75EL^1l5_`(-3{Q!7@_)P~8YW}8YYIM7 zHu6vK{2#~6yoP~g`r*0VlbizXoptO988+p-*;h7cu{L{p40rPLsr%5*)2U2rZqkdePq~Rquz5-*%T~to} zw!dBEC~KYki?2jw8S-Mk#egYDX#!?ppAggs;)-WjpYEkHlodOL&7I&*?i^giFVZod zHAt5!6Fnim>CdoYhzygYv{7BT3u9j~$z|?loc!;fVe4kaJ=U*#?1WNik(fwr0@fD% z?~ACeM!Zlyfku0#Jj0!GY6#W~Ro4=4dW@5Q{yJDkVR!d;_ZBRDpJio=?)(sZ)C5S8 zct1W{KyPUgvGYfZ?G-6xiuQ^bN#-i$&Bh)MSJSmAwL8%BvAIaiR>iF59?j;Zcz-aEfcbkDgy zVN7GWji$RXlRYnEhs6IfL6pudNazc8{z~f-O>aY;#@4MyF|*ojU;K?yyaPAT1c$PxtNLl`~UR7nfB+G zguSXDK<^K%7?UXDHruj6^=K$WMGMheCA(NNAIdoFr;P9Vv!NXE-wU#5w_Z>@GF@;x zjOYxt@QXab`NMSI#W;=8jghy$DjKfKa*R0*Ps;R$-%bq4a$Ie$jhf0qM+Ey_R>NPxo)TlvpmK~_G523S#0XnOG`d;zw!W?UAu@Ub- z#6-V7DdDO4YV6X{%`r=dnt10ZvHW@`b$j^wd#$M}`}AnPVY$B^T@S1f!)rzrY<#@w z+hf;})wfM!`nKE2BaG9OLR%_r>{9w;*84Arni}kU4Bw@$epn;Bx?Ho-n%dgemFLEd z0bTh|@&Ux5vq}21sDb^RV#g&uI3VNPP-AL5@p{l7}cTM>CG#%{p=UrYQj( z*RHju9xYeSDtd2DN-a#rIu07_k#SsO=&( z?pNEp7ewMB>DsM}ripuQFS4fPfYJyRwp(z<370G-3*%tSf`bq~&-YScz@b2!zet>FOSB`Aod%Ve$O4m_iXSTBRW?s!`Jz`O4Y?qC`y4dY zNJ5}V3|Nz2=96C{f+afHL&sGlNC6$4GZ5XxfpkrUesq!tTrP@S4xuj5c`bYJIgME*)#xy+@);J7x_ohUE>@FWV(%U4V_j*~ zJRi;FA`J3IQC}Ofa7+X>IQd&kMfZkO?P#;uT9>6AT_im7Mu`I}B4Q@FO4~v%VjhId z^BtWadg_Ygq_N3VC-dw6+pkT3=U@B!1NTJtO%Nyh_6wrLHQqg#Z@>8p*%fB3RjP$K z-<$(~=sU%-Gh2Om;G7_u$6auA4AImWJszO63e&9nAV{OM#7QX|D?73^sg9&hocxV* z(q+s{Xsb>W?{65c9XSWxWb-3~s^-WRsOC1SO>IsQ@jW-*5vk(GkpO)k?Cv+y%m?=*m z>1h^!^>NX?JZ;Qt#3<0g1Jhv4$@<|8AY@ad~y0wVgSLpmp(YPX;zixVEmjA$i zB>Qc~T7q%}!l_PE!pTpji{84i!nYzj$t|Cu07Zew)-T%0F`{y1cKXtPIk5-P*ss3~ z(3pMIRQ{D%xhie4d=98IHi(^Gkf+T9#r^eUDej+FW#73$lJtxD>vA=*k;OL1$4Y*< zbcMrXjtwtR*$)?{a9Ck&I2ed~<&wC1Z?bse?qSyST4`6>Mzr5|yZFw1`ba0_Z$vHD z7U^sJu=k9t^24aKe<($YMj!)Uo)0+#&$;T>xWzt|7wn?TAiBl%Y$IpNK@F!mK{+Y z22SDLsO{UroLrsF*NfiOfwASe`J#PoLelY9Ar^wb@#DB75FbB=I~FO&4~nXL z=ia$qdRV{ekDHyrWb0lFRQ+*z?m~|0Wb38*{Mv0$Lc(P0bA#H|!DLwj&6R8ou+f9o z^kBoJ1{o!5?K`TQN+(+@y$0f7nYLCw$wV1OS^JJCyFV>`H6{n8WE_yl$J&D}3s;Cg z-#;y8=_T@qzRiK5Sj^wGa{jJOOW)=fOV&x>35X?a$E2oTDls(u(gZ`(FO4%a{n8lG zv-WoWcyKgxJ@D}Ibor=-_E^TAwG(^i`(~*nr~Yp)Ibq$-RsKW3i2rA&1f9{C9StNl zM1ghdw}@TqDw5Ls9vo3MB#fss2Pgk|x#(S&K$(zs=4tB_@#0I{Pm%&s+q03vwLXuZ zLzul;{1GIt4;cUKhEOMKJSa9lm^vk`6s8JDr}Pxw$&bB7^~OY~lc9k8&wsF@=Ru13 z!Tq<6L;s`1Hy?_pApFoh97j0;X?}atM)%!El&a(ZO;uw8bymhgryFa@pMKnLyNMJwHU!#j_d=<+i4Tv^c8^15E)u>UGi!~Q$-dja)bD*5w64Cp} zZPpBR?oVqv96EPEDlkZ}oeK@Y zuJ$+Cc>UK1l`)jM4sI}ny5$35dnCa+RvuwU87d#S$<&P4Ge9!}Muld^=JyLwRw%Y? zigqm8V+LuZd^-6dws>$nw$jND(D99tWz>@d(bZfqemjLyddtJKmz@HeGXq>)%%sja?qi z|M&$eE54_;Uz1d@?Z&~S*;Xzojg7)73=Em+<`Pl)*n$k%iOIwi?x-Jmr)YmHq2OQ1 z@*+(+lMTt@Zdo+AEG^SP2@fADH)cu$r}}rx`!D!&f~;o>D7hNe#V zw?S02ctqGWBi&EX4$ai^DWzrG;Bq}dr^9xWzB$if@HBL`m)e+55R5(M6U#vRb>oOG z8|J4H(NbU&UE|}0YxAAfu`cRI`fvB<8wPG}+Mik>4s02reK#^FP~%}&W2JIb*~Z5PO;L*R|90?JM%(v+DEm&TcEd5T_&XWy zv1`zs?jKi;1hwxg|BWrgoM{fz5Od%Cq%zE}txmp=oR`$sHUzJOee=&a{vh9^IT}?e za;sy+u&s%?vx4TLJQ0&!2F%6pj1g5^(`aSC^?K`A>Dx;6*N9<{>-^wACEqK4{CHW= zes1~mv@)n9ag7{YGoL)he>;TX456Cm=LD(73^k{m{Q0oHp_-w_R$ZWNK0Y9kZ{97s zznh0$WY@LX;)(kF$n&Oxv5UW19C%`cwt0Zd1UxONrUrdaOIEgI4Cx3z_*m>~NnMax zJ@Cv_)%m}8hIgLJZ3te0$NR;BN7X-wq_ZxOzb!^vSSQN1Rai5N`vzcdlxZ%@cw{RL zZ5;1m=X%5LzWHvv%eYrWZBOInB4t)mf&V`8(UIg5q)vL?i%FZK4oE|d1JX^OE7j#$ zGmW^ykS)8nui)E)oghGMMyxXD4<0fNskXM&B6G)#f(5Ut^nw+ndBU4{8NL%gaN4wS z(b$ToIy)vh#@U*uL2jB|l?eIE@vx*GFJg|v=@&Y8^6ycQGP07I6?j}=9A9jlK-vgc zcWw+5ZP%u1%@;7}Eb+sgRn~E}roOj7xq{aX9CL%X{NyygTe!TV#5`|2T+QXp^0}O>2v*-XyIxOxRvb2%0YiPrr(Rm}gwUQOSJJf^aZymyDt>gBY zgT`j|MzQ{>1b9y10$8*^<>t=>S5`m$aQ|W@aORwUdgz(6>waNt%_wl1yLvihrNn}0 zH|~VAtqZmdcqF}R99&?=lyR4v-Aq?5kW!ARTG{{?n0dpx4NKt$eTSglV?(;ZgE;b; zm6YH=DIOeWP72X`M}qcXn4AOm+@2{8JTp8YtJuk(RKYl_&pp(`$T1@K*@Ov?qrFZ8 zu)DI>fO-rKg2FLgrrc}{%U+5?_aryX8-zu^IW`&@Rwm7pyVkD*@;2Jz|oh0Gw+cbOPb*a z_9W)+Ax)~W(Q=U%GNm-Wz~j98vF6>g#G2h7T0J;K-TVE7jQeB3ArTxBmGK5S2dHgu zPj<^UP2jHCRi$a%78t}^<{-3Y7P^?j7;SbnXmWyR#wi+FcbI%igJ|Rn-r)13A0Int z-0RGRmXkkmPBEgbjmfAikkJ#E4A)K{!cPphWrO)ii(J6jS+;q6kF$d(KK7)g_PtWx z87^U5fA?(ZMuZfl)1&;0R zJ)&pd!+m3G?HgOq3lF4IB>DPb1xZu+V)E#8B@D-+V4yH`biZ<(So|aGb_Y?wiq8f} zxZ)K^c#Yi4XCLho&v^S{jM%b&q_$#Ka4HBA3lD{p9(!jP(#+0*Xik50yI~-6?v1oXwXF=&xbA(O++0f9(gB z1ZU|-zWVoj+LSKZ9?8<~{Cq%HcfN*=ZjqQcZJdZY7-P+e>g$qTOK}~Xipda^atBdq z^Ep3R0!`iclZpI;0Sn^#W7uXV#|EwP>L15R+jZiaL!+!YQg?E0ksxh{rexI9+%gX~ zhMHS6{GlxrLP-cYdIs{IqX{u3eqLRY zFS=f`i{fK=@4j19A4}C98Z8=+CAf1=4I#)#V?F#(F1BBIkB7HIyHS$Ar@|@!%8EZI z-*=INZtWYG+%OrNPGyZU6cb@S_TXt7P1DZvP{Xfgn zDjLM;pJmYP%Fm{ZuUPKn>zn&_M6eRhieyYNnE>ua2VAthiKpxM1FV*x$CWzv<6yTE zxg?YNEVMah!cKjEVPH6kd?$(=1nI~z)6kQ+?W{voo(Qe<<4(PCJIlFJPFh(8tr#x_ zSa7(C(XM+dNV@KMzN>GEuCt}W^->J9U^LG)lZ5f>8+yeCA=bVT2yz z@(mOw*A^^{lRt25Ah-WMCS1Rmdz0hrU~G!Ia!X+`Wcr#_<||G_N9J&!_?z5{ZJ2!n zwqg&A9)$Ji?JqC5$k!h2!!N>^2X=ZecJx(cLw7hU3Z*ELsP$xbM|q7V~^xyc#Ic)gjom55i8a zP>Eg{uUqsSpF5+74Z-5XKo<87;>>?P79dek=n(AA48pE3cz~k!m)T-sPpl~Wbz}n0 z8}JIboT-JjTxm)>s}K`!D34ct=oB+S1IvH@xM=(J)I_doRIBlFaMa3;Q}fcl>D9IU^!R~qK|1E>vbE7!> z8)UFrBZJi%8Eml;-0yA<%wTs<4$5G)Mh27VTxHjsz6@4m+5T!8fA!zWU#rY~@^#zgBH2HS(d0Y}91ruOdr-ZknO;*UHy}@|P4qI?0wk z8hYJB<*!w_GJh4x^$lL!3d&zI2FYJDkiS;q1P1wQhLOK;qx>}k`D0;||r)ap@ewrZO z`z`)>yjbL%nrmJD75e0b3}Dl#d6DuA#O@hiDY{QR9T`SA3H5Y8>`V>{nx#wI_}yg z`#01v*LoK{Gcq*Led;OeoxA%$Qpi$z&j+i>@mHOE>2X;OP{`6%s?JX#OX-R5APQMJ zUDXFEWNEId4^qg|*dY{B|0Npy+X`9yMrvIB=fS=sw!Tp@BM;`QUq2W#JIgCBx6zu% za6wE}2HK#E4aG*iS*9E5p3yrHSWvKoGE`UoHfFZ6lr7ImeHhcZNSzGNXz<&?bB_;A z`5k+L#Y7nW?0?SArr3=fgxylCiZVsln@Jjcrse&3(Q_n@inNocJ{RxC-^_3)3tgn* z25g^K@8nC=WXSU<$HyT`9c_&D8fJIM=On!DOaJg`q`xBCEP=*0NzuGD2o1fm0-Cl2 z(73VWGG2NxcM^&by$R++qO*N1-Lj$-gSTyxAMeb*Htqou zNrC8j0R(DG@M~nGr9no4m7T7H>D#&l3k@3c&jn>7Hnl-p;68PLC{!_$aoZ&Frz!8J zkpX!y8WLXdkxK=WMs&TMEDpSFjZlLCJg%?&(c9(5pP&}e->{i4j2j70?$?UsA7zRl!c6bk4mlaoa*q{%{XS=ZF3T)+NL>`)`i2dT?N9Uc%xy-?~(tHc%?bm6ZU zbe5F3zyLzSh{(wjRznk9q`a3Ys^8ZS?K-oZ&s{7hg0W&^ z^yiOJ#!OpGuTqftX$H4B`8PkFY-k4QHE+L}T|jR!7DL~BTvWaL1M$7l*pVlOx-n{b z5;D*C;Yd;y8e7apU^WhT`Ig!AR(aY%Oxvkr9FiuQOtDEsfc+*$CeQPTraPF%$#40< zj~5NV0-DjpCZ)LA#$GYuhT_TPqFg2{6-*l&hz~V=Y&0zw9j6_ZLD~Cd~E4F-}%pj*77uB zVzw1+!bpeEpV`3LMCUKxNH;ne9ypbpi3r)&? zVG39I2?NhQy~u=}%)W@mkYHOluvyd|(f-HOiu~R{{a#OhPiyLT!#v-c&4zy8lpCI= zKK*`jD{z-Y)cK^C36dOBA9MQpFj0K|DaQo6a#48h!dt;ng{8BR7*QfzZxvckAUP?y z1HQ2RLV|W-7JU_^`ofZ=303{=tJfQC&K{rVd*dB(>cSgI6B-m6$641s4s_H!-yi1B z^Syq&FN##-vn`k5$P+eMMfRV+q5ToZ`+rUi|I=6Gs=_lmjV1(K(C5SH7ru@1=l=|! zu-VDye_jp9q92gL##id#hdB~`ppI4}K78}+(q_)E6P`%4*Lb*SMl-ca7O z{nO>~1*Tw7#q0~zRZE(9?9-Jo1)G(`gjl-07iX$(Mjh(vU2fHmom)frnwC`;%Qd%S+Mu z$Xz;5sOmU8n%~6TU!3v%^UAuw>x+E`{KYQZovM5?kY+%ei@;la|NP?0*V6^Ha}Ve| zh~R%0UmGl(JE)=|2oBQBza?Da*YL;*!i^5<;ESV*ptPecg-;4gDoyeEN-qaqlkHK+j`5K?Ey!ij`Dg%!)teeWV;@X94FRpf6ow!coI*qFb*GIUnps!F|I<6F7 zgs(gYg*6>1WBETr+$%x7vL)yWt_z0$6@4&%XgI>?{A5R4Huq@W{PFyg`Ez15AY(YSu^^!eU~UgZVd_Q5Dq z9l@ueE%SQ2i{F(TG8OVQ;EMA7^IiHRB@EZKANL(T->YS~!)V=&SVO`{uW!X2Lc9Sy z&-eMxtigS=&-Xzh?(Mjr!Tp5K_u&rQA?P289-aS*d0QPkBjFursRproF|fUo$~ZGz0ZK;Pq6w+nJ#@m3b|jF^IbIxo0reje1@Sj^Mhy&#Q7 zz$4b7I^z(Sh3PEJhI_cqv^LyfbN&eK*h7#wOn%W2_Yi#2(T+QPq;fCr@wg&zjnY{} z6_s%>#@zxu@y8e8Skyf}-#>L0ei?TkvF0fBqGGQ%y@XE`x)xcb^BlUWan<0e#kClh z3s(cKMqKM~HR0NXYb&lDxLR?w;UZBOVtP7#=+xUfm=@e$9P_)p2LV7$Jc#1EU+hd+&>ZtcUW_AwO-?`BtA&P3s!xt8fYQO#erh91>4*Be^wx2NtL~ z_=0U)kc-86|K{Se!VSE)qK@AcJ`&${9=XH&qdI=pEI+=4zZyOgJQAwCi|^nQ!;QtR zciSEOn(&c5sJD6Fy@TV+vsFaX5m(O};8sO+1eB!rx5+GBhT*Vy5XBj4inT;r!ZlDF_0O@k+_{tizI)nL8t zPw>TDi)9_XEqoygogLR~Ct~R61;OWrXz@F|pFhdJ)JEoX^m=(b*GBI0hVSN;kjCrW z&8I*Z@21^+63Nm@cQm+6^`Nsq1sH4ihNt+=OL&>L>ncx+Y=gJas!Y3cQzCJcyh@#xJ@ z{*$MMBby?ldNcpYGpq?`Q9g@5>Z*-tG-g+uK${2T)dAG{)CX_dM52I{#>_Qnyg{63V zeCXS881Uhpp<0F&i5o?X<)fW;Ej7F(MPh0+yaRf8XA|B2uyZeN#edj&3b(pjcV5Qr z-p9Nt9QP*^y))_Vt@W;?`*V}LJLvxD6mKWpzxclQyuAO!8>MOEBDilcK3MJXmTFo? z_(*7Dgv0C7w42>+5RT!a*D`>sWe36Zk#Vdwq)7-4S1{}%>1mk(yj)%o-lAYwN8)Lz z0lWn!lCWI1BJ{&f5~igLrmS18dx$}lQ9+iH1oW|S5Wrdn9HZbJ3LY+DO@4iy+Up8- zDm=vuoLm)FD;U98!ZivuKHhx?Rw$|>-XMS}@dHEk32FN3w}k1F>tHC&NqG8NIKhYM z4mi<(<${c0`f@t(B`My-Q0;eaLr{bi5|ma(Qc%Do=tNUcz$9oHB}v>Vd6K5C2Ok^m z9C-Q~dmZ3R+$pURe2-3RMEn%}w*ja4!B6TT%v$el2-8w$6wV|B8j>IgZH02cfJvjj z3=-sb6orUhF+LBt&3iITTM$>0k7^|VUj~74I b818m#r3PRKjcFsmu##Z>(4m$Y z1b+jtv;gQ~0j*MJFTw@*8mIvy*RF$xyU~`?1vIST!}*4VY|=s+MsBRy;xtMBfF8mA z0318-?TpZpGTwk=hB_6qAL{HEXMo$R;Fpm>PkXOKXldz}(dR`~{U@D`J^`{`1^-oN zFIl{$7A-Z-SOFS+g=ENV-eA$v+%)8TgFNJVo!toIh3-@E?a)~j@SzHZ$n9XSRVsL+ z&ia5cPSPeVm zL!H%c@)Ll*yl)3yhmPS*AzxuR23xTlqr*^LXG@?)tx3UYIy->@bC-fA=x)~4*xy0u zbe+B3{0mpb+)|)g3t67`#;bKQzi;?7fL$(gAVZvL-y7yQRp&Ug;u@iuK-pOhb_g< zEgrDR@NS*`2yT!6e?g8o3_fuLu<27_yWvBffC(Q3{@>Ht#!6`Hj6v@Xdy$azLj`_e zFUuSLQSciW0hz$;@JtZ?5(LWk!~Y#VPzrdTF@SJP-WLFBXN?ZSN9e4WGX%0r!G{1Vm^Jzf)(cpn*{3wBf7i zfRGr#GYQ`W`k4SLK|c~-Tnc|oXSVYQl)|LA7fhi*)aS! zIR7y1ub zsR-WHSrna~6r4_)#0nod35|s`D14629$kaxA1QdM z&aPPrjm%W=Y~-3VQj-UH$aKM(b>68`!B44olZrbUxs%M*Cq7oy8sneVc-3=*(S$2BuRCyG~~h zLq)t-5g^^Bb)kU?H)5V+gsfQMJvyTU9Il*r*i#7Q4d{@TrWougjPDwNYi-GdG=B2&VsW|ZX*0^t`WboNUN3MPa9 zK%D3Ttfp1eajZ(K0FwYvLe%dtEsFtmsR5lc&Y3J*4X2HA|A`)3fj~J;6w>GGHo(ee z(eb)A!%wBr+3@mHz$+h#{s!QgfR#Ye*P<+chQQH_g5YJ~e-?GBy*nBo5kymRmp|3vF__>mDwK_*Up9|t75yoledq$- zF8R4x^cggu4$KBUI_tUu*c{PiM5=tiIfei+9BaT92zW)o!*upDnk6dG#2^y-|EEte z>A=aKAz)0A&boJ?LTVWEKc*Vfh-{=Z5EB&nV%8eX%}5sm4NZtb-9;t9lb98mfYq#s zc?SGwnwk6#!l_+=)qrAttu(~23vho10p0*o{*;905$QIgqEdB$*#G;zfOi=1@JKiz zG{E*MI1Ns?25^;v%izQ|z)GXT=jv?zVNBEW3V%D|3`|G@x@nm_9Lwkf@Bwr0G<+Q- zJnzTgF_h&G4DcI{5q9V(s1Xjw2*)DQMVwR}z~-LCejRp09mu|E#RqzcM zP>&z~2Av%W1-}}%BEX1eW13NZ_Q53j2E_hN0M!Wf?S!Kr=<(CBB1&w+2-S%6pU7(b zqwpt@Y{*AkfT3X>q5bW>fR&HvA7UEr2kbVc0n@+K*>kNJLA}u+7Sb6%gJJAQ>|8QY zvr^%0I@<~#(OMK-ptF1Hp+My$v6B(lU;<|HL#!`2jqIsHaV+wGTrK7Q6N{Usk zy$Ze$DkGSj2%$H2z0Pici8SSuu^!;zRHnvazlChq15jnh*e7&$6azBXkg=^g`#v-h zVhW5cb?FK8ua&6|e+rxL0E0CO?$X)vO;B;8f?owr{s7|_`yqTL1qJ2hvAwby{}}i< zT2)`|$H&F%EF~TS>^JzurO~-B<^L;&6U9x?@qeCxpUPfwaM7Qy1m2?>Ow*YYBQOPu zg9`u8dEhe@9EGi|;5M zt=-L|i%VH!-F^2htuH8c6m}d+(uQl^Kc{Ffcbpib9oD>FoAz<6@t@;WR$f~*XT~+R zI|}UHN7A*69UC&VV(wisR*UzZ8>=1aXv@@WS_B?NU%%|G25()iHmaj5OH1S7sH$3e Sr&05Mwicpwe3`4gul-*UCVF=O diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/feb_debug b/slsDetectorSoftware/eigerDetectorServer/bin/feb_debug index aa7007eb39a4a7a168bdbb7ba54ec6e92abbfced..026d21127e52065da52fc76442d9b7e4da1f7bd8 100755 GIT binary patch delta 44041 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 U0VX5*!Q06G*WVtxpr3v4|L(rep#T5? delta 42656 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 R=#I_O*jjwwe*xQT@+trT diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 5b1e1f03f..e876cc6a1 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -71,8 +71,11 @@ int initDetector(){ */ //get dac values - for(i=0;i<(detectorModules)->ndac;i++) - (detectorModules)->dacs[i] = setDAC((enum detDacIndex)i,-1,(detectorModules)->module); + int retval[2]; + for(i=0;i<(detectorModules)->ndac;i++){ + setDAC((enum detDacIndex)i,-1,(detectorModules)->module,0,retval); + (detectorModules)->dacs[i] = retval[0]; + } /* initialize dynamic range etc. */ @@ -88,6 +91,8 @@ int initDetector(){ setHighVolage(150,0); setIODelay(675,0); setTiming(AUTO_TIMING); + int enable[2] = {0,1}; + setExternalGating(enable);//disable external gating return 1; } @@ -214,19 +219,26 @@ int detectorTest( enum digitalTestMode arg){ -int setDAC(enum detDacIndex ind, int val, int imod){ +void setDAC(enum detDacIndex ind, int val, int imod, int mV, int retval[]){ char iname[10]; strcpy(iname,EigerGetDACName((int)ind)); -//#ifdef VERBOSE +#ifdef VERBOSE if(val >= 0) - printf("Setting dac %d: %s to %d mV\n",ind, iname,val); + printf("Setting dac %d: %s to %d ",ind, iname,val); else - printf("Getting dac %d: %s\n",ind, iname); -//#endif + printf("Getting dac %d: %s ",ind, iname); + if(mV) + printf("in mV\n"); + else + printf("in dac units\n"); +#endif if(val >= 0) - EigerSetDAC(iname,val); + EigerSetDAC(iname,val,mV); + retval[0] = EigerGetDAC(iname); + retval[1] = EigerGetDACmV(iname); + + (detectorModules)->dacs[ind] = retval[0]; - return EigerGetDAC(iname); } @@ -260,7 +272,6 @@ int enableTenGigabitEthernet(int val){ SetTenGigbaBitEthernet(1); else SetTenGigbaBitEthernet(0); - SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); //configuremac called from client } return GetTenGigbaBitEthernet(); @@ -268,12 +279,13 @@ int enableTenGigabitEthernet(int val){ int setModule(sls_detector_module myMod){ + int retval[2]; #ifdef VERBOSE printf("Setting module with settings %d\n",myMod.reg); #endif int i; for(i=0;i=0) + EigerSetExternalGating(enable[0], enable[1]);//enable = 0 or 1, polarity = 0 or 1 , where 1 is positive + enable[0] = EigerGetExternalGatingPolarity(); + enable[1] = EigerGetExternalGating(); +} + enum masterFlags setMaster(enum masterFlags arg){ return NO_MASTER; diff --git a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c index d05db2a71..577b740a1 100755 --- a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c +++ b/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c @@ -500,47 +500,6 @@ int program_one_dac(int addr, int value, int imod) { -int set_one_dac(int imod) { - int control, ibit; - int bit, value; - control=13; - value=(DAC_REFOUT<<10) | (control<< 12); -#ifdef DEBUGOUT - fprintf(stdout,"value=%d\n",value); -#endif - for (ibit=0; ibit<6; ibit++) { - bit=value & (1<<(15-ibit)); - if (bit) { - putout("0000010001000000",imod); - putout("0000011001000000",imod); - putout("0000010001000000",imod); -#ifdef DEBUGOUT - fprintf(stdout,"1"); -#endif - } else { - putout("0000000001000000",imod); - putout("0000001001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUGOUT - fprintf(stdout,"0"); -#endif - } - } - for (ibit=0; ibit<10; ibit++) { - putout("0000000001000000",imod); - putout("0000001001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUGOUT - fprintf(stdout,"0"); -#endif - } - -#ifdef DEBUGOUT - fprintf(stdout,"\n"); -#endif - return OK; -} - int initDACbyIndex(int ind,int val, int imod) { int v; const int partref[NDAC]=PARTREF; @@ -550,15 +509,16 @@ int initDACbyIndex(int ind,int val, int imod) { int ref=partref[ind]; int r1=partr1[ind]; int r2=partr2[ind]; + int retval[2]; v=(val+(val-ref)*r1/r2)*DAC_DR/DAC_MAX; - v=initDACbyIndexDACU(ind,v,imod); + v=initDACbyIndexDACU(ind,v,imod,0,retval); return (v*DAC_MAX/DAC_DR+ref*r1/r2)/(1+r1/r2); } -int initDACbyIndexDACU(int ind, int val, int imod) { +int initDACbyIndexDACU(int ind, int val, int imod, int mV, int retval[]) { // const double daccs[NDAC]=DACCS; // const double dacaddr[NDAC]=DACADDR; @@ -567,6 +527,8 @@ int initDACbyIndexDACU(int ind, int val, int imod) { // int addr=dacaddr[ind]; // int iv; int im; + if(mV) + val = (val*4096)/2500; if (val>=0) initDAC(ind,val, imod); @@ -597,123 +559,12 @@ int initDACbyIndexDACU(int ind, int val, int imod) { #ifdef VERBOSE printf("returning %d\n",setDACRegister(ind, -1, 0)); #endif - return setDACRegister(ind, -1, 0); + retval[0] = setDACRegister(ind, -1, 0); + retval[1] = (retval[0]*2500)/4096; + return retval[0]; } } -int getThresholdEnergy() { - double g[3]=DEFAULTGAIN; - double o[3]=DEFAULTOFFSET; - double myg=-1, myo=-1; - // int dacu; - int imod; - int ethr=-1; - int ret=FAIL; - - if (detectorModules) { - // for (imod=0; imodgain,(detectorModules+imod)->offset); -#endif - if ((detectorModules+imod)->gain>0) - myg=(detectorModules+imod)->gain; - else { - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - // else - //myg=-1; - } - - if ((detectorModules+imod)->offset>0) - myo=(detectorModules+imod)->offset; - else { - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - // else - //myo=-1; - } - - if (myg>0 && myo>0) { - //ethr=(myo-detectorDacs[VTHRESH+imod*NDAC])*1000/myg; - - ethr=(myo-setDACRegister(VREF_DS,-1,imod))*1000/myg;//edited by dhanya - // else - // ethr=-1; - - } -#ifdef VERBOSE - //printf("module=%d gain=%f, offset=%f, dacu=%f\n",imod, myg, myo, detectorDacs[VTHRESH+imod*NDAC]); - printf("module=%d gain=%f, offset=%f, dacu=%d\n",imod, myg, myo,(int)(setDACRegister(VREF_DS,-1,imod)));//edited by dhanya - printf("Threshold energy of module %d is %d eV\n", imod, ethr); -#endif - - if (imod==0) - ret=ethr; - else { - if (ethr>(ret+100) || ethr<(ret-100)) - return FAIL; - } - } - } - return ret; -} - -int setThresholdEnergy(int ethr) { - double g[3]=DEFAULTGAIN; - double o[3]=DEFAULTOFFSET; - double myg=-1, myo=-1; - int dacu; - int imod; - int ret=ethr; - - setSettings(GET_SETTINGS,-1);//-1 added by dhanya - if (thisSettings>=0 || thisSettings<3){ - myg=g[thisSettings]; - myo=o[thisSettings]; - } - for (imod=0; imodgain>0) - myg=(detectorModules+imod)->gain; - else - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - else - myg=-1; - if ((detectorModules+imod)->offset>0) - myo=(detectorModules+imod)->offset; - else - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - else - myo=-1; - } else { - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - else - myo=-1; - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - else - myg=-1; - } - if (myg>0 && myo>0) { - dacu=myo-myg*((double)ethr)/1000.; -#ifdef VERBOSE - printf("module %d (%x): gain %f, off %f, energy %d eV, dac %d\n",imod,(unsigned int)((detectorModules+imod)),(detectorModules+imod)->gain,(detectorModules+imod)->offset, ethr,dacu); -#endif - } else { - dacu=ethr; -#ifdef VERBOSE - printf("could not set threshold energy for module %d, settings %d (offset is %f; gain is %f)\n",imod,thisSettings,myo,myg); -#endif - } - initDACbyIndexDACU(VREF_DS, dacu, imod); ///needs to be fixed dhanya - } - return ret; -} - int getDACbyIndexDACU(int ind, int imod) { diff --git a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.h b/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.h index d03c9db10..2e04bd713 100755 --- a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.h +++ b/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.h @@ -109,10 +109,8 @@ int initDAC(int dac_addr, int value,int imod ); int initDACs(int* v,int imod ); int setSettings(int i,int imod); int initDACbyIndex(int ind,int val, int imod); -int initDACbyIndexDACU(int ind,int val, int imod); +int initDACbyIndexDACU(int ind,int val, int imod, int mV, int retval[]); int getDACbyIndexDACU(int ind, int imod); -int getThresholdEnergy(); -int setThresholdEnergy(int ethr); /* Other DAC index routines*/ int getTemperatureByModule(int tempSensor, int imod); diff --git a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c index 190d91627..8a44510d9 100755 --- a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c +++ b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c @@ -891,13 +891,15 @@ int read_register(int file_des) { int set_dac(int file_des) { //default:all mods - int retval; + int retval[2];retval[1]=-1; + int temp; int ret=OK; - int arg[2]; + int arg[3]; enum dacIndex ind; int imod; int n; int val; + int mV; int idac=0; sprintf(mess,"Can't set DAC\n"); @@ -909,6 +911,7 @@ int set_dac(int file_des) { } ind=arg[0]; imod=arg[1]; + mV=arg[2]; n = receiveDataOnly(file_des,&val,sizeof(val)); if (n < 0) { @@ -967,33 +970,37 @@ int set_dac(int file_des) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); } else{ - if(idac==HIGH_VOLTAGE) - retval=initHighVoltageByModule(val,imod); - else - retval=initDACbyIndexDACU(idac,val,imod); + if(idac==HIGH_VOLTAGE){ + retval[0]=initHighVoltageByModule(val,imod); + ret=FAIL; + if(retval[0]==-2) + strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); + else if(retval[0]==-3) + strcpy(mess,"Weird value read back or it has not been set yet\n"); + else + ret=OK; + }else{ + initDACbyIndexDACU(idac,val,imod,mV,retval); + ret=FAIL; + if(mV) + temp = retval[1]; + else + temp = retval[0]; + if ((abs(temp-val)<=3) || val==-1) { + ret=OK; +#ifdef VERBOSE + printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); +#endif + } + } } } - if(ret==OK){ - ret=FAIL; - if(idac==HIGH_VOLTAGE){ - if(retval==-2) - strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); - else if(retval==-3) - strcpy(mess,"Weird value read back or it has not been set yet\n"); - else - ret=OK; - }//since v r saving only msb - else if ((retval-val)<=3 || val==-1) - ret=OK; - } + #endif -#ifdef VERBOSE - printf("DAC set to %d V\n", retval); -#endif if(ret==FAIL) - printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, retval); + printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, temp); else{ if (differentClients) ret=FORCE_UPDATE; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 3c66ae67a..6c8275b64 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -2690,7 +2690,7 @@ int multiSlsDetector::getAngularConversion(int &direction, angleConversionCons -dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int imod) { +dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { dacs_t ret, ret1=-100; int id=-1, im=-1; @@ -2703,7 +2703,7 @@ dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int imod) { for (int idet=dmi; idetsetDAC(val, idac, im); + ret=detectors[idet]->setDAC(val, idac, mV, im); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<actionMask=0; + thisDetector->tenGigaEnable=0; for (int ia=0; iaactionScript[ia],"none"); @@ -2000,16 +2001,17 @@ int slsDetector::readRegister(int addr){ }{}; */ -dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int imod){ +dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int mV, int imod){ - dacs_t retval; + dacs_t retval[2]; int fnum=F_SET_DAC; int ret=FAIL; char mess[100]; - int arg[2]; + int arg[3]; arg[0]=index; arg[1]=imod; + arg[2]=mV; #ifdef VERBOSE std::cout<< std::endl; @@ -2022,16 +2024,16 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int imod){ controlSocket->SendDataOnly(&val,sizeof(val)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret!=FAIL) { - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + controlSocket->ReceiveDataOnly(retval,sizeof(retval)); if (index < thisDetector->nDacs){ if (dacs) { if (imod>=0) { - *(dacs+index+imod*thisDetector->nDacs)=retval; + *(dacs+index+imod*thisDetector->nDacs)=retval[0]; } else { for (imod=0; imodnModsMax; imod++) - *(dacs+index+imod*thisDetector->nDacs)=retval; + *(dacs+index+imod*thisDetector->nDacs)=retval[0]; } } } @@ -2046,12 +2048,15 @@ dacs_t slsDetector::setDAC(dacs_t val, dacIndex index, int imod){ } } #ifdef VERBOSE - std::cout<< "Dac set to "<< retval << std::endl; + std::cout<< "Dac set to "<< retval[0] << " dac units (" << retval[1] << "mV)" << std::endl; #endif if (ret==FAIL) { std::cout<< "Set dac failed " << std::endl; } - return retval; + if(mV) + return retval[1]; + + return retval[0]; }; @@ -4930,6 +4935,7 @@ char* slsDetector::setReceiver(string receiverIP){ std::cout << "frame period:" << thisDetector->timerValue[FRAME_PERIOD] << endl; std::cout << "frame number:" << thisDetector->timerValue[FRAME_NUMBER] << endl; std::cout << "dynamic range:" << thisDetector->dynamicRange << endl << endl; + std::cout << "10GbE:" << thisDetector->tenGigaEnable << endl << endl; /** enable compresison, */ #endif if(setDetectorType()!= GENERIC){ @@ -4950,6 +4956,8 @@ char* slsDetector::setReceiver(string receiverIP){ setDynamicRange(thisDetector->dynamicRange); //set scan tag setUDPConnection(); + if(thisDetector->myDetectorType == EIGER) + enableTenGigabitEthernet(thisDetector->tenGigaEnable); } } @@ -6707,20 +6715,22 @@ int slsDetector::enableTenGigabitEthernet(int i){ 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)); - } + if(configureMAC() != FAIL){ + 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(fnum2,retval,i); + if(ret==FAIL) + setErrorMask((getErrorMask())|(RECEIVER_TEN_GIGA)); + } + } } + if(ret != FAIL) + thisDetector->tenGigaEnable=retval; return retval; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 662d9ab14..e1aecef1d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -251,6 +251,9 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** online flag - is set if the receiver is connected, unset if socket connection is not possible */ int receiverOnlineFlag; + /** 10 Gbe enable*/ + int tenGigaEnable; + } sharedSlsDetector; @@ -779,10 +782,11 @@ class slsDetector : public slsDetectorUtils, public energyConversion { set dacs value \param val value (in V) \param index DAC index + \param mV 0 in dac units or 1 in mV \param imod module number (if -1 alla modules) \returns current DAC value */ - dacs_t setDAC(dacs_t val, dacIndex index, int imod=-1); + dacs_t setDAC(dacs_t val, dacIndex index , int mV, int imod=-1); /** set dacs value diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp index a161765e0..e0da124cc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp @@ -423,7 +423,7 @@ int slsDetectorActions::executeScan(int level, int istep) { setThresholdEnergy((int)currentScanVariable[level]); //energy scan break; case thresholdScan: - setDAC((dacs_t)currentScanVariable[level],THRESHOLD); // threshold scan + setDAC((dacs_t)currentScanVariable[level],THRESHOLD,0); // threshold scan break; case trimbitsScan: trimbit=(int)currentScanVariable[level]; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.h b/slsDetectorSoftware/slsDetector/slsDetectorActions.h index 75f1a9612..ce27b578b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.h @@ -188,13 +188,14 @@ class slsDetectorActions : public virtual slsDetectorBase /** - set dacs value - \param val value (in V) - \param index DAC index - \param imod module number (if -1 alla modules) - \returns current DAC value + set dacs value + \param val value (in V) + \param index DAC index + \param mV 0 in dac units or 1 in mV + \param imod module number (if -1 alla modules) + \returns current DAC value */ - virtual dacs_t setDAC(dacs_t val, dacIndex index , int imod=-1)=0; + virtual dacs_t setDAC(dacs_t val, dacIndex index , int mV, int imod=-1)=0; virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS)=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 879b5cd3b..ea37f8a1c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3229,10 +3229,12 @@ string slsDetectorCommand::cmdDAC(int narg, char *args[], int action) { if (action==HELP_ACTION) return helpDAC(narg, args, action); - + dacIndex dac; dacs_t val=-1; char answer[1000]; + int mode=0; + if (cmd=="vthreshold") dac=THRESHOLD; else if (cmd=="vcalibration") @@ -3327,23 +3329,30 @@ string slsDetectorCommand::cmdDAC(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); if (action==PUT_ACTION) { + + if(narg > 2) + if(!strcasecmp(args[2],"mv")) + mode = 1; #ifdef DACS_INT - if (sscanf(args[1],"%d", &val)) + + if (sscanf(args[1],"%d", &val)) #else - if (sscanf(args[1],"%f", &val)) + if (sscanf(args[1],"%f", &val)) #endif ; else return string("cannot scan DAC value ")+string(args[1]); - myDet->setDAC(val,dac); + myDet->setDAC(val,dac,mode); } #ifdef DACS_INT - sprintf(answer,"%d",myDet->setDAC(-1,dac)); + sprintf(answer,"%d",myDet->setDAC(-1,dac,mode)); #else - sprintf(answer,"%f",myDet->setDAC(-1,dac)); + sprintf(answer,"%f",myDet->setDAC(-1,dac,mode)); #endif + if(mode) + strcat(answer,"mV"); return string(answer); } @@ -3414,6 +3423,8 @@ string slsDetectorCommand::helpDAC(int narg, char *args[], int action) { os << "vcn" << "dacu\t sets vcn " << std::endl; os << "vis" << "dacu\t sets vis " << std::endl; + + os << " mv if you want in mV else in dac units " << std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index 788b23878..f64ac7d53 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -237,7 +237,7 @@ void slsDetectorUtils::acquire(int delflag){ aclog->addStep(getCurrentPosition(), getCurrentFileName()); if (eclog) - eclog->addStep(setDAC(-1,THRESHOLD), getCurrentFileName()); + eclog->addStep(setDAC(-1,THRESHOLD,0), getCurrentFileName()); if (*correctionMask&(1<< I0_NORMALIZATION)) { @@ -773,45 +773,118 @@ int slsDetectorUtils::retrieveDetectorSetup(string const fname1, int level){ int slsDetectorUtils::dumpDetectorSetup(string const fname, int level){ slsDetectorCommand *cmd; + string names[100]; + int nvar=0; + + switch (getDetectorsType()) { + case EIGER: + names[nvar++]="fname"; + names[nvar++]="index"; + names[nvar++]="flags"; + names[nvar++]="dr"; + names[nvar++]="settings"; + names[nvar++]="threshold"; + names[nvar++]="exptime"; + names[nvar++]="period"; + names[nvar++]="frames"; + names[nvar++]="cycles"; + names[nvar++]="timing"; + names[nvar++]="fineoff"; + names[nvar++]="startscript"; + names[nvar++]="startscriptpar"; + names[nvar++]="stopscript"; + names[nvar++]="stopscriptpar"; + names[nvar++]="scriptbefore"; + names[nvar++]="scriptbeforepar"; + names[nvar++]="scriptafter"; + names[nvar++]="scriptafterpar"; + names[nvar++]="scan0script"; + names[nvar++]="scan0par"; + names[nvar++]="scan0prec"; + names[nvar++]="scan0steps"; + names[nvar++]="scan1script"; + names[nvar++]="scan1par"; + names[nvar++]="scan1prec"; + names[nvar++]="scan1steps"; + names[nvar++]="ratecorr"; + names[nvar++]="flatfield"; + names[nvar++]="badchannels"; + break; + case GOTTHARD: + names[nvar++]="fname"; + names[nvar++]="index"; + names[nvar++]="flags"; + names[nvar++]="dr"; + names[nvar++]="settings"; + names[nvar++]="exptime"; + names[nvar++]="period"; + names[nvar++]="delay"; + names[nvar++]="gates"; + names[nvar++]="frames"; + names[nvar++]="cycles"; + names[nvar++]="timing"; + names[nvar++]="fineoff"; + names[nvar++]="startscript"; + names[nvar++]="startscriptpar"; + names[nvar++]="stopscript"; + names[nvar++]="stopscriptpar"; + names[nvar++]="scriptbefore"; + names[nvar++]="scriptbeforepar"; + names[nvar++]="scriptafter"; + names[nvar++]="scriptafterpar"; + names[nvar++]="scan0script"; + names[nvar++]="scan0par"; + names[nvar++]="scan0prec"; + names[nvar++]="scan0steps"; + names[nvar++]="scan1script"; + names[nvar++]="scan1par"; + names[nvar++]="scan1prec"; + names[nvar++]="scan1steps"; + names[nvar++]="ratecorr"; + names[nvar++]="flatfield"; + names[nvar++]="badchannels"; + break; + case MYTHEN: + names[nvar++]="fname"; + names[nvar++]="index"; + names[nvar++]="flags"; + names[nvar++]="dr"; + names[nvar++]="settings"; + names[nvar++]="threshold"; + names[nvar++]="exptime"; + names[nvar++]="period"; + names[nvar++]="delay"; + names[nvar++]="gates"; + names[nvar++]="frames"; + names[nvar++]="cycles"; + names[nvar++]="probes"; + names[nvar++]="timing"; + names[nvar++]="fineoff"; + names[nvar++]="startscript"; + names[nvar++]="startscriptpar"; + names[nvar++]="stopscript"; + names[nvar++]="stopscriptpar"; + names[nvar++]="scriptbefore"; + names[nvar++]="scriptbeforepar"; + names[nvar++]="scriptafter"; + names[nvar++]="scriptafterpar"; + names[nvar++]="scan0script"; + names[nvar++]="scan0par"; + names[nvar++]="scan0prec"; + names[nvar++]="scan0steps"; + names[nvar++]="scan1script"; + names[nvar++]="scan1par"; + names[nvar++]="scan1prec"; + names[nvar++]="scan1steps"; + names[nvar++]="ratecorr"; + names[nvar++]="flatfield"; + names[nvar++]="badchannels"; + names[nvar++]="trimbits"; + break; + + } + - string names[]={ - "fname",\ - "index",\ - "flags",\ - "dr",\ - "settings",\ - "threshold",\ - "exptime",\ - "period",\ - "delay",\ - "gates",\ - "frames",\ - "cycles",\ - "probes",\ - "timing",\ - "fineoff",\ - "startscript",\ - "startscriptpar",\ - "stopscript",\ - "stopscriptpar",\ - "scriptbefore",\ - "scriptbeforepar",\ - "scriptafter",\ - "scriptafterpar",\ - "scan0script",\ - "scan0par",\ - "scan0prec",\ - "scan0steps",\ - "scan1script",\ - "scan1par",\ - "scan1prec",\ - "scan1steps",\ - "ratecorr",\ - "flatfield",\ - "badchannels",\ - "trimbits" - }; - int nvar=35; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 1da8cfdba..431c0bfc0 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -496,10 +496,11 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { set dacs value \param val value (in V) \param index DAC index + \param mV 0 in dac units or 1 in mV \param imod module number (if -1 alla modules) \returns current DAC value */ - virtual dacs_t setDAC(dacs_t val, dacIndex index , int imod=-1)=0; + virtual dacs_t setDAC(dacs_t val, dacIndex index , int mV, int imod=-1)=0; /** diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 264d1dd80..824580375 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -34,9 +34,10 @@ int moduleTest( enum digitalTestMode arg, int imod); int detectorTest( enum digitalTestMode arg); -int setDAC(enum detDacIndex ind, int val, int imod); +void setDAC(enum detDacIndex ind, int val, int imod, int mV, int retval[]); int getADC(enum detDacIndex ind, int imod); + #if defined(EIGERD) || defined(GOTTHARD) int setHighVolage(int val, int imod); #endif @@ -125,6 +126,9 @@ enum externalCommunicationMode setTiming( enum externalCommunicationMode arg); enum masterFlags setMaster(enum masterFlags arg); enum synchronizationMode setSynchronization(enum synchronizationMode arg); +#ifdef EIGERD +void setExternalGating(int enable[]); +#endif #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index e5c20f715..9d216c800 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -1043,13 +1043,15 @@ int digital_test(int file_des) { int set_dac(int file_des) { - int retval; + int retval[2];retval[1]=-1; + int temp; int ret=OK,ret1=OK; - int arg[2]; + int arg[3]; enum dacIndex ind; int imod; int n; int val; + int mV; enum detDacIndex idac=0; sprintf(mess,"Can't set DAC\n"); @@ -1062,6 +1064,7 @@ int set_dac(int file_des) { } ind=arg[0]; imod=arg[1]; + mV=arg[2]; n = receiveData(file_des,&val,sizeof(val),INT32); if (n < 0) { @@ -1182,25 +1185,33 @@ int set_dac(int file_des) { sprintf(mess,"Detector locked by %s\n",lastClientIP); } else{ if(ind == HV_POT) - retval = setHighVolage(val,imod); + retval[0] = setHighVolage(val,imod); else if(ind == IO_DELAY) - retval = setIODelay(val,imod); + retval[0] = setIODelay(val,imod); else - retval=setDAC(idac,val,imod); + setDAC(idac,val,imod,mV,retval); } + + + } #endif #ifdef VERBOSE - printf("DAC set to %d V\n", retval); + printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); #endif + if(ret == OK){ - if ((abs(retval-val)<=5) || val==-1) { + if(mV) + temp = retval[1]; + else + temp = retval[0]; + if ((abs(temp-val)<=5) || val==-1) { ret=OK; if (differentClients) ret=FORCE_UPDATE; } else { ret=FAIL; - printf("Setting dac %d of module %d: wrote %d but read %d\n", idac, imod, val, retval); + printf("Setting dac %d of module %d: wrote %d but read %d\n", idac, imod, val, temp); } } @@ -2977,6 +2988,7 @@ int configure_mac(int file_des) { if (imod>=getTotalNumberOfModules()) { ret=FAIL; sprintf(mess,"Module number out of range %d\n",imod); + printf("mess:%s\n",mess); } #endif #ifdef VERBOSE @@ -3384,14 +3396,14 @@ int enable_ten_giga(int file_des) { } /* execute action */ if(ret != FAIL){ -#ifdef VERBOSE +//#ifdef VERBOSE printf("Enabling 10Gbe :%d \n",arg); -#endif +//#endif #ifdef SLS_DETECTOR_FUNCTION_LIST retval=enableTenGigabitEthernet(arg); if((arg != -1) && (retval != arg)) ret=FAIL; - else if (differentClients==1 && ret==OK) { + else if (differentClients==1) { ret=FORCE_UPDATE; } #endif