works but needs to be verified. the void* in call back

This commit is contained in:
Dhanya Maliakal 2017-09-29 11:39:10 +02:00
parent 352ade6457
commit 1a8b0692fe
2 changed files with 39 additions and 19 deletions

View File

@ -5731,17 +5731,18 @@ int multiSlsDetector::getData(const int isocket, int* image, const int size,
void multiSlsDetector::readFrameFromReceiver(){ void multiSlsDetector::readFrameFromReceiver(){
//determine number of half readouts and maxX and maxY //determine number of half readouts and maxX and maxY
int maxX=0,maxY=0; int maxX=thisMultiDetector->numberOfChannel[X];
int maxY=thisMultiDetector->numberOfChannel[Y];
int numSockets = thisMultiDetector->numberOfDetectors; int numSockets = thisMultiDetector->numberOfDetectors;
int numSocketsPerSLSDetector = 1; int numSocketsPerSLSDetector = 1;
bool jungfrau = false; bool jungfrau = false;
double* gdata = NULL; bool eiger = false;
/*double* gdata = NULL;*/
switch(getDetectorsType()){ switch(getDetectorsType()){
case EIGER: case EIGER:
eiger = true;
numSocketsPerSLSDetector = 2; numSocketsPerSLSDetector = 2;
numSockets *= numSocketsPerSLSDetector; numSockets *= numSocketsPerSLSDetector;
maxX = thisMultiDetector->numberOfChannel[X];
maxY = thisMultiDetector->numberOfChannel[Y];
break; break;
case JUNGFRAU: case JUNGFRAU:
jungfrau = true; jungfrau = true;
@ -5757,7 +5758,7 @@ void multiSlsDetector::readFrameFromReceiver(){
string currentFileName = ""; string currentFileName = "";
//getting sls values //getting sls values
int slsdatabytes = 0, slsmaxchannels = 0, slsmaxX = 0, slsmaxY=0, nx=0, ny=0; int slsdatabytes = 0, slsmaxchannels = 0, slsmaxX = 0, slsmaxY=0;
double bytesperchannel = 0; double bytesperchannel = 0;
if(detectors[0]){ if(detectors[0]){
slsdatabytes = detectors[0]->getDataBytes(); slsdatabytes = detectors[0]->getDataBytes();
@ -5768,12 +5769,10 @@ void multiSlsDetector::readFrameFromReceiver(){
} }
//getting multi values //getting multi values
nx = getTotalNumberOfChannels(slsDetectorDefs::X);
ny = getTotalNumberOfChannels(slsDetectorDefs::Y);
//calculating offsets (for eiger interleaving ports) //calculating offsets (for eiger interleaving ports)
int offsetX[numSockets]; int offsetY[numSockets]; int offsetX[numSockets]; int offsetY[numSockets];
int bottom[numSockets]; int bottom[numSockets];
if(maxX){ if(eiger){
for(int i=0; i<numSockets; ++i){ for(int i=0; i<numSockets; ++i){
offsetY[i] = (maxY - (thisMultiDetector->offsetY[i/numSocketsPerSLSDetector] + slsmaxY)) * maxX * bytesperchannel; offsetY[i] = (maxY - (thisMultiDetector->offsetY[i/numSocketsPerSLSDetector] + slsmaxY)) * maxX * bytesperchannel;
//the left half or right half //the left half or right half
@ -5787,7 +5786,7 @@ void multiSlsDetector::readFrameFromReceiver(){
} }
int expectedslssize = slsdatabytes/numSocketsPerSLSDetector; int expectedslssize = slsdatabytes/numSocketsPerSLSDetector;
int* image = new int[(expectedslssize/sizeof(int))](); /*int* image = new int[(expectedslssize/sizeof(int))]();
int nel=(thisMultiDetector->dataBytes)/sizeof(int); int nel=(thisMultiDetector->dataBytes)/sizeof(int);
if(nel <= 0){ if(nel <= 0){
cprintf(RED,"Error: Multislsdetector databytes not valid : %d\n", thisMultiDetector->dataBytes); cprintf(RED,"Error: Multislsdetector databytes not valid : %d\n", thisMultiDetector->dataBytes);
@ -5797,6 +5796,14 @@ void multiSlsDetector::readFrameFromReceiver(){
int* multiframegain=NULL; int* multiframegain=NULL;
if (jungfrau) if (jungfrau)
multiframegain = new int[nel](); multiframegain = new int[nel]();
*/
char* image = new char[expectedslssize]();
char* multiframe = new char[thisMultiDetector->dataBytes]();
char* multiframegain = NULL;
if (jungfrau)
multiframegain = new char[thisMultiDetector->dataBytes]();
int nch; int nch;
bool runningList[numSockets]; bool runningList[numSockets];
@ -5815,7 +5822,7 @@ void multiSlsDetector::readFrameFromReceiver(){
//exit when last message for each socket received //exit when last message for each socket received
while(running){ while(running){
memset(((char*)multiframe),0xFF,slsdatabytes*thisMultiDetector->numberOfDetectors); //reset frame memory memset(multiframe,0xFF,slsdatabytes*thisMultiDetector->numberOfDetectors);/*memset(((char*)multiframe),0xFF,slsdatabytes*thisMultiDetector->numberOfDetectors);*/ //reset frame memory
//get each frame //get each frame
for(int isocket=0; isocket<numSockets; ++isocket){ for(int isocket=0; isocket<numSockets; ++isocket){
@ -5823,29 +5830,29 @@ void multiSlsDetector::readFrameFromReceiver(){
//if running //if running
if (runningList[isocket]) { if (runningList[isocket]) {
//get individual images //get individual images
if(FAIL == getData(isocket, image, expectedslssize, currentAcquisitionIndex,currentFrameIndex,currentSubFrameIndex,currentFileName)){ if(FAIL == getData(isocket, (int*)image, expectedslssize, currentAcquisitionIndex,currentFrameIndex,currentSubFrameIndex,currentFileName)){
runningList[isocket] = false; runningList[isocket] = false;
--numRunning; --numRunning;
continue; continue;
} }
//assemble data with interleaving //assemble data with interleaving
if(maxX){ if(eiger){
//bottom //bottom
if(bottom[isocket]){ if(bottom[isocket]){
//if((((isocket/numSocketsPerSLSDetector)+1)%2) == 0){ //if((((isocket/numSocketsPerSLSDetector)+1)%2) == 0){
for(int i=0;i<slsmaxY;++i){ for(int i=0;i<slsmaxY;++i){
memcpy(((char*)multiframe) + offsetY[isocket] + offsetX[isocket] + (int)((slsmaxY-1-i)*maxX*bytesperchannel), memcpy(multiframe + offsetY[isocket] + offsetX[isocket] + (int)((slsmaxY-1-i)*maxX*bytesperchannel),
(char*)image+ (int)(i*(slsmaxX/numSocketsPerSLSDetector)*bytesperchannel), image+ (int)(i*(slsmaxX/numSocketsPerSLSDetector)*bytesperchannel),
(int)((slsmaxX/numSocketsPerSLSDetector)*bytesperchannel)); (int)((slsmaxX/numSocketsPerSLSDetector)*bytesperchannel));
} }
} }
//top //top
else{ else{
for(int i=0;i<slsmaxY;++i){ for(int i=0;i<slsmaxY;++i){
memcpy(((char*)multiframe) + offsetY[isocket] + offsetX[isocket] + (int)(i*maxX*bytesperchannel), memcpy(multiframe + offsetY[isocket] + offsetX[isocket] + (int)(i*maxX*bytesperchannel),
(char*)image+ (int)(i*(slsmaxX/numSocketsPerSLSDetector)*bytesperchannel), image+ (int)(i*(slsmaxX/numSocketsPerSLSDetector)*bytesperchannel),
(int)((slsmaxX/numSocketsPerSLSDetector)*bytesperchannel)); (int)((slsmaxX/numSocketsPerSLSDetector)*bytesperchannel));
} }
} }
@ -5853,7 +5860,7 @@ void multiSlsDetector::readFrameFromReceiver(){
//assemble data with no interleaving, assumed detectors appended vertically //assemble data with no interleaving, assumed detectors appended vertically
else{ else{
memcpy((char*)multiframe+slsdatabytes*isocket,(char*)image,slsdatabytes); memcpy(multiframe+slsdatabytes*isocket,image,slsdatabytes);
} }
} }
@ -5877,6 +5884,7 @@ void multiSlsDetector::readFrameFromReceiver(){
//send data to callback //send data to callback
if(running){ if(running){
/*
if (jungfrau) { if (jungfrau) {
// with gain data // with gain data
if (gainDataEnable) { if (gainDataEnable) {
@ -5895,13 +5903,20 @@ void multiSlsDetector::readFrameFromReceiver(){
} }
fdata = decodeData(multiframe,nch); fdata = decodeData(multiframe,nch);
if ((fdata) && (dataReady)){ if ((fdata) && (dataReady)){
thisData = new detectorData(fdata, NULL,NULL,getCurrentProgress(),currentFileName.c_str(),nx,ny, gdata); thisData = new detectorData(fdata, NULL,NULL,getCurrentProgress(),currentFileName.c_str(),maxX,maxY, gdata);
dataReady(thisData, currentFrameIndex, currentSubFrameIndex, pCallbackArg); dataReady(thisData, currentFrameIndex, currentSubFrameIndex, pCallbackArg);
delete thisData; delete thisData;
fdata = NULL; fdata = NULL;
gdata = NULL; gdata = NULL;
//cout<<"Send frame #"<< currentFrameIndex << " to gui"<<endl; //cout<<"Send frame #"<< currentFrameIndex << " to gui"<<endl;
} }
*/
if(dataReady) {
thisData = new detectorData(multiframe, thisMultiDetector->dataBytes, NULL,NULL,getCurrentProgress(),currentFileName.c_str(),maxX,maxY);
dataReady(thisData, currentFrameIndex, currentSubFrameIndex, pCallbackArg);
delete thisData;
}
setCurrentProgress(currentAcquisitionIndex+1); setCurrentProgress(currentAcquisitionIndex+1);
} }

View File

@ -18,7 +18,10 @@ class detectorData {
\param ny dimension in y (1D detector) \param ny dimension in y (1D detector)
\param gval pointer to gain data (for jungfrau) \param gval pointer to gain data (for jungfrau)
*/ */
detectorData(double *val=NULL, double *err=NULL, double *ang=NULL, double p_ind=-1, const char *fname="", int np=-1, int ny=1, double* gval=NULL) : values(val), errors(err), angles(ang), progressIndex(p_ind), npoints(np), npy(ny), gvalues(gval){ detectorData(double *val=NULL, double *err=NULL, double *ang=NULL, double p_ind=-1, const char *fname="", int np=-1, int ny=1, double* gval=NULL) : cvalues(NULL), databytes(-1), values(val), errors(err), angles(ang), progressIndex(p_ind), npoints(np), npy(ny), gvalues(gval){
strcpy(fileName,fname);
};
detectorData(char *val=NULL, int db=0, double *err=NULL, double *ang=NULL, double p_ind=-1, const char *fname="", int np=-1, int ny=1, double* gval=NULL) : cvalues(val), databytes(db), values(NULL), errors(err), angles(ang), progressIndex(p_ind), npoints(np), npy(ny), gvalues(gval){
strcpy(fileName,fname); strcpy(fileName,fname);
}; };
/** /**
@ -27,6 +30,8 @@ class detectorData {
*/ */
~detectorData() {if (values) delete [] values; if (errors) delete [] errors; if (angles) delete [] angles; if (gvalues) delete [] gvalues;}; ~detectorData() {if (values) delete [] values; if (errors) delete [] errors; if (angles) delete [] angles; if (gvalues) delete [] gvalues;};
//private: //private:
char* cvalues;
int databytes;
double *values; /**< @short pointer to the data */ double *values; /**< @short pointer to the data */
double *errors; /**< @short pointer to the errors */ double *errors; /**< @short pointer to the errors */
double *angles;/**< @short pointer to the angles (NULL if no angular conversion) */ double *angles;/**< @short pointer to the angles (NULL if no angular conversion) */