Package rospy :: Module service

Source Code for Module rospy.service

  1  # Software License Agreement (BSD License) 
  2  # 
  3  # Copyright (c) 2008, Willow Garage, Inc. 
  4  # All rights reserved. 
  5  # 
  6  # Redistribution and use in source and binary forms, with or without 
  7  # modification, are permitted provided that the following conditions 
  8  # are met: 
  9  # 
 10  #  * Redistributions of source code must retain the above copyright 
 11  #    notice, this list of conditions and the following disclaimer. 
 12  #  * Redistributions in binary form must reproduce the above 
 13  #    copyright notice, this list of conditions and the following 
 14  #    disclaimer in the documentation and/or other materials provided 
 15  #    with the distribution. 
 16  #  * Neither the name of Willow Garage, Inc. nor the names of its 
 17  #    contributors may be used to endorse or promote products derived 
 18  #    from this software without specific prior written permission. 
 19  # 
 20  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 21  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 22  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 23  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 24  # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 25  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 26  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 27  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 28  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 29  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 30  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 31  # POSSIBILITY OF SUCH DAMAGE. 
 32  # 
 33  # Revision $Id: service.py 11753 2010-10-25 06:23:19Z kwc $ 
 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  ## alias of roslib.message.ServiceDefinition 
 51  import roslib.message 
 52  ServiceDefinition = roslib.message.ServiceDefinition 
 53   
54 -class ServiceException(Exception):
55 """Exception class for service-related errors""" 56 pass
57
58 -class _Service(object):
59 """Internal-use superclass for storing service information"""
60 - def __init__(self, name, service_class):
61 self.resolved_name = resolve_name(name) #services remap as well 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 #initialize attr
66
67 -class ServiceManager(object):
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 = {} # {name : Service} 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
83 - def get_services(self):
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
95 - def unregister_all(self):
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 # NOTE: this call can potentially take a long time under lock and thus needs to be reimplmented 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 # NOTE: this call can potentially take a long time under lock 136 self.registration_listeners.notify_removed(resolved_service_name, service.uri, Registration.SRV)
137
138 - def get_service(self, resolved_service_name):
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