37 if (m_is_configured) {
38 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"This emulator is already configured!";
42 m_raw_sender_timeout_ms = std::chrono::milliseconds(1);
44 std::mt19937 mt(rand());
45 std::uniform_real_distribution<double> dis(0.0, 1.0);
48 m_sourceid.subsystem = ReadoutType::subsystem;
63 if (m_dropout_rate == 0.0) {
64 m_dropouts = std::vector<bool>(1);
66 m_dropouts = std::vector<bool>(m_dropouts_length);
68 for (
size_t i = 0; i < m_dropouts.size(); ++i) {
69 m_dropouts[i] = dis(mt) >= m_dropout_rate;
75 m_error_bit_generator.generate();
80 if (m_generate_periodic_adc_pattern) {
81 TLOG() <<
"Generated pattern.";
82 m_pattern_generator.generate(m_sourceid.id, vec_size);
92 m_is_configured =
true;
95 m_producer_thread.set_name(
"fakeprod", m_sourceid.id);
134 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Data generation thread " << m_this_link_number <<
" started";
139 auto& source = m_file_source->get();
141 uint num_elem = m_file_source->num_elements();
143 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"No elements to read from buffer! Sleeping...";
144 std::this_thread::sleep_for(std::chrono::milliseconds(100));
145 num_elem = m_file_source->num_elements();
148 auto rptr =
reinterpret_cast<ReadoutType*
>(source.data());
151 uint64_t ts_0 = rptr->get_timestamp();
153 auto time_now = std::chrono::system_clock::now().time_since_epoch();
154 uint64_t current_time =
155 std::chrono::duration_cast<std::chrono::microseconds>(time_now).count();
158 ts_0 = 625 * current_time / 10;
161 TLOG_DEBUG(TLVL_BOOKKEEPING) <<
"Using first timestamp: " << ts_0;
162 uint64_t timestamp = ts_0;
163 int dropout_index = 0;
165 while (m_run_marker.load()) {
167 for (uint16_t i = 0; i < m_frames_per_tick; i++) {
169 if (
offset == num_elem || (
offset + 1) *
sizeof(ReadoutType) > source.size()) {
173 bool create_frame = m_dropouts[dropout_index];
174 dropout_index = (dropout_index + 1) % m_dropouts.size();
178 ::memcpy(
static_cast<void*
>(&payload),
179 static_cast<void*
>(source.data() +
offset *
sizeof(ReadoutType)),
180 sizeof(ReadoutType));
183 payload.fake_timestamps(timestamp, m_time_tick_diff);
186 payload.fake_geoid(m_crateid, m_slotid, m_linkid);
189 std::vector<uint16_t> frame_errs;
190 for (
size_t i = 0; i < rptr->get_num_frames(); ++i) {
191 frame_errs.push_back(m_error_bit_generator.next());
193 payload.fake_frame_errors(&frame_errs);
195 if (m_generate_periodic_adc_pattern) {
196 if (timestamp - m_pattern_generator_previous_ts > m_time_to_wait) {
206 payload.fake_adc_pattern(m_pattern_generator.get_channel_number());
208 catch (std::exception & ex) {
215 m_pattern_generator_previous_ts = timestamp;
222 m_raw_data_sender->send(std::move(payload), m_raw_sender_timeout_ms);
231 ++m_packet_count_tot;
236 timestamp += m_time_tick_diff * rptr->get_num_frames();
240 m_rate_limiter->limit();
242 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Data generation thread " << m_sourceid.to_string() <<
" finished";