HLCC Documentation 3.0.1
Loading...
Searching...
No Matches
commandsImpl.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2020-2025 European Southern Observatory (ESO)
2//
3// SPDX-License-Identifier: LGPL-3.0-only
4
13#ifndef HLCC_TELIF_TELIF_COMMANDSIMPL_HPP
14#define HLCC_TELIF_TELIF_COMMANDSIMPL_HPP
15
16#include <Stdif.hpp>
17
18#include <rad/exceptions.hpp>
19#include <rad/smAdapter.hpp>
20
21#include "telif/commands.rad.hpp"
22#include "telif/logger.hpp"
23
24
25namespace hlcc::telif {
26
27class CommandsImpl : public ccsinsif::AsyncCommands {
28public:
29 explicit CommandsImpl(rad::SMAdapter& sm) : m_sm(sm) {
30 /* GCH
31 * I do the registration of the RejectionHandler
32 * in the definition of each command handler method
33 * by adding the line:
34 * m_sm.RegisterDefaultRequestRejectHandler<StdCmds::Exit>();
35 * This has the advantage of putting the registration one by one
36 * together with the code of each handler, making it easy to keep the
37 * code aligned and to handle special cases, for example with
38 * specific handlers for commands returning something different form
39 * a string or not setting an handler for commands that are always available,
40 * in any state and will never be rejected.
41 * The drawback is a small performance penalty, since it will try to
42 * insert the registration in the std::map every time.
43 * Nothing will happen, since std::map will not insert a duplicate and will
44 * simply ignore the additional insertion.
45 * If that is a problem, we might do the registration here in the constructor,
46 * but it will be error prone when keeping the code aligned when
47 * adding or removing commands
48 */
49 RAD_TRACE(GetLogger());
50 }
51
52 virtual ~CommandsImpl() {
53 RAD_TRACE(GetLogger());
54 }
55
56 virtual elt::mal::future<std::string> Preset(const std::shared_ptr<ccsinsif::PresetArgs>& preset_args) override {
57 RAD_TRACE(GetLogger());
58
59 LOG4CPLUS_INFO_FMT(GetLogger(), "Preset command received with PresetData - Ra %1.15f, "
60 "Dec %1.15f, Epoch %s, Parallax %1.15f, Object_name %s, "
61 "Proper_motion_ra %1.15f, Proper_motion_dec %1.15f, Radvel %1.15f, "
62 "Rshift %1.15f, Velocity_offset_ra %1.15f, "
63 "Velocity_offset_dec %1.15f, Time_ephem_utc %1.15f",
64 preset_args->getPreset_data()->getTarget_data()->getRa(), preset_args->getPreset_data()->getTarget_data()->getDec(),
65 preset_args->getPreset_data()->getTarget_data()->getEpoch().c_str(),
66 preset_args->getPreset_data()->getTarget_data()->getParallax(), preset_args->getPreset_data()->getTarget_data()->getObject_name().c_str(),
67 preset_args->getPreset_data()->getTarget_data()->getProper_motion_ra(),
68 preset_args->getPreset_data()->getTarget_data()->getProper_motion_dec(),
69 preset_args->getPreset_data()->getTarget_data()->getRadvel(), preset_args->getPreset_data()->getTarget_data()->getRshift(),
70 preset_args->getPreset_data()->getTarget_data()->getVelocity_offset_ra(),
71 preset_args->getPreset_data()->getTarget_data()->getVelocity_offset_dec(),
72 preset_args->getPreset_data()->getTarget_data()->getTime_ephem_utc());
73
74 auto ev = std::make_shared<TelifCommands::Preset>(preset_args->clone());
75 RAD_TRACE(GetLogger());
76 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::Preset>();
77 m_sm.PostEvent(ev);
78 RAD_TRACE(GetLogger());
79 return ev->GetPayload().GetReplyFuture();
80
81 }
82
83 virtual elt::mal::future<std::string> UpdateTarget(const std::string& preset_args) override {
84 RAD_TRACE(GetLogger());
85
86 auto ev = std::make_shared<TelifCommands::UpdateTarget>(preset_args);
87 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::UpdateTarget>();
88 m_sm.PostEvent(ev);
89 return ev->GetPayload().GetReplyFuture();
90 }
91
92 virtual elt::mal::future<std::string> RequestControl(ccsinsif::ControlMode control_mode) override {
93 RAD_TRACE(GetLogger());
94 LOG4CPLUS_INFO(GetLogger(), "Received RequestControl with: Control_mode " << control_mode);
95 auto ev = std::make_shared<TelifCommands::RequestControl>(control_mode);
96 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::RequestControl>();
97 m_sm.PostEvent(ev);
98
99 return ev->GetPayload().GetReplyFuture();
100 }
101
102 virtual elt::mal::future<std::string> ReleaseControl() override {
103 RAD_TRACE(GetLogger());
104 LOG4CPLUS_INFO(GetLogger(), "Received ReleaseControl");
105 auto ev = std::make_shared<TelifCommands::ReleaseControl>();
106 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::ReleaseControl>();
107 m_sm.PostEvent(ev);
108
109 return ev->GetPayload().GetReplyFuture();
110 }
111
112 virtual elt::mal::future<std::string> GetConfig() override {
113 RAD_TRACE(GetLogger());
114 LOG4CPLUS_INFO(GetLogger(), "Received GetConfig");
115
116 auto ev = std::make_shared<EventsApp::GetConfig>("");
117 m_sm.RegisterDefaultRequestRejectHandler<EventsApp::GetConfig>();
118 m_sm.PostEvent(ev);
119
120 return ev->GetPayload().GetReplyFuture();
121 }
122
123 [[deprecated("SetObservingWavelength is Deprecated - Use UpdateTarget")]]
124 virtual elt::mal::future<std::string> SetObservingWavelength(double wavelength) override {
125 RAD_TRACE(GetLogger());
126 LOG4CPLUS_INFO(GetLogger(), "Received SetObservingWavelength with: Wavelength " << wavelength);
127
128 auto ev = std::make_shared<TelifCommands::SetObservingWavelength>(wavelength);
129 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::SetObservingWavelength>();
130 m_sm.PostEvent(ev);
131
132 return ev->GetPayload().GetReplyFuture();
133 }
134
135 virtual elt::mal::future<std::string> SetVelocityOffset(const std::shared_ptr<ccsinsif::VelocityOffset>& offset) override {
136 RAD_TRACE(GetLogger());
137 LOG4CPLUS_INFO(GetLogger(), "Received SetVelocityOffset with: Ra " << offset->getRa()
138 << ", Dec " << offset->getDec());
139
140 auto ev = std::make_shared<TelifCommands::SetVelocityOffset>(offset->clone());
141 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::SetVelocityOffset>();
142 m_sm.PostEvent(ev);
143
144 return ev->GetPayload().GetReplyFuture();
145 }
146
147 virtual elt::mal::future<std::string> SkyOffset(const std::shared_ptr<ccsinsif::OffsetSkyArgs>& offset_args) override {
148 RAD_TRACE(GetLogger());
149 LOG4CPLUS_INFO(GetLogger(), "Received SkyOffset with: Ra " << offset_args->getRa()
150 << ", Dec " << offset_args->getDec() << ", Field_stabilization "
151 << offset_args->getField_stabilization()
152 << ", Guide_star_param " << offset_args->getGuide_star_param());
153 auto ev = std::make_shared<TelifCommands::SkyOffset>(offset_args->clone());
154 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::SkyOffset>();
155 m_sm.PostEvent(ev);
156
157 return ev->GetPayload().GetReplyFuture();
158 }
159
160 virtual elt::mal::future<std::string> OffsetSetFocalPlane(const std::shared_ptr<ccsinsif::OffsetFocalPlaneArgs>& offset_args) override {
161 RAD_TRACE(GetLogger());
162 LOG4CPLUS_INFO(GetLogger(), "Received OffsetSetFocalPlane with: X " << offset_args->getX()
163 << ", Y " << offset_args->getY() << ", Field_stabilization "
164 << offset_args->getField_stabilization()
165 << ", Guide_star_param " << offset_args->getGuide_star_param());
166 auto ev = std::make_shared<TelifCommands::OffsetSetFocalPlane>(offset_args->clone());
167
168 //m_sm.PostEvent(ev);
169 stdif::ExceptionErr icd_ex {"NOT IMPLEMENTED", 0};
170 ev->GetPayload().SetException(icd_ex);
171
172 return ev->GetPayload().GetReplyFuture();
173 }
174
175 virtual elt::mal::future<std::string> SetReferenceFocus(double offset) override {
176 RAD_TRACE(GetLogger());
177 LOG4CPLUS_INFO(GetLogger(), "Received SetReferenceFocus with: Offset " << offset);
178
179 auto ev = std::make_shared<TelifCommands::SetReferenceFocus>(offset);
180 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::SetReferenceFocus>();
181 m_sm.PostEvent(ev);
182
183 return ev->GetPayload().GetReplyFuture();
184 }
185
186 virtual elt::mal::future<std::string> SetReferenceAberration(const elt::mal::shared_vector<const double>& aberration_offset) override {
187 RAD_TRACE(GetLogger());
188 LOG4CPLUS_INFO(GetLogger(), "Received SetReferenceAberration with: Aberration_offset " << aberration_offset);
189
190 /* Create a copy obj for the aberration_offset
191 * which in this case still have the same shared pointer of the original*/
192 elt::mal::shared_vector<const double> aberration_offset_temp(aberration_offset);
193
194 /* Make the copy obj unique by reseting the shared pointer reference to a new obj
195 * Its equivalent to the Clone() method of other types */
196 aberration_offset_temp.make_unique();
197
198 auto ev = std::make_shared<TelifCommands::SetReferenceAberration>(aberration_offset_temp);
199
200 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::SetReferenceAberration>();
201
202 m_sm.PostEvent(ev);
203
204 return ev->GetPayload().GetReplyFuture();
205 }
206
207 virtual elt::mal::future<std::string> RousConfig(ccsinsif::RousMode mode) override {
208 RAD_TRACE(GetLogger());
209 LOG4CPLUS_INFO(GetLogger(), "Received RousConfig with: Mode " << mode);
210
211 auto ev = std::make_shared<TelifCommands::RousConfig>(mode);
212 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::RousConfig>();
213 m_sm.PostEvent(ev);
214
215 return ev->GetPayload().GetReplyFuture();
216 }
217
218 virtual elt::mal::future<std::string> RousExecute() override {
219 RAD_TRACE(GetLogger());
220 LOG4CPLUS_INFO(GetLogger(), "Received RousExecute");
221
222 auto ev = std::make_shared<TelifCommands::RousExecute>();
223 m_sm.RegisterDefaultRequestRejectHandler<TelifCommands::RousExecute>();
224 m_sm.PostEvent(ev);
225
226 return ev->GetPayload().GetReplyFuture();
227 }
228
229private:
230 rad::SMAdapter& m_sm;
231};
232
233} // namespace hlcc::telif
234
235#endif // HLCC_TELIF_TELIF_COMMANDSIMPL_HPP
Default logger name.
virtual elt::mal::future< std::string > SetReferenceFocus(double offset) override
Definition commandsImpl.hpp:175
virtual elt::mal::future< std::string > SetVelocityOffset(const std::shared_ptr< ccsinsif::VelocityOffset > &offset) override
Definition commandsImpl.hpp:135
virtual elt::mal::future< std::string > UpdateTarget(const std::string &preset_args) override
Definition commandsImpl.hpp:83
virtual elt::mal::future< std::string > SkyOffset(const std::shared_ptr< ccsinsif::OffsetSkyArgs > &offset_args) override
Definition commandsImpl.hpp:147
virtual elt::mal::future< std::string > SetObservingWavelength(double wavelength) override
Definition commandsImpl.hpp:124
virtual elt::mal::future< std::string > RousConfig(ccsinsif::RousMode mode) override
Definition commandsImpl.hpp:207
CommandsImpl(rad::SMAdapter &sm)
Definition commandsImpl.hpp:29
virtual elt::mal::future< std::string > OffsetSetFocalPlane(const std::shared_ptr< ccsinsif::OffsetFocalPlaneArgs > &offset_args) override
Definition commandsImpl.hpp:160
virtual elt::mal::future< std::string > RequestControl(ccsinsif::ControlMode control_mode) override
Definition commandsImpl.hpp:92
virtual elt::mal::future< std::string > SetReferenceAberration(const elt::mal::shared_vector< const double > &aberration_offset) override
Definition commandsImpl.hpp:186
virtual elt::mal::future< std::string > GetConfig() override
Definition commandsImpl.hpp:112
virtual elt::mal::future< std::string > Preset(const std::shared_ptr< ccsinsif::PresetArgs > &preset_args) override
Definition commandsImpl.hpp:56
virtual elt::mal::future< std::string > ReleaseControl() override
Definition commandsImpl.hpp:102
virtual ~CommandsImpl()
Definition commandsImpl.hpp:52
virtual elt::mal::future< std::string > RousExecute() override
Definition commandsImpl.hpp:218
Definition configTest.cpp:22
log4cplus::Logger & GetLogger()
Definition logger.cpp:21