def register_request_manager_mapping(self, component, request_manager): """Adds a mapping between a component and a request manager: all services exposed by this component are handled by this request manager. A component may have 0, 1 or more request managers. if more than one, each request manager can independently invoke the service. :param string component: the name of the component that use *request_manager* as request manager. :param string request_manager: the classpath of the request manager (eg: 'morse.middleware.socket_request_manager.SocketRequestManager', 'morse.middleware.yarp_request_manager.YarpRequestManager',...). """ if not request_manager in self._request_managers: raise MorseServiceError( "Request manager '%s' has not been registered!" % request_manager) instance = self._request_managers[request_manager] if component in self._service_mappings: self._service_mappings[component].add(instance) else: self._service_mappings[component] = { instance, }
def get_request_managers(self, component): if not component in self._service_mappings: logger.error("no service manager is available for the " + component + " component! This error " + \ "can have several causes. Maybe you forgot to add the middleware 'empty', or " + \ "you are using a middleware that does not currently support requests. ") raise MorseServiceError( "No request manager has been mapped to the component %s" % component) return self._service_mappings[component]
def decorated_fn(self, callback, *param): # Stores in the callback the original calling # service. try: callback.service = decorated_fn except AttributeError: raise MorseServiceError( "Invalid callback for async service. Did you forget to pass the chain callback from an overlay?" ) self.set_service_callback(callback) try: fn(self, *param) except BaseException as e: # Failure during service invokation? remove the # callback and re-raise self.on_completion = None raise e
def joint_trajectory_action(self, req): # Fill a MORSE trajectory structure from ROS JointTrajectory traj = {} req = req.trajectory traj["starttime"] = self._stamp_to_secs(req.header.stamp) joint_names = req.joint_names target_joints = self.overlaid_object.local_data.keys() diff = set(joint_names).difference(set(target_joints)) if diff: raise MorseServiceError("Trajectory contains unknown joints! %s" % diff) points = [] for p in req.points: point = {} # Re-order joint values to match the local_data order pos = dict(zip(joint_names, p.positions)) point["positions"] = [pos[j] for j in target_joints if j in pos] vel = dict(zip(joint_names, p.velocities)) point["velocities"] = [vel[j] for j in target_joints if j in vel] acc = dict(zip(joint_names, p.accelerations)) point["accelerations"] = [ acc[j] for j in target_joints if j in acc ] point["time_from_start"] = self._stamp_to_secs(p.time_from_start) points.append(point) traj["points"] = points logger.info(traj) self.overlaid_object.trajectory( self.chain_callback(self.joint_trajectory_action_result), traj)