ifw-ccf 6.0.0
 
Loading...
Searching...
No Matches
application.hpp
Go to the documentation of this file.
1
6
7#ifndef CCF_CONTROL_APPLICATION_HPP_
8#define CCF_CONTROL_APPLICATION_HPP_
9
10#include <mal/Mal.hpp>
11
12#include <rad/mal/replier.hpp>
13#include <rad/dbAdapterRedis.hpp>
14
15#include <Recif.hpp>
16
24
38
39
40namespace ifw::ccf::control {
41
43 // @{
44 const std::string MON_THR_TAG = "MonThr";
45 const std::string ACQ_THR_TAG = "AcqThr";
46 const std::string INPUT_Q_TAG = "InputQueue";
47 // Used as a fmt format string; fmt (v11) format strings are consteval under
48 // C++20, so this must be usable in a constant expression — a const
49 // std::string is not, a constexpr std::string_view is.
50 constexpr std::string_view OUTPUT_Q_TAG = "OutputQueue::{}";
51 // @}
52
54 // @{
55 const std::string THREAD_SIG_TERM = "SigTerm";
56 const std::string THREAD_SIG_SETUP = "SigSetup";
57 const std::string THREAD_SIG_NEW_DATA = "SigNewData";
58 const std::string THREAD_SIG_PUBLISH = "SigPublish";
59 const std::string THREAD_SIG_START = "SigStart";
60 // @}
61
62 //const std::string THREAD_SYNC_ACK_OK = "SigAckOk";
63 //const std::string THREAD_SYNC_ACK_ERROR = "SigAckError";
64 //const std::string THREAD_SYNC_UNKNOWN = "SigUnknown";
65
67 // @{
68 const std::string ACTIVE_REC_MUTEX = "ActiveRecMutex";
69 const std::string REC_HISTORY_MUTEX = "RecHistoryMutex";
70 const std::string MUTEX_REC_WAIT_REQUESTS = "RecWaitRequests";
71 const std::string MUTEX_TELEMETRY = "Telemetry";
72 const std::string MUTEX_TELEMETRY_CACHE = "TelemetryCache";
73 // @}
74
76 template <typename CMD_TYPE, typename EX_TYPE>
77 void CcfRequestRejectHandler(const rad::AnyEvent& event, const std::string& state) {
78 LOG4CPLUS_TRACE_METHOD(Logger(), __PRETTY_FUNCTION__);
79 auto req = rad::GetPayloadNothrow<CMD_TYPE>(event);
80 if (req == nullptr) {
81 LOG4CPLUS_ERROR(Logger(), event.GetId() << " has no associated request!");
82 return;
83 }
84 req->SetException(EX_TYPE("Request rejected in state " + state, 0));
85 }
86
87
93 public:
94
97
99 static Application& Instance();
100
101 virtual ~Application();
102
104 elt::mal::Mal& GetMal();
105
107 int Execute(int argc, char* argv[]);
108
111 void CreateThreads();
112
114 void LoadInitSetup();
115
117 void HandleSetup();
118
121 void Dismantle();
122
123 // Returns true if image acquisition is active.
124 bool AcquisitionActive();
125
127 void StartAcquistion(bool force = false, bool exec_com_adapter_start = true);
128
131 void StopAcquistion();
132
134 void CheckStopAcquistion();
135
138
140 std::string GetState();
141
143 void SetRequestStatus(const std::string& request,
144 const std::string& status);
145
147 std::string GetRequestStatus(const std::string& request) const;
148
150 std::string ListAdapters();
151
153 template <class COM_ADPT_TYPE, class SIM_COM_ADPT_TYPE>
154 void RegisterComAdapters(const COM_ADPT_TYPE& com_adapter_factory_obj,
155 const SIM_COM_ADPT_TYPE& sim_com_adapter_factory_obj) {
156 LOG4CPLUS_TRACE_METHOD(Logger(), __PRETTY_FUNCTION__);
157 // if (m_com_adapter != nullptr) {
158 // delete m_com_adapter;
159 // }
160 // if (m_sim_com_adapter != nullptr) {
161 // delete m_sim_com_adapter;
162 // }
163 m_com_adapter = std::make_unique<COM_ADPT_TYPE>();
164 ifw::ccf::AssertPtr(m_com_adapter.get(), "Communication Adapter", IFWLOC);
165 m_sim_com_adapter = std::make_unique<SIM_COM_ADPT_TYPE>();
166 ifw::ccf::AssertPtr(m_sim_com_adapter.get(), "Simulation Communication Adapter", IFWLOC);
167 }
168
170 template <class MON_ADPT_TYPE>
171 void RegisterMonAdapter(const MON_ADPT_TYPE& mon_adapter_factory_obj) {
172 LOG4CPLUS_TRACE_METHOD(Logger(), __PRETTY_FUNCTION__);
173 m_mon_adapter = std::make_unique<MON_ADPT_TYPE>();
174 ifw::ccf::AssertPtr(m_com_adapter.get(), "Monitoring Adapter", IFWLOC);
175 }
176
178 template <class EXEC_ADPT_TYPE>
179 void RegisterExecAdapter(const EXEC_ADPT_TYPE& exec_adapter_factory_obj) {
180 LOG4CPLUS_TRACE_METHOD(Logger(), __PRETTY_FUNCTION__);
181 m_exec_adapter = std::make_unique<EXEC_ADPT_TYPE>();
182 ifw::ccf::AssertPtr(m_exec_adapter.get(), "Execution Adapter", IFWLOC);
183 }
184
188
191
194
196 void ConnectDevice();
197
199 void DisconnectDevice();
200
202 const std::vector<std::string>& GetProcThreadNames() const;
203
205 const std::vector<std::string>& GetPubThreadNames(const std::string& proc_thread_name) const;
206
208 const std::list<PubThread*>& GetPubThreads() const;
209
211 ProcThread& GetProcThread(const std::string& proc_thread_name);
212
214 bool IsProcThread(const std::string& thread_name);
215
217 bool IsPubThread(const std::string& thread_name);
218
219 Application(const Application&) = delete;
221
223 // Recording handling
225
228
230 void SetActiveRecStatusObj(std::shared_ptr<recif::RecStatus>& active_rec);
231
233 void UpdateActiveRecStatusObj(const ifw::ccf::common::PublisherStatus& sum_rec_pub_status);
234
236 void UpdateRecStatusInDb();
237
239 void GetActiveRecStatus(std::shared_ptr<recif::RecStatus>& active_rec) const;
240
242
245 std::shared_ptr<recif::RecStatus>& active_rec);
246
248 void SetRecordingStatus(const ifw::ccf::PubStatus status);
249
251 void GetRecStatus(const std::string& rec_id,
252 std::shared_ptr<recif::RecStatus>& active_rec) const;
253
255 void GetMostRecentRecStatus(std::shared_ptr<recif::RecStatus>& active_rec) const;
256
258 void AddRecWaitRequest(std::shared_ptr<RecWaitRequest>& req_wait_req);
259
261 void CheckRecWaitRequests(const bool recording_completed=false);
262
265
268
271
273 void ActivateRecording();
275
276 void HandleTelemetry(const double time_now);
277
278 std::map<std::string, TelemetryCacheEntry>& TelemetryCache();
279
280 private:
281 Application();
282
283 int8_t m_simulation{-1};
284 std::unique_ptr<rad::cii::Replier> m_mal_replier;
285 std::shared_ptr<elt::mal::Mal> m_mal{nullptr};
286 std::unique_ptr<DataContext> m_data_ctx;
287 ActionMgr m_action_mgr;
288 //StdActions* m_actions_std;
289 bool m_dismantle_invoked{false};
290
291 std::map<std::string, std::string> m_request_status_map;
292
293 // TODO: Handle this in the ifw::ccf::common::ComAdptBase class.
294 // See EICSSW-2138.
295 std::unique_ptr<ifw::ccf::common::ComAdptBase> m_com_adapter{nullptr};
296 std::unique_ptr<ifw::ccf::common::ComAdptBase> m_sim_com_adapter{nullptr};
297
298 std::unique_ptr<ifw::ccf::common::MonAdptBase> m_mon_adapter;
299
300 std::unique_ptr<ifw::ccf::common::ExecAdptBase> m_exec_adapter;
301
302 std::map<std::string, std::shared_ptr<ifw::ccf::common::FrameQueue>> m_frame_queues;
303
304 std::vector<std::string> m_proc_thread_names;
305 std::map<std::string, std::vector<std::string>> m_proc_to_pub_thread_names;
306
307 std::map<std::string, bool> m_pub_thread_names;
308
309 // For easy access to the Processing Threads. The threads are handled by the MPTK.
310 std::list<ProcThread*> m_proc_threads;
311
312 // For easy access to the Publisher Thread. The threads are handled by the MPTK.
313 std::list<PubThread*> m_pub_threads;
314
315 // Acquisition control.
317 double m_acq_setup_expo_time{0.0};
318 int64_t m_acq_setup_nb_of_frames{0};
319 int64_t m_acq_status_frame_count{0};
320 double m_acq_end_time{UINT_MAX};
321
322 // Recording session control.
323 std::shared_ptr<recif::RecStatus> m_active_recording;
324 int64_t m_exp_nb_of_frames;
325 int32_t m_max_sz_rec_history{1000};
326 int32_t m_rec_history_exp{INT_MAX};
327 bool m_cfg_auto_stop_acq_after_rec{false};
328 bool m_acq_auto_started_at_rec_start{false};
329 // Maps "<rec id>" into the set of associated Recording Sessions.
330 std::map<std::string, std::shared_ptr<recif::RecStatus>> m_rec_history;
331 std::vector<std::string> m_rec_id_history;
332
333 std::map<std::string, std::string> m_file_stored_to_pub_id;
334
335 // Pending ReqWait Requests.
336 std::map<std::string, std::shared_ptr<RecWaitRequest>> m_rec_wait_requests;
337
338 // Telemetry.
339 void InitTelemetry();
340 bool m_tel_enabled{false};
341 double m_tel_period{0};
342 bool m_disable_during_acq{true};
343 std::map<std::string, ifw::ccf::control::TelemetryNode> m_tel_nodes;
344 std::vector<std::string> m_tel_names;
345 double m_time_last_tel_sampling_exec{0};
346 std::map<std::string, TelemetryCacheEntry> m_tel_cache;
347 // Per-node last-emit timestamp for throttling repeated "no usable value"
348 // WARN messages emitted by HandleTelemetry. See TEL_WARN_THROTTLE_PERIOD.
349 std::map<std::string, double> m_tel_warn_last_emit;
350};
351
352
353inline Application& App() {
354 return Application::Instance();
355}
356
357} // namespace ifw::ccf::control
358
359#endif // CCFCONTROL_APPLICATION_HPP_
Class to be used as parent for CCF application type of classes.
Definition appBase.hpp:28
Class to be used as parent for CCF Communication Adapters.
Definition comAdptBase.hpp:48
Class to be used as parent for CCF Execution Adapters.
Definition execAdptBase.hpp:18
Class to be used as parent for CCF Monitor Adapters.
Definition monAdptBase.hpp:22
Class used by a Publisher to handle its own publisher status.
Definition pubBase.hpp:35
Implements the core CCF Control Application.
Definition application.hpp:92
void UpdateRecStatusInDb()
Update the status of the current Recording Session in the DB.
Definition application.cpp:778
void UpdateActiveRecStatusObj(const ifw::ccf::common::PublisherStatus &sum_rec_pub_status)
Update the Active Recording Status Object in memory and in the OLDB.
Definition application.cpp:750
void ActivateRecording()
Selects publishers and activate the recording.
Definition application.cpp:1025
bool AcquisitionActive()
Definition application.cpp:668
void CheckStopAcquistion()
Check if the conditions are met to stop an ongoing acqusition session.
Definition application.cpp:849
std::string ListAdapters()
List the available adapters registered in this executable.
Definition application.cpp:432
void IncrementFrameCounter()
Increment frame counter, counting the number of complete frames received.
Definition application.cpp:932
void CleanUpRecWaitRequests()
Check if there are RecWait Requests that can be removed from the queue.
Definition application.cpp:1123
void UpdateRecordingStatus()
Disable assignment operator.
Definition application.cpp:711
void CheckRecWaitRequests(const bool recording_completed=false)
Check if there are pending requests from RecWait Requests and send response if needed.
Definition application.cpp:1085
void GetMostRecentRecStatus(std::shared_ptr< recif::RecStatus > &active_rec) const
Get the information about the most recent Recording (active or in the history).
Definition application.cpp:991
void RegisterMonAdapter(const MON_ADPT_TYPE &mon_adapter_factory_obj)
Method to allocate and register the Monitor Adapters.
Definition application.hpp:171
Application(const Application &)=delete
int GetFramesRemainingActiveRecStatus() const
Definition application.cpp:945
void SetRecordingStatus(const ifw::ccf::PubStatus status)
Set the status of the an active Recording Session (Active Recording Object).
Definition application.cpp:996
std::map< std::string, TelemetryCacheEntry > & TelemetryCache()
Definition application.cpp:1207
void StopAcquistion()
Definition application.cpp:912
void CreateThreads()
Definition application.cpp:448
const std::list< PubThread * > & GetPubThreads() const
Get the IDs of the Publisher Threads running.
Definition application.cpp:701
void UpdateControlSetupPars()
Update setup parameters used internally in the application for flow control.
Definition application.cpp:1182
ProcThread & GetProcThread(const std::string &proc_thread_name)
Get reference to Processing Thread object.
Definition application.cpp:690
void GetActiveRecStatus(std::shared_ptr< recif::RecStatus > &active_rec) const
Get the currently active Recording status.
Definition application.cpp:937
int Execute(int argc, char *argv[])
Initialise and execute the application.
Definition application.cpp:61
static Application & Instance()
Return reference to unique instance of the application class.
Definition application.cpp:38
void MoveActiveRecStatusToHistory(const ifw::ccf::PubStatus status, std::shared_ptr< recif::RecStatus > &active_rec)
Move the Active Rec Status object to the Rec Status History.
Definition application.cpp:1047
virtual ~Application()
Definition application.cpp:49
void GetRecStatus(const std::string &rec_id, std::shared_ptr< recif::RecStatus > &active_rec) const
Check if a Recording with the given ID is found and returns its status.
Definition application.cpp:952
void RegisterExecAdapter(const EXEC_ADPT_TYPE &exec_adapter_factory_obj)
Method to allocate and register the Execution Adapter.
Definition application.hpp:179
void HandleSetup()
Handle the setup of the application.
Definition application.cpp:651
void AddRecWaitRequest(std::shared_ptr< RecWaitRequest > &req_wait_req)
Add a ReqWaitRequest in the internal registry.
Definition application.cpp:1077
elt::mal::Mal & GetMal()
Return reference to the MAL (Singleton) instance.
Definition application.cpp:54
bool IsPubThread(const std::string &thread_name)
Returns bool if the thread is a Publisher Thread.
Definition application.cpp:1165
void LoadInitSetup()
Load the Initialisation Setup specified in the configuration and install it.
Definition application.cpp:641
const std::vector< std::string > & GetPubThreadNames(const std::string &proc_thread_name) const
Get the names of the Publisher Threads running for a specific Processing Thread.
Definition application.cpp:679
std::string GetRequestStatus(const std::string &request) const
Get the status of the given request.
Definition application.cpp:1150
void ConnectDevice()
Connect to the associated device.
Definition application.cpp:398
void Dismantle()
Definition application.cpp:308
void RegisterComAdapters(const COM_ADPT_TYPE &com_adapter_factory_obj, const SIM_COM_ADPT_TYPE &sim_com_adapter_factory_obj)
Method to allocate and register the Communication Adapters.
Definition application.hpp:154
std::string GetState()
Return the current state (status) of the SCXML state machine.
Definition application.cpp:706
ifw::ccf::common::ExecAdptBase & GetExecAdapter()
Return the reference to the Execution Adapter.
Definition application.cpp:633
bool IsProcThread(const std::string &thread_name)
Returns bool if the thread is a Processing Thread.
Definition application.cpp:1160
static Application * s_app_instance
Singleton instance.
Definition application.hpp:96
void DisconnectDevice()
Disconnect from the associated device.
Definition application.cpp:416
Application & operator=(const Application &)=delete
Disable copy constructor.
void SetRequestStatus(const std::string &request, const std::string &status)
Set status of the given request.
Definition application.cpp:1144
void HandleTelemetry(const double time_now)
Definition application.cpp:1263
ifw::ccf::common::MonAdptBase & GetMonAdapter()
Return the reference to the Monitoring Adapter.
Definition application.cpp:625
void StartAcquistion(bool force=false, bool exec_com_adapter_start=true)
Instruct the system to start an acquisition (finite or infnite).
Definition application.cpp:815
void AcqAutoStartedAtRecStart()
Invoke to signal that the Acqusition was auto started at RecStart.
Definition application.cpp:1177
ifw::ccf::common::ComAdptBase & GetComAdapter()
Definition application.cpp:612
const std::vector< std::string > & GetProcThreadNames() const
Get the names of the Processing Threads running.
Definition application.cpp:673
void SetActiveRecStatusObj(std::shared_ptr< recif::RecStatus > &active_rec)
Set the Active Recording Status Object.
Definition application.cpp:1015
Processing Thread MPTK Thread implementation (see also ifw::ccf::mptk::Thread).
Definition procThread.hpp:18
Definition acqThread.cpp:11
constexpr std::string_view OUTPUT_Q_TAG
Definition application.hpp:50
const std::string ACTIVE_REC_MUTEX
Definition application.hpp:68
const std::string ACQ_THR_TAG
Definition application.hpp:45
const std::string THREAD_SIG_START
Definition application.hpp:59
const std::string REC_HISTORY_MUTEX
Definition application.hpp:69
const std::string THREAD_SIG_NEW_DATA
Definition application.hpp:57
const std::string INPUT_Q_TAG
Definition application.hpp:46
const std::string THREAD_SIG_SETUP
Definition application.hpp:56
const std::string MON_THR_TAG
Definition application.hpp:44
const std::string MUTEX_REC_WAIT_REQUESTS
Definition application.hpp:70
const std::string MUTEX_TELEMETRY
Definition application.hpp:71
void CcfRequestRejectHandler(const rad::AnyEvent &event, const std::string &state)
Template function RAD request rejection check/handler.
Definition application.hpp:77
const std::string THREAD_SIG_TERM
Definition application.hpp:55
const std::string THREAD_SIG_PUBLISH
Definition application.hpp:58
const std::string MUTEX_TELEMETRY_CACHE
Definition application.hpp:72
Application & App()
Definition application.hpp:353
PubStatus
Defines the various possible states of a Data Publisher.
Definition base.hpp:180
log4cplus::Logger & Logger()
Definition base.cpp:24
ExpoMode
Exposure modes.
Definition base.hpp:208
@ INACTIVE
Definition base.hpp:211
void AssertPtr(const void *ptr, const std::string &object, const std::string &location)
Check that pointer is not nullptr and raise rad::exception in case it is.
Definition base.cpp:66