From 11cb0eb3ce248bd32a0b073fedf4503d62585671 Mon Sep 17 00:00:00 2001 From: Leonardo Hax Damiani Date: Wed, 27 Jan 2021 16:47:49 +0000 Subject: [PATCH] eiger_packet definitions and initial related changes --- .gitmodules | 3 ++ core-buffer/include/eiger.hpp | 38 ++++++++++++++++++++++++ core-buffer/include/formats.hpp | 4 +-- core-buffer/src/RamBuffer.cpp | 3 +- core-buffer/test/test_RamBuffer.cpp | 4 +-- eiger/config_eiger.txt | 8 +++++ eiger/config_udp_recv.json | 5 ++++ eiger/start_eiger_acquisition.sh | 30 +++++++++++++++++++ eiger/start_eiger_server.sh | 22 ++++++++++++++ jf-udp-recv/include/FrameUdpReceiver.hpp | 2 +- jf-udp-recv/src/FrameStats.cpp | 4 +-- jf-udp-recv/src/FrameUdpReceiver.cpp | 21 ++++++++----- slsDetectorPackage | 1 + 13 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 .gitmodules create mode 100644 core-buffer/include/eiger.hpp create mode 100755 eiger/config_eiger.txt create mode 100644 eiger/config_udp_recv.json create mode 100755 eiger/start_eiger_acquisition.sh create mode 100755 eiger/start_eiger_server.sh create mode 160000 slsDetectorPackage diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..23f0b16 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "slsDetectorPackage"] + path = slsDetectorPackage + url = https://github.com/slsdetectorgroup/slsDetectorPackage.git diff --git a/core-buffer/include/eiger.hpp b/core-buffer/include/eiger.hpp new file mode 100644 index 0000000..796eeb2 --- /dev/null +++ b/core-buffer/include/eiger.hpp @@ -0,0 +1,38 @@ +#ifndef EIGER_H +#define EIGER_H + +#include + + +#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 { + uint64_t framenum; + uint32_t exptime; + uint32_t packetnum; + + double bunchid; + uint64_t timestamp; + + uint16_t moduleID; + uint16_t xCoord; + uint16_t yCoord; + uint16_t zCoord; + + uint32_t debug; + uint16_t roundRobin; + uint8_t detectortype; + uint8_t headerVersion; + char data[EIGER_DATA_BYTES_PER_PACKET]; +}; +#pragma pack(pop) + + +#endif diff --git a/core-buffer/include/formats.hpp b/core-buffer/include/formats.hpp index dfa3589..6928931 100644 --- a/core-buffer/include/formats.hpp +++ b/core-buffer/include/formats.hpp @@ -2,7 +2,7 @@ #define SF_DAQ_BUFFER_FORMATS_HPP #include "buffer_config.hpp" -#include "jungfrau.hpp" +#include "eiger.hpp" #pragma pack(push) #pragma pack(1) @@ -27,7 +27,7 @@ struct ImageMetadata { #pragma pack(pop) struct ModuleFrameBuffer { - ModuleFrame module[JUNGFRAU_N_MODULES]; + ModuleFrame module[EIGER_N_MODULES]; }; #pragma pack(push) diff --git a/core-buffer/src/RamBuffer.cpp b/core-buffer/src/RamBuffer.cpp index bcf614b..bd31202 100644 --- a/core-buffer/src/RamBuffer.cpp +++ b/core-buffer/src/RamBuffer.cpp @@ -6,6 +6,7 @@ #include "RamBuffer.hpp" #include "buffer_config.hpp" + using namespace std; using namespace buffer_config; @@ -100,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 == JF_N_PACKETS_PER_FRAME; + frame_meta->n_recv_packets == EIGER_N_PACKETS_PER_FRAME; if (!is_good_frame) { is_good_image = false; diff --git a/core-buffer/test/test_RamBuffer.cpp b/core-buffer/test/test_RamBuffer.cpp index b4b8ddb..e2975b1 100644 --- a/core-buffer/test/test_RamBuffer.cpp +++ b/core-buffer/test/test_RamBuffer.cpp @@ -13,7 +13,7 @@ TEST(RamBuffer, simple_store) frame_meta.pulse_id = 123523; frame_meta.daq_rec = 1234; frame_meta.frame_index = 12342300; - frame_meta.n_recv_packets = JF_N_PACKETS_PER_FRAME; + frame_meta.n_recv_packets = EIGER_N_PACKETS_PER_FRAME; auto frame_buffer = make_unique(MODULE_N_PIXELS); @@ -25,7 +25,7 @@ TEST(RamBuffer, simple_store) for (int i_module=0; i_module" + echo " DETECTOR_NAME: Eiger..." + echo " number_of_cycles : optional, default 100" + exit +fi + +SLS_DET_PACKAGE_PATH='/home/hax_l/software/sf_daq_buffer/slsDetectorPackage/build/bin/' + +DETECTOR=$1 + +n_cycles=10 +if [ $# == 2 ] +then + n_cycles=$2 +fi + + +${SLS_DET_PACKAGE_PATH}sls_detector_put timing trigger +${SLS_DET_PACKAGE_PATH}sls_detector_put triggers ${n_cycles} +${SLS_DET_PACKAGE_PATH}sls_detector_put exptime 0.000005 +${SLS_DET_PACKAGE_PATH}sls_detector_put frames 1 +${SLS_DET_PACKAGE_PATH}sls_detector_put dr 16 +#sls_detector_put ${D}-clearbit to 0x5d 0 # normal mode, not highG0 +${SLS_DET_PACKAGE_PATH}sls_detector_put start + +echo "Now start trigger" diff --git a/eiger/start_eiger_server.sh b/eiger/start_eiger_server.sh new file mode 100755 index 0000000..0b81b47 --- /dev/null +++ b/eiger/start_eiger_server.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# usage ./start_eiger_detector.sh Eiger 1 +if [ $# -lt 1 ] +then + echo "Usage : $0 " + echo " DETECTOR_NAME: Eiger" + echo " tcp port : optional, default 2000" + exit +fi + +SLS_DET_PACKAGE_PATH='/home/hax_l/software/sf_daq_buffer/slsDetectorPackage/build/bin/' + +port=2000 +if [ $# == 2 ] +then + port=$1 +fi + +echo "Starting the server..." +${SLS_DET_PACKAGE_PATH}eigerDetectorServerMaster_virtual -p port + + diff --git a/jf-udp-recv/include/FrameUdpReceiver.hpp b/jf-udp-recv/include/FrameUdpReceiver.hpp index eea4d46..026ab9f 100644 --- a/jf-udp-recv/include/FrameUdpReceiver.hpp +++ b/jf-udp-recv/include/FrameUdpReceiver.hpp @@ -11,7 +11,7 @@ class FrameUdpReceiver { PacketUdpReceiver udp_receiver_; - jungfrau_packet packet_buffer_[buffer_config::BUFFER_UDP_N_RECV_MSG]; + eiger_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 8beb291..40b5906 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 < JF_N_PACKETS_PER_FRAME) { - n_missed_packets_ += JF_N_PACKETS_PER_FRAME - meta.n_recv_packets; + if (meta.n_recv_packets < EIGER_N_PACKETS_PER_FRAME) { + n_missed_packets_ += EIGER_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 1c0833b..1eaced9 100644 --- a/jf-udp-recv/src/FrameUdpReceiver.cpp +++ b/jf-udp-recv/src/FrameUdpReceiver.cpp @@ -1,6 +1,9 @@ #include -#include +// #include +#include #include "FrameUdpReceiver.hpp" +#include +#include using namespace std; using namespace buffer_config; @@ -14,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(jungfrau_packet); + recv_buff_ptr_[i].iov_len = sizeof(eiger_packet); msgs_[i].msg_hdr.msg_iov = &recv_buff_ptr_[i]; msgs_[i].msg_hdr.msg_iovlen = 1; @@ -40,11 +43,11 @@ inline void FrameUdpReceiver::copy_packet_to_buffers( ModuleFrame& metadata, char* frame_buffer, const int i_packet) { size_t frame_buffer_offset = - JUNGFRAU_DATA_BYTES_PER_PACKET * packet_buffer_[i_packet].packetnum; + EIGER_DATA_BYTES_PER_PACKET * packet_buffer_[i_packet].packetnum; memcpy( (void*) (frame_buffer + frame_buffer_offset), packet_buffer_[i_packet].data, - JUNGFRAU_DATA_BYTES_PER_PACKET); + EIGER_DATA_BYTES_PER_PACKET); metadata.n_recv_packets++; } @@ -73,10 +76,10 @@ inline uint64_t FrameUdpReceiver::process_packets( } copy_packet_to_buffers(metadata, frame_buffer, i_packet); - + // Last frame packet received. Frame finished. if (packet_buffer_[i_packet].packetnum == - JF_N_PACKETS_PER_FRAME - 1) + EIGER_N_PACKETS_PER_FRAME - 1) { // Buffer is loaded only if this is not the last message. if (i_packet+1 != packet_buffer_n_packets_) { @@ -86,6 +89,10 @@ 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; } @@ -106,7 +113,7 @@ 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, JUNGFRAU_DATA_BYTES_PER_FRAME); + memset(frame_buffer, 0, EIGER_DATA_BYTES_PER_FRAME); // Happens when last packet from previous frame was missed. if (packet_buffer_loaded_) { diff --git a/slsDetectorPackage b/slsDetectorPackage new file mode 160000 index 0000000..64de9f3 --- /dev/null +++ b/slsDetectorPackage @@ -0,0 +1 @@ +Subproject commit 64de9f3ad0fea061a4aafa7b59a89ef1a33ef4aa