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 stop (
void)
override;
81 virtual void stopNoMutex (
void)
override;
83 virtual void ProcessData_(artdaq::FragmentPtrs & output);
85 DataType getDataType(uint8_t byte) {
return static_cast<DataType
>((byte & 0xF0) >> 4); }
86 ReturnCode getReturnCode(uint8_t byte) {
return static_cast<ReturnCode
>(byte & 0xF); }
87 void send(CommandType flag);
89 packetBuffer_list_t packetBuffers_;
101 uint8_t expectedPacketNumber_;
104 struct sockaddr_in si_data_;
111 bool isTimerExpired_();
113 std::thread receiverThread_;
114 std::mutex receiveBufferLock_;
115 packetBuffer_list_t receiveBuffers_;
118 double fragmentWindow_;
119 std::chrono::high_resolution_clock::time_point lastFrag_;