From c0a69ebc2dffd5cdc5a27704bc07a3a4d72e8bc7 Mon Sep 17 00:00:00 2001 From: l_maliakal_d Date: Fri, 23 Mar 2012 11:16:30 +0000 Subject: [PATCH] now the loadimage, read/reset counterblock for gotthard works git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@159 951219d9-93cf-4727-9268-0efd64621fa3 --- .../slsDetector/slsDetector.cpp | 92 +++++++++++++++++-- slsDetectorSoftware/slsDetector/slsDetector.h | 30 +++++- .../slsDetector/slsDetectorBase.h | 30 ++++-- .../slsDetector/slsDetectorCommand.cpp | 92 ++++++++++++++++--- .../slsDetector/slsDetectorCommand.h | 2 + .../slsDetector/slsDetectorUtils.cpp | 52 ++++++++++- .../slsDetector/slsDetectorUtils.h | 26 +++++- 7 files changed, 291 insertions(+), 33 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index e1d0364a2..111bdb11b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -4645,7 +4645,7 @@ int slsDetector::loadImageToDetector(imageType index,string const fname){ -int slsDetector::sendImageToDetector(imageType index,short int arg[]){ +int slsDetector::sendImageToDetector(imageType index,short int imageVals[]){ int ret=FAIL; int retval; @@ -4653,7 +4653,7 @@ int slsDetector::sendImageToDetector(imageType index,short int arg[]){ char mess[100]; #ifdef VERBOSE - std::cout<< std::endl<< "Sending image to detector " << std::endl; + std::cout<<"Sending image to detector " <onlineFlag==ONLINE_FLAG) { @@ -4661,7 +4661,7 @@ int slsDetector::sendImageToDetector(imageType index,short int arg[]){ if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&index,sizeof(index)); - controlSocket->SendDataOnly(arg,sizeof(arg)); + controlSocket->SendDataOnly(imageVals,thisDetector->dataBytes); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); @@ -4676,9 +4676,6 @@ int slsDetector::sendImageToDetector(imageType index,short int arg[]){ } } - if (ret==FAIL) { - std::cout<< "failed " << std::endl; - } return ret; } @@ -5552,3 +5549,86 @@ synchronizationMode slsDetector::setSynchronization(synchronizationMode flag) { return retval; } + + +int slsDetector::getCounterBlock(short int arg[],int startACQ){ + + int ret=FAIL; + int fnum=F_READ_COUNTER_BLOCK; + char mess[100]; + + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&startACQ,sizeof(startACQ)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=FAIL) + controlSocket->ReceiveDataOnly(arg,thisDetector->dataBytes); + else { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + } + controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + } + + return ret; +} + +int slsDetector::writeCounterBlockFile(string const fname,int startACQ){ + + int ret=FAIL; + short int counterVals[thisDetector->nChans*thisDetector->nChips]; + +#ifdef VERBOSE + std::cout<< std::endl<< "Reading Counter to \""<onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&startACQ,sizeof(startACQ)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL){ + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + } + controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + } + + return ret; +} + diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index cc997df10..3db279ecb 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -9,7 +9,6 @@ //#include "slsDetectorCommand.h" - //enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS}; @@ -1339,7 +1338,7 @@ typedef struct sharedSlsDetector { \param arg image */ - int sendImageToDetector(imageType index,short int arg[]); + int sendImageToDetector(imageType index,short int imageVals[]); /** Sets/gets the synchronization mode of the various detectors @@ -1348,6 +1347,33 @@ typedef struct sharedSlsDetector { */ synchronizationMode setSynchronization(synchronizationMode sync=GET_SYNCHRONIZATION_MODE); + /** + writes the counter memory block from the detector + \param startACQ is 1 to start acquisition after reading counter + \param fname file name to load data from + \returns OK or FAIL + */ + int writeCounterBlockFile(string const fname,int startACQ=0); + + + /** + gets counter memory block in detector + \param startACQ is 1 to start acquisition after reading counter + \param arg counter memory block from detector + \returns OK or FAIL + */ + int getCounterBlock(short int arg[],int startACQ=0); + + + /** + Resets counter in detector + \param startACQ is 1 to start acquisition after resetting counter + \returns OK or FAIL + */ + int resetCounterBlock(int startACQ=0); + + + protected: diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 8cab554ad..6d00d84d7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -794,14 +794,30 @@ class slsDetectorBase { \returns OK or FAIL */ virtual int loadImageToDetector(imageType index,string const fname)=0; - - /** - Test function - \param times number of repetitions - \returns repetition when it fails - */ - virtual int testFunction(int times=0)=0; + + /** + writes the counter memory block from the detector + \param startACQ is 1 to start acquisition after reading counter + \fname file fname to load data from + \returns OK or FAIL + */ + virtual int writeCounterBlockFile(string const fname,int startACQ=0)=0; + + + /** + Resets counter memory block in detector + \param startACQ is 1 to start acquisition after resetting counter + \returns OK or FAIL + */ + virtual int resetCounterBlock(int startACQ=0)=0; + + + /** + function to test acquisition + */ + virtual int testFunction(int itimes=0)=0; + /************************************************************************ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 897591230..77aaa6fb8 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -126,6 +126,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorBase *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdImage; i++; + descrToFuncMap[i].m_pFuncName="readctr"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; + i++; + + descrToFuncMap[i].m_pFuncName="resetctr"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; + i++; + /* trim/cal directories */ descrToFuncMap[i].m_pFuncName="trimdir"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettingsDir; @@ -1635,36 +1643,90 @@ string slsDetectorCommand::cmdImage(int narg, char *args[], int action){ if (action==HELP_ACTION) return helpImage(narg,args,HELP_ACTION); else if (action==GET_ACTION) - return string("Cannot get"); - + return string("Cannot get"); + sval=string(args[1]); myDet->setOnline(ONLINE_FLAG); - + + if (string(args[0])==string("darkimage")) - retval=myDet->loadImageToDetector(DARK_IMAGE,sval); + retval=myDet->loadImageToDetector(DARK_IMAGE,sval); else if (string(args[0])==string("gainimage")) - retval=myDet->loadImageToDetector(GAIN_IMAGE,sval); + retval=myDet->loadImageToDetector(GAIN_IMAGE,sval); + - if(!retval) + if(retval==OK) return string("Image loaded succesfully"); else - return string("Image NOT loaded"); + return string("Image load failed"); } string slsDetectorCommand::helpImage(int narg, char *args[], int action){ - if (action==PUT_ACTION || action==HELP_ACTION){ - if (string(args[0])==string("darkimage")) - return string("darkimage f \t loads the image to detector from file f\n"); - else - return string("gainimage f \t loads the image to detector from file f\n"); - } - else - return string("Cannot get"); + ostringstream os; + if (action==PUT_ACTION || action==HELP_ACTION){ + os << "darkimage f \t loads the image to detector from file f"<< std::endl; + os << "gainimage f \t loads the image to detector from file f"<< std::endl; + } + if (action==GET_ACTION || action==HELP_ACTION){ + os << "darkimage \t Cannot get"<< std::endl; + os << "gainimage \t Cannot get"<< std::endl; + } + return os.str(); } +string slsDetectorCommand::cmdCounter(int narg, char *args[], int action){ + int ival; + string sval; + int retval; + if (action==HELP_ACTION) + return helpCounter(narg,args,HELP_ACTION); + else if (action==PUT_ACTION) + ival=atoi(args[1]); + + myDet->setOnline(ONLINE_FLAG); + + if (string(args[0])==string("readctr")){ + if (action==PUT_ACTION) + return string("Cannot put"); + else{ + if (narg<3) + return string("should specify I/O file"); + sval=string(args[2]); + retval=myDet->writeCounterBlockFile(sval,ival); + } + } + else if (string(args[0])==string("resetctr")){ + if (action==GET_ACTION) + return string("Cannot get"); + else + retval=myDet->resetCounterBlock(ival); + } + + + if(retval==OK) + return string("Counter read/reset succesfully"); + else + return string("Counter read/reset failed"); +} + + +string slsDetectorCommand::helpCounter(int narg, char *args[], int action){ + ostringstream os; + os << std::endl; + if (action==PUT_ACTION || action==HELP_ACTION){ + os << "readctr \t Cannot put"<< std::endl; + os << "resetctr i \t resets counter in detector, restarts acquisition if i=1"<< std::endl; + } + if (action==GET_ACTION || action==HELP_ACTION) + os << "readctr i fname\t reads counter in detector to file fname, restarts acquisition if i=1"<< std::endl; + os << "resetctr \t Cannot get"<< std::endl; + return os.str(); +} + + string slsDetectorCommand::cmdPositions(int narg, char *args[], int action){ int ival; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.h b/slsDetectorSoftware/slsDetector/slsDetectorCommand.h index 6539ec618..5fac16b7f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.h @@ -80,6 +80,7 @@ class slsDetectorCommand { static string helpAdvanced(int narg, char *args[], int action); static string helpConfiguration(int narg, char *args[], int action); static string helpImage(int narg, char *args[], int action); + static string helpCounter(int narg, char *args[], int action); static string helpADC(int narg, char *args[], int action); @@ -149,6 +150,7 @@ class slsDetectorCommand { string cmdAdvanced(int narg, char *args[], int action); string cmdConfiguration(int narg, char *args[], int action); string cmdImage(int narg, char *args[], int action); + string cmdCounter(int narg, char *args[], int action); string cmdADC(int narg, char *args[], int action); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index 1ab998eb7..215bb490e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -880,6 +880,39 @@ int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, int *data, int o +/*writes raw data file */ +int slsDetectorUtils::writeDataFile(string fname, int nch, short int *data){ + ofstream outfile; + if (data==NULL) + return FAIL; + + outfile.open (fname.c_str(),ios_base::out); + if (outfile.is_open()) + { + writeDataFile(outfile, nch, data, 0); + outfile.close(); + return OK; + } else { + std::cout<< "Could not open file " << fname << "for writing"<< std::endl; + return FAIL; + } +}; + + + +/*writes raw data file */ +int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, short int *data, int offset){ + if (data==NULL) + return FAIL; + + for (int ichan=0; ichan> ichan >> idata; @@ -1095,7 +1128,7 @@ int slsDetectorUtils::readDataFile(ifstream &infile, short int *data, int nch, i } // } #ifdef VERBOSE - std::cout<< "read " << iline <<" channels " << std::endl; + ;//std::cout<< "read " << iline <<" channels " << std::endl; #endif } return iline; @@ -1135,6 +1168,21 @@ int slsDetectorUtils::writeDataFile(ofstream &outfile, int *data, int offset){ + + +int slsDetectorUtils::writeDataFile(string fname, short int *data){ + + return writeDataFile(fname, getTotalNumberOfChannels(), data); +} + +int slsDetectorUtils::writeDataFile(ofstream &outfile, short int *data, int offset){ + + return writeDataFile(outfile, getTotalNumberOfChannels(), data, offset); +} + + + + int slsDetectorUtils::readDataFile(string fname, float *data, float *err, float *ang, char dataformat) { return readDataFile(getTotalNumberOfChannels(), fname, data, err, ang, dataformat); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 270d90379..5b444a2e8 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -176,6 +176,19 @@ class slsDetectorUtils : public slsDetectorBase { virtual int writeDataFile(string fname, int *data); int writeDataFile(ofstream &outfile, int *data, int offset=0); + + /** + + writes a data file + \param name of the file to be written + \param data array of data values + \returns OK or FAIL if it could not write the file or data=NULL + \sa mythenDetector::writeDataFile + */ + virtual int writeDataFile(string fname, short int *data); + int writeDataFile(ofstream &outfile, short int *data, int offset=0); + + /** reads a data file @@ -229,7 +242,8 @@ class slsDetectorUtils : public slsDetectorBase { static int writeDataFile(string fname, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f'); static int writeDataFile(ofstream &outfile, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int offset=0); - /** + + /** writes a data file \param name of the file to be written @@ -239,7 +253,17 @@ class slsDetectorUtils : public slsDetectorBase { */ static int writeDataFile(string fname,int nch, int *data); static int writeDataFile(ofstream &outfile,int nch, int *data, int offset=0); + + /** + writes a data file + \param name of the file to be written + \param data array of data values + \returns OK or FAIL if it could not write the file or data=NULL + \sa mythenDetector::writeDataFile + */ + static int writeDataFile(string fname,int nch, short int *data); + static int writeDataFile(ofstream &outfile,int nch, short int *data, int offset=0); /** reads a data file