service_client.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_NODE_SERVICE_CLIENT_HPP_INCLUDED
6 #define UAVCAN_NODE_SERVICE_CLIENT_HPP_INCLUDED
7 
12 
13 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
14 # error UAVCAN_CPP_VERSION
15 #endif
16 
17 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
18 # include <functional>
19 #endif
20 
21 namespace uavcan
22 {
28 {
31 
33 
34  ServiceCallID(NodeID arg_server_node_id, TransferID arg_transfer_id)
35  : server_node_id(arg_server_node_id)
36  , transfer_id(arg_transfer_id)
37  { }
38 
39  bool operator==(const ServiceCallID rhs) const
40  {
41  return (rhs.server_node_id == server_node_id) &&
42  (rhs.transfer_id == transfer_id);
43  }
44 
45  bool isValid() const { return server_node_id.isUnicast(); }
46 };
47 
53 template <typename DataType>
55 {
56 public:
58 
59  enum Status { Success, ErrorTimeout };
60 
61 private:
62  const Status status_;
65 
66 public:
67  ServiceCallResult(Status arg_status, ServiceCallID arg_call_id, ResponseFieldType& arg_response)
68  : status_(arg_status)
69  , call_id_(arg_call_id)
70  , response_(arg_response)
71  {
72  UAVCAN_ASSERT(call_id_.isValid());
73  UAVCAN_ASSERT((status_ == Success) || (status_ == ErrorTimeout));
74  }
75 
79  bool isSuccessful() const { return status_ == Success; }
80 
81  Status getStatus() const { return status_; }
82 
83  ServiceCallID getCallID() const { return call_id_; }
84 
88  const ResponseFieldType& getResponse() const { return response_; }
89  ResponseFieldType& getResponse() { return response_; }
90 };
91 
96 template <typename Stream, typename DataType>
97 static Stream& operator<<(Stream& s, const ServiceCallResult<DataType>& scr)
98 {
99  s << "# Service call result [" << DataType::getDataTypeFullName() << "] "
100  << (scr.isSuccessful() ? "OK" : "FAILURE")
101  << " server_node_id=" << int(scr.getCallID().server_node_id.get())
102  << " tid=" << int(scr.getCallID().transfer_id.get()) << "\n";
103  if (scr.isSuccessful())
104  {
105  s << scr.getResponse();
106  }
107  else
108  {
109  s << "# (no data)";
110  }
111  return s;
112 }
113 
118  , protected DeadlineHandler
119 {
121 
122 protected:
124  {
128 
129  virtual void handleDeadline(MonotonicTime);
130 
131  public:
134  , owner_(owner)
135  , id_(call_id)
136  , timed_out_(false)
137  {
140  }
141 
142  ServiceCallID getCallID() const { return id_; }
143 
144  bool hasTimedOut() const { return timed_out_; }
145 
146  static bool hasTimedOutPredicate(const CallState& cs) { return cs.hasTimedOut(); }
147 
148  bool operator==(const CallState& rhs) const
149  {
150  return (&owner_ == &rhs.owner_) && (id_ == rhs.id_);
151  }
152  };
153 
155  {
157  CallStateMatchingPredicate(ServiceCallID reference) : id(reference) { }
158  bool operator()(const CallState& state) const { return (state.getCallID() == id) && !state.hasTimedOut(); }
159  };
160 
162  {
165  bool operator()(const CallState& state) const { return state.getCallID().server_node_id == server_node_id; }
166  };
167 
169 
174  { }
175 
176  virtual ~ServiceClientBase() { }
177 
178  int prepareToCall(INode& node, const char* dtname, NodeID server_node_id, ServiceCallID& out_call_id);
179 
180 public:
188 };
189 
210 template <typename DataType_,
211 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
212  typename Callback_ = std::function<void (const ServiceCallResult<DataType_>&)>
213 #else
214  typename Callback_ = void (*)(const ServiceCallResult<DataType_>&)
215 #endif
216  >
218  : public GenericSubscriber<DataType_,
219  typename DataType_::Response, TransferListenerWithFilter>
220  , public ServiceClientBase
221 {
222 public:
223  typedef DataType_ DataType;
224  typedef typename DataType::Request RequestType;
225  typedef typename DataType::Response ResponseType;
227  typedef Callback_ Callback;
228 
229 private:
233 
235 
237  {
239 
240  TimeoutCallbackCaller(ServiceClient& arg_owner) : owner(arg_owner) { }
241 
242  void operator()(const CallState& state)
243  {
244  if (state.hasTimedOut())
245  {
246  UAVCAN_TRACE("ServiceClient::TimeoutCallbackCaller", "Timeout from nid=%d, tid=%d, dtname=%s",
247  int(state.getCallID().server_node_id.get()), int(state.getCallID().transfer_id.get()),
248  DataType::getDataTypeFullName());
249 
250  typename SubscriberType::ReceivedDataStructureSpec rx_struct; // Default-initialized
251 
252  ServiceCallResultType result(ServiceCallResultType::ErrorTimeout, state.getCallID(),
253  rx_struct); // Mutable!
254 
255  owner.invokeCallback(result);
256  }
257  }
258  };
259 
261 
264 
265  virtual bool shouldAcceptFrame(const RxFrame& frame) const; // Called from the transfer listener
266 
267  void invokeCallback(ServiceCallResultType& result);
268 
269  virtual void handleReceivedDataStruct(ReceivedDataStructure<ResponseType>& response);
270 
271  virtual void handleDeadline(MonotonicTime);
272 
273  int addCallState(ServiceCallID call_id);
274 
275 public:
280  explicit ServiceClient(INode& node, const Callback& callback = Callback())
283  , call_registry_(node.getAllocator())
284  , publisher_(node, getDefaultRequestTimeout())
285  , callback_(callback)
286  {
287  setPriority(TransferPriority::MiddleLower);
288  setRequestTimeout(getDefaultRequestTimeout());
289 #if UAVCAN_DEBUG
290  UAVCAN_ASSERT(getRequestTimeout() == getDefaultRequestTimeout()); // Making sure default values are OK
291 #endif
292  }
293 
294  virtual ~ServiceClient() { cancelAllCalls(); }
295 
300  int init()
301  {
302  return publisher_.init();
303  }
304 
310  int init(TransferPriority priority)
311  {
312  return publisher_.init(priority);
313  }
314 
325  int call(NodeID server_node_id, const RequestType& request);
326 
331  int call(NodeID server_node_id, const RequestType& request, ServiceCallID& out_call_id);
332 
336  void cancelCall(ServiceCallID call_id);
337 
341  void cancelAllCalls();
342 
346  bool hasPendingCallToServer(NodeID server_node_id) const;
347 
352  ServiceCallID getCallIDByIndex(unsigned index) const;
353 
357  const Callback& getCallback() const { return callback_; }
358  void setCallback(const Callback& cb) { callback_ = cb; }
359 
364  unsigned getNumPendingCalls() const { return call_registry_.getSize(); }
365 
370  bool hasPendingCalls() const { return !call_registry_.isEmpty(); }
371 
377  uint32_t getResponseFailureCount() const { return SubscriberType::getFailureCount(); }
378 
384  MonotonicDuration getRequestTimeout() const { return request_timeout_; }
386  {
387  timeout = max(timeout, getMinRequestTimeout());
388  timeout = min(timeout, getMaxRequestTimeout());
389 
390  publisher_.setTxTimeout(timeout);
391  request_timeout_ = max(timeout, publisher_.getTxTimeout()); // No less than TX timeout
392  }
393 
399  TransferPriority getPriority() const { return publisher_.getPriority(); }
400  void setPriority(const TransferPriority prio) { publisher_.setPriority(prio); }
401 };
402 
403 // ----------------------------------------------------------------------------
404 
405 template <typename DataType_, typename Callback_>
407 {
408  if (coerceOrFallback<bool>(callback_, true))
409  {
410  callback_(result);
411  }
412  else
413  {
414  handleFatalError("Srv client clbk");
415  }
416 }
417 
418 template <typename DataType_, typename Callback_>
420 {
421  UAVCAN_ASSERT(frame.getTransferType() == TransferTypeServiceResponse); // Other types filtered out by dispatcher
422 
423  return UAVCAN_NULLPTR != call_registry_.find(CallStateMatchingPredicate(ServiceCallID(frame.getSrcNodeID(),
424  frame.getTransferID())));
425 
426 }
427 
428 template <typename DataType_, typename Callback_>
430 {
431  UAVCAN_ASSERT(response.getTransferType() == TransferTypeServiceResponse);
432 
433  ServiceCallID call_id(response.getSrcNodeID(), response.getTransferID());
434  cancelCall(call_id);
435  ServiceCallResultType result(ServiceCallResultType::Success, call_id, response); // Mutable!
436  invokeCallback(result);
437 }
438 
439 
440 template <typename DataType_, typename Callback_>
442 {
443  UAVCAN_TRACE("ServiceClient", "Shared deadline event received");
444  /*
445  * Invoking callbacks for timed out call state objects.
446  */
447  TimeoutCallbackCaller callback_caller(*this);
448  call_registry_.template forEach<TimeoutCallbackCaller&>(callback_caller);
449  /*
450  * Removing timed out objects.
451  * This operation cannot be merged with the previous one because that will not work with recursive calls.
452  */
453  call_registry_.removeAllWhere(&CallState::hasTimedOutPredicate);
454  /*
455  * Subscriber does not need to be registered if we don't have any pending calls.
456  * Removing it makes processing of incoming frames a bit faster.
457  */
458  if (call_registry_.isEmpty())
459  {
460  SubscriberType::stop();
461  }
462 }
463 
464 template <typename DataType_, typename Callback_>
466 {
467  if (call_registry_.isEmpty())
468  {
469  const int subscriber_res = SubscriberType::startAsServiceResponseListener();
470  if (subscriber_res < 0)
471  {
472  UAVCAN_TRACE("ServiceClient", "Failed to start the subscriber, error: %i", subscriber_res);
473  return subscriber_res;
474  }
475  }
476 
477  if (UAVCAN_NULLPTR == call_registry_.template emplace<INode&, ServiceClientBase&,
478  ServiceCallID>(SubscriberType::getNode(), *this, call_id))
479  {
480  SubscriberType::stop();
481  return -ErrMemory;
482  }
483 
484  return 0;
485 }
486 
487 template <typename DataType_, typename Callback_>
489 {
491  return call(server_node_id, request, dummy);
492 }
493 
494 template <typename DataType_, typename Callback_>
496  ServiceCallID& out_call_id)
497 {
498  if (!coerceOrFallback<bool>(callback_, true))
499  {
500  UAVCAN_TRACE("ServiceClient", "Invalid callback");
501  return -ErrInvalidConfiguration;
502  }
503 
504  /*
505  * Common procedures that don't depend on the struct data type
506  */
507  const int prep_res =
508  prepareToCall(SubscriberType::getNode(), DataType::getDataTypeFullName(), server_node_id, out_call_id);
509  if (prep_res < 0)
510  {
511  UAVCAN_TRACE("ServiceClient", "Failed to prepare the call, error: %i", prep_res);
512  return prep_res;
513  }
514 
515  /*
516  * Initializing the call state - this will start the subscriber ad-hoc
517  */
518  const int call_state_res = addCallState(out_call_id);
519  if (call_state_res < 0)
520  {
521  UAVCAN_TRACE("ServiceClient", "Failed to add call state, error: %i", call_state_res);
522  return call_state_res;
523  }
524 
525  /*
526  * Configuring the listener so it will accept only the matching responses
527  * TODO move to init(), but this requires to somewhat refactor GenericSubscriber<> (remove TransferForwarder)
528  */
529  TransferListenerWithFilter* const tl = SubscriberType::getTransferListener();
530  if (tl == UAVCAN_NULLPTR)
531  {
532  UAVCAN_ASSERT(0); // Must have been created
533  cancelCall(out_call_id);
534  return -ErrLogic;
535  }
536  tl->installAcceptanceFilter(this);
537 
538  /*
539  * Publishing the request
540  */
541  const int publisher_res = publisher_.publish(request, TransferTypeServiceRequest, server_node_id,
542  out_call_id.transfer_id);
543  if (publisher_res < 0)
544  {
545  cancelCall(out_call_id);
546  return publisher_res;
547  }
548 
549  UAVCAN_ASSERT(server_node_id == out_call_id.server_node_id);
550  return publisher_res;
551 }
552 
553 template <typename DataType_, typename Callback_>
555 {
556  call_registry_.removeFirstWhere(CallStateMatchingPredicate(call_id));
557  if (call_registry_.isEmpty())
558  {
559  SubscriberType::stop();
560  }
561 }
562 
563 template <typename DataType_, typename Callback_>
565 {
566  call_registry_.clear();
567  SubscriberType::stop();
568 }
569 
570 template <typename DataType_, typename Callback_>
572 {
573  return UAVCAN_NULLPTR != call_registry_.find(ServerSearchPredicate(server_node_id));
574 }
575 
576 template <typename DataType_, typename Callback_>
578 {
579  const CallState* const id = call_registry_.getByIndex(index);
580  return (id == UAVCAN_NULLPTR) ? ServiceCallID() : id->getCallID();
581 }
582 
583 }
584 
585 #endif // UAVCAN_NODE_SERVICE_CLIENT_HPP_INCLUDED
uavcan::ServiceClientBase::ServerSearchPredicate
Definition: service_client.hpp:161
response
const std::string response
uavcan::Multiset::removeFirstWhere
void removeFirstWhere(Predicate predicate)
Definition: multiset.hpp:265
uavcan::Multiset::clear
void clear()
Definition: multiset.hpp:271
uavcan::ServiceCallResult::ResponseFieldType
ReceivedDataStructure< typename DataType::Response > ResponseFieldType
Definition: service_client.hpp:57
uavcan::ServiceClient::addCallState
int addCallState(ServiceCallID call_id)
Definition: service_client.hpp:465
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
generic_publisher.hpp
uavcan::Multiset::removeAllWhere
void removeAllWhere(Predicate predicate)
Definition: multiset.hpp:262
uavcan::ServiceClientBase::CallState::hasTimedOut
bool hasTimedOut() const
Definition: service_client.hpp:144
uavcan::ServiceClient::~ServiceClient
virtual ~ServiceClient()
Definition: service_client.hpp:294
uavcan::ServiceClientBase::CallState::id_
const ServiceCallID id_
Definition: service_client.hpp:126
call
bool call(const std::string &service_name, MReq &req, MRes &res)
uavcan::Noncopyable
Definition: templates.hpp:46
uavcan::ServiceClient::getCallIDByIndex
ServiceCallID getCallIDByIndex(unsigned index) const
Definition: service_client.hpp:577
multiset.hpp
uavcan::ServiceClient::handleDeadline
virtual void handleDeadline(MonotonicTime)
Definition: service_client.hpp:441
uavcan::ServiceClientBase::prepareToCall
int prepareToCall(INode &node, const char *dtname, NodeID server_node_id, ServiceCallID &out_call_id)
Definition: uc_service_client.cpp:31
uavcan::ServiceClient::cancelCall
void cancelCall(ServiceCallID call_id)
Definition: service_client.hpp:554
uavcan::ITransferAcceptanceFilter
Definition: transfer_listener.hpp:159
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::ServiceClient::shouldAcceptFrame
virtual bool shouldAcceptFrame(const RxFrame &frame) const
Definition: service_client.hpp:419
uavcan::GenericPublisherBase::setTxTimeout
void setTxTimeout(MonotonicDuration tx_timeout)
Definition: uc_generic_publisher.cpp:56
uavcan::ServiceClientBase::getDefaultRequestTimeout
static MonotonicDuration getDefaultRequestTimeout()
Definition: service_client.hpp:185
uavcan::ServiceCallResult::call_id_
ServiceCallID call_id_
Identifies the call.
Definition: service_client.hpp:63
uavcan::ServiceClientBase::CallStateMatchingPredicate::id
const ServiceCallID id
Definition: service_client.hpp:156
uavcan::ServiceCallResult::getCallID
ServiceCallID getCallID() const
Definition: service_client.hpp:83
uavcan::ServiceClientBase::CallState::getCallID
ServiceCallID getCallID() const
Definition: service_client.hpp:142
uavcan::ServiceClient::call_registry_
CallRegistry call_registry_
Definition: service_client.hpp:260
uavcan::ServiceClientBase::~ServiceClientBase
virtual ~ServiceClientBase()
Definition: service_client.hpp:176
uavcan::ServiceClient::ServiceClient
ServiceClient(INode &node, const Callback &callback=Callback())
Definition: service_client.hpp:280
uavcan::operator<<
OStream & operator<<(OStream &s, long long x)
Definition: ostream.hpp:40
uavcan::ServiceClient::callback_
Callback callback_
Definition: service_client.hpp:263
uavcan::NodeID::get
uint8_t get() const
Definition: transfer.hpp:132
uavcan::ServiceClient::PublisherType
GenericPublisher< DataType, RequestType > PublisherType
Definition: service_client.hpp:231
uavcan::ServiceClient::getPriority
TransferPriority getPriority() const
Definition: service_client.hpp:399
uavcan::TransferTypeServiceResponse
@ TransferTypeServiceResponse
Definition: transfer.hpp:20
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::ServiceClientBase::CallState::timed_out_
bool timed_out_
Definition: service_client.hpp:127
uavcan::ServiceClient::TimeoutCallbackCaller
Definition: service_client.hpp:236
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::TransferListenerWithFilter::installAcceptanceFilter
void installAcceptanceFilter(const ITransferAcceptanceFilter *acceptance_filter)
Definition: transfer_listener.hpp:186
uavcan::TransferListenerWithFilter
Definition: transfer_listener.hpp:173
uavcan::Multiset::isEmpty
bool isEmpty() const
Definition: multiset.hpp:327
uavcan::ServiceClient::ResponseType
DataType::Response ResponseType
Definition: service_client.hpp:225
generic_subscriber.hpp
uavcan::ServiceClientBase::CallState::handleDeadline
virtual void handleDeadline(MonotonicTime)
Definition: uc_service_client.cpp:12
uavcan::Multiset::getSize
unsigned getSize() const
Definition: multiset.hpp:461
uavcan::ServiceCallResult::response_
ResponseFieldType & response_
Returned data structure. Value undefined if the service call has failed.
Definition: service_client.hpp:64
uavcan::ReceivedDataStructure
Definition: generic_subscriber.hpp:39
UAVCAN_TRACE
#define UAVCAN_TRACE(...)
Definition: libuavcan/libuavcan/include/uavcan/debug.hpp:31
uavcan::ServiceClient::TimeoutCallbackCaller::owner
ServiceClient & owner
Definition: service_client.hpp:238
uavcan::ServiceClient::SubscriberType
GenericSubscriber< DataType, ResponseType, TransferListenerWithFilter > SubscriberType
Definition: service_client.hpp:232
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::TransferTypeServiceRequest
@ TransferTypeServiceRequest
Definition: transfer.hpp:21
uavcan::TransferID::get
uint8_t get() const
Definition: transfer.hpp:99
uavcan::GenericPublisher::publish
int publish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, MonotonicTime blocking_deadline=MonotonicTime())
Definition: generic_publisher.hpp:132
uavcan::DeadlineHandler
Definition: scheduler.hpp:17
uavcan::ServiceCallResult
Definition: service_client.hpp:54
uavcan::ServiceClient::getResponseFailureCount
uint32_t getResponseFailureCount() const
Definition: service_client.hpp:377
uavcan::TransferPriority::MiddleLower
static const TransferPriority MiddleLower
Definition: transfer.hpp:39
uavcan::ServiceClient::getCallback
const Callback & getCallback() const
Definition: service_client.hpp:357
uavcan::Multiset::find
T * find(Predicate predicate)
Definition: multiset.hpp:437
uavcan::ServiceClientBase::CallState
Definition: service_client.hpp:123
uavcan::ServiceCallResult::status_
const Status status_
Whether successful or not. Failure to decode the response causes timeout.
Definition: service_client.hpp:62
uavcan::TransferID
Definition: transfer.hpp:71
uavcan::ServiceClient::hasPendingCalls
bool hasPendingCalls() const
Definition: service_client.hpp:370
uavcan_kinetis::ErrLogic
static const uavcan::int16_t ErrLogic
Internal logic error.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:22
uavcan::DataTypeDescriptor
Definition: data_type.hpp:130
uavcan::ServiceClient::Callback
Callback_ Callback
Definition: service_client.hpp:227
uavcan::ServiceClientBase
Definition: service_client.hpp:117
uavcan::RxFrame
Definition: frame.hpp:104
uavcan::ServiceCallResult::ServiceCallResult
ServiceCallResult(Status arg_status, ServiceCallID arg_call_id, ResponseFieldType &arg_response)
Definition: service_client.hpp:67
uavcan::ServiceCallID::server_node_id
NodeID server_node_id
Definition: service_client.hpp:29
uavcan::ServiceCallResult::getResponse
ResponseFieldType & getResponse()
Definition: service_client.hpp:89
uavcan::ServiceClient::CallRegistry
Multiset< CallState > CallRegistry
Definition: service_client.hpp:234
uavcan::ServiceClientBase::CallStateMatchingPredicate::CallStateMatchingPredicate
CallStateMatchingPredicate(ServiceCallID reference)
Definition: service_client.hpp:157
uavcan::ServiceCallResult::getStatus
Status getStatus() const
Definition: service_client.hpp:81
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
uavcan::ServiceCallResult::Success
@ Success
Definition: service_client.hpp:59
uavcan::ServiceClientBase::CallState::operator==
bool operator==(const CallState &rhs) const
Definition: service_client.hpp:148
uavcan::ServiceClientBase::ServiceClientBase
ServiceClientBase(INode &node)
Definition: service_client.hpp:170
uavcan::ServiceClient::cancelAllCalls
void cancelAllCalls()
Definition: service_client.hpp:564
uavcan::ServiceClient::init
int init()
Definition: service_client.hpp:300
uavcan::ServiceClientBase::CallState::CallState
CallState(INode &node, ServiceClientBase &owner, ServiceCallID call_id)
Definition: service_client.hpp:132
uavcan::NodeID::isUnicast
bool isUnicast() const
Definition: transfer.hpp:136
uavcan::ServiceClient::publisher_
PublisherType publisher_
Definition: service_client.hpp:262
uavcan::ServiceCallID::ServiceCallID
ServiceCallID()
Definition: service_client.hpp:32
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan::ServiceClient::init
int init(TransferPriority priority)
Definition: service_client.hpp:310
uavcan::INode
Definition: abstract_node.hpp:19
uavcan::Multiset::getByIndex
T * getByIndex(unsigned index)
Definition: multiset.hpp:313
uavcan::ServiceClient
Definition: service_client.hpp:217
uavcan::TransferPriority
Definition: transfer.hpp:28
uavcan::ServiceClientBase::ServerSearchPredicate::ServerSearchPredicate
ServerSearchPredicate(NodeID nid)
Definition: service_client.hpp:164
uavcan::ServiceClientBase::CallState::hasTimedOutPredicate
static bool hasTimedOutPredicate(const CallState &cs)
Definition: service_client.hpp:146
uavcan::ServiceClientBase::CallStateMatchingPredicate
Definition: service_client.hpp:154
uavcan::ServiceCallResult::getResponse
const ResponseFieldType & getResponse() const
Definition: service_client.hpp:88
uavcan::ServiceClientBase::getMinRequestTimeout
static MonotonicDuration getMinRequestTimeout()
Definition: service_client.hpp:186
uavcan::ServiceClientBase::getMaxRequestTimeout
static MonotonicDuration getMaxRequestTimeout()
Definition: service_client.hpp:187
uavcan::ServiceCallResult::isSuccessful
bool isSuccessful() const
Definition: service_client.hpp:79
uavcan::ServiceClientBase::data_type_descriptor_
const DataTypeDescriptor * data_type_descriptor_
This will be initialized at the time of first call.
Definition: service_client.hpp:120
build_config.hpp
uavcan::GenericPublisherBase::getPriority
TransferPriority getPriority() const
Definition: generic_publisher.hpp:73
frame
uavcan::CanFrame frame
Definition: can.cpp:78
uavcan::ServiceClient::TimeoutCallbackCaller::TimeoutCallbackCaller
TimeoutCallbackCaller(ServiceClient &arg_owner)
Definition: service_client.hpp:240
uavcan::GenericPublisher::init
int init()
Definition: generic_publisher.hpp:118
uavcan::ServiceClient::hasPendingCallToServer
bool hasPendingCallToServer(NodeID server_node_id) const
Definition: service_client.hpp:571
uavcan::ServiceClient::getNumPendingCalls
unsigned getNumPendingCalls() const
Definition: service_client.hpp:364
uavcan::ServiceClient::getRequestTimeout
MonotonicDuration getRequestTimeout() const
Definition: service_client.hpp:384
uavcan::ServiceClient::SelfType
ServiceClient< DataType, Callback > SelfType
Definition: service_client.hpp:230
uavcan::ServiceClientBase::CallStateMatchingPredicate::operator()
bool operator()(const CallState &state) const
Definition: service_client.hpp:158
uavcan::ServiceClient::setRequestTimeout
void setRequestTimeout(MonotonicDuration timeout)
Definition: service_client.hpp:385
uavcan::ServiceClientBase::ServerSearchPredicate::server_node_id
const NodeID server_node_id
Definition: service_client.hpp:163
libuavcan_dsdl_compiler.pyratemp.dummy
def dummy(*_, **__)
Definition: pyratemp.py:252
uavcan::ServiceClient::handleReceivedDataStruct
virtual void handleReceivedDataStruct(ReceivedDataStructure< ResponseType > &response)
Definition: service_client.hpp:429
uavcan::ServiceCallID::ServiceCallID
ServiceCallID(NodeID arg_server_node_id, TransferID arg_transfer_id)
Definition: service_client.hpp:34
uavcan::DeadlineHandler::startWithDelay
void startWithDelay(MonotonicDuration delay)
Definition: uc_scheduler.cpp:22
pyuavcan_v0.dsdl.signature.s
s
Definition: signature.py:73
uavcan::ServiceClient::DataType
DataType_ DataType
Definition: service_client.hpp:223
uavcan::ServiceClientBase::CallState::owner_
ServiceClientBase & owner_
Definition: service_client.hpp:125
uavcan::ServiceClient::setCallback
void setCallback(const Callback &cb)
Definition: service_client.hpp:358
uavcan::handleFatalError
UAVCAN_EXPORT void handleFatalError(const char *msg)
Definition: uc_error.cpp:20
uavcan::ServiceCallID
Definition: service_client.hpp:27
uavcan::ServiceCallID::transfer_id
TransferID transfer_id
Definition: service_client.hpp:30
uavcan::ServiceClientBase::ServerSearchPredicate::operator()
bool operator()(const CallState &state) const
Definition: service_client.hpp:165
uavcan::ServiceClient::ServiceCallResultType
ServiceCallResult< DataType > ServiceCallResultType
Definition: service_client.hpp:226
uavcan::GenericPublisherBase::getTxTimeout
MonotonicDuration getTxTimeout() const
Definition: generic_publisher.hpp:58
uavcan::ServiceClientBase::request_timeout_
MonotonicDuration request_timeout_
Definition: service_client.hpp:168
uavcan::GenericPublisher< DataType, RequestType >
uavcan::GenericSubscriber
Definition: generic_subscriber.hpp:128
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
uavcan::ServiceCallID::isValid
bool isValid() const
Definition: service_client.hpp:45
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan::GenericPublisherBase::setPriority
void setPriority(const TransferPriority prio)
Definition: generic_publisher.hpp:74
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::ServiceClient::setPriority
void setPriority(const TransferPriority prio)
Definition: service_client.hpp:400
uavcan::ServiceClient::call
int call(NodeID server_node_id, const RequestType &request)
Definition: service_client.hpp:488
uavcan::ServiceCallID::operator==
bool operator==(const ServiceCallID rhs) const
Definition: service_client.hpp:39
uavcan::ServiceCallResult::Status
Status
Definition: service_client.hpp:59
uavcan::DeadlineHandler::getScheduler
Scheduler & getScheduler() const
Definition: scheduler.hpp:42
uavcan::Multiset< CallState >
uavcan::ServiceClient::invokeCallback
void invokeCallback(ServiceCallResultType &result)
Definition: service_client.hpp:406
uavcan::GenericSubscriber::ReceivedDataStructureSpec
Definition: generic_subscriber.hpp:164
uavcan::ServiceClient::TimeoutCallbackCaller::operator()
void operator()(const CallState &state)
Definition: service_client.hpp:242
uavcan::ServiceClient::RequestType
DataType::Request RequestType
Definition: service_client.hpp:224
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03