5 #ifndef UAVCAN_NODE_GENERIC_SUBSCRIBER_HPP_INCLUDED 6 #define UAVCAN_NODE_GENERIC_SUBSCRIBER_HPP_INCLUDED 38 template <
typename DataType_>
43 template <
typename Ret, Ret(IncomingTransfer::*Fun) () const>
50 return (_transfer_->*Fun)();
59 : _transfer_(arg_transfer)
69 return safeget<MonotonicTime, &IncomingTransfer::getMonotonicTimestamp>();
84 template <
typename Stream,
typename DataType>
85 static Stream& operator<<(Stream& s, const ReceivedDataStructure<DataType>& rds)
87 s <<
"# Received struct ts_m=" << rds.getMonotonicTimestamp()
88 <<
" ts_utc=" << rds.getUtcTimestamp()
89 <<
" snid=" <<
int(rds.getSrcNodeID().get()) <<
"\n";
90 s << static_cast<const DataType&>(rds);
127 template <
typename DataSpec,
typename DataStruct,
typename TransferListenerType>
147 TransferListenerType(obj.node_.getDispatcher().getTransferPerfCounter(),
182 UAVCAN_TRACE(
"GenericSubscriber",
"Start as message listener; dtname=%s", DataSpec::getDataTypeFullName());
188 UAVCAN_TRACE(
"GenericSubscriber",
"Start as service request listener; dtname=%s",
189 DataSpec::getDataTypeFullName());
195 UAVCAN_TRACE(
"GenericSubscriber",
"Start as service response listener; dtname=%s",
196 DataSpec::getDataTypeFullName());
206 forwarder_->allowAnonymousTransfers();
215 UAVCAN_TRACE(
"GenericSubscriber",
"Stop; dtname=%s", DataSpec::getDataTypeFullName());
227 template <
typename DataSpec,
typename DataStruct,
typename TransferListenerType>
240 UAVCAN_TRACE(
"GenericSubscriber",
"Type [%s] is not registered", DataSpec::getDataTypeFullName());
241 return -ErrUnknownDataType;
246 forwarder_.template construct<SelfType&, const DataTypeDescriptor&, uint16_t, IPoolAllocator&>
247 (*
this, *descr, MaxBufferSize, node_.getAllocator());
252 template <
typename DataSpec,
typename DataStruct,
typename TransferListenerType>
255 ReceivedDataStructureSpec rx_struct(&transfer);
263 const int decode_res = DataStruct::decode(rx_struct, codec);
270 UAVCAN_TRACE(
"GenericSubscriber",
"Unable to decode the message [%i] [%s]",
271 decode_res, DataSpec::getDataTypeFullName());
273 node_.getDispatcher().getTransferPerfCounter().addError();
280 handleReceivedDataStruct(rx_struct);
283 template <
typename DataSpec,
typename DataStruct,
typename TransferListenerType>
287 const int res = checkInit();
290 UAVCAN_TRACE(
"GenericSubscriber",
"Initialization failure [%s]", DataSpec::getDataTypeFullName());
299 #endif // UAVCAN_NODE_GENERIC_SUBSCRIBER_HPP_INCLUDED
GenericSubscriberBase(INode &node)
NodeID getSrcNodeID() const
bool registerServiceRequestListener(TransferListener *listener)
UtcTime getUtcTimestamp() const
const DataTypeDescriptor * find(const char *name) const
GenericSubscriber< DataSpec, DataStruct, TransferListenerType > SelfType
void handleIncomingTransfer(IncomingTransfer &transfer)
#define UAVCAN_TRACE(...)
void allowAnonymousTransfers()
int startAsMessageListener()
TransferForwarder(SelfType &obj, const DataTypeDescriptor &data_type, uint16_t max_buffer_size, IPoolAllocator &allocator)
Implicitly convertible to/from uavcan.Timestamp.
ReceivedDataStructureSpec(const IncomingTransfer *arg_transfer)
int startAsServiceRequestListener()
void handleIncomingTransfer(IncomingTransfer &transfer)
bool isAnonymousTransfer() const
bool registerMessageListener(TransferListener *listener)
MonotonicTime getMonotonicTimestamp() const
bool registerServiceResponseListener(TransferListener *listener)
ReceivedDataStructure(const IncomingTransfer *arg_transfer)
virtual ~GenericSubscriber()
static GlobalDataTypeRegistry & instance()
int startAsServiceResponseListener()
void stop(TransferListener *listener)
int genericStart(bool(Dispatcher::*registration_method)(TransferListener *))
ReceivedDataStructureSpec()
LazyConstructor< TransferForwarder > forwarder_
TransferID getTransferID() const
int genericStart(TransferListener *listener, bool(Dispatcher::*registration_method)(TransferListener *))
uint8_t getIfaceIndex() const
TransferListenerType * getTransferListener()
const IncomingTransfer *const _transfer_
Such weird name is necessary to avoid clashing with DataType fields.
TransferPriority getPriority() const
uint32_t getFailureCount() const
TransferType getTransferType() const
GenericSubscriber(INode &node)