1 #ifndef artdaq_ots_Generators_UDPReceiver_hh
2 #define artdaq_ots_Generators_UDPReceiver_hh
17 #include "fhiclcpp/fwd.h"
18 #include "artdaq-core/Data/Fragment.hh"
19 #include "artdaq/Application/CommandableFragmentGenerator.hh"
21 #include <arpa/inet.h>
22 #include <netinet/in.h>
23 #include <sys/types.h>
24 #include <sys/socket.h>
37 enum class CommandType : uint8_t {
44 enum class ReturnCode : uint8_t {
51 enum class DataType : uint8_t {
64 typedef std::string packetBuffer_t;
65 typedef std::list<packetBuffer_t> packetBuffer_list_t;
67 class UDPReceiver :
public artdaq::CommandableFragmentGenerator {
69 explicit UDPReceiver(fhicl::ParameterSet
const & ps);
78 bool getNext_(artdaq::FragmentPtrs & output)
override;
79 void start(
void)
override;
80 virtual void start_();
81 virtual void stop(
void)
override;
82 virtual void stopNoMutex(
void)
override;
84 virtual void ProcessData_(artdaq::FragmentPtrs & output);
86 DataType getDataType(uint8_t byte) {
return static_cast<DataType
>((byte & 0xF0) >> 4); }
87 ReturnCode getReturnCode(uint8_t byte) {
return static_cast<ReturnCode
>(byte & 0xF); }
88 void send(CommandType flag);
90 packetBuffer_list_t packetBuffers_;
103 uint8_t expectedPacketNumber_;
106 struct sockaddr_in si_data_;
113 bool isTimerExpired_();
115 std::thread receiverThread_;
116 std::mutex receiveBufferLock_;
117 packetBuffer_list_t receiveBuffers_;
120 double fragmentWindow_;
121 std::chrono::high_resolution_clock::time_point lastFrag_;