diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 5dc57e871..3198f89e2 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -364,6 +364,11 @@ enum detectorSettings{ MEDIUMGAIN, /**< medium gain settings */ VERYHIGHGAIN, /**< very high gain settings */ LOWNOISE, /**< low noise settings */ + DYNAMICHG0, /**< dynamic high gain 0 */ + FIXGAIN1, /**< fix gain 1 */ + FIXGAIN2, /**< fix gain 2 */ + FORCESWITCHG1, /**< force switch gain 1 */ + FORCESWITCHG2, /**< force switch gain 2 */ UNDEFINED, /**< undefined or custom settings */ UNINITIALIZED /**< uninitialiazed (status at startup) */ }; diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c index eff5027c6..85a32eb21 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c @@ -1576,37 +1576,19 @@ int initHighVoltage(int val, int imod){ int initConfGain(int isettings,int val,int imod){ int retval; - u_int32_t addr=GAIN_REG; - - if(val!=-1){ -#ifdef VERBOSE - printf("Setting Gain of module:%d with val:%d\n",imod,val); -#endif - bus_w(addr,((val<>SETTINGS_OFFSET); + retval=(bus_r(addr)); #ifdef VERBOSE - printf("Settings read from reg is %d\n",retval); + printf("Value read from Gain reg is %d\n",retval); #endif - if((isettings!=-1)&&(retval!=isettings)){ - printf("\n\nSettings r\n\n"); - return -1; - } - - return retval; + return retval; } diff --git a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c index b9897212e..656787a7b 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/mcb_funcs.c @@ -847,38 +847,51 @@ int setSettings(int i, int imod) { else printf("\ninside set settings wit settings=%d...\n",i); #endif - int confgain[] = CONF_GAIN; - int isett=-2,retval; + int isett=-1,val=-1,retval=-1; + enum conf_gain { + dynamic = 0x0f00, //dynamic + dynamichighgain0 = 0x0f01, //dynamichighgain0 + fixgain1 = 0x0f02, //fixgain1 + fixgain2 = 0x0f06, //fixgain2 + forceswitchgain1 = 0x1f00, //forceswitchgain1 + forceswitchgain2 = 0x3f00 //forceswitchgain2 + }; - //reading settings - if(i==GET_SETTINGS){ - retval=initConfGainByModule(i,i,imod); - if(retval==i) - isett=UNDEFINED; - } - //writing settings - else{ - retval=initConfGainByModule(i,confgain[i],imod); - if(retval!=i) - isett=UNDEFINED; - } - //if error while read/writing - if(isett==UNDEFINED) - printf("Error:Weird Value read back from the Gain/Settings Reg\n"); - else{ - //validating the settings read back - if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN)) - isett=retval; - else{ - isett=UNDEFINED; - printf("Error:Wrong Settings Read out:%d\n",retval); - } - } - thisSettings=isett; + //determine conf value to write + if(i!=GET_SETTINGS){ + switch(i){ + case DYNAMICGAIN: val = dynamic;break; + case DYNAMICHG0: val = dynamichighgain0;break; + case FIXGAIN1: val = fixgain1;break; + case FIXGAIN2: val = fixgain2;break; + case FORCESWITCHG1: val = forceswitchgain1;break; + case FORCESWITCHG2: val = forceswitchgain2;break; + default: + printf("Error: This settings is not defined for this detector %d\n",i); + return GET_SETTINGS; + } + } + + retval=initConfGainByModule(i,val,imod); + + switch(retval){ + case dynamic: isett=DYNAMICGAIN; break; + case dynamichighgain0: isett=DYNAMICHG0; break; + case fixgain1: isett=FIXGAIN1; break; + case fixgain2: isett=FIXGAIN2; break; + case forceswitchgain1: isett=FORCESWITCHG1; break; + case forceswitchgain2: isett=FORCESWITCHG2; break; + default: + isett=UNDEFINED; + printf("Error:Wrong settings read out from Gain Reg 0x%x\n",retval); + break; + } + + thisSettings=isett; #ifdef VERBOSE - printf("detector settings are %d\n",thisSettings); + printf("detector settings are %d\n",thisSettings); #endif - return thisSettings; + return thisSettings; } @@ -1530,7 +1543,8 @@ int initModulebyNumber(sls_detector_module myMod) { int imod; // int obe; // int ow; - int v[NDAC]; + /* int v[NDAC];*/ + int retval =-1, idac; nchip=myMod.nchip; @@ -1559,7 +1573,7 @@ int initModulebyNumber(sls_detector_module myMod) { v[idac]=(myMod.dacs)[idac]; */ - +/* v[VDAC0]=(myMod.dacs)[0]; v[VDAC1]=(myMod.dacs)[1]; v[VDAC2]=(myMod.dacs)[2]; @@ -1580,11 +1594,19 @@ int initModulebyNumber(sls_detector_module myMod) { printf("vdac6=%d\n",v[VDAC6]); printf("vdac7=%d\n",v[VDAC7]); #endif - + */ // initDACs(v,imod); // initMCBregisters(myMod.reg,imod); + for (idac=0; idac2500) - val=-1; - printf("%d mV is ",val); - if (val>0) - val=4095*val/2500; - printf("%d DACu\n", val); - } else if (val>4095) - val=-1; - - - retval=setDac(ind,val); - /* if(idac==HIGH_VOLTAGE) */ - /* retval=initHighVoltageByModule(val,imod); */ - /* else */ - /* retval=initDACbyIndexDACU(idac,val,imod); */ - } - else if (ind==ADC_VPP) { - printf("Setting ADC VPP to %d\n",val); - if (val>4 || val<0) - printf("Cannot set ADC VPP to %d\n",val); - else { - writeADC(0x18,val); - adcvpp=val; - } - retval=adcvpp;; + if (ind<16) { - } + if (mV) { + if (val>2500) + val=-1; + printf("%d mV is ",val); + if (val>0) + val=4095*val/2500; + printf("%d DACu\n", val); + } else if (val>4095) + val=-1; + + + retval=setDac(ind,val); + /* if(idac==HIGH_VOLTAGE) */ + /* retval=initHighVoltageByModule(val,imod); */ + /* else */ + /* retval=initDACbyIndexDACU(idac,val,imod); */ + } + else if (ind==ADC_VPP) { + printf("Setting ADC VPP to %d\n",val); + if (val>4 || val<0) + printf("Cannot set ADC VPP to %d\n",val); + else { + writeADC(0x18,val); + adcvpp=val; + } + retval=adcvpp;; + + } } } 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; */ - if (ind<16) { - if (mV) { - - printf("%d DACu is ",retval); - retval1=2500*retval/16535; - printf("%d mV \n",retval1); - } else - retval1=retval; + /* 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; */ + if (ind<16) { + if (mV) { + + printf("%d DACu is ",retval); + retval1=2500*retval/16535; + printf("%d mV \n",retval1); + } else + retval1=retval; + } } #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); else{ @@ -1433,8 +1498,8 @@ int set_module(int file_des) { sls_detector_module myModule; int *myChip=malloc(NCHIP*sizeof(int)); int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myDac=malloc(NDAC*sizeof(int));/**dhanya*/ - int *myAdc=malloc(NADC*sizeof(int));/**dhanya*/ + int *myDac=malloc(NDAC*sizeof(int)); + int *myAdc=malloc(NADC*sizeof(int)); int retval, n; int ret=OK; int dr;// ow; @@ -1503,6 +1568,8 @@ int set_module(int file_des) { } else { #ifdef MCB_FUNCS retval=initModulebyNumber(myModule); + if(retval != myModule.reg) + ret = FAIL; #endif } } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 0dbf0b51c..984cdee54 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3128,6 +3128,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise case DYNAMICGAIN: if ((thisDetector->myDetectorType == GOTTHARD) || (thisDetector->myDetectorType == PROPIX) || + (thisDetector->myDetectorType == JUNGFRAU) || (thisDetector->myDetectorType == MOENCH)) { ssettings="/dynamicgain"; thisDetector->currentSettings=DYNAMICGAIN; @@ -3160,6 +3161,36 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise break; case LOWNOISE: break; + case DYNAMICHG0: + if (thisDetector->myDetectorType == JUNGFRAU) { + ssettings="/dynamichg0"; + thisDetector->currentSettings=DYNAMICHG0; + } + break; + case FIXGAIN1: + if (thisDetector->myDetectorType == JUNGFRAU) { + ssettings="/fixgain1"; + thisDetector->currentSettings=FIXGAIN1; + } + break; + case FIXGAIN2: + if (thisDetector->myDetectorType == JUNGFRAU) { + ssettings="/fixgain2"; + thisDetector->currentSettings=FIXGAIN2; + } + break; + case FORCESWITCHG1: + if (thisDetector->myDetectorType == JUNGFRAU) { + ssettings="/forceswitchg1"; + thisDetector->currentSettings=FORCESWITCHG1; + } + break; + case FORCESWITCHG2: + if (thisDetector->myDetectorType == JUNGFRAU) { + ssettings="/forceswitchg2"; + thisDetector->currentSettings=FORCESWITCHG2; + } + break; default: break; } @@ -3194,6 +3225,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise case MOENCH: case GOTTHARD: case PROPIX: + case JUNGFRAU: case JUNGFRAUCTB: //settings is saved in myMod.reg myMod->reg=thisDetector->currentSettings; @@ -3221,6 +3253,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise case MOENCH: case GOTTHARD: case PROPIX: + case JUNGFRAU: case JUNGFRAUCTB: ostfn_default << thisDetector->settingsDir << ssettings << ssettings << ".settings"; break; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 7377036db..12ab52d31 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -638,37 +638,51 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef return GET_EXTERNAL_SIGNAL_FLAG ;}; /** returns detector settings string from index - \param s can be STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN, GET_SETTINGS - \returns standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, undefined + \param s can be STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN, LOWNOISE, + DYNAMICHG0, FIXGAIN1, FIXGAIN2, FORCESWITCHG1, FORCESWITCHG2, GET_SETTINGS + \returns standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, lownoise, + dynamichg0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, undefined */ static string getDetectorSettings(detectorSettings s){\ - switch(s) {\ - case STANDARD: return string("standard");\ - case FAST: return string("fast");\ - case HIGHGAIN: return string("highgain");\ - case DYNAMICGAIN: return string("dynamicgain"); \ - case LOWGAIN: return string("lowgain"); \ + switch(s) { \ + case STANDARD: return string("standard"); \ + case FAST: return string("fast"); \ + case HIGHGAIN: return string("highgain"); \ + case DYNAMICGAIN: return string("dynamicgain"); \ + case LOWGAIN: return string("lowgain"); \ case MEDIUMGAIN: return string("mediumgain"); \ - case VERYHIGHGAIN: return string("veryhighgain"); \ + case VERYHIGHGAIN: return string("veryhighgain"); \ case LOWNOISE: return string("lownoise"); \ - default: return string("undefined"); \ + case DYNAMICHG0: return string("dynamichg0"); \ + case FIXGAIN1: return string("fixgain1"); \ + case FIXGAIN2: return string("fixgain2"); \ + case FORCESWITCHG1: return string("forceswitchg1");\ + case FORCESWITCHG2: return string("forceswitchg2");\ + default: return string("undefined"); \ }}; /** returns detector settings string from index - \param s can be standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, undefined - \returns setting index STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN, GET_SETTINGS + \param s can be standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, lownoise, + dynamichg0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, undefined + \returns setting index STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN,LOWNOISE, + DYNAMICHG0, FIXGAIN1, FIXGAIN2, FORCESWITCHG1, FORCESWITCHG2, GET_SETTINGS */ static detectorSettings getDetectorSettings(string s){ \ - if (s=="standard") return STANDARD; \ - if (s=="fast") return FAST; \ - if (s=="highgain") return HIGHGAIN; \ - if (s=="dynamicgain") return DYNAMICGAIN; \ - if (s=="lowgain") return LOWGAIN; \ - if (s=="mediumgain") return MEDIUMGAIN; \ - if (s=="veryhighgain") return VERYHIGHGAIN; \ - if (s=="lownoise") return LOWNOISE; \ - return GET_SETTINGS; \ + if (s=="standard") return STANDARD; \ + if (s=="fast") return FAST; \ + if (s=="highgain") return HIGHGAIN; \ + if (s=="dynamicgain") return DYNAMICGAIN; \ + if (s=="lowgain") return LOWGAIN; \ + if (s=="mediumgain") return MEDIUMGAIN; \ + if (s=="veryhighgain") return VERYHIGHGAIN; \ + if (s=="lownoise") return LOWNOISE; \ + if (s=="dynamichg0") return DYNAMICHG0; \ + if (s=="fixgain1") return FIXGAIN1; \ + if (s=="fixgain2") return FIXGAIN2; \ + if (s=="forceswitchg2") return FORCESWITCHG1; \ + if (s=="lownoise") return FORCESWITCHG2; \ + return GET_SETTINGS; \ }; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index 818ab8399..2d8be5c56 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -215,6 +215,24 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string break; case EIGER: break; + case JUNGFRAU: + names[id++]="VDAC0"; + names[id++]="VDAC1"; + names[id++]="VDAC2"; + names[id++]="VDAC3"; + names[id++]="VDAC4"; + names[id++]="VDAC5"; + names[id++]="VDAC6"; + names[id++]="VDAC7"; + names[id++]="VDAC8"; + names[id++]="VDAC9"; + names[id++]="VDAC10"; + names[id++]="VDAC11"; + names[id++]="VDAC12"; + names[id++]="VDAC13"; + names[id++]="VDAC14"; + names[id++]="VDAC15"; + break; default: cout << "Unknown detector type - unknown format for settings file" << endl; return NULL; @@ -359,6 +377,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string case MOENCH: case GOTTHARD: case PROPIX: + case JUNGFRAU: //---------------dacs--------------- infile.open(myfname.c_str(), ios_base::in); if (infile.is_open()) { @@ -458,6 +477,24 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp break; case EIGER: break; + case JUNGFRAU: + names[id++]="VDAC0"; + names[id++]="VDAC1"; + names[id++]="VDAC2"; + names[id++]="VDAC3"; + names[id++]="VDAC4"; + names[id++]="VDAC5"; + names[id++]="VDAC6"; + names[id++]="VDAC7"; + names[id++]="VDAC8"; + names[id++]="VDAC9"; + names[id++]="VDAC10"; + names[id++]="VDAC11"; + names[id++]="VDAC12"; + names[id++]="VDAC13"; + names[id++]="VDAC14"; + names[id++]="VDAC15"; + break; default: cout << "Unknown detector type - unknown format for settings file" << endl; return FAIL;