/* * Copyright (C) 2014 Pavel Kirienko */ #pragma once #include #include #include #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11) # error UAVCAN_CPP_VERSION #endif #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11 # include #endif namespace uavcan { template = UAVCAN_CPP11 typename Callback_ = std::function&)>, #else typename Callback_ = void (*)(const ReceivedDataStructure&), #endif unsigned NumStaticReceivers = 2, unsigned NumStaticBufs = 1> class UAVCAN_EXPORT Subscriber : public GenericSubscriber::Type> { public: typedef Callback_ Callback; private: typedef typename TransferListenerInstantiationHelper::Type TransferListenerType; typedef GenericSubscriber BaseType; Callback callback_; void handleReceivedDataStruct(ReceivedDataStructure& msg) { if (try_implicit_cast(callback_, true)) { callback_(msg); } else { handleFatalError("Invalid subscriber callback"); } } public: typedef DataType_ DataType; explicit Subscriber(INode& node) : BaseType(node) , callback_() { StaticAssert::check(); } int start(const Callback& callback) { stop(); if (!try_implicit_cast(callback, true)) { UAVCAN_TRACE("Subscriber", "Invalid callback"); return -ErrInvalidParam; } callback_ = callback; return BaseType::startAsMessageListener(); } using BaseType::stop; using BaseType::getFailureCount; }; }