1 #ifndef artdaq_Application_CommandableFragmentGenerator_hh
2 #define artdaq_Application_CommandableFragmentGenerator_hh
6 #include <netinet/in.h>
8 #include <sys/socket.h>
12 #include <condition_variable>
20 #include "fhiclcpp/fwd.h"
21 #include "fhiclcpp/ParameterSet.h"
22 #include "artdaq-core/Data/Fragment.hh"
23 #include "artdaq-core/Generators/FragmentGenerator.hh"
24 #include "artdaq-utilities/Plugins/MetricManager.hh"
25 #include "artdaq/DAQrate/detail/RequestMessage.hh"
26 #include "artdaq/DAQdata/Globals.hh"
137 bool getNext(FragmentPtrs& output)
override final;
158 bool sendEmptyFragment(FragmentPtrs& frags,
size_t sequenceId, std::string desc);
222 return fragment_ids_;
287 std::string
ReportCmd(std::string
const& which =
"");
295 return instance_name_for_metrics_;
402 instance_name_for_metrics_ = name;
425 std::string request_addr_;
428 struct sockaddr_in si_data_;
430 std::map<Fragment::sequence_id_t, Fragment::timestamp_t> requests_;
431 std::mutex request_mutex_;
432 std::thread requestThread_;
435 Fragment::timestamp_t windowOffset_;
436 Fragment::timestamp_t windowWidth_;
437 Fragment::timestamp_t staleTimeout_;
438 size_t maxFragmentCount_;
442 std::thread dataThread_;
444 std::condition_variable requestCondition_;
445 std::condition_variable dataCondition_;
446 std::atomic<int> dataBufferDepthFragments_;
447 std::atomic<size_t> dataBufferDepthBytes_;
448 int maxDataBufferDepthFragments_;
449 size_t maxDataBufferDepthBytes_;
451 bool useMonitoringThread_;
452 std::thread monitoringThread_;
453 int64_t monitoringInterval_;
454 std::chrono::steady_clock::time_point lastMonitoringCall_;
457 FragmentPtrs dataBuffer_;
458 FragmentPtrs newDataBuffer_;
459 std::mutex dataBufferMutex_;
461 std::vector<artdaq::Fragment::fragment_id_t> fragment_ids_;
466 int run_number_, subrun_number_;
481 std::atomic<bool> should_stop_, exception_;
482 std::string latest_exception_report_;
483 std::atomic<size_t> ev_counter_;
486 std::string instance_name_for_metrics_;
491 int sleep_on_stop_us_;
497 virtual bool getNext_(FragmentPtrs& output) = 0;
503 virtual bool checkHWStatus_();
515 virtual void start() = 0;
519 virtual void stopNoMutex() = 0;
525 virtual void stop() = 0;
529 virtual void pauseNoMutex();
534 virtual void pause();
540 virtual void resume();
550 virtual std::string report();
552 virtual std::string reportSpecific(std::string
const&);
int fragment_id() const
Get the current Fragment ID, if there is only one.
int subrun_number() const
Get the current Subrun number.
virtual ~CommandableFragmentGenerator()
CommandableFragmentGenerator Destructor.
RequestMode
The RequestMode enumeration contains the possible ways which CommandableFragmentGenerator responds to...
bool exception() const
Get the current value of the exception flag.
void metricsReportingInstanceName(std::string const &name)
Sets the name for metrics reporting.
std::mutex mutex_
Mutex used to ensure that multiple transition commands do not run at the same time.
bool sendEmptyFragment(FragmentPtrs &frags, size_t sequenceId, std::string desc)
Send an EmptyFragmentType Fragment.
void getMonitoringDataLoop()
This function regularly calls checkHWStatus_(), and sets the isHardwareOK flag accordingly.
void startDataThread()
Function that launches the data thread (getDataLoop())
std::string ReportCmd(std::string const &which="")
Get a report about a user-specified run-time quantity.
bool dataBufferIsTooLarge()
Test the configured constraints on the data buffer.
void StopCmd(uint64_t timeout, uint64_t timestamp)
Stop the CommandableFragmentGenerator.
uint64_t timeout() const
Timeout of last command.
void StartCmd(int run, uint64_t timeout, uint64_t timestamp)
Start the CommandableFragmentGenerator.
bool check_stop()
Routine used by applyRequests to make sure that all outstanding requests have been fulfilled before r...
void ResumeCmd(uint64_t timeout, uint64_t timestamp)
Resume the CommandableFragmentGenerator.
CommandableFragmentGenerator()
CommandableFragmentGenerator default constructor.
bool getNext(FragmentPtrs &output) overridefinal
getNext calls either applyRequests or getNext_ to get any data that is ready to be sent to the EventB...
size_t ev_counter_inc(size_t step=1, bool force=false)
Increment the event counter, if the current RequestMode allows it.
std::vector< Fragment::fragment_id_t > fragmentIDs() override
Get the list of Fragment IDs handled by this CommandableFragmentGenerator.
void PauseCmd(uint64_t timeout, uint64_t timestamp)
Pause the CommandableFragmentGenerator.
void getDataLoop()
When separate_data_thread is set to true, this loop repeatedly calls getNext_ and adds returned Fragm...
virtual std::string metricsReportingInstanceName() const
Get the name used when reporting metrics.
bool should_stop() const
Get the current value of the should_stop flag.
void startRequestReceiverThread()
Function that launches the data request receiver thread (receiveRequestsLoop())
CommandableFragmentGenerator is a FragmentGenerator-derived abstract class that defines the interface...
void startMonitoringThread()
Function that launches the monitoring thread (getMonitoringDataLoop())
size_t ev_counter() const
Get the current value of the event counter.
void checkDataBuffer()
Perform data buffer pruning operations. If the RequestMode is Single, removes all but the latest Frag...
int board_id() const
Gets the current board_id.
std::string printMode_()
Return the string representation of the current RequestMode.
void sendEmptyFragments(FragmentPtrs &frags)
This function is for Buffered and Single request modes, as they can only respond to one data request ...
void set_exception(bool exception)
Control the exception flag.
void getDataBufferStats()
Calculate the size of the dataBuffer and report appropriate metrics.
uint64_t timestamp() const
Timestamp of last command.
bool applyRequests(FragmentPtrs &output)
See if any requests have been received, and add the corresponding data Fragment objects to the output...
void receiveRequestsLoop()
This function receives data request packets, adding new requests to the request list.
void setupRequestListener()
Opens the socket used to listen for data requests.
int run_number() const
Get the current Run number.