diff --git a/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h b/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h
index c8f39b05e..82e6b30e4 100755
--- a/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h
+++ b/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h
@@ -22,7 +22,7 @@ extern int nframes;
extern char* ramValues;
#define UDP_PACKET_HEADER_VERSION (0x1)
-#define UDP_PACKET_MAX_DATA_BYTES (1280)
+#define UDP_PACKET_DATA_BYTES (1344)
uint32_t udpPacketNumber = 0;
@@ -41,13 +41,6 @@ uint64_t getUDPFrameNumber() {
return udpFrameNumber;
}
-void calculateDataBytesPerSample() {
- dataBytesPerSample = dataBytes / nSamples;
- numSamplesPerPacket = (double)UDP_PACKET_MAX_DATA_BYTES / (double)dataBytesPerSample;
- dataBytesPerPacket = dataBytesPerSample * numSamplesPerPacket;
- FILE_LOG(logDEBUG2, ("Databytes/Sample = %d, numSamples/Packet:%d dataBytes/Packet:%d\n",
- dataBytesPerSample, numSamplesPerPacket, dataBytesPerPacket));
-}
/**
* Called for each UDP packet header creation
@@ -81,35 +74,34 @@ int fillUDPPacket(char* buffer) {
sls_detector_header* header = (sls_detector_header*)(buffer);
- // first packet (update frame number)
+ // update frame number, starts at 1 (reset packet number)
if (udpHeaderOffset == 0) {
- // increment frame number (starts at 1)
++udpFrameNumber;
header->frameNumber = udpFrameNumber;
udpPacketNumber = -1;
}
- // increment udp packet number (starts at 0)
+
+ // increment and copy udp packet number (starts at 0)
++udpPacketNumber;
-
- // copy packet number
- FILE_LOG(logDEBUG2, ("Creating packet number %d (fnum:%lld)\n", udpPacketNumber, (long long int) udpFrameNumber));
header->packetNumber = udpPacketNumber;
+ FILE_LOG(logDEBUG2, ("Creating packet number %d (fnum:%lld)\n", udpPacketNumber, (long long int) udpFrameNumber));
- // calculate number of bytes to write
- int numBytesToWrite = ((udpHeaderOffset + dataBytesPerPacket) <= dataBytes) ?
- dataBytesPerPacket : (dataBytes - udpHeaderOffset);
+ // calculate number of bytes to copy
+ int numBytesToCopy = ((udpHeaderOffset + UDP_PACKET_DATA_BYTES) <= dataBytes) ?
+ UDP_PACKET_DATA_BYTES : (dataBytes - udpHeaderOffset);
+ header->reserved = numBytesToCopy;
- // copy number of samples in current packet
- header->reserved = (numBytesToWrite / dataBytesPerSample);
- if (numBytesToWrite % dataBytesPerSample) {
- FILE_LOG(logERROR, ("fillUDPPacketHeader: numBytesToWrite is not divisible by dataBytesPerSample! Calculation error\n"));
+ // copy data
+ memcpy(buffer + sizeof(sls_detector_header), ramValues + udpHeaderOffset, numBytesToCopy);
+ // pad last packet if extra space
+ if (numBytesToCopy < UDP_PACKET_DATA_BYTES) {
+ int bytes = UDP_PACKET_DATA_BYTES - numBytesToCopy;
+ FILE_LOG(logDEBUG1, ("Padding %d bytes for fnum:%lld pnum:%d\n", bytes, (long long int)udpFrameNumber, udpPacketNumber));
+ memset(buffer + sizeof(sls_detector_header) + numBytesToCopy, 0, bytes);
}
- // copy date
- memcpy(buffer + sizeof(sls_detector_header), ramValues + udpHeaderOffset, numBytesToWrite);
-
// increment offset
- udpHeaderOffset += numBytesToWrite;
+ udpHeaderOffset += numBytesToCopy;
- return numBytesToWrite + sizeof(sls_detector_header);
+ return UDP_PACKET_DATA_BYTES + sizeof(sls_detector_header);
}
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
index 5a0641f96..a7f50e253 100755
--- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
@@ -1498,9 +1498,8 @@ int read_all(int file_des) {
if (createUDPSocket() == OK) {
- char buffer[UDP_PACKET_MAX_DATA_BYTES + sizeof(sls_detector_header)];
+ char buffer[UDP_PACKET_DATA_BYTES + sizeof(sls_detector_header)];
createUDPPacketHeader(buffer, getHardwareSerialNumber());
- calculateDataBytesPerSample();
// keep reading frames
while(readFrameFromFifo() == OK) {
diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp
index fcceb23bf..b90f99dea 100644
--- a/slsDetectorSoftware/slsDetector/slsDetector.cpp
+++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp
@@ -424,8 +424,10 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
thisDetector->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
break;
case CHIPTESTBOARD:
+ thisDetector->receiver_framesPerFile = CTB_MAX_FRAMES_PER_FILE;
+ break;
case MOENCH:
- thisDetector->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
+ thisDetector->receiver_framesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
break;
default:
break;
@@ -2420,10 +2422,11 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) {
thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]);
setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]);
}
+ setDynamicRange(thisDetector->dynamicRange);
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]);
+ enableTenGigabitEthernet(thisDetector->tenGigaEnable);
}
- setDynamicRange(thisDetector->dynamicRange);
if (thisDetector->myDetectorType == EIGER) {
setFlippedData(X, -1);
activate(-1);
diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp
index f55c38ccf..2537f3028 100644
--- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp
+++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp
@@ -354,7 +354,7 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++i;
/*! \page config
- - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. \c Returns \c (int)
+ - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER, Moench and ChipTestBoard only. \c Returns \c (int)
*/
descrToFuncMap[i].m_pFuncName = "tengiga"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdReceiver;
diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h
index 1c3ffc808..97d4c9c2f 100644
--- a/slsReceiverSoftware/include/GeneralData.h
+++ b/slsReceiverSoftware/include/GeneralData.h
@@ -407,110 +407,6 @@ private:
};
-
-
-
-class JCTBData : public GeneralData {
-
-
-private:
- /** Structure of an jungfrau ctb packet header */
- typedef struct {
- unsigned char emptyHeader[6];
- unsigned char reserved[4];
- unsigned char packetNumber[1];
- unsigned char frameNumber[3];
- unsigned char bunchid[8];
- } jfrauctb_packet_header_t;
-
- public:
-
-
-
- /** Bytes Per Adc */
- const static uint32_t bytesPerAdc = 2;
-
- /** Constructor */
- JCTBData(){
- myDetectorType = slsDetectorDefs::CHIPTESTBOARD;
- nPixelsX = 400;
- nPixelsY = 400;
- headerSizeinPacket = 22;
- dataSize = 8192;
- packetSize = headerSizeinPacket + dataSize;
- packetsPerFrame = 1;
- imageSize = nPixelsX * nPixelsY * 2;
- frameIndexMask = 0xFFFFFF;
- maxFramesPerFile = JFCTB_MAX_FRAMES_PER_FILE;
- fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
- defaultFifoDepth = 2500;
- };
-
- /**
- * Get Header Infomation (frame number, packet number)
- * @param index thread index for debugging purposes
- * @param packetData pointer to data
- * @param dynamicRange dynamic range to assign subframenumber if 32 bit mode
- * @param oddStartingPacket odd starting packet (gotthard)
- * @param frameNumber frame number * @param packetNumber packet number
- * @param subFrameNumber sub frame number if applicable
- * @param bunchId bunch id
- */
- void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket,
- uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const {
- subFrameNumber = -1;
- jfrauctb_packet_header_t* header = (jfrauctb_packet_header_t*)(packetData);
- frameNumber = (uint64_t)((*( (uint32_t*) header->frameNumber)) & frameIndexMask);
- packetNumber = (uint32_t)(*( (uint8_t*) header->packetNumber));
- bunchId = (*((uint64_t*) header->bunchid));
- }
-
- /**
- * Setting packets per frame changes member variables
- * @param ns number of samples
- * @param nroich number of channels in roi
- */
- void setNumberofSamples(const uint64_t ns, uint32_t nroich) {
- packetsPerFrame = ceil(double(2 * (nroich ? nroich : 32) * ns) / dataSize);
- nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */
- imageSize = nPixelsX * nPixelsY * 2;
- };
-
- /**
- * Print all variables
- */
- void Print(TLogLevel level = logDEBUG1) const {
- GeneralData::Print(level);
- FILE_LOG(logINFO) << "Bytes Per Adc: " << bytesPerAdc;
- }
-};
-
-
-class JungfrauData : public GeneralData {
-
- public:
-
- /** Constructor */
- JungfrauData(){
- myDetectorType = slsDetectorDefs::JUNGFRAU;
- nPixelsX = (256*4);
- nPixelsY = 512;
- emptyHeader = 6;
- headerSizeinPacket = emptyHeader + sizeof(slsDetectorDefs::sls_detector_header);
- dataSize = 8192;
- packetSize = headerSizeinPacket + dataSize;
- packetsPerFrame = 128;
- imageSize = dataSize*packetsPerFrame;
- maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
- fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
- defaultFifoDepth = 2500;
- standardheader = true;
- defaultUdpSocketBufferSize = (2000 * 1024 * 1024);
- };
-
-};
-
-
class EigerData : public GeneralData {
public:
@@ -586,3 +482,168 @@ class EigerData : public GeneralData {
};
+
+
+class JungfrauData : public GeneralData {
+
+ public:
+
+ /** Constructor */
+ JungfrauData(){
+ myDetectorType = slsDetectorDefs::JUNGFRAU;
+ nPixelsX = (256*4);
+ nPixelsY = 512;
+ emptyHeader = 6;
+ headerSizeinPacket = emptyHeader + sizeof(slsDetectorDefs::sls_detector_header);
+ dataSize = 8192;
+ packetSize = headerSizeinPacket + dataSize;
+ packetsPerFrame = 128;
+ imageSize = dataSize*packetsPerFrame;
+ maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
+ fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
+ defaultFifoDepth = 2500;
+ standardheader = true;
+ defaultUdpSocketBufferSize = (2000 * 1024 * 1024);
+ };
+
+};
+
+
+
+class ChipTestBoardData : public GeneralData {
+
+ public:
+
+
+ /** Constructor */
+ ChipTestBoardData(){
+ myDetectorType = slsDetectorDefs::CHIPTESTBOARD;
+ nPixelsX = 36;
+ nPixelsY = 1;
+ headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
+ dataSize = 0; // to be calculatedd
+ packetSize = headerSizeinPacket + dataSize;
+ packetsPerFrame = 0; // to be calculated
+ imageSize = nPixelsX * nPixelsY * 2;
+ maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
+ fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
+ defaultFifoDepth = 2500;
+ standardheader = true;
+ };
+
+ /**
+ * Setting packets per frame changes member variables
+ * @param ns number of samples
+ * @param nroich number of channels in roi
+ */
+ void setNumberofSamples(const uint64_t ns, uint32_t nroich) {
+ packetsPerFrame = ceil(double(2 * (nroich ? nroich : 32) * ns) / dataSize);
+ nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */
+ imageSize = nPixelsX * nPixelsY * 2;
+ };
+
+ /**
+ * Setting ten giga enable changes member variables
+ * @param tgEnable true if 10GbE is enabled, else false
+ * @param dr dynamic range
+ */
+ void SetTenGigaEnable(bool tgEnable, int dr) {
+ dataSize = (tgEnable ? 4096 : 1024);
+ packetSize = headerSizeinPacket + dataSize;
+ packetsPerFrame = (tgEnable ? 4 : 16) * dr;
+ imageSize = dataSize*packetsPerFrame;
+ };
+
+};
+
+
+class MoenchData : public GeneralData {
+
+
+private:
+ /** Structure of an jungfrau ctb packet header */
+ typedef struct {
+ unsigned char emptyHeader[6];
+ unsigned char reserved[4];
+ unsigned char packetNumber[1];
+ unsigned char frameNumber[3];
+ unsigned char bunchid[8];
+ } jfrauctb_packet_header_t;
+
+ public:
+
+
+
+ /** Bytes Per Adc */
+ const static uint32_t bytesPerAdc = 2;
+
+ /** Constructor */
+ MoenchData(){
+ myDetectorType = slsDetectorDefs::MOENCH;
+ nPixelsX = 400;
+ nPixelsY = 400;
+ headerSizeinPacket = 22;
+ dataSize = 8192;
+ packetSize = headerSizeinPacket + dataSize;
+ packetsPerFrame = 1;
+ imageSize = nPixelsX * nPixelsY * 2;
+ frameIndexMask = 0xFFFFFF;
+ maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
+ fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
+ defaultFifoDepth = 2500;
+ };
+
+ /**
+ * Get Header Infomation (frame number, packet number)
+ * @param index thread index for debugging purposes
+ * @param packetData pointer to data
+ * @param dynamicRange dynamic range to assign subframenumber if 32 bit mode
+ * @param oddStartingPacket odd starting packet (gotthard)
+ * @param frameNumber frame number * @param packetNumber packet number
+ * @param subFrameNumber sub frame number if applicable
+ * @param bunchId bunch id
+ */
+ void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket,
+ uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const {
+ subFrameNumber = -1;
+ jfrauctb_packet_header_t* header = (jfrauctb_packet_header_t*)(packetData);
+ frameNumber = (uint64_t)((*( (uint32_t*) header->frameNumber)) & frameIndexMask);
+ packetNumber = (uint32_t)(*( (uint8_t*) header->packetNumber));
+ bunchId = (*((uint64_t*) header->bunchid));
+ }
+
+ /**
+ * Setting packets per frame changes member variables
+ * @param ns number of samples
+ * @param nroich number of channels in roi
+ */
+ void setNumberofSamples(const uint64_t ns, uint32_t nroich) {
+ packetsPerFrame = ceil(double(2 * (nroich ? nroich : 32) * ns) / dataSize);
+ nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */
+ imageSize = nPixelsX * nPixelsY * 2;
+ };
+
+ /**
+ * Setting ten giga enable changes member variables
+ * @param tgEnable true if 10GbE is enabled, else false
+ * @param dr dynamic range
+ */
+ void SetTenGigaEnable(bool tgEnable, int dr) {
+ dataSize = (tgEnable ? 4096 : 1024);
+ packetSize = headerSizeinPacket + dataSize;
+ packetsPerFrame = (tgEnable ? 4 : 16) * dr;
+ imageSize = dataSize*packetsPerFrame;
+ };
+
+ /**
+ * Print all variables
+ */
+ void Print(TLogLevel level = logDEBUG1) const {
+ GeneralData::Print(level);
+ FILE_LOG(logINFO) << "Bytes Per Adc: " << bytesPerAdc;
+ }
+};
+
+
+
+
diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
index 2dc315d02..1aae6e77c 100644
--- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp
+++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
@@ -844,10 +844,11 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) {
//set detector specific variables
switch(myDetectorType) {
- case GOTTHARD: generalData = new GotthardData(); break;
- case EIGER: generalData = new EigerData(); break;
- case CHIPTESTBOARD: generalData = new JCTBData(); break;
- case JUNGFRAU: generalData = new JungfrauData(); break;
+ case GOTTHARD: generalData = new GotthardData(); break;
+ case EIGER: generalData = new EigerData(); break;
+ case JUNGFRAU: generalData = new JungfrauData(); break;
+ case CHIPTESTBOARD: generalData = new ChipTestBoardData(); break;
+ case MOENCH: generalData = new MoenchData(); break;
default: break;
}
numThreads = generalData->threadsPerReceiver;
diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
index f85df5fcf..abfa3ae16 100644
--- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
+++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
@@ -1247,7 +1247,7 @@ int slsReceiverTCPIPInterface::enable_tengiga() {
if (interface->Server_ReceiveArg(ret, mess, &val, sizeof(val), true, receiver) == FAIL)
return FAIL;
- if (myDetectorType != EIGER)
+ if (myDetectorType != EIGER && myDetectorType != CHIPTESTBOARD && myDetectorType != MOENCH)
functionNotImplemented();
// base object not null
diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h
index b7d7cc2de..50062c781 100755
--- a/slsSupportLib/include/sls_detector_defs.h
+++ b/slsSupportLib/include/sls_detector_defs.h
@@ -55,11 +55,10 @@ typedef int int32_t;
#define MAX_STR_LENGTH 1000
#define MAX_FRAMES_PER_FILE 20000
#define SHORT_MAX_FRAMES_PER_FILE 100000
-#define MOENCH_MAX_FRAMES_PER_FILE 1000
+#define MOENCH_MAX_FRAMES_PER_FILE 100000
#define EIGER_MAX_FRAMES_PER_FILE 10000
#define JFRAU_MAX_FRAMES_PER_FILE 10000
-#define JFCTB_MAX_FRAMES_PER_FILE 100000
-
+#define CTB_MAX_FRAMES_PER_FILE 20000
#define DEFAULT_STREAMING_TIMER_IN_MS 200