Go to the documentation of this file.00001
00002 #include <ros/ros.h>
00003 #include <boost/thread.hpp>
00004
00005 #include "udpmulti_transport/UDPMultRegisterTopic.h"
00006 #include "udpmulti_transport/UDPMultClearAll.h"
00007 #include "udpmulti_transport/UDPMultGetTopicList.h"
00008
00009
00010 typedef std::map< std::string, unsigned int ,std::less<std::string> > TopicPortMap;
00011 unsigned int availablePort = 1024;
00012 std::string multicast_address = "239.255.0.1";
00013 TopicPortMap registeredTopic;
00014 boost::mutex main_mutex;
00015
00016
00017 bool register_topic(udpmulti_transport::UDPMultRegisterTopic::Request &req,
00018 udpmulti_transport::UDPMultRegisterTopic::Response &res)
00019 {
00020 boost::lock_guard<boost::mutex> guard(main_mutex);
00021 TopicPortMap::iterator it = registeredTopic.find(req.topic);
00022 if (it != registeredTopic.end()) {
00023 res.multicast_address = multicast_address;
00024 res.port = it->second;
00025 } else {
00026 res.multicast_address = multicast_address;
00027 res.port = availablePort++;
00028 registeredTopic.insert(std::pair<std::string,unsigned int>(req.topic,res.port));
00029 }
00030 ROS_INFO("Registered port %d for topic %s", res.port,req.topic.c_str());
00031
00032 return true;
00033 }
00034
00035 bool clear_all_topics(udpmulti_transport::UDPMultClearAll::Request &req,
00036 udpmulti_transport::UDPMultClearAll::Response &res)
00037 {
00038 boost::lock_guard<boost::mutex> guard(main_mutex);
00039 registeredTopic.clear();
00040 availablePort = 1024;
00041 ROS_INFO("Deleted all topic-port association");
00042 res.result = 0;
00043 return true;
00044 }
00045
00046 bool get_topic_list(udpmulti_transport::UDPMultGetTopicList::Request &req,
00047 udpmulti_transport::UDPMultGetTopicList::Response &res)
00048 {
00049 boost::lock_guard<boost::mutex> guard(main_mutex);
00050 TopicPortMap::const_iterator it;
00051 unsigned int i=0;
00052 res.multicast_address = multicast_address;
00053 res.topics.resize(registeredTopic.size());
00054 for (it=registeredTopic.begin();it!=registeredTopic.end();it++,i++) {
00055 udpmulti_transport::UDPMultTopic tpc;
00056 tpc.topic = it->first;
00057 tpc.port = it->second;
00058 res.topics[i] = tpc;
00059 }
00060 return true;
00061 }
00062
00063
00064 int main(int argc,char *argv[])
00065 {
00066 ros::init(argc, argv, "udpmulti_manager");
00067 ros::NodeHandle n("udpmulti_manager");
00068 n.param<std::string>("multicast_address",multicast_address,"239.255.0.1");
00069
00070 ros::ServiceServer regTopicSrv = n.advertiseService("register_topic",register_topic);
00071 ros::ServiceServer clearAllSrv = n.advertiseService("clear_all_topics",clear_all_topics);
00072 ros::ServiceServer getListSrv = n.advertiseService("get_topics",get_topic_list);
00073 ROS_INFO("udpmulti_manager started");
00074
00075 ros::spin();
00076
00077 }
00078
00079
00080