5 #include "artdaq-demo/Generators/ToySimulator.hh"
7 #include "canvas/Utilities/Exception.h"
9 #include "artdaq-core/Utilities/SimpleLookupPolicy.hh"
10 #include "artdaq/Generators/GeneratorMacros.hh"
12 #include "artdaq-core-demo/Overlays/FragmentType.hh"
13 #include "artdaq-core-demo/Overlays/ToyFragment.hh"
15 #include "fhiclcpp/ParameterSet.h"
23 #define TRACE_NAME "ToySimulator"
24 #include "cetlib_except/exception.h"
28 : CommandableFragmentGenerator( ps )
31 , timestampScale_( ps.get<int>(
"timestamp_scale_factor", 1 ) )
32 , rollover_subrun_interval_( ps.get<int>(
"rollover_subrun_interval", 0 ) )
33 , metadata_( {0, 0, 0} )
34 , readout_buffer_(
nullptr )
35 , fragment_type_(
static_cast<decltype( fragment_type_ )
>( artdaq::Fragment::InvalidFragmentType ) )
36 , distribution_type_( static_cast<ToyHardwareInterface::DistributionType>( ps.get<
int>(
"distribution_type" ) ) )
37 , generated_fragments_per_event_( ps.get<
int>(
"generated_fragments_per_event", 1 ) )
38 , exception_on_config_( ps.get<
bool>(
"exception_on_config",
false ) )
39 , dies_on_config_( ps.get<
bool>(
"dies_on_config",
false ) )
42 hardware_interface_->AllocateReadoutBuffer( &readout_buffer_ );
44 if ( exception_on_config_ )
46 throw cet::exception(
"ToySimulator" ) <<
"This is an engineered exception designed for testing purposes, set "
47 "by the exception_on_config FHiCL variable";
49 else if ( dies_on_config_ )
51 TLOG( TLVL_ERROR ) <<
"This is an engineered process death, set by the dies_on_config FHiCL variable";
55 metadata_.board_serial_number = hardware_interface_->SerialNumber() & 0xFFFF;
56 metadata_.num_adc_bits = hardware_interface_->NumADCBits();
57 TLOG( TLVL_INFO ) <<
"Constructor: metadata_.unused = 0x" << std::hex << metadata_.unused
58 <<
" sizeof(metadata_) = " << std::dec <<
sizeof( metadata_ );
60 switch ( hardware_interface_->BoardType() )
63 fragment_type_ = toFragmentType(
"TOY1" );
66 fragment_type_ = toFragmentType(
"TOY2" );
69 throw cet::exception(
"ToySimulator" ) <<
"Unable to determine board type supplied by hardware";
75 bool demo::ToySimulator::getNext_( artdaq::FragmentPtrs& frags )
77 if ( should_stop() ) {
return false; }
90 std::size_t bytes_read = 0;
91 hardware_interface_->FillBuffer( readout_buffer_, &bytes_read );
101 for (
auto&
id : fragmentIDs() )
108 std::unique_ptr<artdaq::Fragment> fragptr(
109 artdaq::Fragment::FragmentBytes( bytes_read, ev_counter(),
id, fragment_type_, metadata_, timestamp_ ) );
110 frags.emplace_back( std::move( fragptr ) );
113 memcpy( frags.back()->dataBeginBytes(), readout_buffer_, bytes_read );
117 memcpy( frags.back()->dataBeginBytes(), readout_buffer_,
sizeof( ToyFragment::Header ) );
120 TLOG( 50 ) <<
"getNext_ after memcpy " << bytes_read
121 <<
" bytes and std::move dataSizeBytes()=" << frags.back()->sizeBytes()
122 <<
" metabytes=" <<
sizeof( metadata_ );
125 if ( metricMan !=
nullptr )
126 { metricMan->sendMetric(
"Fragments Sent", ev_counter(),
"Events", 3, artdaq::MetricMode::LastPoint ); }
128 if ( rollover_subrun_interval_ > 0 && ev_counter() % rollover_subrun_interval_ == 0 && fragment_id() == 0 )
130 bool fragmentIdZero =
false;
131 for (
auto&
id : fragmentIDs() )
133 if (
id == 0 ) fragmentIdZero =
true;
135 if ( fragmentIdZero )
137 artdaq::FragmentPtr endOfSubrunFrag(
new artdaq::Fragment( static_cast<size_t>(
138 ceil(
sizeof( my_rank ) / static_cast<double>(
sizeof( artdaq::Fragment::value_type ) ) ) ) ) );
139 endOfSubrunFrag->setSystemType( artdaq::Fragment::EndOfSubrunFragmentType );
141 endOfSubrunFrag->setSequenceID( ev_counter() + 1 );
142 endOfSubrunFrag->setTimestamp( 1 + ( ev_counter() / rollover_subrun_interval_ ) );
144 *endOfSubrunFrag->dataBegin() = my_rank;
145 frags.emplace_back( std::move( endOfSubrunFrag ) );
150 timestamp_ += timestampScale_;
155 void demo::ToySimulator::start()
157 hardware_interface_->StartDatataking();
161 void demo::ToySimulator::stop() { 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 ...