00001 #ifndef artdaq_Application_MPI2_BoardReaderCore_hh
00002 #define artdaq_Application_MPI2_BoardReaderCore_hh
00003
00004 #include <string>
00005
00006 #include "artdaq/Application/CommandableFragmentGenerator.hh"
00007 #include "artdaq/Application/Commandable.hh"
00008 #include "fhiclcpp/ParameterSet.h"
00009 #include "canvas/Persistency/Provenance/RunID.h"
00010 #include "artdaq/DAQrate/DataSenderManager.hh"
00011 #include "artdaq/Application/StatisticsHelper.hh"
00012 #include "artdaq-utilities/Plugins/MetricManager.hh"
00013
00014 namespace artdaq
00015 {
00016 class BoardReaderCore;
00017 }
00018
00023 class artdaq::BoardReaderCore
00024 {
00025 public:
00026 static const std::string FRAGMENTS_PROCESSED_STAT_KEY;
00027 static const std::string INPUT_WAIT_STAT_KEY;
00028 static const std::string BRSYNC_WAIT_STAT_KEY;
00029 static const std::string OUTPUT_WAIT_STAT_KEY;
00030 static const std::string FRAGMENTS_PER_READ_STAT_KEY;
00031
00036 BoardReaderCore(Commandable& parent_application);
00037
00041 BoardReaderCore(BoardReaderCore const&) = delete;
00042
00046 virtual ~BoardReaderCore();
00047
00052 BoardReaderCore& operator=(BoardReaderCore const&) = delete;
00053
00072 bool initialize(fhicl::ParameterSet const& pset, uint64_t, uint64_t);
00073
00081 bool start(art::RunID id, uint64_t timeout, uint64_t timestamp);
00082
00089 bool stop(uint64_t timeout, uint64_t timestamp);
00090
00097 bool pause(uint64_t timeout, uint64_t timestamp);
00098
00105 bool resume(uint64_t timeout, uint64_t timestamp);
00106
00111 bool shutdown(uint64_t);
00112
00118 bool soft_initialize(fhicl::ParameterSet const& pset, uint64_t, uint64_t);
00119
00125 bool reinitialize(fhicl::ParameterSet const& pset, uint64_t, uint64_t);
00126
00133 void process_fragments();
00134
00143 std::string report(std::string const& which) const;
00144
00151 bool metaCommand(std::string const& command, std::string const& arg);
00152
00157 static DataSenderManager* GetDataSenderManagerPtr() { return sender_ptr_.get(); }
00158
00163 size_t GetFragmentsProcessed() { return fragment_count_; }
00164 private:
00165 Commandable& parent_application_;
00166 std::unique_ptr<CommandableFragmentGenerator> generator_ptr_;
00167 art::RunID run_id_;
00168
00169 fhicl::ParameterSet data_pset_;
00170 int rt_priority_;
00171 bool skip_seqId_test_;
00172
00173 static std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
00174
00175 std::atomic<size_t> fragment_count_;
00176 artdaq::Fragment::sequence_id_t prev_seq_id_;
00177 std::atomic<bool> stop_requested_;
00178 std::atomic<bool> pause_requested_;
00179
00180
00181 artdaq::StatisticsHelper statsHelper_;
00182
00183 std::string buildStatisticsString_();
00184
00185 void sendMetrics_();
00186
00187 bool verbose_;
00188
00193 void logMessage_(std::string const& text);
00194 };
00195
00196 #endif