added iodelay with setttings

This commit is contained in:
Dhanya Maliakal
2016-02-24 18:05:17 +01:00
parent 0b1710c267
commit 5af05c24c1
9 changed files with 60 additions and 26 deletions

View File

@@ -536,7 +536,7 @@ int getDefaultSettingsTau_in_nsec(){
} }
int setModule(sls_detector_module myMod, int* gain, int* offset){ int setModule(sls_detector_module myMod, int* gain, int* offset,int* delay){
int retval[2]; int retval[2];
int i; int i;
@@ -560,6 +560,12 @@ int setModule(sls_detector_module myMod, int* gain, int* offset){
printf("offset[%d]:%d\n",i,detectorOffset[i]); printf("offset[%d]:%d\n",i,detectorOffset[i]);
}else cprintf(RED,"offset not set\n"); }else cprintf(RED,"offset not set\n");
} }
if(setIODelay(*delay, -1)!= (*delay)){
cprintf(RED,"could not set iodelay %d\n",*delay);
return FAIL;
}
//copy module locally //copy module locally
if (detectorModules) if (detectorModules)
copyModule(detectorModules,&myMod); copyModule(detectorModules,&myMod);

View File

@@ -2658,6 +2658,7 @@ int slsDetector::setModule(int reg, int imod){
sls_detector_module myModule; sls_detector_module myModule;
int* g=0; int* g=0;
int* o=0; int* o=0;
int* iod=0;
#ifdef VERBOSE #ifdef VERBOSE
std::cout << "slsDetector set module " << std::endl; std::cout << "slsDetector set module " << std::endl;
@@ -2726,14 +2727,14 @@ int slsDetector::setModule(int reg, int imod){
ads[i]=-1; ads[i]=-1;
myModule.adcs=ads; myModule.adcs=ads;
} }
ret=setModule(myModule,g,o); ret=setModule(myModule,g,o,iod);
} }
return ret; return ret;
}; };
int slsDetector::setModule(sls_detector_module module, int* gainval, int* offsetval){ int slsDetector::setModule(sls_detector_module module, int* gainval, int* offsetval, int* iodelay){
int fnum=F_SET_MODULE; int fnum=F_SET_MODULE;
int retval; int retval;
@@ -2757,6 +2758,8 @@ int slsDetector::setModule(sls_detector_module module, int* gainval, int* offset
controlSocket->SendDataOnly(gainval,sizeof(int)*thisDetector->nGain); controlSocket->SendDataOnly(gainval,sizeof(int)*thisDetector->nGain);
if((thisDetector->nOffset) && (offsetval)) if((thisDetector->nOffset) && (offsetval))
controlSocket->SendDataOnly(offsetval,sizeof(int)*thisDetector->nOffset); controlSocket->SendDataOnly(offsetval,sizeof(int)*thisDetector->nOffset);
if(thisDetector->myDetectorType == EIGER)
controlSocket->SendDataOnly(iodelay,sizeof(int));
controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret!=FAIL) { if (ret!=FAIL) {
@@ -3116,10 +3119,13 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise
string ssettings; string ssettings;
int* gainval=0, *offsetval=0; int* gainval=0, *offsetval=0;
int* iodelay=0;
if(thisDetector->nGain) if(thisDetector->nGain)
gainval=new int[thisDetector->nGain]; gainval=new int[thisDetector->nGain];
if(thisDetector->nOffset) if(thisDetector->nOffset)
offsetval=new int[thisDetector->nOffset]; offsetval=new int[thisDetector->nOffset];
if(thisDetector->myDetectorType == EIGER)
iodelay = new int;
int ret=0; int ret=0;
@@ -3269,7 +3275,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise
#ifdef VERBOSE #ifdef VERBOSE
cout << "the settings file name is "<<settingsfname << endl; cout << "the settings file name is "<<settingsfname << endl;
#endif #endif
if (!readSettingsFile(settingsfname,thisDetector->myDetectorType, myMod)) { if (!readSettingsFile(settingsfname,thisDetector->myDetectorType, myMod,iodelay)) {
//if it didnt open, try default settings file //if it didnt open, try default settings file
ostringstream ostfn_default; ostringstream ostfn_default;
switch(thisDetector->myDetectorType){ switch(thisDetector->myDetectorType){
@@ -3289,7 +3295,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise
#ifdef VERBOSE #ifdef VERBOSE
cout << settingsfname << endl; cout << settingsfname << endl;
#endif #endif
if (!readSettingsFile(settingsfname,thisDetector->myDetectorType, myMod)) { if (!readSettingsFile(settingsfname,thisDetector->myDetectorType, myMod,iodelay)) {
//if default doesnt work, return error //if default doesnt work, return error
std::cout << "Could not open settings file" << endl; std::cout << "Could not open settings file" << endl;
setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN)); setErrorMask((getErrorMask())|(SETTINGS_FILE_NOT_OPEN));
@@ -3334,7 +3340,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise
} }
//if everything worked, set module**** //if everything worked, set module****
setModule(*myMod,gainval,offsetval); setModule(*myMod,gainval,offsetval,iodelay);
} }
} }
@@ -6155,9 +6161,9 @@ int slsDetector::writeConfigurationFile(ofstream &outfile, int id){
int slsDetector::writeSettingsFile(string fname, int imod){ int slsDetector::writeSettingsFile(string fname, int imod, int* iodelay){
return writeSettingsFile(fname,thisDetector->myDetectorType, detectorModules[imod]); return writeSettingsFile(fname,thisDetector->myDetectorType, detectorModules[imod], iodelay);
}; };
@@ -6168,6 +6174,7 @@ int slsDetector::loadSettingsFile(string fname, int imod) {
sls_detector_module *myMod=NULL; sls_detector_module *myMod=NULL;
int* gainval=0; int* offsetval=0; int* gainval=0; int* offsetval=0;
int *iodelay=0;
if(thisDetector->nGain){ if(thisDetector->nGain){
gainval=new int[thisDetector->nGain]; gainval=new int[thisDetector->nGain];
for(int i=0;i<thisDetector->nGain;i++) for(int i=0;i<thisDetector->nGain;i++)
@@ -6178,6 +6185,8 @@ int slsDetector::loadSettingsFile(string fname, int imod) {
for(int i=0;i<thisDetector->nOffset;i++) for(int i=0;i<thisDetector->nOffset;i++)
offsetval[i] = -1; offsetval[i] = -1;
} }
if(thisDetector->myDetectorType == EIGER)
iodelay = new int;*iodelay=0;
string fn=fname; string fn=fname;
fn=fname; fn=fname;
int mmin=0, mmax=setNumberOfModules(); int mmin=0, mmax=setNumberOfModules();
@@ -6197,13 +6206,14 @@ int slsDetector::loadSettingsFile(string fname, int imod) {
ostfn << ".sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER, im); ostfn << ".sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER, im);
fn=ostfn.str(); fn=ostfn.str();
} }
myMod=readSettingsFile(fn, thisDetector->myDetectorType); myMod=readSettingsFile(fn, thisDetector->myDetectorType,myMod,iodelay);
if (myMod) { if (myMod) {
myMod->module=im; myMod->module=im;
//settings is saved in myMod.reg for all except mythen //settings is saved in myMod.reg for all except mythen
if(thisDetector->myDetectorType!=MYTHEN) if(thisDetector->myDetectorType!=MYTHEN)
myMod->reg=thisDetector->currentSettings; myMod->reg=thisDetector->currentSettings;
setModule(*myMod,gainval,offsetval); setModule(*myMod,gainval,offsetval,iodelay);
deleteModule(myMod); deleteModule(myMod);
if(gainval) delete[] gainval; if(gainval) delete[] gainval;
if(offsetval) delete[] offsetval; if(offsetval) delete[] offsetval;
@@ -6216,9 +6226,9 @@ int slsDetector::loadSettingsFile(string fname, int imod) {
int slsDetector::saveSettingsFile(string fname, int imod) { int slsDetector::saveSettingsFile(string fname, int imod) {
sls_detector_module *myMod=NULL; sls_detector_module *myMod=NULL;
int ret=FAIL; int ret=FAIL;
int *iod = 0;
int mmin=0, mmax=setNumberOfModules(); int mmin=0, mmax=setNumberOfModules();
if (imod>=0) { if (imod>=0) {
@@ -6227,12 +6237,17 @@ int slsDetector::saveSettingsFile(string fname, int imod) {
} }
for (int im=mmin; im<mmax; im++) { for (int im=mmin; im<mmax; im++) {
ostringstream ostfn; ostringstream ostfn;
if(thisDetector->myDetectorType == EIGER) if(thisDetector->myDetectorType == EIGER){
ostfn << fname << ".sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER); ostfn << fname << ".sn" << setfill('0') << setw(3) << dec << getId(DETECTOR_SERIAL_NUMBER);
else } else
ostfn << fname << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER,im); ostfn << fname << ".sn" << setfill('0') << setw(3) << hex << getId(MODULE_SERIAL_NUMBER,im);
if ((myMod=getModule(im))) { if ((myMod=getModule(im))) {
ret=writeSettingsFile(ostfn.str(), thisDetector->myDetectorType, *myMod);
if(thisDetector->myDetectorType == EIGER){
iod = new int;
*iod = (int)setDAC((dacs_t)-1,IO_DELAY,0,-1);
}
ret=writeSettingsFile(ostfn.str(), thisDetector->myDetectorType, *myMod,iod);
deleteModule(myMod); deleteModule(myMod);
} }
} }
@@ -6284,6 +6299,7 @@ int slsDetector::loadCalibrationFile(string fname, int imod) {
string fn=fname; string fn=fname;
int* gainval=0; int* offsetval=0; int* gainval=0; int* offsetval=0;
int* iodelay=0;
if(thisDetector->nGain){ if(thisDetector->nGain){
gainval=new int[thisDetector->nGain]; gainval=new int[thisDetector->nGain];
for(int i=0;i<thisDetector->nGain;i++) for(int i=0;i<thisDetector->nGain;i++)
@@ -6315,7 +6331,8 @@ int slsDetector::loadCalibrationFile(string fname, int imod) {
} }
fn=ostfn.str(); fn=ostfn.str();
if((myMod=getModule(im))){ if((myMod=getModule(im))){
iodelay = new int;
*iodelay = (int)setDAC(-1,IO_DELAY,0);
//extra gain and offset //extra gain and offset
if(thisDetector->nGain){ if(thisDetector->nGain){
if(readCalibrationFile(fn,gainval, offsetval,thisDetector->myDetectorType)==FAIL) if(readCalibrationFile(fn,gainval, offsetval,thisDetector->myDetectorType)==FAIL)
@@ -6325,7 +6342,7 @@ int slsDetector::loadCalibrationFile(string fname, int imod) {
if(readCalibrationFile(fn,myMod->gain, myMod->offset)==FAIL) if(readCalibrationFile(fn,myMod->gain, myMod->offset)==FAIL)
return FAIL; return FAIL;
} }
setModule(*myMod,gainval,offsetval); setModule(*myMod,gainval,offsetval,iodelay);
deleteModule(myMod); deleteModule(myMod);
if(gainval) delete[]gainval; if(gainval) delete[]gainval;

View File

@@ -494,11 +494,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
writes a trim/settings file for module number imod - the values will be read from the current detector structure writes a trim/settings file for module number imod - the values will be read from the current detector structure
\param fname name of the file to be written \param fname name of the file to be written
\param imod module number \param imod module number
\param iodelay io delay (detector specific)
\returns OK or FAIL if the file could not be written \returns OK or FAIL if the file could not be written
\sa ::sls_detector_module sharedSlsDetector mythenDetector::writeSettingsFile(string, int) \sa ::sls_detector_module sharedSlsDetector mythenDetector::writeSettingsFile(string, int)
*/ */
using energyConversion::writeSettingsFile; using energyConversion::writeSettingsFile;
int writeSettingsFile(string fname, int imod); int writeSettingsFile(string fname, int imod, int* iodelay=0);
/** /**
@@ -908,10 +909,11 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
\param module module to be set - must contain correct module number and also channel and chip registers \param module module to be set - must contain correct module number and also channel and chip registers
\param gainval pointer to extra gain values \param gainval pointer to extra gain values
\param offsetval pointer to extra offset values \param offsetval pointer to extra offset values
\param iodelay iodelay (detector specific)
\returns current register value \returns current register value
\sa ::sls_detector_module \sa ::sls_detector_module
*/ */
int setModule(sls_detector_module module, int* gainval, int* offsetval); int setModule(sls_detector_module module, int* gainval, int* offsetval,int* iodelay);
//virtual int setModule(sls_detector_module module); //virtual int setModule(sls_detector_module module);
/** /**

View File

@@ -163,7 +163,7 @@ int energyConversion::writeCalibrationFile(string fname, int *gain, int *offset,
/* I/O */ /* I/O */
slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string fname, detectorType myDetectorType, sls_detector_module *myMod){ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string fname, detectorType myDetectorType, sls_detector_module *myMod, int* iodelay){
@@ -353,10 +353,12 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string
infile.open(myfname.c_str(),ifstream::binary); infile.open(myfname.c_str(),ifstream::binary);
if (infile.is_open()) { if (infile.is_open()) {
infile.read((char*) myMod->dacs,sizeof(dacs_t)*(myMod->ndac)); infile.read((char*) myMod->dacs,sizeof(dacs_t)*(myMod->ndac));
infile.read((char*) iodelay,sizeof(iodelay));
infile.read((char*) myMod->chanregs,sizeof(int)*(myMod->nchan)); infile.read((char*) myMod->chanregs,sizeof(int)*(myMod->nchan));
#ifdef VERBOSE #ifdef VERBOSE
for(int i=0;i<myMod->ndac;i++) for(int i=0;i<myMod->ndac;i++)
std::cout << "dac " << i << ":" << myMod->dacs[i] << std::endl; std::cout << "dac " << i << ":" << myMod->dacs[i] << std::endl;
std::cout << "iodelay:" << *iodelay << std::endl;
#endif #endif
if(infile.eof()){ if(infile.eof()){
cout<<endl<<"Error, could not load trimbits end of file, "<<myfname<<", reached."<<endl<<endl; cout<<endl<<"Error, could not load trimbits end of file, "<<myfname<<", reached."<<endl<<endl;
@@ -436,7 +438,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string
}; };
int energyConversion::writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod){ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod, int* iodelay){
ofstream outfile; ofstream outfile;
@@ -512,8 +514,10 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp
#ifdef VERBOSE #ifdef VERBOSE
for(int i=0;i<mod.ndac;i++) for(int i=0;i<mod.ndac;i++)
std::cout << "dac " << i << ":" << mod.dacs[i] << std::endl; std::cout << "dac " << i << ":" << mod.dacs[i] << std::endl;
std::cout << "iodelay: " << *iodelay << std::endl;
#endif #endif
outfile.write((char*)mod.dacs, sizeof(dacs_t)*(mod.ndac)); outfile.write((char*)mod.dacs, sizeof(dacs_t)*(mod.ndac));
outfile.write((char*)iodelay, sizeof(iodelay));
outfile.write((char*)mod.chanregs, sizeof(int)*(mod.nchan)); outfile.write((char*)mod.chanregs, sizeof(int)*(mod.nchan));
outfile.close(); outfile.close();

View File

@@ -81,21 +81,23 @@ class energyConversion
\param fname name of the file to be read \param fname name of the file to be read
\param myDetectorType detector type (needed for number of channels, chips, dacs etc.) \param myDetectorType detector type (needed for number of channels, chips, dacs etc.)
\param myMod pointer to the module structure which has to be set. <BR> If it is NULL a new module structure will be created \param myMod pointer to the module structure which has to be set. <BR> If it is NULL a new module structure will be created
\param iodelay io delay (detector specific)
\returns the pointer to myMod or NULL if reading the file failed \returns the pointer to myMod or NULL if reading the file failed
*/ */
sls_detector_module* readSettingsFile(string fname, detectorType myDetectorType, sls_detector_module* myMod=NULL); sls_detector_module* readSettingsFile(string fname, detectorType myDetectorType, sls_detector_module* myMod=NULL, int* iodelay=0);
/** /**
writes a trim/settings file writes a trim/settings file
\param fname name of the file to be written \param fname name of the file to be written
\param myDetectorType detector type (needed for number of channels, chips, dacs etc.) \param myDetectorType detector type (needed for number of channels, chips, dacs etc.)
\param mod module structure which has to be written to file \param mod module structure which has to be written to file
\param iodelay io delay (detector specific)
\returns OK or FAIL if the file could not be written \returns OK or FAIL if the file could not be written
\sa ::sls_detector_module mythenDetector::writeSettingsFile(string, sls_detector_module) \sa ::sls_detector_module mythenDetector::writeSettingsFile(string, sls_detector_module)
*/ */
int writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod); int writeSettingsFile(string fname, detectorType myDetectorType, sls_detector_module mod, int* iodelay=0);
/** allocates the momery for a detector module structure /** allocates the momery for a detector module structure
\param myDetectorType detector type (needed for number of channels, chips, dacs etc.) \param myDetectorType detector type (needed for number of channels, chips, dacs etc.)

View File

@@ -70,7 +70,7 @@ int getChip(sls_detector_chip *myChip);
#ifdef EIGERD #ifdef EIGERD
int setModule(sls_detector_module myMod, int* gain, int* offset); int setModule(sls_detector_module myMod, int* gain, int* offset,int* delay);
int getModule(sls_detector_module *myMod, int* gain, int* offset); int getModule(sls_detector_module *myMod, int* gain, int* offset);
#else #else
int setModule(sls_detector_module myMod); int setModule(sls_detector_module myMod);

View File

@@ -1807,6 +1807,7 @@ int set_module(int file_des) {
#ifdef EIGERD #ifdef EIGERD
int *myGain = (int*)malloc(getNumberOfGainsPerModule()*sizeof(int)); int *myGain = (int*)malloc(getNumberOfGainsPerModule()*sizeof(int));
int *myOffset = (int*)malloc(getNumberOfOffsetsPerModule()*sizeof(int)); int *myOffset = (int*)malloc(getNumberOfOffsetsPerModule()*sizeof(int));
int *myIODelay = (int*)malloc(sizeof(int));
#endif #endif
int *myChip=(int*)malloc(getNumberOfChipsPerModule()*sizeof(int)); int *myChip=(int*)malloc(getNumberOfChipsPerModule()*sizeof(int));
int *myChan=(int*)malloc(getNumberOfChannelsPerModule()*sizeof(int)); int *myChan=(int*)malloc(getNumberOfChannelsPerModule()*sizeof(int));
@@ -1861,6 +1862,7 @@ int set_module(int file_des) {
#ifdef EIGERD #ifdef EIGERD
n = receiveData(file_des,myGain,sizeof(int)*getNumberOfGainsPerModule(),INT32); n = receiveData(file_des,myGain,sizeof(int)*getNumberOfGainsPerModule(),INT32);
n = receiveData(file_des,myOffset,sizeof(int)*getNumberOfOffsetsPerModule(),INT32); n = receiveData(file_des,myOffset,sizeof(int)*getNumberOfOffsetsPerModule(),INT32);
n = receiveData(file_des,myIODelay,sizeof(int),INT32);
#endif #endif
if (ret>=0) if (ret>=0)
ret=OK; ret=OK;
@@ -1876,6 +1878,7 @@ int set_module(int file_des) {
printf("gain[%d]:%d\t%f\n",i,myGain[i],((double)myGain[i]/1000)); printf("gain[%d]:%d\t%f\n",i,myGain[i],((double)myGain[i]/1000));
for(i=0;i<getNumberOfOffsetsPerModule();i++) for(i=0;i<getNumberOfOffsetsPerModule();i++)
printf("offset[%d]:%d\t%f\n",i,myOffset[i],((double)myOffset[i]/1000)); printf("offset[%d]:%d\t%f\n",i,myOffset[i],((double)myOffset[i]/1000));
printf("IO Delay:%d\n",i,*myIODelay);
#endif #endif
#endif #endif
@@ -1898,7 +1901,7 @@ int set_module(int file_des) {
sprintf(mess,"Detector locked by %s\n",lastClientIP); sprintf(mess,"Detector locked by %s\n",lastClientIP);
} else { } else {
#ifdef EIGERD #ifdef EIGERD
ret=setModule(myModule, myGain, myOffset); ret=setModule(myModule, myGain, myOffset,myIODelay);
//rate correction //rate correction
if(getRateCorrectionEnable()){ if(getRateCorrectionEnable()){
int64_t tau_ns = getDefaultSettingsTau_in_nsec(); int64_t tau_ns = getDefaultSettingsTau_in_nsec();