From 66afc2da315902341439fc3501d37618cc739a14 Mon Sep 17 00:00:00 2001 From: Leonardo Hax Damiani Date: Mon, 1 Feb 2021 16:01:59 +0100 Subject: [PATCH] impl of cmake flags and usage of different detector packets. --- core-buffer/CMakeLists.txt | 8 ++++++ core-buffer/include/eiger.hpp | 16 ++++++------ core-buffer/include/formats.hpp | 12 ++++++++- core-buffer/include/jungfrau.hpp | 14 +++++------ core-buffer/src/BufferUtils.cpp | 1 + core-buffer/src/RamBuffer.cpp | 2 +- jf-udp-recv/include/FrameUdpReceiver.hpp | 2 +- jf-udp-recv/src/FrameStats.cpp | 4 +-- jf-udp-recv/src/FrameUdpReceiver.cpp | 31 +++++++++++++++--------- jf-udp-recv/src/PacketUdpReceiver.cpp | 1 + 10 files changed, 59 insertions(+), 32 deletions(-) diff --git a/core-buffer/CMakeLists.txt b/core-buffer/CMakeLists.txt index e87a3b2..0e02d76 100644 --- a/core-buffer/CMakeLists.txt +++ b/core-buffer/CMakeLists.txt @@ -8,5 +8,13 @@ target_include_directories(core-buffer-lib PUBLIC include/) target_link_libraries(core-buffer-lib external) +if (USE_EIGER) + target_compile_definitions(core-buffer-lib INTERFACE -DUSE_EIGER) +endif (USE_EIGER) + +if (DEBUG_OUTPUT) + target_compile_definitions(core-buffer-lib PUBLIC -DDEBUG_OUTPUT) +endif(DEBUG_OUTPUT) + enable_testing() add_subdirectory(test/) \ No newline at end of file diff --git a/core-buffer/include/eiger.hpp b/core-buffer/include/eiger.hpp index 796eeb2..b256e28 100644 --- a/core-buffer/include/eiger.hpp +++ b/core-buffer/include/eiger.hpp @@ -3,17 +3,15 @@ #include +#define N_MODULES 1 +#define BYTES_PER_PACKET 1072 +#define DATA_BYTES_PER_PACKET 1024 +#define N_PACKETS_PER_FRAME 128 +#define DATA_BYTES_PER_FRAME 131072 -#define EIGER_N_MODULES 1 -#define EIGER_BYTES_PER_PACKET 1072 -#define EIGER_DATA_BYTES_PER_PACKET 1024 -#define EIGER_N_PACKETS_PER_FRAME 128 -#define EIGER_DATA_BYTES_PER_FRAME 131072 - -// 48 bytes + 8192 bytes = 8240 bytes #pragma pack(push) #pragma pack(2) -struct eiger_packet { +struct det_packet { uint64_t framenum; uint32_t exptime; uint32_t packetnum; @@ -30,7 +28,7 @@ struct eiger_packet { uint16_t roundRobin; uint8_t detectortype; uint8_t headerVersion; - char data[EIGER_DATA_BYTES_PER_PACKET]; + char data[DATA_BYTES_PER_PACKET]; }; #pragma pack(pop) diff --git a/core-buffer/include/formats.hpp b/core-buffer/include/formats.hpp index 6928931..fe29600 100644 --- a/core-buffer/include/formats.hpp +++ b/core-buffer/include/formats.hpp @@ -2,7 +2,17 @@ #define SF_DAQ_BUFFER_FORMATS_HPP #include "buffer_config.hpp" + +#ifndef USE_EIGER +#include "jungfrau.hpp" +#else #include "eiger.hpp" +#endif + +#ifdef DEBUG_OUTPUT +#define EIGER_DATA_BYTES_PER_PACKET_VALIDATION 131072 +#define JUNGFRAU_DATA_BYTES_PER_PACKET_VALIDATION 1048576 +#endif #pragma pack(push) #pragma pack(1) @@ -27,7 +37,7 @@ struct ImageMetadata { #pragma pack(pop) struct ModuleFrameBuffer { - ModuleFrame module[EIGER_N_MODULES]; + ModuleFrame module[N_MODULES]; }; #pragma pack(push) diff --git a/core-buffer/include/jungfrau.hpp b/core-buffer/include/jungfrau.hpp index 99156e6..a6313c4 100644 --- a/core-buffer/include/jungfrau.hpp +++ b/core-buffer/include/jungfrau.hpp @@ -3,16 +3,16 @@ #include -#define JUNGFRAU_N_MODULES 32 -#define JUNGFRAU_BYTES_PER_PACKET 8240 -#define JUNGFRAU_DATA_BYTES_PER_PACKET 8192 -#define JF_N_PACKETS_PER_FRAME 128 -#define JUNGFRAU_DATA_BYTES_PER_FRAME 1048576 +#define N_MODULES 32 +#define BYTES_PER_PACKET 8240 +#define DATA_BYTES_PER_PACKET 8192 +#define N_PACKETS_PER_FRAME 128 +#define DATA_BYTES_PER_FRAME 1048576 // 48 bytes + 8192 bytes = 8240 bytes #pragma pack(push) #pragma pack(2) -struct jungfrau_packet { +struct det_packet { uint64_t framenum; uint32_t exptime; uint32_t packetnum; @@ -29,7 +29,7 @@ struct jungfrau_packet { uint16_t roundRobin; uint8_t detectortype; uint8_t headerVersion; - char data[JUNGFRAU_DATA_BYTES_PER_PACKET]; + char data[DATA_BYTES_PER_PACKET]; }; #pragma pack(pop) diff --git a/core-buffer/src/BufferUtils.cpp b/core-buffer/src/BufferUtils.cpp index 4e861df..3d12259 100644 --- a/core-buffer/src/BufferUtils.cpp +++ b/core-buffer/src/BufferUtils.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/core-buffer/src/RamBuffer.cpp b/core-buffer/src/RamBuffer.cpp index bd31202..3b04783 100644 --- a/core-buffer/src/RamBuffer.cpp +++ b/core-buffer/src/RamBuffer.cpp @@ -101,7 +101,7 @@ char* RamBuffer::read_image(const uint64_t pulse_id, ModuleFrame *frame_meta = src_meta + i_module; auto is_good_frame = - frame_meta->n_recv_packets == EIGER_N_PACKETS_PER_FRAME; + frame_meta->n_recv_packets == N_PACKETS_PER_FRAME; if (!is_good_frame) { is_good_image = false; diff --git a/jf-udp-recv/include/FrameUdpReceiver.hpp b/jf-udp-recv/include/FrameUdpReceiver.hpp index 026ab9f..fd24a23 100644 --- a/jf-udp-recv/include/FrameUdpReceiver.hpp +++ b/jf-udp-recv/include/FrameUdpReceiver.hpp @@ -11,7 +11,7 @@ class FrameUdpReceiver { PacketUdpReceiver udp_receiver_; - eiger_packet packet_buffer_[buffer_config::BUFFER_UDP_N_RECV_MSG]; + det_packet packet_buffer_[buffer_config::BUFFER_UDP_N_RECV_MSG]; iovec recv_buff_ptr_[buffer_config::BUFFER_UDP_N_RECV_MSG]; mmsghdr msgs_[buffer_config::BUFFER_UDP_N_RECV_MSG]; sockaddr_in sock_from_[buffer_config::BUFFER_UDP_N_RECV_MSG]; diff --git a/jf-udp-recv/src/FrameStats.cpp b/jf-udp-recv/src/FrameStats.cpp index 40b5906..95d1931 100644 --- a/jf-udp-recv/src/FrameStats.cpp +++ b/jf-udp-recv/src/FrameStats.cpp @@ -25,8 +25,8 @@ void FrameStats::reset_counters() void FrameStats::record_stats(const ModuleFrame &meta) { - if (meta.n_recv_packets < EIGER_N_PACKETS_PER_FRAME) { - n_missed_packets_ += EIGER_N_PACKETS_PER_FRAME - meta.n_recv_packets; + if (meta.n_recv_packets < N_PACKETS_PER_FRAME) { + n_missed_packets_ += N_PACKETS_PER_FRAME - meta.n_recv_packets; n_corrupted_frames_++; } diff --git a/jf-udp-recv/src/FrameUdpReceiver.cpp b/jf-udp-recv/src/FrameUdpReceiver.cpp index 1eaced9..6609c8d 100644 --- a/jf-udp-recv/src/FrameUdpReceiver.cpp +++ b/jf-udp-recv/src/FrameUdpReceiver.cpp @@ -1,9 +1,9 @@ #include -// #include -#include #include "FrameUdpReceiver.hpp" #include #include +#include +#include "date.h" using namespace std; using namespace buffer_config; @@ -17,7 +17,7 @@ FrameUdpReceiver::FrameUdpReceiver( for (int i = 0; i < BUFFER_UDP_N_RECV_MSG; i++) { recv_buff_ptr_[i].iov_base = (void*) &(packet_buffer_[i]); - recv_buff_ptr_[i].iov_len = sizeof(eiger_packet); + recv_buff_ptr_[i].iov_len = sizeof(det_packet); msgs_[i].msg_hdr.msg_iov = &recv_buff_ptr_[i]; msgs_[i].msg_hdr.msg_iovlen = 1; @@ -43,11 +43,11 @@ inline void FrameUdpReceiver::copy_packet_to_buffers( ModuleFrame& metadata, char* frame_buffer, const int i_packet) { size_t frame_buffer_offset = - EIGER_DATA_BYTES_PER_PACKET * packet_buffer_[i_packet].packetnum; + DATA_BYTES_PER_PACKET * packet_buffer_[i_packet].packetnum; memcpy( (void*) (frame_buffer + frame_buffer_offset), packet_buffer_[i_packet].data, - EIGER_DATA_BYTES_PER_PACKET); + DATA_BYTES_PER_PACKET); metadata.n_recv_packets++; } @@ -79,7 +79,7 @@ inline uint64_t FrameUdpReceiver::process_packets( // Last frame packet received. Frame finished. if (packet_buffer_[i_packet].packetnum == - EIGER_N_PACKETS_PER_FRAME - 1) + N_PACKETS_PER_FRAME - 1) { // Buffer is loaded only if this is not the last message. if (i_packet+1 != packet_buffer_n_packets_) { @@ -89,10 +89,6 @@ inline uint64_t FrameUdpReceiver::process_packets( // If i_packet is the last packet the buffer is empty. } else { - cout << "[FrameUdpReceiver::process_packets] Received final packet of frame: "; - cout << packet_buffer_[i_packet].framenum; - cout << endl; - packet_buffer_loaded_ = false; packet_buffer_offset_ = 0; } @@ -113,8 +109,21 @@ uint64_t FrameUdpReceiver::get_frame_from_udp( // Reset the metadata and frame buffer for the next frame. metadata.pulse_id = 0; metadata.n_recv_packets = 0; - memset(frame_buffer, 0, EIGER_DATA_BYTES_PER_FRAME); + memset(frame_buffer, 0, DATA_BYTES_PER_FRAME); + #ifdef DEBUG_OUTPUT + using namespace date; + cout << " [" << std::chrono::system_clock::now(); + cout << "] [FrameUdpReceiver::get_frame_from_udp] Detector frame:"; + if (JUNGFRAU_DATA_BYTES_PER_PACKET_VALIDATION == DATA_BYTES_PER_FRAME) { + cout << " Jungfrau (current DATA_BYTES_PER_FRAME: "; + }else if(EIGER_DATA_BYTES_PER_PACKET_VALIDATION == DATA_BYTES_PER_FRAME){ + cout << " Eiger (current DATA_BYTES_PER_FRAME: "; + }; + cout << DATA_BYTES_PER_FRAME; + cout << ")."; + cout << endl; + #endif // Happens when last packet from previous frame was missed. if (packet_buffer_loaded_) { diff --git a/jf-udp-recv/src/PacketUdpReceiver.cpp b/jf-udp-recv/src/PacketUdpReceiver.cpp index bbf5820..d237e20 100644 --- a/jf-udp-recv/src/PacketUdpReceiver.cpp +++ b/jf-udp-recv/src/PacketUdpReceiver.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "PacketUdpReceiver.hpp" #include "jungfrau.hpp" #include