diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index d7357ae17..9139ee1f7 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -2274,7 +2274,7 @@ void *start_timer(void *arg) { int datasize = imagesize; int packetsize = datasize + sizeof(sls_detector_header); int vetodatasize = VETO_DATA_SIZE; - int vetopacketsize = vetodatasize + sizeof(sls_detector_header); + int vetopacketsize = vetodatasize + VETO_HEADER_SIZE; // Generate data char imageData[imagesize]; @@ -2331,21 +2331,16 @@ void *start_timer(void *arg) { sendUDPPacket(0, packetData, packetsize); // second interface (veto) - char packetData2[packetsize]; - memset(packetData2, 0, packetsize); + char packetData2[vetopacketsize]; + memset(packetData2, 0, vetopacketsize); if (numInterfaces == 2) { // set header - sls_detector_header *header = - (sls_detector_header *)(packetData2); - header->detType = (uint16_t)myDetectorType; - header->version = SLS_DETECTOR_HEADER_VERSION - 1; + veto_header *header = (veto_header *)(packetData2); header->frameNumber = frameHeaderNr; - header->packetNumber = 0; - header->modId = 0; - header->row = detPos[X]; - header->column = detPos[Y]; + header->bunchId = 0; + header->reserved = 0; // fill data - memcpy(packetData2 + sizeof(sls_detector_header), vetoData, + memcpy(packetData2 + VETO_HEADER_SIZE, vetoData, vetodatasize); // send 1 packet = 1 frame sendUDPPacket(1, packetData2, vetopacketsize); diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index dad6a1a51..09199d818 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -57,6 +57,13 @@ #define READOUT_PLL_VCO_FREQ_HZ (866666688) // 866 MHz #define SYSTEM_PLL_VCO_FREQ_HZ (722222224) // 722 MHz #define VETO_DATA_SIZE (160) +#define VETO_HEADER_SIZE (24) +typedef struct { + uint64_t frameNumber; + uint64_t bunchId; + uint64_t reserved; +} veto_header; + /** Other Definitions */ #define BIT16_MASK (0xFFFF) diff --git a/slsReceiverSoftware/src/GeneralData.h b/slsReceiverSoftware/src/GeneralData.h index 21e3591f3..53ef917b8 100644 --- a/slsReceiverSoftware/src/GeneralData.h +++ b/slsReceiverSoftware/src/GeneralData.h @@ -50,6 +50,7 @@ class GeneralData { uint32_t vetoDataSize{0}; uint32_t vetoPacketSize{0}; uint32_t vetoImageSize{0}; + uint32_t vetoHsize{0}; GeneralData(){}; virtual ~GeneralData(){}; @@ -61,14 +62,17 @@ class GeneralData { * @param oddStartingPacket odd starting packet (gotthard) * @param frameNumber frame number * @param packetNumber packet number + * @param bunchId bunch Id */ virtual void GetHeaderInfo(int index, char *packetData, bool oddStartingPacket, uint64_t &frameNumber, - uint32_t &packetNumber) const { + uint32_t &packetNumber, + uint64_t &bunchId) const { frameNumber = ((uint32_t)(*((uint32_t *)(packetData)))); frameNumber++; packetNumber = frameNumber & packetIndexMask; frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset; + bunchId = -1; } /** @@ -194,9 +198,11 @@ class GotthardData : public GeneralData { * @param oddStartingPacket odd starting packet (gotthard) * @param frameNumber frame number * @param packetNumber packet number + * @param bunchId bunch Id */ void GetHeaderInfo(int index, char *packetData, bool oddStartingPacket, - uint64_t &frameNumber, uint32_t &packetNumber) const { + uint64_t &frameNumber, uint32_t &packetNumber, + uint64_t &bunchId) const { if (nPixelsX == 1280) { frameNumber = *reinterpret_cast(packetData); if (oddStartingPacket) @@ -207,6 +213,7 @@ class GotthardData : public GeneralData { frameNumber = *reinterpret_cast(packetData); packetNumber = 0; } + bunchId = -1; } /** @@ -490,6 +497,7 @@ class Gotthard2Data : public GeneralData { vetoDataSize = 160; vetoPacketSize = headerSizeinPacket + vetoDataSize; vetoImageSize = vetoDataSize * packetsPerFrame; + vetoHsize = 24; }; /** @@ -506,6 +514,23 @@ class Gotthard2Data : public GeneralData { threadsPerReceiver = 1; } }; + + /** + * Get Header Infomation (frame number, packet number) for veto packets + * @param index thread index for debugging purposes + * @param packetData pointer to data + * @param oddStartingPacket odd starting packet (gotthard) + * @param frameNumber frame number + * @param packetNumber packet number + * @param bunchId bunch Id + */ + void GetHeaderInfo(int index, char *packetData, bool oddStartingPacket, + uint64_t &frameNumber, uint32_t &packetNumber, + uint64_t &bunchId) const { + frameNumber = *reinterpret_cast(packetData); + bunchId = *reinterpret_cast(packetData + 8); + packetNumber = 0; + } }; class ChipTestBoardData : public GeneralData { diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 0caacb1ca..ffaf46fca 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -270,22 +270,25 @@ uint32_t Listener::ListenToAnImage(char *buf) { int rc = 0; uint64_t fnum = 0; uint32_t pnum = 0; + uint64_t bnum = 0; uint32_t numpackets = 0; uint32_t dsize = generalData->dataSize; uint32_t imageSize = generalData->imageSize; uint32_t packetSize = generalData->packetSize; + uint32_t hsize = generalData->headerSizeinPacket; + uint32_t fifohsize = generalData->fifoBufferHeaderSize; + bool standardheader = generalData->standardheader; if (myDetectorType == GOTTHARD2 && index != 0) { dsize = generalData->vetoDataSize; imageSize = generalData->vetoImageSize; packetSize = generalData->vetoPacketSize; + hsize = generalData->vetoHsize; + standardheader = false; } - uint32_t hsize = generalData->headerSizeinPacket; - uint32_t fifohsize = generalData->fifoBufferHeaderSize; uint32_t pperFrame = generalData->packetsPerFrame; bool isHeaderEmpty = true; sls_detector_header *old_header = nullptr; sls_receiver_header *new_header = nullptr; - bool standardheader = generalData->standardheader; uint32_t corrected_dsize = dsize - ((pperFrame * dsize) - imageSize); // reset to -1 @@ -329,7 +332,7 @@ uint32_t Listener::ListenToAnImage(char *buf) { // ----------------------------------------------------------------------------- else { generalData->GetHeaderInfo(index, &carryOverPacket[0], - oddStartingPacket, fnum, pnum); + oddStartingPacket, fnum, pnum, bnum); } //------------------------------------------------------------------------------------------------------------ if (fnum != currentFrameIndex) { @@ -403,6 +406,7 @@ uint32_t Listener::ListenToAnImage(char *buf) { // ------------------------------------------------------------------------------ else { new_header->detHeader.frameNumber = fnum; + new_header->detHeader.bunchId = bnum; new_header->detHeader.row = row; new_header->detHeader.column = column; new_header->detHeader.detType = @@ -470,7 +474,7 @@ uint32_t Listener::ListenToAnImage(char *buf) { } generalData->GetHeaderInfo(index, &listeningPacket[0], - oddStartingPacket, fnum, pnum); + oddStartingPacket, fnum, pnum, bnum); } //------------------------------------------------------------------------------------------------------------ @@ -569,6 +573,7 @@ uint32_t Listener::ListenToAnImage(char *buf) { // ------------------------------------------------------------------------------ else { new_header->detHeader.frameNumber = fnum; + new_header->detHeader.bunchId = bnum; new_header->detHeader.row = row; new_header->detHeader.column = column; new_header->detHeader.detType =