From 998646f03b229ae86bd6e57ff0bd15dd1763c342 Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Thu, 11 Dec 2014 15:33:32 +0100 Subject: add base class and template subscriber class as well to improve interface to get last msg value --- src/examples/subscriber/subscriber_example.cpp | 2 +- src/examples/subscriber/subscriber_example.h | 2 +- src/platforms/px4_defines.h | 9 ++---- src/platforms/px4_nodehandle.h | 28 +++++++++---------- src/platforms/px4_publisher.h | 25 ++++++++++++++--- src/platforms/px4_subscriber.h | 38 ++++++++++++++++++++------ 6 files changed, 70 insertions(+), 34 deletions(-) diff --git a/src/examples/subscriber/subscriber_example.cpp b/src/examples/subscriber/subscriber_example.cpp index 95e208ca6..83ead4ba5 100644 --- a/src/examples/subscriber/subscriber_example.cpp +++ b/src/examples/subscriber/subscriber_example.cpp @@ -78,5 +78,5 @@ SubscriberExample::SubscriberExample() : void SubscriberExample::rc_channels_callback(const PX4_TOPIC_T(rc_channels) &msg) { PX4_INFO("Subscriber callback: [%llu], value of _sub_rc_chan: [%llu]", msg.timestamp_last_valid, - ((PX4_SUBSCRIBER_T(rc_channels) *)_sub_rc_chan)->get_msg().timestamp_last_valid); + _sub_rc_chan->get_msg().timestamp_last_valid); } diff --git a/src/examples/subscriber/subscriber_example.h b/src/examples/subscriber/subscriber_example.h index 73c739035..c4b853d4d 100644 --- a/src/examples/subscriber/subscriber_example.h +++ b/src/examples/subscriber/subscriber_example.h @@ -54,7 +54,7 @@ protected: int32_t _interval; px4_param_t _p_test_float; float _test_float; - px4::Subscriber * _sub_rc_chan; + px4::PX4_SUBSCRIBER(rc_channels) * _sub_rc_chan; void rc_channels_callback(const PX4_TOPIC_T(rc_channels) &msg); diff --git a/src/platforms/px4_defines.h b/src/platforms/px4_defines.h index fa3ef216a..9bb190380 100644 --- a/src/platforms/px4_defines.h +++ b/src/platforms/px4_defines.h @@ -93,9 +93,6 @@ static inline px4_param_t PX4_ROS_PARAM_SET(const char *name, float value) /* Get value of parameter */ #define PX4_PARAM_GET(_handle, _destpt) ros::param::get(_handle, *_destpt) -/* Get a subscriber class type based on the topic name */ -#define PX4_SUBSCRIBER_T(_name) SubscriberROS - #else /* * Building for NuttX @@ -134,9 +131,6 @@ typedef param_t px4_param_t; /* Get value of parameter */ #define PX4_PARAM_GET(_handle, _destpt) param_get(_handle, _destpt) -/* Get a subscriber class type based on the topic name */ -#define PX4_SUBSCRIBER_T(_name) SubscriberUORB - /* XXX this is a hack to resolve conflicts with NuttX headers */ #define isspace(c) \ ((c) == ' ' || (c) == '\t' || (c) == '\n' || \ @@ -150,6 +144,9 @@ typedef param_t px4_param_t; #define PX4_GET_SUBSCRIBE(_1, _2, _3, _4, _5, NAME, ...) NAME #define PX4_SUBSCRIBE(...) PX4_GET_SUBSCRIBE(__VA_ARGS__, PX4_SUBSCRIBE_CBMETH, PX4_SUBSCRIBE_CBFUNC, PX4_SUBSCRIBE_NOCB)(__VA_ARGS__) +/* Get a subscriber class type based on the topic name */ +#define PX4_SUBSCRIBER(_name) Subscriber + /* shortcut for advertising topics */ #define PX4_ADVERTISE(_nodehandle, _name) _nodehandle.advertise(PX4_TOPIC(_name)) diff --git a/src/platforms/px4_nodehandle.h b/src/platforms/px4_nodehandle.h index c24a18303..9bd792c69 100644 --- a/src/platforms/px4_nodehandle.h +++ b/src/platforms/px4_nodehandle.h @@ -77,13 +77,13 @@ public: * @param fb Callback, executed on receiving a new message */ template - Subscriber *subscribe(const char *topic, void(*fp)(const M&)) + Subscriber *subscribe(const char *topic, void(*fp)(const M&)) { - Subscriber *sub = new SubscriberROS(std::bind(fp, std::placeholders::_1)); + SubscriberBase *sub = new SubscriberROS(std::bind(fp, std::placeholders::_1)); ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS::callback, (SubscriberROS*)sub); ((SubscriberROS*)sub)->set_ros_sub(ros_sub); _subs.push_back(sub); - return sub; + return (Subscriber *)sub; } /** @@ -92,13 +92,13 @@ public: * @param fb Callback, executed on receiving a new message */ template - Subscriber *subscribe(const char *topic, void(T::*fp)(const M&), T *obj) + Subscriber *subscribe(const char *topic, void(T::*fp)(const M&), T *obj) { - Subscriber *sub = new SubscriberROS(std::bind(fp, obj, std::placeholders::_1)); + SubscriberBase *sub = new SubscriberROS(std::bind(fp, obj, std::placeholders::_1)); ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS::callback, (SubscriberROS*)sub); ((SubscriberROS*)sub)->set_ros_sub(ros_sub); _subs.push_back(sub); - return sub; + return (Subscriber *)sub; } /** @@ -106,13 +106,13 @@ public: * @param topic Name of the topic */ template - Subscriber *subscribe(const char *topic) + Subscriber *subscribe(const char *topic) { - Subscriber *sub = new SubscriberROS(); + SubscriberBase *sub = new SubscriberROS(); ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS::callback, (SubscriberROS*)sub); ((SubscriberROS*)sub)->set_ros_sub(ros_sub); _subs.push_back(sub); - return sub; + return (Subscriber *)sub; } /** @@ -141,10 +141,10 @@ public: private: static const uint32_t kQueueSizeDefault = 1000; /**< Size of queue for ROS */ - std::list _subs; /**< Subcriptions of node */ - std::list _pubs; /**< Publications of node */ + std::list _subs; /**< Subcriptions of node */ + std::list _pubs; /**< Publications of node */ }; -#else +#else //Building for NuttX class __EXPORT NodeHandle { public: @@ -164,7 +164,7 @@ public: */ template - Subscriber *subscribe(const struct orb_metadata *meta, + Subscriber *subscribe(const struct orb_metadata *meta, std::function callback, unsigned interval) { @@ -175,7 +175,7 @@ public: _sub_min_interval = sub_px4; } - return (Subscriber *)sub_px4; + return (Subscriber *)sub_px4; } /** diff --git a/src/platforms/px4_publisher.h b/src/platforms/px4_publisher.h index cb15eeb58..6b6d8e39e 100644 --- a/src/platforms/px4_publisher.h +++ b/src/platforms/px4_publisher.h @@ -48,15 +48,30 @@ namespace px4 { + +/** + * Untemplated publisher base class + * */ +class PublisherBase +{ +public: + PublisherBase() {}; + ~PublisherBase() {}; + +}; + #if defined(__linux) || (defined(__APPLE__) && defined(__MACH__)) -class Publisher +class Publisher : + public PublisherBase { public: /** * Construct Publisher by providing a ros::Publisher * @param ros_pub the ros publisher which will be used to perform the publications */ - Publisher(ros::Publisher ros_pub) : _ros_pub(ros_pub) + Publisher(ros::Publisher ros_pub) : + PublisherBase(), + _ros_pub(ros_pub) {} ~Publisher() {}; @@ -71,7 +86,8 @@ private: }; #else class Publisher : - public uORB::PublicationNode + public uORB::PublicationNode, + public PublisherBase { public: /** @@ -81,7 +97,8 @@ public: */ Publisher(const struct orb_metadata *meta, List *list) : - uORB::PublicationNode(meta, list) + uORB::PublicationNode(meta, list), + PublisherBase() {} ~Publisher() {}; diff --git a/src/platforms/px4_subscriber.h b/src/platforms/px4_subscriber.h index 234b72f5b..59c0ef70b 100644 --- a/src/platforms/px4_subscriber.h +++ b/src/platforms/px4_subscriber.h @@ -50,14 +50,36 @@ namespace px4 { + +/** + * Untemplated subscriber base class + * */ +class SubscriberBase +{ +public: + SubscriberBase() {}; + ~SubscriberBase() {}; + +}; + /** * Subscriber class which is used by nodehandle */ -class Subscriber +template +class Subscriber : + public SubscriberBase { public: - Subscriber() {}; + Subscriber() : + SubscriberBase() + {}; ~Subscriber() {}; + + /* Accessors*/ + /** + * Get the last message value + */ + virtual const M& get_msg() = 0; }; #if defined(__linux) || (defined(__APPLE__) && defined(__MACH__)) @@ -66,7 +88,7 @@ public: */ template class SubscriberROS : - public Subscriber + public Subscriber { friend class NodeHandle; @@ -75,7 +97,7 @@ public: * Construct Subscriber by providing a callback function */ SubscriberROS(std::function cbf) : - Subscriber(), + Subscriber(), _ros_sub(), _cbf(cbf), _msg_current() @@ -85,7 +107,7 @@ public: * Construct Subscriber without a callback function */ SubscriberROS() : - Subscriber(), + Subscriber(), _ros_sub(), _cbf(NULL), _msg_current() @@ -128,14 +150,14 @@ protected: }; -#else +#else // Building for NuttX /** * Subscriber class that is templated with the uorb subscription message type */ template class SubscriberUORB : - public Subscriber, + public Subscriber, public uORB::Subscription { public: @@ -150,7 +172,7 @@ public: unsigned interval, std::function callback, List *list) : - Subscriber(), + Subscriber(), uORB::Subscription(meta, interval, list), _callback(callback) //XXX store callback -- cgit v1.2.3