:impl of cmake flags and usage of different detector packets.

This commit is contained in:
2021-02-01 16:01:59 +01:00
committed by Leonardo Hax Damiani
parent 11cb0eb3ce
commit ac442f0a00
10 changed files with 59 additions and 32 deletions
+8
View File
@@ -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/)
+7 -9
View File
@@ -3,17 +3,15 @@
#include <cstdint>
#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)
+11 -1
View File
@@ -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)
+7 -7
View File
@@ -3,16 +3,16 @@
#include <cstdint>
#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)
+1
View File
@@ -4,6 +4,7 @@
#include <buffer_config.hpp>
#include <zmq.h>
#include <fstream>
#include <stdexcept>
#include <rapidjson/istreamwrapper.h>
#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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];
+2 -2
View File
@@ -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_++;
}
+20 -11
View File
@@ -1,9 +1,9 @@
#include <cstring>
// #include <jungfrau.hpp>
#include <eiger.hpp>
#include "FrameUdpReceiver.hpp"
#include <ostream>
#include <iostream>
#include <chrono>
#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_) {
+1
View File
@@ -1,5 +1,6 @@
#include <netinet/in.h>
#include <iostream>
#include <stdexcept>
#include "PacketUdpReceiver.hpp"
#include "jungfrau.hpp"
#include <unistd.h>