37 if (m_is_configured) {
38 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"This emulator is already configured!";
43 std::mt19937 mt(rand());
44 std::uniform_real_distribution<double> dis(0.0, 1.0);
47 m_sourceid.subsystem = ReadoutType::subsystem;
59 throw ConfigurationError(
ERS_HERE, m_sourceid,
"", ex);
62 if (m_dropout_rate == 0.0) {
63 m_dropouts = std::vector<bool>(1);
65 m_dropouts = std::vector<bool>(m_dropouts_length);
67 for (
size_t i = 0; i < m_dropouts.size(); ++i) {
68 m_dropouts[i] = dis(mt) >= m_dropout_rate;
74 m_error_bit_generator.generate();
79 if (m_generate_periodic_adc_pattern) {
80 TLOG() <<
"Generated pattern.";
81 m_pattern_generator.generate(m_sourceid.id, vec_size);
91 m_is_configured =
true;
94 m_producer_thread.set_name(
"fakeprod", m_sourceid.id);
133 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Data generation thread " << m_this_link_number <<
" started";
138 auto& source = m_file_source->get();
140 uint num_elem = m_file_source->num_elements();
142 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"No elements to read from buffer! Sleeping...";
143 std::this_thread::sleep_for(std::chrono::milliseconds(100));
144 num_elem = m_file_source->num_elements();
147 auto rptr =
reinterpret_cast<ReadoutType*
>(source.data());
150 uint64_t ts_0 = rptr->get_timestamp();
152 auto time_now = std::chrono::system_clock::now().time_since_epoch();
153 uint64_t current_time =
154 std::chrono::duration_cast<std::chrono::microseconds>(time_now).count();
157 ts_0 = 625 * current_time / 10;
160 TLOG_DEBUG(TLVL_BOOKKEEPING) <<
"Using first timestamp: " << ts_0;
161 uint64_t timestamp = ts_0;
162 int dropout_index = 0;
164 while (m_run_marker.load()) {
166 for (uint16_t i = 0; i < m_frames_per_tick; i++) {
168 if (
offset == num_elem || (
offset + 1) *
sizeof(ReadoutType) > source.size()) {
172 bool create_frame = m_dropouts[dropout_index];
173 dropout_index = (dropout_index + 1) % m_dropouts.size();
177 ::memcpy(
static_cast<void*
>(&payload),
178 static_cast<void*
>(source.data() +
offset *
sizeof(ReadoutType)),
179 sizeof(ReadoutType));
182 payload.fake_timestamps(timestamp, m_time_tick_diff);
185 payload.fake_geoid(m_crateid, m_slotid, m_linkid);
188 std::vector<uint16_t> frame_errs;
189 for (
size_t i = 0; i < rptr->get_num_frames(); ++i) {
190 frame_errs.push_back(m_error_bit_generator.next());
192 payload.fake_frame_errors(&frame_errs);
194 if (m_generate_periodic_adc_pattern) {
195 if (timestamp - m_pattern_generator_previous_ts > m_time_to_wait) {
205 payload.fake_adc_pattern(m_pattern_generator.get_channel_number());
207 catch (std::exception & ex) {
214 m_pattern_generator_previous_ts = timestamp;
221 (*m_raw_data_callback)(std::move(payload));
230 ++m_packet_count_tot;
235 timestamp += m_time_tick_diff * rptr->get_num_frames();
239 m_rate_limiter->limit();
241 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Data generation thread " << m_sourceid.to_string() <<
" finished";