5 #include "artdaq-demo/Generators/ToySimulator.hh"
7 #include "canvas/Utilities/Exception.h"
9 #include "artdaq/Application/GeneratorMacros.hh"
10 #include "artdaq-core/Utilities/SimpleLookupPolicy.hh"
12 #include "artdaq-core-demo/Overlays/ToyFragment.hh"
13 #include "artdaq-core-demo/Overlays/FragmentType.hh"
15 #include "fhiclcpp/ParameterSet.h"
23 #define TRACE_NAME "ToySimulator"
25 #include "cetlib_except/exception.h"
29 CommandableFragmentGenerator(ps)
32 , timestampScale_(ps.get<int>(
"timestamp_scale_factor", 1))
33 , rollover_subrun_interval_(ps.get<int>(
"rollover_subrun_interval", 0))
34 , metadata_({ 0,0,0 })
35 , readout_buffer_(
nullptr)
36 , fragment_type_(
static_cast<decltype(fragment_type_)
>(artdaq::Fragment::InvalidFragmentType))
37 , distribution_type_(static_cast<ToyHardwareInterface::DistributionType>(ps.get<
int>(
"distribution_type")))
38 , generated_fragments_per_event_(ps.get<
int>(
"generated_fragments_per_event", 1))
39 , exception_on_config_(ps.get<
bool>(
"exception_on_config",
false)) , dies_on_config_(ps.get<
bool>(
"dies_on_config",
false))
42 hardware_interface_->AllocateReadoutBuffer(&readout_buffer_);
44 if (exception_on_config_) {
45 throw cet::exception(
"ToySimulator") <<
"This is an engineered exception designed for testing purposes, set by the exception_on_config FHiCL variable";
46 }
else if (dies_on_config_) {
47 TLOG(TLVL_ERROR) <<
"This is an engineered process death, set by the dies_on_config FHiCL variable";
51 metadata_.board_serial_number = hardware_interface_->SerialNumber() & 0xFFFF;
52 metadata_.num_adc_bits = hardware_interface_->NumADCBits();
53 TLOG(TLVL_INFO) <<
"Constructor: metadata_.unused = 0x" << std::hex << metadata_.unused <<
" sizeof(metadata_) = " << std::dec <<
sizeof(metadata_);
55 switch (hardware_interface_->BoardType())
58 fragment_type_ = toFragmentType(
"TOY1");
61 fragment_type_ = toFragmentType(
"TOY2");
64 throw cet::exception(
"ToySimulator") <<
"Unable to determine board type supplied by hardware";
70 hardware_interface_->FreeReadoutBuffer(readout_buffer_);
73 bool demo::ToySimulator::getNext_(artdaq::FragmentPtrs& frags)
91 std::size_t bytes_read = 0;
92 hardware_interface_->FillBuffer(readout_buffer_, &bytes_read);
103 for (
auto i_f = 0; i_f < generated_fragments_per_event_; ++i_f) {
110 auto offset = i_f == 0 ? 0 : i_f + 10000;
111 std::unique_ptr<artdaq::Fragment> fragptr(
112 artdaq::Fragment::FragmentBytes(bytes_read,
114 fragment_id() + offset,
116 metadata_, timestamp_));
117 frags.emplace_back(std::move(fragptr));
120 std::unique_ptr<artdaq::Fragment> fragptr(
121 artdaq::Fragment::FragmentBytes( 1024 - 40,
122 ev_counter(), fragment_id(),
124 metadata_, timestamp_));
125 frags.emplace_back(std::move(fragptr));
126 artdaq::detail::RawFragmentHeader *hdr = (artdaq::detail::RawFragmentHeader*)(frags.back()->headerBeginBytes());
128 hdr->word_count = ceil((bytes_read + 32) / static_cast<double>(
sizeof(artdaq::RawDataType)));
131 if ( !frags.empty() ) {
134 memcpy(frags.back()->dataBeginBytes(), readout_buffer_, bytes_read);
138 memcpy(frags.back()->dataBeginBytes(), readout_buffer_,
sizeof(ToyFragment::Header));
141 TLOG(50) <<
"getNext_ after memcpy " << bytes_read
142 <<
" bytes and std::move dataSizeBytes()=" << frags.back()->sizeBytes() <<
" metabytes=" <<
sizeof(metadata_);
145 if (metricMan !=
nullptr)
147 metricMan->sendMetric(
"Fragments Sent", ev_counter(),
"Events", 3, artdaq::MetricMode::LastPoint);
150 if (rollover_subrun_interval_ > 0 && ev_counter() % rollover_subrun_interval_ == 0 && fragment_id() == 0)
152 artdaq::FragmentPtr endOfSubrunFrag(
new artdaq::Fragment(static_cast<size_t>(ceil(
sizeof(my_rank) / static_cast<double>(
sizeof(artdaq::Fragment::value_type))))));
153 endOfSubrunFrag->setSystemType(artdaq::Fragment::EndOfSubrunFragmentType);
155 endOfSubrunFrag->setSequenceID(ev_counter() + 1);
156 endOfSubrunFrag->setTimestamp(1 + (ev_counter() / rollover_subrun_interval_));
158 *endOfSubrunFrag->dataBegin() = my_rank;
159 frags.emplace_back(std::move(endOfSubrunFrag));
163 timestamp_ += timestampScale_;
168 void demo::ToySimulator::start()
170 hardware_interface_->StartDatataking();
174 void demo::ToySimulator::stop()
176 hardware_interface_->StopDatataking();
A use-after-free expliot distribution.
ToySimulator(fhicl::ParameterSet const &ps)
ToySimulator Constructor.
JCF, Mar-17-2016: ToyHardwareInterface is meant to mimic a vendor-provided hardware API...
virtual ~ToySimulator()
Shutdown the ToySimulator.
ToySimulator is a simple type of fragment generator intended to be studied by new users of artdaq as ...