mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-29 09:30:02 +02:00
jungfrau works
This commit is contained in:
parent
0d86439589
commit
3b0e2e611c
@ -461,29 +461,6 @@ private:
|
|||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
//**detector parameters***
|
//**detector parameters***
|
||||||
/**
|
|
||||||
* structure of an eiger packet header
|
|
||||||
* subframenum subframe number for 32 bit mode (already written by firmware)
|
|
||||||
* missingpacket explicitly put to 0xFF to recognize it in file read (written by software)
|
|
||||||
* portnum 0 for the first port and 1 for the second port (written by software to file)
|
|
||||||
* dynamicrange dynamic range or bits per pixel (written by software to file)
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
unsigned char subFameNumber[4];
|
|
||||||
unsigned char missingPacket[2];
|
|
||||||
unsigned char portIndex[1];
|
|
||||||
unsigned char dynamicRange[1];
|
|
||||||
} eiger_packet_header_t;
|
|
||||||
/**
|
|
||||||
* structure of an eiger packet footer
|
|
||||||
* framenum 48 bit frame number (already written by firmware)
|
|
||||||
* packetnum packet number (already written by firmware)
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
unsigned char frameNumber[6];
|
|
||||||
unsigned char packetNumber[2];
|
|
||||||
} eiger_packet_footer_t;
|
|
||||||
|
|
||||||
/** Size of 1 Frame including headers */
|
/** Size of 1 Frame including headers */
|
||||||
int frameSize;
|
int frameSize;
|
||||||
|
|
||||||
|
@ -75,7 +75,8 @@ class sockaddr_in;
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#define DEFAULT_PACKET_SIZE 1286
|
#define DEFAULT_PACKET_SIZE 1286
|
||||||
#define SOCKET_BUFFER_SIZE (100*1024*1024) //100MB
|
/*#define SOCKET_BUFFER_SIZE (100*1024*1024) //100MB*/
|
||||||
|
#define SOCKET_BUFFER_SIZE (2000*1024*1024) //100MB
|
||||||
#define DEFAULT_PORTNO 1952
|
#define DEFAULT_PORTNO 1952
|
||||||
#define DEFAULT_BACKLOG 5
|
#define DEFAULT_BACKLOG 5
|
||||||
#define DEFAULT_UDP_PORTNO 50001
|
#define DEFAULT_UDP_PORTNO 50001
|
||||||
@ -578,7 +579,6 @@ enum communicationProtocol{
|
|||||||
|
|
||||||
int ReceiveDataOnly(void* buf,int length=0){
|
int ReceiveDataOnly(void* buf,int length=0){
|
||||||
|
|
||||||
|
|
||||||
if (buf==NULL) return -1;
|
if (buf==NULL) return -1;
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,6 +5,43 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* structure of an eiger packet header
|
||||||
|
* subframenum subframe number for 32 bit mode (already written by firmware)
|
||||||
|
* missingpacket explicitly put to 0xFF to recognize it in file read (written by software)
|
||||||
|
* portnum 0 for the first port and 1 for the second port (written by software to file)
|
||||||
|
* dynamicrange dynamic range or bits per pixel (written by software to file)
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char subFrameNumber[4];
|
||||||
|
unsigned char missingPacket[2];
|
||||||
|
unsigned char portIndex[1];
|
||||||
|
unsigned char dynamicRange[1];
|
||||||
|
} eiger_packet_header_t;
|
||||||
|
/**
|
||||||
|
* structure of an eiger packet footer
|
||||||
|
* framenum 48 bit frame number (already written by firmware)
|
||||||
|
* packetnum packet number (already written by firmware)
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char frameNumber[6];
|
||||||
|
unsigned char packetNumber[2];
|
||||||
|
} eiger_packet_footer_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* structure of an jungfrau packet header
|
||||||
|
* empty header
|
||||||
|
* framenumber
|
||||||
|
* packetnumber
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char emptyHeader[6];
|
||||||
|
unsigned char frameNumber[8];
|
||||||
|
unsigned char packetNumber[8];
|
||||||
|
} jfrau_packet_header_t;
|
||||||
|
|
||||||
|
|
||||||
#define GOODBYE -200
|
#define GOODBYE -200
|
||||||
|
|
||||||
#define DO_NOTHING 0
|
#define DO_NOTHING 0
|
||||||
@ -90,6 +127,26 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define JFRAU_FIFO_SIZE 2500 //cannot be less than max jobs per thread = 1000
|
||||||
|
#define JFRAU_PACKETS_PER_FRAME 128
|
||||||
|
#define JFRAU_HEADER_LENGTH 22
|
||||||
|
#define JFRAU_ONE_DATA_SIZE 8192
|
||||||
|
#define JFRAU_ONE_PACKET_SIZE (JFRAU_HEADER_LENGTH+JFRAU_ONE_DATA_SIZE) //8214
|
||||||
|
#define JFRAU_DATA_BYTES (JFRAU_ONE_DATA_SIZE*JFRAU_PACKETS_PER_FRAME) //8192*128
|
||||||
|
#define JFRAU_BUFFER_SIZE (JFRAU_ONE_PACKET_SIZE*JFRAU_PACKETS_PER_FRAME) //8214*128
|
||||||
|
|
||||||
|
|
||||||
|
#define JFRAU_FRAME_INDEX_MASK 0x0 //Not Applicable, use struct
|
||||||
|
#define JFRAU_FRAME_INDEX_OFFSET 0x0 //Not Applicable, use struct
|
||||||
|
#define JFRAU_PACKET_INDEX_MASK 0x0//Not Applicable, use struct
|
||||||
|
|
||||||
|
#define JFRAU_PIXELS_IN_ONE_ROW (256*4)
|
||||||
|
#define JFRAU_PIXELS_IN_ONE_COL (256*2)
|
||||||
|
#define JFRAU_BYTES_IN_ONE_ROW (JFRAU_PIXELS_IN_ONE_ROW*2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define JCTB_FIFO_SIZE 2500 //cannot be less than max jobs per thread = 1000
|
#define JCTB_FIFO_SIZE 2500 //cannot be less than max jobs per thread = 1000
|
||||||
/*#define MOENCH_ALIGNED_FRAME_SIZE 65536*/
|
/*#define MOENCH_ALIGNED_FRAME_SIZE 65536*/
|
||||||
#define JCTB_PACKETS_PER_FRAME 50
|
#define JCTB_PACKETS_PER_FRAME 50
|
||||||
|
@ -176,6 +176,9 @@ private:
|
|||||||
/** eiger specific read frame */
|
/** eiger specific read frame */
|
||||||
int eiger_read_frame();
|
int eiger_read_frame();
|
||||||
|
|
||||||
|
/** jungfrau specific read frame */
|
||||||
|
int jungfrau_read_frame();
|
||||||
|
|
||||||
/** Sets the receiver to send every nth frame to gui, or only upon gui request */
|
/** Sets the receiver to send every nth frame to gui, or only upon gui request */
|
||||||
int set_read_frequency();
|
int set_read_frequency();
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ typedef int int32_t;
|
|||||||
#define SHORT_MAX_FRAMES_PER_FILE 100000
|
#define SHORT_MAX_FRAMES_PER_FILE 100000
|
||||||
#define MOENCH_MAX_FRAMES_PER_FILE 1000
|
#define MOENCH_MAX_FRAMES_PER_FILE 1000
|
||||||
#define EIGER_MAX_FRAMES_PER_FILE 2000
|
#define EIGER_MAX_FRAMES_PER_FILE 2000
|
||||||
|
#define JFRAU_MAX_FRAMES_PER_FILE 2000
|
||||||
#define JFCTB_MAX_FRAMES_PER_FILE 100000
|
#define JFCTB_MAX_FRAMES_PER_FILE 100000
|
||||||
|
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ int UDPStandardImplementation::setupFifoStructure(){
|
|||||||
int64_t i;
|
int64_t i;
|
||||||
int oldNumberofJobsPerBuffer = numberofJobsPerBuffer;
|
int oldNumberofJobsPerBuffer = numberofJobsPerBuffer;
|
||||||
//eiger always listens to 1 packet at a time
|
//eiger always listens to 1 packet at a time
|
||||||
if(myDetectorType == EIGER){
|
if((myDetectorType == EIGER) || (myDetectorType = JUNGFRAU)){
|
||||||
numberofJobsPerBuffer = 1;
|
numberofJobsPerBuffer = 1;
|
||||||
FILE_LOG(logDEBUG) << "Info: 1 packet per buffer";
|
FILE_LOG(logDEBUG) << "Info: 1 packet per buffer";
|
||||||
}
|
}
|
||||||
@ -288,6 +288,7 @@ int UDPStandardImplementation::setupFifoStructure(){
|
|||||||
case GOTTHARD: fifoSize = GOTTHARD_FIFO_SIZE; break;
|
case GOTTHARD: fifoSize = GOTTHARD_FIFO_SIZE; break;
|
||||||
case MOENCH: fifoSize = MOENCH_FIFO_SIZE; break;
|
case MOENCH: fifoSize = MOENCH_FIFO_SIZE; break;
|
||||||
case PROPIX: fifoSize = PROPIX_FIFO_SIZE; break;
|
case PROPIX: fifoSize = PROPIX_FIFO_SIZE; break;
|
||||||
|
case JUNGFRAU: fifoSize = JFRAU_FIFO_SIZE; break;
|
||||||
case EIGER: fifoSize = EIGER_FIFO_SIZE * packetsPerFrame; break;//listens to 1 packet at a time and size depends on packetsperframe
|
case EIGER: fifoSize = EIGER_FIFO_SIZE * packetsPerFrame; break;//listens to 1 packet at a time and size depends on packetsperframe
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@ -717,7 +718,6 @@ int UDPStandardImplementation::setDetectorType(const detectorType d){
|
|||||||
footerOffset = EIGER_PACKET_HEADER_SIZE + oneDataSize;
|
footerOffset = EIGER_PACKET_HEADER_SIZE + oneDataSize;
|
||||||
break;
|
break;
|
||||||
case JUNGFRAUCTB:
|
case JUNGFRAUCTB:
|
||||||
case JUNGFRAU:
|
|
||||||
packetsPerFrame = JCTB_PACKETS_PER_FRAME;
|
packetsPerFrame = JCTB_PACKETS_PER_FRAME;
|
||||||
onePacketSize = JCTB_ONE_PACKET_SIZE;
|
onePacketSize = JCTB_ONE_PACKET_SIZE;
|
||||||
//oneDataSize = Not applicable;
|
//oneDataSize = Not applicable;
|
||||||
@ -730,6 +730,19 @@ int UDPStandardImplementation::setDetectorType(const detectorType d){
|
|||||||
fifoSize = JCTB_FIFO_SIZE;
|
fifoSize = JCTB_FIFO_SIZE;
|
||||||
//footerOffset = Not applicable;
|
//footerOffset = Not applicable;
|
||||||
break;
|
break;
|
||||||
|
case JUNGFRAU:
|
||||||
|
packetsPerFrame = JFRAU_PACKETS_PER_FRAME;
|
||||||
|
onePacketSize = JFRAU_ONE_PACKET_SIZE;
|
||||||
|
oneDataSize = JFRAU_DATA_BYTES;
|
||||||
|
frameSize = JFRAU_BUFFER_SIZE;
|
||||||
|
bufferSize = JFRAU_BUFFER_SIZE;
|
||||||
|
frameIndexMask = JFRAU_FRAME_INDEX_MASK;
|
||||||
|
frameIndexOffset = JFRAU_FRAME_INDEX_OFFSET;
|
||||||
|
packetIndexMask = JFRAU_PACKET_INDEX_MASK;
|
||||||
|
maxPacketsPerFile = JFRAU_MAX_FRAMES_PER_FILE * JFRAU_PACKETS_PER_FRAME;
|
||||||
|
fifoSize = JFRAU_FIFO_SIZE;
|
||||||
|
//footerOffset = Not applicable;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FILE_LOG(logERROR) << "This is an unknown receiver type " << (int)d;
|
FILE_LOG(logERROR) << "This is an unknown receiver type " << (int)d;
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -1297,9 +1310,9 @@ int UDPStandardImplementation::setupWriter(){
|
|||||||
if (rawDataReadyCallBack){
|
if (rawDataReadyCallBack){
|
||||||
FILE_LOG(logINFO) << "Data Write has been defined externally";
|
FILE_LOG(logINFO) << "Data Write has been defined externally";
|
||||||
}
|
}
|
||||||
}else if(!fileWriteEnable)
|
}else if(!fileWriteEnable){
|
||||||
FILE_LOG(logINFO) << "Data will not be saved";
|
FILE_LOG(logINFO) << "Data will not be saved";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//creating first file
|
//creating first file
|
||||||
@ -1571,6 +1584,7 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int lSize, in
|
|||||||
|
|
||||||
int receivedSize = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS + cSize, lSize + cSize);
|
int receivedSize = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS + cSize, lSize + cSize);
|
||||||
|
|
||||||
|
|
||||||
//throw away packets that is not one packet size, need to check status if socket is shut down
|
//throw away packets that is not one packet size, need to check status if socket is shut down
|
||||||
while(status != TRANSMITTING && myDetectorType == EIGER && receivedSize != onePacketSize) {
|
while(status != TRANSMITTING && myDetectorType == EIGER && receivedSize != onePacketSize) {
|
||||||
if(receivedSize != EIGER_HEADER_LENGTH)
|
if(receivedSize != EIGER_HEADER_LENGTH)
|
||||||
@ -1584,13 +1598,19 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int lSize, in
|
|||||||
totalListeningFrameCount[ithread] += (receivedSize/onePacketSize);
|
totalListeningFrameCount[ithread] += (receivedSize/onePacketSize);
|
||||||
|
|
||||||
#ifdef MANUALDEBUG
|
#ifdef MANUALDEBUG
|
||||||
|
if(myDetectorType == JUNGFRAU){
|
||||||
|
jfrau_packet_header_t* header = (jfrau_packet_header_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
|
cprintf(RED,"framenumber:%llu\n",(long long unsigned int)(*( (uint64_t*) header->frameNumber)));
|
||||||
|
cprintf(RED,"packetnumber:%llu\n",(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
|
||||||
|
}else if(myDetectorType == EIGER){
|
||||||
eiger_packet_header_t* header = (eiger_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
|
eiger_packet_header_t* header = (eiger_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(buffer[ithread] + footerOffset + HEADER_SIZE_NUM_TOT_PACKETS);
|
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(buffer[ithread] + footerOffset + HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
cprintf(GREEN,"thread:%d subframenum:%d oldpacketnum:%d new pnum:%d\n",
|
cprintf(GREEN,"thread:%d subframenum:%d oldpacketnum:%d new pnum:%d\n",
|
||||||
ithread,
|
ithread,
|
||||||
(*( (unsigned int*) header->subFameNumber)),
|
(*( (unsigned int*) header->subFrameNumber)),
|
||||||
(*( (uint8_t*) header->dynamicRange)),
|
(*( (uint8_t*) header->dynamicRange)),
|
||||||
(*( (uint16_t*) footer->packetNumber)));
|
(*( (uint16_t*) footer->packetNumber)));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -1609,10 +1629,15 @@ void UDPStandardImplementation::startFrameIndices(int ithread){
|
|||||||
FILE_LOG(logDEBUG) << __AT__ << " called";
|
FILE_LOG(logDEBUG) << __AT__ << " called";
|
||||||
|
|
||||||
//determine startFrameIndex
|
//determine startFrameIndex
|
||||||
|
jfrau_packet_header_t* header=0;
|
||||||
switch(myDetectorType){
|
switch(myDetectorType){
|
||||||
case EIGER:
|
case EIGER:
|
||||||
startFrameIndex = 0; //frame number always resets
|
startFrameIndex = 0; //frame number always resets
|
||||||
break;
|
break;
|
||||||
|
case JUNGFRAU:
|
||||||
|
header = (jfrau_packet_header_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
|
startFrameIndex = (*( (uint64_t*) header->frameNumber));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if(shortFrameEnable < 0){
|
if(shortFrameEnable < 0){
|
||||||
startFrameIndex = (((((uint32_t)(*((uint32_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)
|
startFrameIndex = (((((uint32_t)(*((uint32_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)
|
||||||
@ -1741,8 +1766,10 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int cSiz
|
|||||||
|
|
||||||
int lastPacketOffset; //the offset of the last packet
|
int lastPacketOffset; //the offset of the last packet
|
||||||
uint32_t lastFrameHeader; //frame number of last packet in buffer
|
uint32_t lastFrameHeader; //frame number of last packet in buffer
|
||||||
|
uint64_t lastFrameHeader64; //frame number of last packet in buffer
|
||||||
uint32_t packetCount = (packetsPerFrame/numberofListeningThreads) * numberofJobsPerBuffer; //packets received
|
uint32_t packetCount = (packetsPerFrame/numberofListeningThreads) * numberofJobsPerBuffer; //packets received
|
||||||
cSize = 0; //reset size
|
cSize = 0; //reset size
|
||||||
|
jfrau_packet_header_t* header;
|
||||||
|
|
||||||
switch(myDetectorType){
|
switch(myDetectorType){
|
||||||
case GOTTHARD:
|
case GOTTHARD:
|
||||||
@ -1802,6 +1829,44 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int cSiz
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case JUNGFRAU:
|
||||||
|
lastPacketOffset = (((numberofJobsPerBuffer * packetsPerFrame - 1) * onePacketSize) + HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
|
#ifdef DEBUG4
|
||||||
|
header = (jfrau_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
|
cprintf(BLUE, "Listening_Thread: First Header:%llu\t First Packet:%llu\n",
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
|
||||||
|
#endif
|
||||||
|
header = (jfrau_packet_header_t*) (buffer[ithread]+lastPacketOffset);
|
||||||
|
#ifdef DEBUG4
|
||||||
|
cprintf(BLUE, "Listening_Thread: Last Header:%llu\t Last Packet:%llu\n",
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
|
||||||
|
#endif
|
||||||
|
//jungfrau last packet value is 0, so find the last packet and store the others in a temp storage
|
||||||
|
if(*( (uint64_t*) header->packetNumber)){
|
||||||
|
cprintf(RED,"entering missing packet zone\n");
|
||||||
|
lastFrameHeader64 = (*( (uint64_t*) header->frameNumber));
|
||||||
|
cSize += onePacketSize;
|
||||||
|
lastPacketOffset -= onePacketSize;
|
||||||
|
--packetCount;
|
||||||
|
while (lastFrameHeader64 == (*( (uint64_t*) header->frameNumber))){
|
||||||
|
cSize += onePacketSize;
|
||||||
|
lastPacketOffset -= onePacketSize;
|
||||||
|
header = (jfrau_packet_header_t*) (buffer[ithread]+lastPacketOffset);
|
||||||
|
#ifdef DEBUG4
|
||||||
|
cprintf(RED,"new header:%llu new packet:%llu\n",
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
|
||||||
|
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
|
||||||
|
#endif
|
||||||
|
--packetCount;
|
||||||
|
}
|
||||||
|
memcpy(temp, buffer[ithread]+(lastPacketOffset+onePacketSize), cSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cprintf(RED,"Listening_Thread %d: Error: This detector %s is not implemented in the receiver\n",
|
cprintf(RED,"Listening_Thread %d: Error: This detector %s is not implemented in the receiver\n",
|
||||||
ithread, getDetectorType(myDetectorType).c_str());
|
ithread, getDetectorType(myDetectorType).c_str());
|
||||||
@ -2407,18 +2472,25 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char*
|
|||||||
|
|
||||||
//get frame number (eiger already gets it when it does packet to packet processing)
|
//get frame number (eiger already gets it when it does packet to packet processing)
|
||||||
if(myDetectorType != EIGER){
|
if(myDetectorType != EIGER){
|
||||||
|
if(myDetectorType == JUNGFRAU){
|
||||||
|
jfrau_packet_header_t* header = (jfrau_packet_header_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS);
|
||||||
|
currentFrameNumber = (*( (uint64_t*) header->frameNumber));
|
||||||
|
}else{
|
||||||
uint64_t tempframenumber = ((uint32_t)(*((uint32_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS))));
|
uint64_t tempframenumber = ((uint32_t)(*((uint32_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS))));
|
||||||
//for gotthard and normal frame, increment frame number to separate fnum and pnum
|
//for gotthard and normal frame, increment frame number to separate fnum and pnum
|
||||||
if (myDetectorType == PROPIX ||(myDetectorType == GOTTHARD && shortFrameEnable == -1))
|
if (myDetectorType == PROPIX ||(myDetectorType == GOTTHARD && shortFrameEnable == -1))
|
||||||
tempframenumber++;
|
tempframenumber++;
|
||||||
//get frame number
|
//get frame number
|
||||||
currentFrameNumber = (tempframenumber & frameIndexMask) >> frameIndexOffset;
|
currentFrameNumber = (tempframenumber & frameIndexMask) >> frameIndexOffset;
|
||||||
|
}
|
||||||
//set indices
|
//set indices
|
||||||
acquisitionIndex = currentFrameNumber - startAcquisitionIndex;
|
acquisitionIndex = currentFrameNumber - startAcquisitionIndex;
|
||||||
frameIndex = currentFrameNumber - startFrameIndex;
|
frameIndex = currentFrameNumber - startFrameIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//callback to write data
|
//callback to write data
|
||||||
if (cbAction < DO_EVERYTHING){
|
if (cbAction < DO_EVERYTHING){
|
||||||
switch(myDetectorType){
|
switch(myDetectorType){
|
||||||
|
@ -817,7 +817,7 @@ int slsReceiverTCPIPInterface::start_receiver(){
|
|||||||
// send answer
|
// send answer
|
||||||
socket->SendDataOnly(&ret,sizeof(ret));
|
socket->SendDataOnly(&ret,sizeof(ret));
|
||||||
if(ret==FAIL){
|
if(ret==FAIL){
|
||||||
cprintf(RED, "%s\n", mess);
|
cprintf(RED, "Error:%s\n", mess);
|
||||||
socket->SendDataOnly(mess,sizeof(mess));
|
socket->SendDataOnly(mess,sizeof(mess));
|
||||||
}
|
}
|
||||||
//return ok/fail
|
//return ok/fail
|
||||||
@ -1084,6 +1084,8 @@ int slsReceiverTCPIPInterface::read_frame(){
|
|||||||
return eiger_read_frame();
|
return eiger_read_frame();
|
||||||
case PROPIX:
|
case PROPIX:
|
||||||
return propix_read_frame();
|
return propix_read_frame();
|
||||||
|
case JUNGFRAU:
|
||||||
|
return jungfrau_read_frame();
|
||||||
default:
|
default:
|
||||||
return gotthard_read_frame();
|
return gotthard_read_frame();
|
||||||
}
|
}
|
||||||
@ -1608,22 +1610,6 @@ int slsReceiverTCPIPInterface::propix_read_frame(){
|
|||||||
int slsReceiverTCPIPInterface::eiger_read_frame(){
|
int slsReceiverTCPIPInterface::eiger_read_frame(){
|
||||||
ret=OK;
|
ret=OK;
|
||||||
|
|
||||||
/** structure of an eiger packet*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned char subframenum[4];
|
|
||||||
unsigned char missingpacket[2];
|
|
||||||
unsigned char portnum[1];
|
|
||||||
unsigned char dynamicrange[1];
|
|
||||||
} eiger_packet_header_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned char framenum[6];
|
|
||||||
unsigned char packetnum[2];
|
|
||||||
} eiger_packet_footer_t;
|
|
||||||
|
|
||||||
|
|
||||||
char fName[MAX_STR_LENGTH]="";
|
char fName[MAX_STR_LENGTH]="";
|
||||||
int acquisitionIndex = -1;
|
int acquisitionIndex = -1;
|
||||||
int frameIndex= -1;
|
int frameIndex= -1;
|
||||||
@ -1686,7 +1672,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
|
|||||||
if(dynamicrange == 32){
|
if(dynamicrange == 32){
|
||||||
eiger_packet_header_t* wbuf_header;
|
eiger_packet_header_t* wbuf_header;
|
||||||
wbuf_header = (eiger_packet_header_t*) raw;
|
wbuf_header = (eiger_packet_header_t*) raw;
|
||||||
subframenumber = *( (uint32_t*) wbuf_header->subframenum);
|
subframenumber = *( (uint32_t*) wbuf_header->subFrameNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VERYVERBOSE
|
#ifdef VERYVERBOSE
|
||||||
@ -1866,6 +1852,167 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int slsReceiverTCPIPInterface::jungfrau_read_frame(){
|
||||||
|
ret=OK;
|
||||||
|
|
||||||
|
char fName[MAX_STR_LENGTH]="";
|
||||||
|
int acquisitionIndex = -1;
|
||||||
|
int frameIndex= -1;
|
||||||
|
uint64_t currentIndex=0;
|
||||||
|
uint64_t startAcquisitionIndex=0;
|
||||||
|
uint64_t startFrameIndex=0;
|
||||||
|
strcpy(mess,"Could not read frame\n");
|
||||||
|
|
||||||
|
|
||||||
|
int frameSize = JFRAU_ONE_PACKET_SIZE * packetsPerFrame;
|
||||||
|
int dataSize = JFRAU_ONE_DATA_SIZE * packetsPerFrame;
|
||||||
|
int oneDataSize = JFRAU_ONE_DATA_SIZE;
|
||||||
|
|
||||||
|
char* raw;
|
||||||
|
char* origVal = new char[frameSize];
|
||||||
|
char* retval = new char[dataSize];
|
||||||
|
char* blackpacket = new char[oneDataSize];
|
||||||
|
|
||||||
|
for(int i=0;i<oneDataSize;i++)
|
||||||
|
blackpacket[i]='0';
|
||||||
|
|
||||||
|
|
||||||
|
// execute action if the arguments correctly arrived
|
||||||
|
#ifdef SLS_RECEIVER_UDP_FUNCTIONS
|
||||||
|
|
||||||
|
if (receiverBase == NULL){
|
||||||
|
strcpy(mess,"Receiver not set up\n");
|
||||||
|
ret=FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//send garbage with -1 currentIndex to try again
|
||||||
|
else if(!receiverBase->getFramesCaught()){
|
||||||
|
startAcquisitionIndex=-1;
|
||||||
|
#ifdef VERYVERBOSE
|
||||||
|
cout<<"haven't caught any frame yet"<<endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// acq started
|
||||||
|
else{
|
||||||
|
ret = OK;
|
||||||
|
//read a frame
|
||||||
|
receiverBase->readFrame(fName,&raw,startAcquisitionIndex,startFrameIndex);
|
||||||
|
//send garbage with -1 index to try again
|
||||||
|
if (raw == NULL){
|
||||||
|
startAcquisitionIndex = -1;
|
||||||
|
#ifdef VERYVERBOSE
|
||||||
|
cout<<"data not ready for gui yet"<<endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//proper frame
|
||||||
|
else{
|
||||||
|
//cout<<"**** got proper frame ******"<<endl;
|
||||||
|
memcpy(origVal,raw,frameSize);
|
||||||
|
raw=NULL;
|
||||||
|
|
||||||
|
//fixed frame number
|
||||||
|
jfrau_packet_header_t* header = (jfrau_packet_header_t*) origVal;
|
||||||
|
currentIndex = (*( (uint64_t*) header->frameNumber));
|
||||||
|
#ifdef VERYVERBOSE
|
||||||
|
cout << "currentIndex:" << dec << currentIndex << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int64_t currentPacket = packetsPerFrame-1;
|
||||||
|
int offsetsrc = 0;
|
||||||
|
int offsetdest = 0;
|
||||||
|
uint64_t ifnum=-1;
|
||||||
|
uint64_t ipnum=-1;
|
||||||
|
|
||||||
|
while(currentPacket >= 0){
|
||||||
|
header = (jfrau_packet_header_t*) (origVal + offsetsrc);
|
||||||
|
ifnum = (*( (uint64_t*) header->frameNumber));
|
||||||
|
ipnum = (*( (uint64_t*) header->packetNumber));
|
||||||
|
if(ifnum != currentIndex) {
|
||||||
|
cout << "current packet " << currentPacket << " Wrong Frame number " << ifnum << ", copying blank packet" << endl;
|
||||||
|
memcpy(retval+offsetdest,blackpacket,oneDataSize);
|
||||||
|
offsetdest += oneDataSize;
|
||||||
|
//no need to increase offsetsrc as all packets will be wrong
|
||||||
|
currentPacket--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(ipnum!= currentPacket){
|
||||||
|
cout << "current packet " << currentPacket << " Wrong packet number " << ipnum << ", copying blank packet" << endl;
|
||||||
|
memcpy(retval+offsetdest,blackpacket,oneDataSize);
|
||||||
|
offsetdest += oneDataSize;
|
||||||
|
//no need to increase offsetsrc until we get the right packet
|
||||||
|
currentPacket--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
offsetsrc+=JFRAU_HEADER_LENGTH;
|
||||||
|
memcpy(retval+offsetdest,origVal+offsetsrc,oneDataSize);
|
||||||
|
offsetdest += oneDataSize;
|
||||||
|
offsetsrc += oneDataSize;
|
||||||
|
currentPacket--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
acquisitionIndex = (int)(currentIndex-startAcquisitionIndex);
|
||||||
|
if(acquisitionIndex == -1)
|
||||||
|
startFrameIndex = -1;
|
||||||
|
else
|
||||||
|
frameIndex = (int)(currentIndex-startFrameIndex);
|
||||||
|
#ifdef VERY_VERY_DEBUG
|
||||||
|
cout << "acquisitionIndex calculated is:" << acquisitionIndex << endl;
|
||||||
|
cout << "frameIndex calculated is:" << frameIndex << endl;
|
||||||
|
cout << "currentIndex:" << currentIndex << endl;
|
||||||
|
cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl;
|
||||||
|
cout << "startFrameIndex:" << startFrameIndex << endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VERYVERBOSE
|
||||||
|
if(frameIndex!=-1){
|
||||||
|
cout << "fName:" << fName << endl;
|
||||||
|
cout << "acquisitionIndex:" << acquisitionIndex << endl;
|
||||||
|
cout << "frameIndex:" << frameIndex << endl;
|
||||||
|
cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl;
|
||||||
|
cout << "startFrameIndex:" << startFrameIndex << endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(ret==OK && socket->differentClients){
|
||||||
|
FILE_LOG(logDEBUG) << "Force update";
|
||||||
|
ret=FORCE_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send answer
|
||||||
|
socket->SendDataOnly(&ret,sizeof(ret));
|
||||||
|
if(ret==FAIL){
|
||||||
|
cprintf(RED,"%s\n",mess);
|
||||||
|
socket->SendDataOnly(mess,sizeof(mess));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
socket->SendDataOnly(fName,MAX_STR_LENGTH);
|
||||||
|
socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex));
|
||||||
|
socket->SendDataOnly(&frameIndex,sizeof(frameIndex));
|
||||||
|
socket->SendDataOnly(retval,dataSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] retval;
|
||||||
|
delete [] origVal;
|
||||||
|
delete [] raw;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int slsReceiverTCPIPInterface::set_read_frequency(){
|
int slsReceiverTCPIPInterface::set_read_frequency(){
|
||||||
ret=OK;
|
ret=OK;
|
||||||
int retval=-1;
|
int retval=-1;
|
||||||
@ -2323,7 +2470,8 @@ int slsReceiverTCPIPInterface::set_dynamic_range() {
|
|||||||
packetsPerFrame = EIGER_ONE_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS;
|
packetsPerFrame = EIGER_ONE_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS;
|
||||||
else
|
else
|
||||||
packetsPerFrame = EIGER_TEN_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS;
|
packetsPerFrame = EIGER_TEN_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS;
|
||||||
}
|
}else if (myDetectorType == JUNGFRAU)
|
||||||
|
packetsPerFrame = JFRAU_PACKETS_PER_FRAME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user