Dripline-Cpp  v2.4.2
Dripline Implementation in C++
oscillator_service_endpoints.cc
Go to the documentation of this file.
1 /*
2  * oscillator_service_endpoints.cc
3  *
4  * Created on: May 20, 2019
5  * Author: N.S. Oblath
6  */
7 
9 
10 #include "dripline_exceptions.hh"
11 
12 #include "logger.hh"
13 #include "signal_handler.hh"
14 
15 using scarab::param_array;
16 using scarab::param_node;
17 using scarab::param_ptr_t;
18 
19 LOGGER( dlog, "oscillator_service_endpoints" );
20 
21 namespace dripline
22 {
23  oscillator_ep::oscillator_ep( const std::string& a_name ) :
24  endpoint( a_name ),
25  f_osc_svc()
26  {}
27 
29  {}
30 
31  oscillator_ep_frequency::oscillator_ep_frequency( const std::string& a_name ) :
32  oscillator_ep( a_name )
33  {}
34 
36  {}
37 
39  {
40  param_ptr_t t_reply_payload( new param_node() );
41  param_node& t_reply_node = t_reply_payload->as_node();
42  t_reply_node.add( "value", f_osc_svc->oscillator().get_frequency() );
43  return a_request->reply( dl_success(), "Get request succeeded", std::move(t_reply_payload) );
44  }
45 
47  {
48  f_osc_svc->oscillator().set_frequency( a_request->payload()["values"][0]().as_double() );
49  return a_request->reply( dl_success(), "Frequency set" );
50  }
51 
52  oscillator_ep_amplitude::oscillator_ep_amplitude( const std::string& a_name ) :
53  oscillator_ep( a_name )
54  {}
55 
57  {}
58 
60  {
61  param_ptr_t t_reply_payload( new param_node() );
62  param_node& t_reply_node = t_reply_payload->as_node();
63  t_reply_node.add( "value", f_osc_svc->oscillator().get_amplitude() );
64  return a_request->reply( dl_success(), "Get request succeeded", std::move(t_reply_payload) );
65  }
66 
68  {
69  f_osc_svc->oscillator().set_amplitude( a_request->payload()["values"][0]().as_double() );
70  return a_request->reply( dl_success(), "Frequency set" );
71  }
72 
73  oscillator_ep_in_phase::oscillator_ep_in_phase( const std::string& a_name ) :
74  oscillator_ep( a_name )
75  {}
76 
78  {}
79 
81  {
82  param_ptr_t t_reply_payload( new param_node() );
83  param_node& t_reply_node = t_reply_payload->as_node();
84  t_reply_node.add( "value", f_osc_svc->oscillator().in_phase().second );
85  return a_request->reply( dl_success(), "Get request succeeded", std::move(t_reply_payload) );
86  }
87 
89  oscillator_ep( a_name )
90  {}
91 
93  {}
94 
96  {
97  param_ptr_t t_reply_payload( new param_node() );
98  param_node& t_reply_node = t_reply_payload->as_node();
99  t_reply_node.add( "value", f_osc_svc->oscillator().quadrature().second );
100  return a_request->reply( dl_success(), "Get request succeeded", std::move(t_reply_payload) );
101  }
102 
103  oscillator_ep_iq::oscillator_ep_iq( const std::string& a_name ) :
104  oscillator_ep( a_name )
105  {}
106 
108  {}
109 
111  {
112  param_ptr_t t_reply_payload( new param_node() );
113  param_node& t_reply_node = t_reply_payload->as_node();
114  param_array t_iq_param;
115  t_iq_param.push_back( f_osc_svc->oscillator().iq().second.real() );
116  t_iq_param.push_back( f_osc_svc->oscillator().iq().second.imag() );
117  t_reply_node.add( "value", std::move(t_iq_param) );
118  return a_request->reply( dl_success(), "Get request succeeded", std::move(t_reply_payload) );
119  }
120 
121  oscillator_service_endpoints::oscillator_service_endpoints( const scarab::param_node& a_config ) :
122  scarab::cancelable(),
123  service( a_config, "osc_svc_ep" ),
124  f_oscillator(),
125  f_return( dl_success().rc_value() )
126  {
127  add_child( std::make_shared< oscillator_ep_frequency >( "frequency" ) );
128  add_child( std::make_shared< oscillator_ep_amplitude >( "amplitude" ) );
129  add_async_child( std::make_shared< oscillator_ep_in_phase >( "in_phase" ) );
130  add_async_child( std::make_shared< oscillator_ep_quadrature >( "quadrature" ) );
131  add_async_child( std::make_shared< oscillator_ep_iq >( "iq" ) );
132  }
133 
135  {
136  }
137 
139  {
140  for( async_map_t::iterator t_child_it = f_async_children.begin();
141  t_child_it != f_async_children.end();
142  ++t_child_it )
143  {
144  auto t_listener_endpoint = std::static_pointer_cast< endpoint_listener_receiver >(t_child_it->second);
145  t_listener_endpoint->endpoint()->service() = shared_from_this();
146  auto t_osc_endpoint = std::static_pointer_cast< oscillator_ep >(t_listener_endpoint->endpoint());
147  t_osc_endpoint->f_osc_svc = this;
148  }
149  for( sync_map_t::iterator t_child_it = f_sync_children.begin();
150  t_child_it != f_sync_children.end();
151  ++t_child_it )
152  {
153  std::static_pointer_cast< oscillator_ep >(t_child_it->second)->f_service = shared_from_this();
154  std::static_pointer_cast< oscillator_ep >(t_child_it->second)->f_osc_svc = this;
155  }
156  return;
157  }
158 
160  {
161  scarab::signal_handler t_sig_hand;
162  t_sig_hand.add_cancelable( this );
163 
164  try
165  {
166  if( ! start() ) throw dripline_error() << "Unable to start service";
167 
168  if( ! listen() ) throw dripline_error() << "Unable to start listening";
169 
170  if( ! stop() ) throw dripline_error() << "Unable to stop service";
171  }
172  catch( std::exception& e )
173  {
174  LERROR( dlog, "Exception caught: " << e.what() );
175  f_return = dl_service_error().rc_value() / 100;
176  }
177 
178  if( scarab::signal_handler::get_exited() )
179  {
180  f_return = scarab::signal_handler::get_return_code();
181  }
182 
183  return;
184  }
185 
186 } /* namespace dripline */
virtual unsigned rc_value() const
std::shared_ptr< msg_request > request_ptr_t
Definition: dripline_fwd.hh:23
virtual reply_ptr_t do_set_request(const request_ptr_t a_request)
Dripline-specific errors.
virtual reply_ptr_t do_set_request(const request_ptr_t a_request)
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)
bool add_child(endpoint_ptr_t a_endpoint_ptr)
Add a synchronous child endpoint.
Definition: service.cc:118
oscillator_service_endpoints(const scarab::param_node &a_config=scarab::param_node())
Consumer of Dripline messages on a particular queue.
Definition: service.hh:72
Definition: core.hh:17
oscillator_ep_quadrature(const std::string &a_name)
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)
static scarab::logger dlog("oscillator_service_endpoints")
oscillator_ep_in_phase(const std::string &a_name)
Decorator class for a plain endpoint: adds listener_receiver capabilities.
Definition: listener.hh:104
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)
oscillator_service_endpoints * f_osc_svc
static scarab::logger dlog("agent")
oscillator_ep_frequency(const std::string &a_name)
std::shared_ptr< msg_reply > reply_ptr_t
Definition: dripline_fwd.hh:24
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)
oscillator_ep_iq(const std::string &a_name)
oscillator_ep_amplitude(const std::string &a_name)
bool add_async_child(endpoint_ptr_t a_endpoint_ptr)
Add an asynchronous child endpoint.
Definition: service.cc:135
Basic Dripline object capable of receiving and acting on messages.
Definition: endpoint.hh:95
oscillator_ep(const std::string &a_name)
virtual reply_ptr_t do_get_request(const request_ptr_t a_request)