DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
Application.cpp
Go to the documentation of this file.
1
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()->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()->session()->get_connectivity_service());
47
48 set_opmon_conf(get_config_manager()->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
75void
76Application::execute(const dataobj_t& cmd_data)
77{
78 auto rc_cmd = cmd_data.get<rcif::cmd::RCCommand>();
79 std::string cmdname = rc_cmd.id;
80 if (!check_state_for_cmd(cmd_data)) {
81 throw InvalidStateForCommand(ERS_HERE, cmdname, get_state(), m_error.load(), m_busy.load());
82 }
83
84 m_busy.store(true);
85
86 if (cmdname == "start") {
87 auto cmd_obj = rc_cmd.data.get<cmd::CmdObj>();
88
89 for (const auto& addressed : cmd_obj.modules) {
90 dataobj_t startpars = addressed.data;
91 auto rc_startpars = startpars.get<rcif::cmd::StartParams>();
92 m_runinfo.set_run_number(rc_startpars.run);
93 break;
94 }
95
96 m_run_start_time = std::chrono::steady_clock::now();
97 m_runinfo.set_running(true);
98 m_runinfo.set_run_time(0);
99 } else if (cmdname == "stop") {
100 m_run_start_time = std::chrono::steady_clock::time_point();
101 m_runinfo.set_running(false);
102 m_runinfo.set_run_number(0);
103 m_runinfo.set_run_time(0);
104 }
105
106 try {
107 m_mod_mgr.execute(cmdname, rc_cmd.data);
108 m_busy.store(false);
109 if (rc_cmd.exit_state != "ANY")
110 set_state(rc_cmd.exit_state);
111 } catch (ers::Issue& ex) {
112 m_busy.store(false);
113 m_error.store(true);
114 throw;
115 }
116}
117
118void
119Application::generate_opmon_data()
120{
121 opmon::AppInfo ai;
122 ai.set_state(get_state());
123 ai.set_busy(m_busy.load());
124 ai.set_error(m_error.load());
125
126 char hostname[256]; // NOLINT
127 auto res = gethostname(hostname, 256);
128 if (res < 0)
129 ai.set_host("Unknown");
130 else
131 ai.set_host(std::string(hostname));
132
133 publish(std::move(ai), {}, opmonlib::to_level(opmonlib::EntryOpMonLevel::kTopPriority));
134
135 if (m_run_start_time.time_since_epoch().count() != 0) {
136 auto now = std::chrono::steady_clock::now();
137 m_runinfo.set_run_time(std::chrono::duration_cast<std::chrono::seconds>(now - m_run_start_time).count());
138 }
139
140 publish(decltype(m_runinfo)(m_runinfo));
141}
142
143bool
144Application::check_state_for_cmd(const dataobj_t& cmd_data) const
145{
146 if (m_busy.load() || m_error.load())
147 return false;
148
149 std::string entry_state = cmd_data.get<rcif::cmd::RCCommand>().entry_state;
150 if (entry_state == "ANY" || get_state() == entry_state)
151 return true;
152
153 return false;
154}
155
156} // namespace dunedaq::appfwk
#define ERS_HERE
Base class for any user define issue.
Definition Issue.hpp:69
static int64_t now()
#define TLOG(...)
Definition macro.hpp:22
InvalidStateForCommand