1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 """Base-classes and management of ROS services.
36 See L{rospy.tcpros_service} for actual implementation."""
37
38 from __future__ import with_statement
39
40 import logging
41 import traceback
42
43 from rospy.core import *
44
45 from rospy.impl.registration import set_service_manager, Registration, get_registration_listeners
46 from rospy.impl.transport import *
47
48 logger = logging.getLogger('rospy.service')
49
50
51 import roslib.message
52 ServiceDefinition = roslib.message.ServiceDefinition
53
55 """Exception class for service-related errors"""
56 pass
57
59 """Internal-use superclass for storing service information"""
60 - def __init__(self, name, service_class):
61 self.resolved_name = resolve_name(name)
62 self.service_class = service_class
63 self.request_class = service_class._request_class
64 self.response_class = service_class._response_class
65 self.uri = None
66
68 """Keeps track of currently registered services in the ROS system"""
69
70 - def __init__(self, registration_listeners=None):
71 """
72 ctor
73 @param registration_listeners: override default registration listener.
74 @type registration_listeners: RegistrationListeners
75 """
76 self.map = {}
77 self.lock = threading.RLock()
78 if registration_listeners is None:
79 self.registration_listeners = get_registration_listeners()
80 else:
81 self.registration_listeners = registration_listeners
82
84 """
85 @return: List of (service_name, service_uri) for all registered services.
86 @rtype: [(str, str)]
87 """
88 with self.lock:
89 ret_val = []
90 for name, service in self.map.iteritems():
91 ret_val.append((name, service.uri))
92 services = self.map.values()
93 return ret_val
94
96 """
97 Unregister all registered services
98 """
99 self.map.clear()
100
101 - def register(self, resolved_service_name, service):
102 """
103 Register service with ServiceManager and ROS master
104 @param resolved_service_name: name of service (resolved)
105 @type resolved_service_name: str
106 @param service: Service to register
107 @type service: L{_Service}
108 """
109 err = None
110 with self.lock:
111 if resolved_service_name in self.map:
112 err = "service [%s] already registered"%resolved_service_name
113 else:
114 self.map[resolved_service_name] = service
115
116
117 self.registration_listeners.notify_added(resolved_service_name, service.uri, Registration.SRV)
118
119 if err:
120 raise ServiceException(err)
121
122 - def unregister(self, resolved_service_name, service):
123 """
124 Unregister service with L{ServiceManager} and ROS Master
125 @param resolved_service_name: name of service
126 @type resolved_service_name: str
127 @param service: service implementation
128 @type service: L{_Service}
129 """
130 with self.lock:
131 curr = self.map.get(resolved_service_name, None)
132 if curr == service:
133 del self.map[resolved_service_name]
134
135
136 self.registration_listeners.notify_removed(resolved_service_name, service.uri, Registration.SRV)
137
139 """
140 @param resolved_service_name: name of service
141 @type resolved_service_name: str
142 @return: service implementation
143 @rtype: _Service
144 """
145 return self.map.get(resolved_service_name, None)
146
147 set_service_manager(ServiceManager())
148