added callback to subscriber signature

This commit is contained in:
William Woodall 2014-08-13 14:44:15 -07:00
parent c6d98ecb2a
commit 0559fafcd0
3 changed files with 24 additions and 13 deletions

View file

@ -40,11 +40,11 @@ public:
} }
template<typename ROSMessage> template<typename ROSMessage>
Subscriber<ROSMessage>* create_subscriber(const char * topic_name) Subscriber<ROSMessage>* create_subscriber(const char * topic_name, typename Subscriber<ROSMessage>::CallbackType callback)
{ {
const rosidl_generator_cpp::MessageTypeSupportHandle & type_support_handle = ::ros_middleware_interface::get_type_support_handle<ROSMessage>(); const rosidl_generator_cpp::MessageTypeSupportHandle & type_support_handle = ::ros_middleware_interface::get_type_support_handle<ROSMessage>();
ros_middleware_interface::SubscriberHandle subscriber_handle = ::ros_middleware_interface::create_subscriber(node_handle_, type_support_handle, topic_name); ros_middleware_interface::SubscriberHandle subscriber_handle = ::ros_middleware_interface::create_subscriber(node_handle_, type_support_handle, topic_name);
SubscriberInterface *sub = new Subscriber<ROSMessage>(subscriber_handle, std::string(topic_name)); SubscriberInterface *sub = new Subscriber<ROSMessage>(subscriber_handle, std::string(topic_name), callback);
this->subscribers_.push_back(sub); this->subscribers_.push_back(sub);
return static_cast<Subscriber<ROSMessage> *>(sub); return static_cast<Subscriber<ROSMessage> *>(sub);
} }

View file

@ -25,15 +25,13 @@ public:
SubscriberInterface(const ros_middleware_interface::SubscriberHandle &subscriber_handle, std::string topic_name) SubscriberInterface(const ros_middleware_interface::SubscriberHandle &subscriber_handle, std::string topic_name)
: subscriber_handle_(subscriber_handle), topic_name_(topic_name) : subscriber_handle_(subscriber_handle), topic_name_(topic_name)
{} {}
virtual void * create_message()
{
throw std::runtime_error("not implemented - should always use override from subclass");
}
virtual void delete_message(void * ros_message)
{
throw std::runtime_error("not implemented - should always use override from subclass");
}
private: private:
virtual void * create_message() = 0;
virtual void delete_message(void * ros_message) = 0;
virtual void handle_message(void * ros_message) = 0;
ros_middleware_interface::SubscriberHandle subscriber_handle_; ros_middleware_interface::SubscriberHandle subscriber_handle_;
std::string topic_name_; std::string topic_name_;
@ -44,20 +42,32 @@ class Subscriber : public SubscriberInterface
{ {
friend class rclcpp::Node; friend class rclcpp::Node;
public: public:
typedef std::function<void(ROSMessage *)> CallbackType; typedef std::function<void(const ROSMessage *)> CallbackType;
Subscriber(const ros_middleware_interface::SubscriberHandle &subscriber_handle, std::string topic_name) Subscriber(const ros_middleware_interface::SubscriberHandle &subscriber_handle, std::string topic_name, CallbackType callback)
: SubscriberInterface(subscriber_handle, topic_name) : SubscriberInterface(subscriber_handle, topic_name), callback_(callback)
{} {}
private:
void * create_message() void * create_message()
{ {
return new ROSMessage(); return new ROSMessage();
} }
void delete_message(void * ros_message) void delete_message(void * ros_message)
{ {
ROSMessage* msg = (ROSMessage*)ros_message; ROSMessage* msg = (ROSMessage*)ros_message;
delete msg; delete msg;
ros_message = 0; ros_message = 0;
} }
void handle_message(void * ros_message)
{
ROSMessage* msg = (ROSMessage*)ros_message;
callback_(msg);
}
CallbackType callback_;
}; };
} }

View file

@ -85,6 +85,7 @@ public:
if (taken) if (taken)
{ {
std::cout << "- received message on topic: " << subscriber->topic_name_ << std::endl; std::cout << "- received message on topic: " << subscriber->topic_name_ << std::endl;
subscriber->handle_message(ros_msg);
} }
subscriber->delete_message(ros_msg); subscriber->delete_message(ros_msg);
} }