DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::dfmodules::TriggerInhibitAgent Class Reference

#include <TriggerInhibitAgent.hpp>

Inheritance diagram for dunedaq::dfmodules::TriggerInhibitAgent:
[legend]
Collaboration diagram for dunedaq::dfmodules::TriggerInhibitAgent:
[legend]

Public Types

using trigdecreceiver_t = iomanager::ReceiverConcept<dfmessages::TriggerDecision>
 
using triginhsender_t = iomanager::SenderConcept<dfmessages::TriggerInhibit>
 

Public Member Functions

 TriggerInhibitAgent (const std::string &, std::shared_ptr< trigdecreceiver_t >, std::shared_ptr< triginhsender_t >)
 TriggerInhibitAgent Constructor.
 
 TriggerInhibitAgent (const TriggerInhibitAgent &)=delete
 TriggerInhibitAgent is not copy-constructible.
 
TriggerInhibitAgentoperator= (const TriggerInhibitAgent &)=delete
 TriggerInhibitAgent is not copy-assignable.
 
 TriggerInhibitAgent (TriggerInhibitAgent &&)=delete
 TriggerInhibitAgent is not move-constructible.
 
TriggerInhibitAgentoperator= (TriggerInhibitAgent &&)=delete
 TriggerInhibitAgent is not move-assignable.
 
void start_checking ()
 
void stop_checking ()
 
void set_threshold_for_inhibit (uint32_t value)
 
void set_latest_trigger_number (daqdataformats::trigger_number_t trig_num)
 
- Public Member Functions inherited from dunedaq::utilities::NamedObject
 NamedObject (const std::string &name)
 NamedObject Constructor.
 
 NamedObject (NamedObject const &)=delete
 NamedObject is not copy-constructible.
 
 NamedObject (NamedObject &&)=default
 NamedObject is move-constructible.
 
NamedObjectoperator= (NamedObject const &)=delete
 NamedObject is not copy-assignable.
 
NamedObjectoperator= (NamedObject &&)=default
 NamedObject is move-assignable.
 
virtual ~NamedObject ()=default
 Default virtual destructor.
 
const std::string & get_name () const final
 Get the name of this NamedObejct.
 
- Public Member Functions inherited from dunedaq::utilities::Named
 Named ()=default
 Named Constructor.
 
 Named (Named const &)=delete
 Named is not copy-constructible.
 
 Named (Named &&)=default
 Named is move-constructible.
 
Namedoperator= (Named const &)=delete
 Named is not copy-assignable.
 
Namedoperator= (Named &&)=default
 Named is move-assignable.
 
virtual ~Named ()=default
 Default virtual destructor.
 

Private Member Functions

void do_work (std::atomic< bool > &)
 

Private Attributes

dunedaq::utilities::WorkerThread m_thread
 
std::chrono::milliseconds m_queue_timeout
 
std::atomic< uint32_t > m_threshold_for_inhibit
 
std::shared_ptr< trigdecreceiver_tm_trigger_decision_receiver
 
std::shared_ptr< triginhsender_tm_trigger_inhibit_sender
 
std::atomic< daqdataformats::trigger_number_tm_trigger_number_at_start_of_processing_chain
 
std::atomic< daqdataformats::trigger_number_tm_trigger_number_at_end_of_processing_chain
 

Detailed Description

Definition at line 36 of file TriggerInhibitAgent.hpp.

Member Typedef Documentation

◆ trigdecreceiver_t

◆ triginhsender_t

Constructor & Destructor Documentation

◆ TriggerInhibitAgent() [1/3]

dunedaq::dfmodules::TriggerInhibitAgent::TriggerInhibitAgent ( const std::string & parent_name,
std::shared_ptr< trigdecreceiver_t > our_input,
std::shared_ptr< triginhsender_t > our_output )
explicit

TriggerInhibitAgent Constructor.

Definition at line 31 of file TriggerInhibitAgent.cpp.

34 : NamedObject(parent_name + "::TriggerInhibitAgent")
35 , m_thread(std::bind(&TriggerInhibitAgent::do_work, this, std::placeholders::_1))
36 , m_queue_timeout(100)
39 , m_trigger_inhibit_sender(our_output)
42{}
std::shared_ptr< triginhsender_t > m_trigger_inhibit_sender
std::shared_ptr< trigdecreceiver_t > m_trigger_decision_receiver
std::atomic< daqdataformats::trigger_number_t > m_trigger_number_at_start_of_processing_chain
dunedaq::utilities::WorkerThread m_thread
std::atomic< daqdataformats::trigger_number_t > m_trigger_number_at_end_of_processing_chain
NamedObject(const std::string &name)
NamedObject Constructor.

◆ TriggerInhibitAgent() [2/3]

dunedaq::dfmodules::TriggerInhibitAgent::TriggerInhibitAgent ( const TriggerInhibitAgent & )
delete

TriggerInhibitAgent is not copy-constructible.

◆ TriggerInhibitAgent() [3/3]

dunedaq::dfmodules::TriggerInhibitAgent::TriggerInhibitAgent ( TriggerInhibitAgent && )
delete

TriggerInhibitAgent is not move-constructible.

Member Function Documentation

◆ do_work()

void dunedaq::dfmodules::TriggerInhibitAgent::do_work ( std::atomic< bool > & running_flag)
private

Definition at line 63 of file TriggerInhibitAgent.cpp.

64{
65 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Entering do_work() method";
66
67 // configuration (hard-coded, for now; will be input from calling code later)
68 int fake_busy_interval_sec = 0;
69 std::chrono::seconds chrono_fake_busy_interval(fake_busy_interval_sec);
70 int fake_busy_duration_sec = 0;
71 std::chrono::seconds chrono_fake_busy_duration(fake_busy_duration_sec);
72 int min_interval_between_inhibit_messages_msec = 0;
73 std::chrono::milliseconds chrono_min_interval_between_inhibit_messages(min_interval_between_inhibit_messages_msec);
74
75 // initialization
76 enum LocalState
77 {
78 no_update,
79 free_state,
80 busy_state
81 };
82 std::chrono::steady_clock::time_point current_time = std::chrono::steady_clock::now();
83 // std::chrono::steady_clock::time_point start_time_of_latest_fake_busy = current_time - chrono_fake_busy_duration;
84 std::chrono::steady_clock::time_point last_sent_time = current_time;
85 LocalState requested_state = no_update;
86 LocalState current_state = free_state;
87 int32_t received_message_count = 0;
88 int32_t sent_message_count = 0;
89
90 // work loop
91 while (running_flag.load()) {
92
93 // check if a TriggerDecision message has arrived, and save the trigger
94 // number contained within it, if one has arrived
95 try {
96 dfmessages::TriggerDecision trig_dec = m_trigger_decision_receiver->receive(m_queue_timeout);
97 ++received_message_count;
98 TLOG_DEBUG(TLVL_WORK_STEPS) << get_name() << ": Popped the TriggerDecision for trigger number "
99 << trig_dec.trigger_number << " off the input queue";
100 m_trigger_number_at_start_of_processing_chain.store(trig_dec.trigger_number);
101 } catch (const iomanager::TimeoutExpired& excpt) {
102 // it is perfectly reasonable that there will be no data in the queue some
103 // fraction of the times that we check, so we just continue on and try again later
104 }
105
106 // to-do: add some logic to fake inhibits
107
108 // check if A) we are supposed to be checking the trigger_number difference, and
109 // B) if so, whether an Inhibit should be asserted or cleared
110 uint32_t threshold = m_threshold_for_inhibit.load(); // NOLINT
111 if (threshold > 0) {
114 if (temp_trig_num_at_start >= temp_trig_num_at_end &&
115 (temp_trig_num_at_start - temp_trig_num_at_end) >= threshold) {
116 if (current_state == free_state) {
117 requested_state = busy_state;
118 }
119 } else {
120 if (current_state == busy_state) {
121 requested_state = free_state;
122 }
123 }
124 }
125
126 // to-do: add some logic to periodically send a message even if nothing has changed
127
128 // send an Inhibit messages, if needed (either Busy or Free state)
129 if (requested_state != no_update && requested_state != current_state) {
130 if ((std::chrono::steady_clock::now() - last_sent_time) >= chrono_min_interval_between_inhibit_messages) {
131 dfmessages::TriggerInhibit inhibit_message;
132 if (requested_state == busy_state) {
133 inhibit_message.busy = true;
134 } else {
135 inhibit_message.busy = false;
136 }
137
138 TLOG_DEBUG(TLVL_WORK_STEPS) << get_name() << ": Pushing a TriggerInhibit message with busy state set to "
139 << inhibit_message.busy << " onto the output queue";
140 try {
141 m_trigger_inhibit_sender->send(std::move(inhibit_message), m_queue_timeout);
142 ++sent_message_count;
143#if 0
144 // temporary logging
145 std::ostringstream oss_sent;
146 oss_sent << ": Successfully pushed a TriggerInhibit message with busy state set to " << inhibit_message.busy
147 << " onto the output queue";
148 TLOG() << ProgressUpdate(ERS_HERE, get_name(), oss_sent.str());
149#endif
150 // if we successfully pushed the message to the Sink, then we assume that the
151 // receiver will get it, and we update our internal state accordingly
152 current_state = requested_state;
153 requested_state = no_update;
154 last_sent_time = std::chrono::steady_clock::now();
155 } catch (const iomanager::TimeoutExpired& excpt) {
156 // It is not ideal if we fail to send the inhibit message out, but rather than
157 // retrying some unknown number of times, we simply output a TRACE message and
158 // go on. This has the benefit of being responsive with pulling TriggerDecision
159 // messages off the input queue, and maybe our Busy/Free state will have changed
160 // by the time that the receiver is ready to receive more messages.
161 TLOG_DEBUG(TLVL_WORK_STEPS) << get_name()
162 << ": TIMEOUT pushing a TriggerInhibit message onto the output queue";
163 }
164 }
165 }
166 }
167
168 std::ostringstream oss_summ;
169 oss_summ << ": Exiting the do_work() method, received " << received_message_count
170 << " TriggerDecision messages and sent " << sent_message_count
171 << " TriggerInhibit messages of all types (both Busy and Free).";
172 TLOG() << ProgressUpdate(ERS_HERE, get_name(), oss_summ.str());
173 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Exiting do_work() method";
174}
#define ERS_HERE
const std::string & get_name() const final
Get the name of this NamedObejct.
#define TLVL_ENTER_EXIT_METHODS
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
#define TLOG(...)
Definition macro.hpp:22
uint64_t trigger_number_t
Type used to represent trigger number.
Definition Types.hpp:24

◆ operator=() [1/2]

TriggerInhibitAgent & dunedaq::dfmodules::TriggerInhibitAgent::operator= ( const TriggerInhibitAgent & )
delete

TriggerInhibitAgent is not copy-assignable.

◆ operator=() [2/2]

TriggerInhibitAgent & dunedaq::dfmodules::TriggerInhibitAgent::operator= ( TriggerInhibitAgent && )
delete

TriggerInhibitAgent is not move-assignable.

◆ set_latest_trigger_number()

void dunedaq::dfmodules::TriggerInhibitAgent::set_latest_trigger_number ( daqdataformats::trigger_number_t trig_num)
inline

Definition at line 63 of file TriggerInhibitAgent.hpp.

64 {
66 }

◆ set_threshold_for_inhibit()

void dunedaq::dfmodules::TriggerInhibitAgent::set_threshold_for_inhibit ( uint32_t value)
inline

Definition at line 58 of file TriggerInhibitAgent.hpp.

59 {
60 m_threshold_for_inhibit.store(value);
61 }

◆ start_checking()

void dunedaq::dfmodules::TriggerInhibitAgent::start_checking ( )

Definition at line 45 of file TriggerInhibitAgent.cpp.

46{
47 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Entering start_checking() method";
48 m_thread.start_working_thread();
49 TLOG() << get_name() << " successfully started";
50 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Exiting start_checking() method";
51}

◆ stop_checking()

void dunedaq::dfmodules::TriggerInhibitAgent::stop_checking ( )

Definition at line 54 of file TriggerInhibitAgent.cpp.

55{
56 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Entering stop_checking() method";
57 m_thread.stop_working_thread();
58 TLOG() << get_name() << " successfully stopped";
59 TLOG_DEBUG(TLVL_ENTER_EXIT_METHODS) << get_name() << ": Exiting stop_checking() method";
60}

Member Data Documentation

◆ m_queue_timeout

std::chrono::milliseconds dunedaq::dfmodules::TriggerInhibitAgent::m_queue_timeout
private

Definition at line 74 of file TriggerInhibitAgent.hpp.

◆ m_thread

dunedaq::utilities::WorkerThread dunedaq::dfmodules::TriggerInhibitAgent::m_thread
private

Definition at line 70 of file TriggerInhibitAgent.hpp.

◆ m_threshold_for_inhibit

std::atomic<uint32_t> dunedaq::dfmodules::TriggerInhibitAgent::m_threshold_for_inhibit
private

Definition at line 75 of file TriggerInhibitAgent.hpp.

◆ m_trigger_decision_receiver

std::shared_ptr<trigdecreceiver_t> dunedaq::dfmodules::TriggerInhibitAgent::m_trigger_decision_receiver
private

Definition at line 78 of file TriggerInhibitAgent.hpp.

◆ m_trigger_inhibit_sender

std::shared_ptr<triginhsender_t> dunedaq::dfmodules::TriggerInhibitAgent::m_trigger_inhibit_sender
private

Definition at line 79 of file TriggerInhibitAgent.hpp.

◆ m_trigger_number_at_end_of_processing_chain

std::atomic<daqdataformats::trigger_number_t> dunedaq::dfmodules::TriggerInhibitAgent::m_trigger_number_at_end_of_processing_chain
private

Definition at line 83 of file TriggerInhibitAgent.hpp.

◆ m_trigger_number_at_start_of_processing_chain

std::atomic<daqdataformats::trigger_number_t> dunedaq::dfmodules::TriggerInhibitAgent::m_trigger_number_at_start_of_processing_chain
private

Definition at line 82 of file TriggerInhibitAgent.hpp.


The documentation for this class was generated from the following files: