aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/examples/subscriber/subscriber_example.cpp2
-rw-r--r--src/examples/subscriber/subscriber_example.h2
-rw-r--r--src/platforms/px4_defines.h9
-rw-r--r--src/platforms/px4_nodehandle.h28
-rw-r--r--src/platforms/px4_publisher.h25
-rw-r--r--src/platforms/px4_subscriber.h38
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<PX4_TOPIC_T(_name)>
-
#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<PX4_TOPIC_T(_name)>
-
/* 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<PX4_TOPIC_T(_name)>
+
/* shortcut for advertising topics */
#define PX4_ADVERTISE(_nodehandle, _name) _nodehandle.advertise<PX4_TOPIC_T(_name)>(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<typename M>
- Subscriber *subscribe(const char *topic, void(*fp)(const M&))
+ Subscriber<M> *subscribe(const char *topic, void(*fp)(const M&))
{
- Subscriber *sub = new SubscriberROS<M>(std::bind(fp, std::placeholders::_1));
+ SubscriberBase *sub = new SubscriberROS<M>(std::bind(fp, std::placeholders::_1));
ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS<M>::callback, (SubscriberROS<M>*)sub);
((SubscriberROS<M>*)sub)->set_ros_sub(ros_sub);
_subs.push_back(sub);
- return sub;
+ return (Subscriber<M> *)sub;
}
/**
@@ -92,13 +92,13 @@ public:
* @param fb Callback, executed on receiving a new message
*/
template<typename M, typename T>
- Subscriber *subscribe(const char *topic, void(T::*fp)(const M&), T *obj)
+ Subscriber<M> *subscribe(const char *topic, void(T::*fp)(const M&), T *obj)
{
- Subscriber *sub = new SubscriberROS<M>(std::bind(fp, obj, std::placeholders::_1));
+ SubscriberBase *sub = new SubscriberROS<M>(std::bind(fp, obj, std::placeholders::_1));
ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS<M>::callback, (SubscriberROS<M>*)sub);
((SubscriberROS<M>*)sub)->set_ros_sub(ros_sub);
_subs.push_back(sub);
- return sub;
+ return (Subscriber<M> *)sub;
}
/**
@@ -106,13 +106,13 @@ public:
* @param topic Name of the topic
*/
template<typename M>
- Subscriber *subscribe(const char *topic)
+ Subscriber<M> *subscribe(const char *topic)
{
- Subscriber *sub = new SubscriberROS<M>();
+ SubscriberBase *sub = new SubscriberROS<M>();
ros::Subscriber ros_sub = ros::NodeHandle::subscribe(topic, kQueueSizeDefault, &SubscriberROS<M>::callback, (SubscriberROS<M>*)sub);
((SubscriberROS<M>*)sub)->set_ros_sub(ros_sub);
_subs.push_back(sub);
- return sub;
+ return (Subscriber<M> *)sub;
}
/**
@@ -141,10 +141,10 @@ public:
private:
static const uint32_t kQueueSizeDefault = 1000; /**< Size of queue for ROS */
- std::list<Subscriber *> _subs; /**< Subcriptions of node */
- std::list<Publisher *> _pubs; /**< Publications of node */
+ std::list<SubscriberBase *> _subs; /**< Subcriptions of node */
+ std::list<PublisherBase *> _pubs; /**< Publications of node */
};
-#else
+#else //Building for NuttX
class __EXPORT NodeHandle
{
public:
@@ -164,7 +164,7 @@ public:
*/
template<typename M>
- Subscriber *subscribe(const struct orb_metadata *meta,
+ Subscriber<M> *subscribe(const struct orb_metadata *meta,
std::function<void(const M &)> callback,
unsigned interval)
{
@@ -175,7 +175,7 @@ public:
_sub_min_interval = sub_px4;
}
- return (Subscriber *)sub_px4;
+ return (Subscriber<M> *)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<uORB::PublicationNode *> *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<typename M>
+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<typename M>
class SubscriberROS :
- public Subscriber
+ public Subscriber<M>
{
friend class NodeHandle;
@@ -75,7 +97,7 @@ public:
* Construct Subscriber by providing a callback function
*/
SubscriberROS(std::function<void(const M &)> cbf) :
- Subscriber(),
+ Subscriber<M>(),
_ros_sub(),
_cbf(cbf),
_msg_current()
@@ -85,7 +107,7 @@ public:
* Construct Subscriber without a callback function
*/
SubscriberROS() :
- Subscriber(),
+ Subscriber<M>(),
_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<typename M>
class SubscriberUORB :
- public Subscriber,
+ public Subscriber<M>,
public uORB::Subscription<M>
{
public:
@@ -150,7 +172,7 @@ public:
unsigned interval,
std::function<void(const M &)> callback,
List<uORB::SubscriptionNode *> *list) :
- Subscriber(),
+ Subscriber<M>(),
uORB::Subscription<M>(meta, interval, list),
_callback(callback)
//XXX store callback