32 bit image, and 32 bit mode frame number for eiger fixed, startframeindex included in readframe for all det in tcpip class

This commit is contained in:
Maliakal Dhanya 2014-09-16 16:29:36 +02:00
parent c2b885f230
commit 5cfe7b4338
5 changed files with 51 additions and 22 deletions

View File

@ -61,6 +61,8 @@ class sockaddr_in;
#endif
#include <stdlib.h> /******exit */
#include <unistd.h>
#include <string.h>
#include <iostream>
@ -558,6 +560,16 @@ enum communicationProtocol{
break;
case UDP:
if (socketDescriptor<0) return -1;
/*
cout <<"******listening inside genericsocket"<<endl;
for(int i=0;i<10000;i++){
nsent = recvfrom(socketDescriptor,(char*)buf+total_sent,5000, 0, (struct sockaddr *) &clientAddress, &clientAddress_length);
cout<<i<<":"<<nsent<<"\t\t";
}
exit(-1);
*/
//if length given, listens to length, else listens for packetsize till length is reached
if(length){
while(length>0){

View File

@ -273,8 +273,9 @@ public:
* @param c pointer to current file name
* @param raw address of pointer, pointing to current frame to send to gui
* @param fnum frame number for eiger as it is not in the packet
* @param fstartind is the start index of the acquisition
*/
virtual void readFrame(char* c,char** raw, uint32_t &fnum) = 0;
virtual void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind ) = 0;
/** set status to transmitting and
* when fifo is empty later, sets status to run_finished

View File

@ -1000,8 +1000,8 @@ int slsReceiverTCPIPInterface::moench_read_frame(){
else{
ret = OK;
startIndex=receiverBase->getStartFrameIndex();
receiverBase->readFrame(fName,&raw,index);
/*startIndex=receiverBase->getStartFrameIndex();*/
receiverBase->readFrame(fName,&raw,index,startIndex);
/**send garbage with -1 index to try again*/
if (raw == NULL){
@ -1170,8 +1170,8 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){
cout<<"haven't caught any frame yet"<<endl;
}else{
ret = OK;
startIndex=receiverBase->getStartFrameIndex();
receiverBase->readFrame(fName,&raw,index);
/*startIndex=receiverBase->getStartFrameIndex();*/
receiverBase->readFrame(fName,&raw,index,startIndex);
/**send garbage with -1 index to try again*/
if (raw == NULL){
@ -1302,13 +1302,9 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
char* raw = new char[frameSize];
char* origVal = new char[frameSize];
char* retval = new char[dataSize];
uint32_t startIndex=0;
strcpy(mess,"Could not read frame\n");
/* typedef struct{
unsigned char num1[4];
unsigned char num2[4];
} eiger_packet_header;*/
// execute action if the arguments correctly arrived
#ifdef SLS_RECEIVER_UDP_FUNCTIONS
@ -1326,7 +1322,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
else{
ret = OK;
/** read a frame */
receiverBase->readFrame(fName,&raw, index);
receiverBase->readFrame(fName,&raw,index,startIndex);
#ifdef VERBOSE
cout << "index:" << dec << index << endl;
#endif
@ -1373,17 +1369,22 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
retindex += numbytesperlineperport;
c1 += numbytesperlineperport;
if(repeat == 2) c1 += 16;
}
for(irepeat=0;irepeat<repeat;irepeat++){//only for 32 bit mode, take 2 packets from same port
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
retindex += numbytesperlineperport;
c2 += numbytesperlineperport;
if(repeat == 2) c2 += 16;
}
ibytesperpacket += numbytesperlineperport;
}
if(repeat == 1) {
c1 += 16;
c2 += 16;
}
}
int64_t temp;
@ -1404,7 +1405,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
for(i=0;i<(1024*(16*dynamicrange)*2)/4;i++)
(*(((uint32_t*)retval)+i)) = htonl((uint32_t)(*(((uint32_t*)retval)+i)));
*/
arg = index-1;
arg = index-startIndex;
}
}

View File

@ -26,6 +26,8 @@
#include <iostream>
using namespace std;
#define EIGER_32BIT_INITIAL_CONSTANT 0x17c
@ -785,7 +787,7 @@ void slsReceiverUDPFunctions::setupFifoStructure(){
/** acquisition functions */
void slsReceiverUDPFunctions::readFrame(char* c,char** raw, uint32_t &fnum){
void slsReceiverUDPFunctions::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind){
//point to gui data
if (guiData == NULL)
guiData = latestData;
@ -793,7 +795,7 @@ void slsReceiverUDPFunctions::readFrame(char* c,char** raw, uint32_t &fnum){
//copy data and filename
strcpy(c,guiFileName);
fnum = guiFrameNumber;
fstartind = getStartFrameIndex();
//could not get gui data
if(!guiDataReady){
@ -1506,9 +1508,13 @@ int slsReceiverUDPFunctions::startListening(){
//normal listening
else if(!carryonBufferSize){
/* if(!ithread){*/
rc = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS, maxBufferSize);
expected = maxBufferSize;
/*}else{
while(1) usleep(100000000);
}
*/
}
//the remaining packets from previous buffer
else{
@ -1726,7 +1732,10 @@ int loop;
//for progress
if(myDetectorType == EIGER){
tempframenum = htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum);
if(dynamicRange != 32)
tempframenum += (startFrameIndex-1); //eiger frame numbers start at 1, so need to -1
else
tempframenum = ((tempframenum / EIGER_32BIT_INITIAL_CONSTANT) + startFrameIndex)-1;//eiger 32 bit mode is a multiple of 17c. +startframeindex for scans
}else if ((myDetectorType == GOTTHARD) && (shortFrame == -1))
tempframenum = (((((uint32_t)(*((uint32_t*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)& (frameIndexMask)) >> frameIndexOffset);
else
@ -1751,6 +1760,7 @@ int loop;
if (cbAction < DO_EVERYTHING){
for(i=0;i<numListeningThreads;++i)
/* for eiger 32 bit mode, currframenum like gotthard, does not start from 0 or 1 */
rawDataReadyCallBack(currframenum, wbuf[i], numpackets * onePacketSize, sfilefd, guiData,pRawDataReady);
}else if (numpackets > 0){
for(i=0;i<numListeningThreads;++i)
@ -1871,9 +1881,14 @@ void slsReceiverUDPFunctions::startFrameIndices(int ithread){
cout << "startAcquisitionIndex:" << startAcquisitionIndex<<endl;
}
//for scans, cuz currfraenum resets
else if (myDetectorType == EIGER)
else if (myDetectorType == EIGER){
if(dynamicRange == 32)
startFrameIndex = (currframenum + 1);// to be added later for scans
else
startFrameIndex += currframenum;
}
cout << "startFrameIndex:" << startFrameIndex<<endl;
prevframenum=startFrameIndex;

View File

@ -286,8 +286,9 @@ public:
* @param c pointer to current file name
* @param raw address of pointer, pointing to current frame to send to gui
* @param fnum frame number for eiger as it is not in the packet
* @param fstartind is the start index of the acquisition
*/
void readFrame(char* c,char** raw, uint32_t &fnum);
void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind);
/**
* Closes all files
@ -468,7 +469,6 @@ private:
unsigned char header_after[24];
} eiger_image_header;
/** structure of an eiger image header*/
typedef struct
{