diff --git a/core-buffer/include/BufferUdpReceiver.hpp b/core-buffer/include/BufferUdpReceiver.hpp index b2e1697..999222f 100644 --- a/core-buffer/include/BufferUdpReceiver.hpp +++ b/core-buffer/include/BufferUdpReceiver.hpp @@ -10,13 +10,16 @@ class BufferUdpReceiver { UdpReceiver udp_receiver_; jungfrau_packet packet_buffer_ = {}; + bool packet_buffer_loaded_ = false; inline void init_frame(ModuleFrame& frame_metadata); + inline void copy_packet_to_buffers( + ModuleFrame& metadata, char* frame_buffer); public: BufferUdpReceiver(const uint16_t port, const int source_id); virtual ~BufferUdpReceiver(); - void get_frame_from_udp(ModuleFrame& metadata, char* frame_buffer); + uint64_t get_frame_from_udp(ModuleFrame& metadata, char* frame_buffer); }; diff --git a/core-buffer/src/BufferUdpReceiver.cpp b/core-buffer/src/BufferUdpReceiver.cpp index d67c142..922a6a9 100644 --- a/core-buffer/src/BufferUdpReceiver.cpp +++ b/core-buffer/src/BufferUdpReceiver.cpp @@ -1,5 +1,9 @@ #include +#include #include "BufferUdpReceiver.hpp" +#include + +using namespace std; BufferUdpReceiver::BufferUdpReceiver( const uint16_t port, @@ -13,7 +17,7 @@ BufferUdpReceiver::~BufferUdpReceiver() { udp_receiver_.disconnect(); } -inline void BufferUdpReceiver::init_frame (ModuleFrame& frame_metadata) +inline void BufferUdpReceiver::init_frame(ModuleFrame& frame_metadata) { frame_metadata.pulse_id = packet_buffer_.bunchid; frame_metadata.frame_index = packet_buffer_.framenum; @@ -21,7 +25,20 @@ inline void BufferUdpReceiver::init_frame (ModuleFrame& frame_metadata) frame_metadata.module_id = (int64_t) source_id_; } -void BufferUdpReceiver::get_frame_from_udp( +inline void BufferUdpReceiver::copy_packet_to_buffers( + ModuleFrame& metadata, char* frame_buffer) +{ + size_t frame_buffer_offset = + JUNGFRAU_DATA_BYTES_PER_PACKET * packet_buffer_.packetnum; + memcpy( + (void*) (frame_buffer + frame_buffer_offset), + packet_buffer_.data, + JUNGFRAU_DATA_BYTES_PER_PACKET); + + metadata.n_received_packets++; +} + +uint64_t BufferUdpReceiver::get_frame_from_udp( ModuleFrame& metadata, char* frame_buffer) { // Reset the metadata and frame buffer for the next frame. @@ -29,18 +46,12 @@ void BufferUdpReceiver::get_frame_from_udp( metadata.n_received_packets = 0; memset(frame_buffer, 0, JUNGFRAU_DATA_BYTES_PER_FRAME); - // The buffer contains a valid packet. Use it. - if (packet_buffer_.bunchid != 0) { + // Happens when last packet from previous frame was missed. + if (packet_buffer_loaded_) { + packet_buffer_loaded_ = false; + init_frame(metadata); - - size_t frame_buffer_offset = - JUNGFRAU_DATA_BYTES_PER_PACKET * packet_buffer_.packetnum; - memcpy( - (void*) (frame_buffer + frame_buffer_offset), - packet_buffer_.data, - JUNGFRAU_DATA_BYTES_PER_PACKET); - - metadata.n_received_packets++; + copy_packet_to_buffers(metadata, frame_buffer); } while (true) { @@ -55,26 +66,22 @@ void BufferUdpReceiver::get_frame_from_udp( if (metadata.pulse_id == 0) { init_frame(metadata); - // Happens if the last packet from the previous frame gets lost. + // Happens if the last packet from the previous frame gets lost. } else if (metadata.pulse_id != packet_buffer_.bunchid) { - return; + cout << "source_id " << source_id_ << " missing last packet"; + cout << " pulse_id " << metadata.pulse_id << endl; + + packet_buffer_loaded_ = true; + + return metadata.pulse_id; } - size_t frame_buffer_offset = - JUNGFRAU_DATA_BYTES_PER_PACKET * packet_buffer_.packetnum; - memcpy( - (void*) (frame_buffer + frame_buffer_offset), - packet_buffer_.data, - JUNGFRAU_DATA_BYTES_PER_PACKET); - - metadata.n_received_packets++; + copy_packet_to_buffers(metadata, frame_buffer); // Last frame packet received. Frame finished. if (packet_buffer_.packetnum == JUNGFRAU_N_PACKETS_PER_FRAME-1) { - // Indicates that the packet has already been consumed. - packet_buffer_.bunchid = 0; - return; + return metadata.pulse_id; } } } \ No newline at end of file