mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-06-04 17:08:39 +02:00
:impl of cmake flags and usage of different detector packets.
This commit is contained in:
@@ -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/)
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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_++;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
#include <netinet/in.h>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include "PacketUdpReceiver.hpp"
|
||||
#include "jungfrau.hpp"
|
||||
#include <unistd.h>
|
||||
|
||||
Reference in New Issue
Block a user