generic_publisher.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_GENERIC_PUBLISHER_HPP_INCLUDED
6 #define UAVCAN_NODE_GENERIC_PUBLISHER_HPP_INCLUDED
7 
8 #include <uavcan/error.hpp>
10 #include <uavcan/data_type.hpp>
12 #include <uavcan/debug.hpp>
16 #include <uavcan/marshal/types.hpp>
17 
18 namespace uavcan
19 {
20 
22 {
26 
27 protected:
29  MonotonicDuration max_transfer_interval)
30  : sender_(node.getDispatcher(), max_transfer_interval)
31  , tx_timeout_(tx_timeout)
32  , node_(node)
33  {
34  setTxTimeout(tx_timeout);
35 #if UAVCAN_DEBUG
36  UAVCAN_ASSERT(getTxTimeout() == tx_timeout); // Making sure default values are OK
37 #endif
38  }
39 
41 
42  bool isInited() const;
43 
44  int doInit(DataTypeKind dtkind, const char* dtname);
45 
47 
48  int genericPublish(const StaticTransferBufferImpl& buffer, TransferType transfer_type,
49  NodeID dst_node_id, TransferID* tid, MonotonicTime blocking_deadline);
50 
52  const TransferSender& getTransferSender() const { return sender_; }
53 
54 public:
57 
59  void setTxTimeout(MonotonicDuration tx_timeout);
60 
66  {
68  }
69 
74  void setPriority(const TransferPriority prio) { sender_.setPriority(prio); }
75 
76  INode& getNode() const { return node_; }
77 };
78 
84 template <typename DataSpec, typename DataStruct>
86 {
88  {
90  };
91 
92  typedef typename Select<DataStruct::MaxBitLen == 0,
93  ZeroTransferBuffer,
95 
96  int checkInit();
97 
98  int doEncode(const DataStruct& message, ITransferBuffer& buffer) const;
99 
100  int genericPublish(const DataStruct& message, TransferType transfer_type, NodeID dst_node_id,
101  TransferID* tid, MonotonicTime blocking_deadline);
102 
103 public:
109  : GenericPublisherBase(node, tx_timeout, max_transfer_interval)
110  { }
111 
113 
118  int init()
119  {
120  return checkInit();
121  }
122 
126  int init(TransferPriority priority)
127  {
128  setPriority(priority);
129  return checkInit();
130  }
131 
132  int publish(const DataStruct& message, TransferType transfer_type, NodeID dst_node_id,
133  MonotonicTime blocking_deadline = MonotonicTime())
134  {
135  return genericPublish(message, transfer_type, dst_node_id, UAVCAN_NULLPTR, blocking_deadline);
136  }
137 
138  int publish(const DataStruct& message, TransferType transfer_type, NodeID dst_node_id, TransferID tid,
139  MonotonicTime blocking_deadline = MonotonicTime())
140  {
141  return genericPublish(message, transfer_type, dst_node_id, &tid, blocking_deadline);
142  }
143 };
144 
145 // ----------------------------------------------------------------------------
146 
147 template <typename DataSpec, typename DataStruct>
149 {
150  if (isInited())
151  {
152  return 0;
153  }
154 
155  return doInit(DataTypeKind(DataSpec::DataTypeKind), DataSpec::getDataTypeFullName());
156 }
157 
158 template <typename DataSpec, typename DataStruct>
159 int GenericPublisher<DataSpec, DataStruct>::doEncode(const DataStruct& message, ITransferBuffer& buffer) const
160 {
161  BitStream bitstream(buffer);
162  ScalarCodec codec(bitstream);
163  const int encode_res = DataStruct::encode(message, codec);
164  if (encode_res <= 0)
165  {
166  UAVCAN_ASSERT(0); // Impossible, internal error
167  return -ErrInvalidMarshalData;
168  }
169  return encode_res;
170 }
171 
172 template <typename DataSpec, typename DataStruct>
173 int GenericPublisher<DataSpec, DataStruct>::genericPublish(const DataStruct& message, TransferType transfer_type,
174  NodeID dst_node_id, TransferID* tid,
175  MonotonicTime blocking_deadline)
176 {
177  const int res = checkInit();
178  if (res < 0)
179  {
180  return res;
181  }
182 
183  Buffer buffer;
184 
185  const int encode_res = doEncode(message, buffer);
186  if (encode_res < 0)
187  {
188  return encode_res;
189  }
190 
191  return GenericPublisherBase::genericPublish(buffer, transfer_type, dst_node_id, tid, blocking_deadline);
192 }
193 
194 }
195 
196 #endif // UAVCAN_NODE_GENERIC_PUBLISHER_HPP_INCLUDED
types.hpp
data_type.hpp
uavcan::GenericPublisherBase::doInit
int doInit(DataTypeKind dtkind, const char *dtname)
Definition: uc_generic_publisher.cpp:15
uavcan::GenericPublisher::Buffer
Select< DataStruct::MaxBitLen==0, ZeroTransferBuffer, StaticTransferBuffer< BitLenToByteLen< DataStruct::MaxBitLen >::Result > >::Result Buffer
Definition: generic_publisher.hpp:94
uavcan::TransferSender::setPriority
void setPriority(TransferPriority prio)
Definition: transfer_sender.hpp:79
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::BitStream
Definition: bit_stream.hpp:31
uavcan::GenericPublisherBase::getTxDeadline
MonotonicTime getTxDeadline() const
Definition: uc_generic_publisher.cpp:36
uavcan::GenericPublisher::publish
int publish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, TransferID tid, MonotonicTime blocking_deadline=MonotonicTime())
Definition: generic_publisher.hpp:138
uavcan::Noncopyable
Definition: templates.hpp:46
uavcan::GenericPublisherBase
Definition: generic_publisher.hpp:21
uavcan::TransferSender
Definition: transfer_sender.hpp:20
uavcan::StaticTransferBufferImpl
Definition: transfer_buffer.hpp:22
debug.hpp
uavcan::GenericPublisherBase::node_
INode & node_
Definition: generic_publisher.hpp:25
uavcan::GenericPublisherBase::setTxTimeout
void setTxTimeout(MonotonicDuration tx_timeout)
Definition: uc_generic_publisher.cpp:56
uavcan::GenericPublisherBase::getNode
INode & getNode() const
Definition: generic_publisher.hpp:76
uavcan::ITransferBuffer
Definition: abstract_transfer_buffer.hpp:16
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::TransferType
TransferType
Definition: transfer.hpp:18
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::GenericPublisher::init
int init(TransferPriority priority)
Definition: generic_publisher.hpp:126
uavcan::GenericPublisherBase::isInited
bool isInited() const
Definition: uc_generic_publisher.cpp:10
transfer_sender.hpp
uavcan::GenericPublisherBase::getTransferSender
const TransferSender & getTransferSender() const
Definition: generic_publisher.hpp:52
uavcan::GenericPublisherBase::genericPublish
int genericPublish(const StaticTransferBufferImpl &buffer, TransferType transfer_type, NodeID dst_node_id, TransferID *tid, MonotonicTime blocking_deadline)
Definition: uc_generic_publisher.cpp:41
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::GenericPublisher::checkInit
int checkInit()
Definition: generic_publisher.hpp:148
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::GenericPublisherBase::~GenericPublisherBase
~GenericPublisherBase()
Definition: generic_publisher.hpp:40
uavcan::GenericPublisherBase::allowAnonymousTransfers
void allowAnonymousTransfers()
Definition: generic_publisher.hpp:65
uavcan::TransferID
Definition: transfer.hpp:71
uavcan::TransferSender::getPriority
TransferPriority getPriority() const
Definition: transfer_sender.hpp:78
uavcan::GenericPublisher::~GenericPublisher
~GenericPublisher()
Definition: generic_publisher.hpp:112
uavcan::GenericPublisherBase::sender_
TransferSender sender_
Definition: generic_publisher.hpp:23
abstract_node.hpp
uavcan::Select
struct UAVCAN_EXPORT Select
Definition: templates.hpp:80
uavcan::GenericPublisherBase::getTransferSender
TransferSender & getTransferSender()
Definition: generic_publisher.hpp:51
uavcan::GenericPublisher::genericPublish
int genericPublish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, TransferID *tid, MonotonicTime blocking_deadline)
Definition: generic_publisher.hpp:173
uavcan::TransferSender::allowAnonymousTransfers
void allowAnonymousTransfers()
Definition: transfer_sender.hpp:88
scalar_codec.hpp
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::DataTypeKind
DataTypeKind
Definition: data_type.hpp:19
uavcan::GenericPublisher::ZeroTransferBuffer::ZeroTransferBuffer
ZeroTransferBuffer()
Definition: generic_publisher.hpp:89
uavcan::StaticTransferBuffer
Definition: transfer_buffer.hpp:50
uavcan::INode
Definition: abstract_node.hpp:19
uavcan::TransferPriority
Definition: transfer.hpp:28
uavcan::GenericPublisher::GenericPublisher
GenericPublisher(INode &node, MonotonicDuration tx_timeout, MonotonicDuration max_transfer_interval=TransferSender::getDefaultMaxTransferInterval())
Definition: generic_publisher.hpp:107
uavcan::GenericPublisherBase::getPriority
TransferPriority getPriority() const
Definition: generic_publisher.hpp:73
uavcan::GenericPublisher::doEncode
int doEncode(const DataStruct &message, ITransferBuffer &buffer) const
Definition: generic_publisher.hpp:159
uavcan::GenericPublisherBase::GenericPublisherBase
GenericPublisherBase(INode &node, MonotonicDuration tx_timeout, MonotonicDuration max_transfer_interval)
Definition: generic_publisher.hpp:28
uavcan::GenericPublisher::init
int init()
Definition: generic_publisher.hpp:118
global_data_type_registry.hpp
uavcan::GenericPublisherBase::getMinTxTimeout
static MonotonicDuration getMinTxTimeout()
Definition: generic_publisher.hpp:55
uavcan::GenericPublisherBase::getMaxTxTimeout
static MonotonicDuration getMaxTxTimeout()
Definition: generic_publisher.hpp:56
uavcan::TransferSender::getDefaultMaxTransferInterval
static MonotonicDuration getDefaultMaxTransferInterval()
Definition: transfer_sender.hpp:38
uavcan::GenericPublisherBase::getTxTimeout
MonotonicDuration getTxTimeout() const
Definition: generic_publisher.hpp:58
uavcan::GenericPublisher
Definition: generic_publisher.hpp:85
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
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::GenericPublisher::ZeroTransferBuffer
Definition: generic_publisher.hpp:87
transfer_buffer.hpp
uavcan::ScalarCodec
Definition: scalar_codec.hpp:20
uavcan::DurationBase< MonotonicDuration >::fromUSec
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
error.hpp
uavcan::GenericPublisherBase::tx_timeout_
MonotonicDuration tx_timeout_
Definition: generic_publisher.hpp:24


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