diff --git a/libuavcan/include/uavcan/internal/node/generic_subscriber.hpp b/libuavcan/include/uavcan/internal/node/generic_subscriber.hpp index 1b04bad525..b667c95c4b 100644 --- a/libuavcan/include/uavcan/internal/node/generic_subscriber.hpp +++ b/libuavcan/include/uavcan/internal/node/generic_subscriber.hpp @@ -56,18 +56,24 @@ public: }; -template -class GenericSubscriber : Noncopyable +template +class TransferListenerInstantiationHelper { - typedef GenericSubscriber SelfType; - - enum { DataTypeMaxByteLen = BitLenToByteLen::Result }; + enum { DataTypeMaxByteLen = BitLenToByteLen::Result }; enum { NeedsBuffer = int(DataTypeMaxByteLen) > int(MaxSingleFrameTransferPayloadLen) }; enum { BufferSize = NeedsBuffer ? DataTypeMaxByteLen : 0 }; enum { NumStaticBufs = NeedsBuffer ? (NumStaticBufs_ ? NumStaticBufs_ : 1) : 0 }; - typedef TransferListener TransferListenerType; +public: + // TODO: support for zero static bufs + typedef TransferListener Type; +}; + + +template +class GenericSubscriber : Noncopyable +{ + typedef GenericSubscriber SelfType; // We need to break the inheritance chain here to implement lazy initialization class TransferForwarder : public TransferListenerType @@ -201,6 +207,8 @@ protected: uint32_t getFailureCount() const { return failure_count_; } + TransferListenerType* getTransferListener() { return forwarder_; } + public: Scheduler& getScheduler() const { return scheduler_; } }; diff --git a/libuavcan/include/uavcan/server.hpp b/libuavcan/include/uavcan/server.hpp index f9cafebdad..4a1589a45e 100644 --- a/libuavcan/include/uavcan/server.hpp +++ b/libuavcan/include/uavcan/server.hpp @@ -11,10 +11,14 @@ namespace uavcan { template &, typename DataType_::Response&), + typename Callback = void(*)(const ReceivedDataStructure&, + typename DataType_::Response&), unsigned int NumStaticReceivers = 2, unsigned int NumStaticBufs = 1> -class Server : public GenericSubscriber +class Server : public GenericSubscriber::Type> { public: typedef DataType_ DataType; @@ -22,7 +26,9 @@ public: typedef typename DataType::Response ResponseType; private: - typedef GenericSubscriber SubscriberType; + typedef typename TransferListenerInstantiationHelper::Type + TransferListenerType; + typedef GenericSubscriber SubscriberType; typedef GenericPublisher PublisherType; PublisherType publisher_; diff --git a/libuavcan/include/uavcan/subscriber.hpp b/libuavcan/include/uavcan/subscriber.hpp index 95386cc90b..7ff0fd0950 100644 --- a/libuavcan/include/uavcan/subscriber.hpp +++ b/libuavcan/include/uavcan/subscriber.hpp @@ -14,9 +14,14 @@ template &), unsigned int NumStaticReceivers = 2, unsigned int NumStaticBufs = 1> -class Subscriber : public GenericSubscriber +class Subscriber : public GenericSubscriber::Type> { - typedef GenericSubscriber BaseType; + typedef typename TransferListenerInstantiationHelper::Type + TransferListenerType; + typedef GenericSubscriber BaseType; Callback callback_;