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
00159 size_t GetFragmentsProcessed() { return fragment_count_; }
00160 private:
00161 Commandable& parent_application_;
00162 std::unique_ptr<CommandableFragmentGenerator> generator_ptr_;
00163 art::RunID run_id_;
00164
00165 fhicl::ParameterSet data_pset_;
00166 int rt_priority_;
00167 bool skip_seqId_test_;
00168
00169 static std::unique_ptr<artdaq::DataSenderManager> sender_ptr_;
00170
00171 size_t fragment_count_;
00172 artdaq::Fragment::sequence_id_t prev_seq_id_;
00173 std::atomic<bool> stop_requested_;
00174 std::atomic<bool> pause_requested_;
00175
00176
00177 artdaq::StatisticsHelper statsHelper_;
00178
00179 std::string buildStatisticsString_();
00180
00181 artdaq::MetricManager metricMan_;
00182
00183 void sendMetrics_();
00184
00185 bool verbose_;
00186
00191 void logMessage_(std::string const& text);
00192 };
00193
00194 #endif