Jpp
Public Member Functions | Private Attributes | List of all members
FrameGenerator Class Reference

#include <frame_generator.hh>

Public Member Functions

 FrameGenerator (const DOMRange_t &dom_range, unsigned int time_slice_duration, unsigned int run_number, unsigned int MTU, unsigned int hitR)
 
void getNext (raw_data_t &target)
 

Private Attributes

unsigned int m_max_seqnumber
 
unsigned int m_delta_ts
 
unsigned int m_payload_size
 
unsigned int m_selected
 
timeval m_tv
 
std::vector< CLBCommonHeaderm_headers
 

Detailed Description

Definition at line 17 of file frame_generator.hh.

Constructor & Destructor Documentation

◆ FrameGenerator()

FrameGenerator::FrameGenerator ( const DOMRange_t dom_range,
unsigned int  time_slice_duration,
unsigned int  run_number,
unsigned int  MTU,
unsigned int  hitR 
)

Definition at line 25 of file frame_generator.cc.

31  :
32  m_delta_ts(time_slice_duration),
33  m_selected((srand(time(0)), rand() % dom_range.size()))
34 {
35  m_headers.reserve(dom_range.size());
36 
37  for (unsigned int i = 0; i < dom_range.size(); i++) {
38  CLBCommonHeader header;
39  header.RunNumber = htonl(run_number);
40  header.DataType = htonl(ttdc);
41  header.UDPSequenceNumber = 0;
42  header.Timestamp.Sec = time(0);
43  header.Timestamp.Tics = 0;
44  header.DOMIdentifier = htonl(dom_range[i]);
45  header.DOMStatus1 = 128;
46  header.DOMStatus2 = 0;
47  header.DOMStatus3 = 0;
48  header.DOMStatus4 = 0;
49 
50  m_headers.push_back(header);
51  }
52 
53 // max seqnumber = NPMT * kHz * Bytes/Hit * ms TS duration / (MTU - size of CLB Common Header)
54  m_max_seqnumber = 31 * hitR * 6 * time_slice_duration / (MTU - sizeof(CLBCommonHeader)) + 1;
55  m_payload_size = 6 * ((MTU - sizeof(CLBCommonHeader)) / 6);
56  m_tv.tv_sec = 0;
57  m_tv.tv_usec = 0;
58 }

Member Function Documentation

◆ getNext()

void FrameGenerator::getNext ( raw_data_t target)

Definition at line 60 of file frame_generator.cc.

61 {
62  ++m_selected;
63  m_selected %= m_headers.size();
64 
65  CLBCommonHeader& common_header = m_headers[m_selected];
66 
67  common_header.UDPSequenceNumber = common_header.UDPSequenceNumber + 1;
68 
69  if (common_header.UDPSequenceNumber == m_max_seqnumber) {
70  common_header.DOMStatus2 = 128;
71 
72  target.resize(sizeof(common_header));
73  } else if (common_header.UDPSequenceNumber == m_max_seqnumber + 1) {
74  if (isTrailer(common_header)) {
75  common_header.UDPSequenceNumber = 0;
76  common_header.DOMStatus2 = 0;
77  common_header.Timestamp.Tics += 62500 * m_delta_ts;
78  if (common_header.Timestamp.Tics >= 62500000) {
79  ++common_header.Timestamp.Sec;
80  common_header.Timestamp.Tics = 0;
81  }
82  } else {
83  assert(!"Programming error: UDPSequenceNumber and trailer not respected.");
84  }
85 
86  target.resize(sizeof(CLBCommonHeader) + m_payload_size);
87  }
88 
89  memcpy(target.data(), &common_header, sizeof(CLBCommonHeader));
90 
92  *static_cast<CLBCommonHeader*>(
93  static_cast<void*>(
94  target.data()
95  )
96  )
97  );
98 
99  if (common_header.UDPSequenceNumber == 0 && m_selected == 0) {
100  int sleep_time = m_delta_ts * 1000;
101 
102  if (m_tv.tv_sec) {
103  timeval tv;
104  gettimeofday(&tv, 0);
105  sleep_time -=
106  (tv.tv_sec - m_tv.tv_sec) * 1000000
107  + (tv.tv_usec - m_tv.tv_usec);
108  }
109 
110  if (sleep_time > 0) {
111  usleep(sleep_time);
112  }
113 
114  gettimeofday(&m_tv, 0);
115  }
116 }

Member Data Documentation

◆ m_max_seqnumber

unsigned int FrameGenerator::m_max_seqnumber
private

Definition at line 19 of file frame_generator.hh.

◆ m_delta_ts

unsigned int FrameGenerator::m_delta_ts
private

Definition at line 20 of file frame_generator.hh.

◆ m_payload_size

unsigned int FrameGenerator::m_payload_size
private

Definition at line 21 of file frame_generator.hh.

◆ m_selected

unsigned int FrameGenerator::m_selected
private

Definition at line 22 of file frame_generator.hh.

◆ m_tv

timeval FrameGenerator::m_tv
private

Definition at line 23 of file frame_generator.hh.

◆ m_headers

std::vector<CLBCommonHeader> FrameGenerator::m_headers
private

Definition at line 24 of file frame_generator.hh.


The documentation for this class was generated from the following files:
UTCTime::Tics
uint32_t Tics
Definition: utctime.hh:15
CLBCommonHeader::DataType
uint32_t DataType
Definition: clb_common_header.hh:19
FrameGenerator::m_selected
unsigned int m_selected
Definition: frame_generator.hh:22
CLBCommonHeader::DOMIdentifier
uint32_t DOMIdentifier
Definition: clb_common_header.hh:23
FrameGenerator::m_max_seqnumber
unsigned int m_max_seqnumber
Definition: frame_generator.hh:19
CLBCommonHeader::DOMStatus3
uint32_t DOMStatus3
Definition: clb_common_header.hh:26
CLBCommonHeader::UDPSequenceNumber
uint32_t UDPSequenceNumber
Definition: clb_common_header.hh:21
CLBCommonHeader::RunNumber
uint32_t RunNumber
Definition: clb_common_header.hh:20
FrameGenerator::m_tv
timeval m_tv
Definition: frame_generator.hh:23
FrameGenerator::m_payload_size
unsigned int m_payload_size
Definition: frame_generator.hh:21
FrameGenerator::m_headers
std::vector< CLBCommonHeader > m_headers
Definition: frame_generator.hh:24
swap_endianness
void swap_endianness(CLBCommonHeader &header)
Definition: frame_generator.cc:15
CLBCommonHeader
Definition: clb_common_header.hh:17
CLBCommonHeader::Timestamp
UTCTime Timestamp
Definition: clb_common_header.hh:22
CLBCommonHeader::DOMStatus4
uint32_t DOMStatus4
Definition: clb_common_header.hh:27
CLBCommonHeader::DOMStatus2
uint32_t DOMStatus2
Definition: clb_common_header.hh:25
isTrailer
bool isTrailer(CLBCommonHeader const &header)
Definition: clb_common_header.hh:130
CLBCommonHeader::DOMStatus1
uint32_t DOMStatus1
Definition: clb_common_header.hh:24
FrameGenerator::m_delta_ts
unsigned int m_delta_ts
Definition: frame_generator.hh:20
UTCTime::Sec
uint32_t Sec
Definition: utctime.hh:14
ttdc
unsigned const int ttdc
Definition: datatypes.cpp:7