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