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  {
67  sender_.allowAnonymousTransfers();
68  }
69 
73  TransferPriority getPriority() const { return sender_.getPriority(); }
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,
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
static MonotonicDuration getMaxTxTimeout()
MonotonicDuration getTxTimeout() const
void setPriority(const TransferPriority prio)
int genericPublish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, TransferID *tid, MonotonicTime blocking_deadline)
struct UAVCAN_EXPORT Select
Definition: templates.hpp:80
GenericPublisher(INode &node, MonotonicDuration tx_timeout, MonotonicDuration max_transfer_interval=TransferSender::getDefaultMaxTransferInterval())
DataTypeKind
Definition: data_type.hpp:19
const TransferSender & getTransferSender() const
void setTxTimeout(MonotonicDuration tx_timeout)
TransferSender & getTransferSender()
TransferPriority getPriority() const
int genericPublish(const StaticTransferBufferImpl &buffer, TransferType transfer_type, NodeID dst_node_id, TransferID *tid, MonotonicTime blocking_deadline)
void setPriority(TransferPriority prio)
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35
TransferType
Definition: transfer.hpp:18
int doEncode(const DataStruct &message, ITransferBuffer &buffer) const
int publish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, MonotonicTime blocking_deadline=MonotonicTime())
int doInit(DataTypeKind dtkind, const char *dtname)
int init(TransferPriority priority)
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
GenericPublisherBase(INode &node, MonotonicDuration tx_timeout, MonotonicDuration max_transfer_interval)
MonotonicTime getTxDeadline() const
TransferPriority getPriority() const
static MonotonicDuration getDefaultMaxTransferInterval()
int publish(const DataStruct &message, TransferType transfer_type, NodeID dst_node_id, TransferID tid, MonotonicTime blocking_deadline=MonotonicTime())
static MonotonicDuration getMinTxTimeout()
Select< DataStruct::MaxBitLen==0, ZeroTransferBuffer, StaticTransferBuffer< BitLenToByteLen< DataStruct::MaxBitLen >::Result > >::Result Buffer


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39