Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef _ROS_SERVICE_SERVER_H_
00036 #define _ROS_SERVICE_SERVER_H_
00037
00038 #include "rosserial_msgs/TopicInfo.h"
00039
00040 #include "ros/publisher.h"
00041 #include "ros/subscriber.h"
00042
00043 namespace ros {
00044
00045 template<typename MReq , typename MRes, typename ObjT=void>
00046 class ServiceServer : public Subscriber_ {
00047 public:
00048 typedef void(ObjT::*CallbackT)(const MReq&, MRes&);
00049
00050 ServiceServer(const char* topic_name, CallbackT cb, ObjT* obj) :
00051 pub(topic_name, &resp, rosserial_msgs::TopicInfo::ID_SERVICE_SERVER + rosserial_msgs::TopicInfo::ID_PUBLISHER),
00052 obj_(obj)
00053 {
00054 this->topic_ = topic_name;
00055 this->cb_ = cb;
00056 }
00057
00058
00059 virtual void callback(unsigned char *data){
00060 req.deserialize(data);
00061 (obj_->*cb_)(req,resp);
00062 pub.publish(&resp);
00063 }
00064 virtual const char * getMsgType(){ return this->req.getType(); }
00065 virtual const char * getMsgMD5(){ return this->req.getMD5(); }
00066 virtual int getEndpointType(){ return rosserial_msgs::TopicInfo::ID_SERVICE_SERVER + rosserial_msgs::TopicInfo::ID_SUBSCRIBER; }
00067
00068 MReq req;
00069 MRes resp;
00070 Publisher pub;
00071 private:
00072 CallbackT cb_;
00073 ObjT* obj_;
00074 };
00075
00076 template<typename MReq , typename MRes>
00077 class ServiceServer<MReq, MRes, void> : public Subscriber_ {
00078 public:
00079 typedef void(*CallbackT)(const MReq&, MRes&);
00080
00081 ServiceServer(const char* topic_name, CallbackT cb) :
00082 pub(topic_name, &resp, rosserial_msgs::TopicInfo::ID_SERVICE_SERVER + rosserial_msgs::TopicInfo::ID_PUBLISHER)
00083 {
00084 this->topic_ = topic_name;
00085 this->cb_ = cb;
00086 }
00087
00088
00089 virtual void callback(unsigned char *data){
00090 req.deserialize(data);
00091 cb_(req,resp);
00092 pub.publish(&resp);
00093 }
00094 virtual const char * getMsgType(){ return this->req.getType(); }
00095 virtual const char * getMsgMD5(){ return this->req.getMD5(); }
00096 virtual int getEndpointType(){ return rosserial_msgs::TopicInfo::ID_SERVICE_SERVER + rosserial_msgs::TopicInfo::ID_SUBSCRIBER; }
00097
00098 MReq req;
00099 MRes resp;
00100 Publisher pub;
00101 private:
00102 CallbackT cb_;
00103 };
00104
00105 }
00106
00107 #endif