DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
Application.cpp
Go to the documentation of this file.
1
9
10#include "Application.hpp"
11
12#include "appfwk/cmd/Nljs.hpp"
14
17#include "confmodel/Session.hpp"
18#include "logging/Logging.hpp"
19#include "rcif/cmd/Nljs.hpp"
20
21#include <string>
22#include <unistd.h>
23#include <utility>
24
25namespace dunedaq::appfwk {
26
27Application::Application(std::string app_name,
28 std::string session_name,
29 std::string cmdlibimpl,
30 std::string confimpl,
31 std::string configuration_id)
32 : ConfigurationManagerOwner(confimpl, app_name, configuration_id)
33 , OpMonManager(session_name, app_name, get_config_manager()->get_session()->get_opmon_uri()->get_URI(app_name))
34 , NamedObject(app_name)
35 , m_mod_mgr(session_name)
36 , m_state("NONE")
37 , m_busy(false)
38 , m_error(false)
39 , m_initialized(false)
40{
41 m_runinfo.set_running(false);
42 m_runinfo.set_run_number(0);
43 m_runinfo.set_run_time(0);
44
45 m_cmd_fac = cmdlib::make_command_facility(
46 cmdlibimpl, session_name, get_config_manager()->get_session()->get_connectivity_service());
47
48 set_opmon_conf(get_config_manager()->get_application()->get_opmon_conf());
49
50 TLOG() << "confimpl=<" << confimpl << ">\n";
51}
52
53void
54Application::init()
55{
56 m_cmd_fac->set_commanded(*this, get_name());
57 m_mod_mgr.initialize(get_config_manager(), *this);
58 set_state("INITIAL");
59 m_initialized = true;
60}
61
62void
63Application::run(std::atomic<bool>& end_marker)
64{
65 if (!m_initialized) {
66 throw ApplicationNotInitialized(ERS_HERE, get_name());
67 }
68
69 start_monitoring();
70 m_cmd_fac->run(end_marker);
71
72 m_mod_mgr.cleanup();
73
74 stop_monitoring();
75}
76
77void
78Application::execute(const dataobj_t& cmd_data)
79{
80 auto rc_cmd = cmd_data.get<rcif::cmd::RCCommand>();
81 std::string cmdname = rc_cmd.id;
82 if (!check_state_for_cmd(cmd_data)) {
83 throw InvalidStateForCommand(ERS_HERE, cmdname, get_state(), m_error.load(), m_busy.load());
84 }
85
86 m_busy.store(true);
87
88 if (cmdname == "start") {
89 auto cmd_obj = rc_cmd.data.get<cmd::CmdObj>();
90
91 for (const auto& addressed : cmd_obj.modules) {
92 dataobj_t startpars = addressed.data;
93 auto rc_startpars = startpars.get<rcif::cmd::StartParams>();
94 m_runinfo.set_run_number(rc_startpars.run);
95 break;
96 }
97
98 m_run_start_time = std::chrono::steady_clock::now();
99 m_runinfo.set_running(true);
100 m_runinfo.set_run_time(0);
101 } else if (cmdname == "stop") {
102 m_run_start_time = std::chrono::steady_clock::time_point();
103 m_runinfo.set_running(false);
104 m_runinfo.set_run_number(0);
105 m_runinfo.set_run_time(0);
106 }
107
108 try {
109 m_mod_mgr.execute(cmdname, static_cast<DAQModule::CommandData_t>(rc_cmd.data));
110 m_busy.store(false);
111 if (rc_cmd.exit_state != "ANY")
112 set_state(rc_cmd.exit_state);
113 } catch (ers::Issue& ex) {
114 m_busy.store(false);
115 m_error.store(true);
116 throw;
117 }
118
119 publish_app_info();
120}
121
122void
123Application::generate_opmon_data()
124{
125 publish_app_info();
126}
127
128bool
129Application::check_state_for_cmd(const dataobj_t& cmd_data) const
130{
131 if (m_busy.load() || m_error.load())
132 return false;
133
134 std::string entry_state = cmd_data.get<rcif::cmd::RCCommand>().entry_state;
135 if (entry_state == "ANY" || get_state() == entry_state)
136 return true;
137
138 return false;
139}
140
141void
142Application::publish_app_info() {
143
144 opmon::AppInfo ai;
145 ai.set_state(get_state());
146 ai.set_busy(m_busy.load());
147 ai.set_error(m_error.load());
148
149 char hostname[256]; // NOLINT
150 auto res = gethostname(hostname, 256);
151 if (res < 0)
152 ai.set_host("Unknown");
153 else
154 ai.set_host(std::string(hostname));
155
156 publish(std::move(ai), {}, opmonlib::to_level(opmonlib::EntryOpMonLevel::kTopPriority));
157
158 if (m_run_start_time.time_since_epoch().count() != 0) {
159 auto now = std::chrono::steady_clock::now();
160 m_runinfo.set_run_time(std::chrono::duration_cast<std::chrono::seconds>(now - m_run_start_time).count());
161 }
162
163 publish(decltype(m_runinfo)(m_runinfo));
164
165}
166
167
168} // namespace dunedaq::appfwk
#define ERS_HERE
Base class for any user define issue.
Definition Issue.hpp:80
static int64_t now()
#define TLOG(...)
Definition macro.hpp:22
const dunedaq::confmodel::Session * get_session(dunedaq::conffwk::Configuration &conf, const std::string &name, unsigned long rlevel=10, const std::vector< std::string > *rclasses=nullptr)
Get session object.
InvalidStateForCommand