def set_parameters_atomically( self, parameter_list: List[Parameter]) -> SetParametersResult: """ Atomically set parameters for the node. If a callback was registered previously with :func:`set_parameters_callback`, it will be called prior to setting the parameters for the node. If the parameters are set successfully, a :class:`ParameterEvent` message is published. :param parameter_list: The list of parameters to set. """ result = None if self._parameters_callback: result = self._parameters_callback(parameter_list) else: result = SetParametersResult(successful=True) if result.successful: parameter_event = ParameterEvent() # Add fully qualified path of node to parameter event if self.get_namespace() == '/': parameter_event.node = self.get_namespace() + self.get_name() else: parameter_event.node = self.get_namespace( ) + '/' + self.get_name() for param in parameter_list: if Parameter.Type.NOT_SET == param.type_: if Parameter.Type.NOT_SET != self.get_parameter( param.name).type_: # Parameter deleted. (Parameter had value and new value is not set) parameter_event.deleted_parameters.append( param.to_parameter_msg()) # Delete any unset parameters regardless of their previous value. # We don't currently store NOT_SET parameters so this is an extra precaution. if param.name in self._parameters: del self._parameters[param.name] else: if Parameter.Type.NOT_SET == self.get_parameter( param.name).type_: # Parameter is new. (Parameter had no value and new value is set) parameter_event.new_parameters.append( param.to_parameter_msg()) else: # Parameter changed. (Parameter had a value and new value is set) parameter_event.changed_parameters.append( param.to_parameter_msg()) self._parameters[param.name] = param parameter_event.stamp = self._clock.now().to_msg() self._parameter_event_publisher.publish(parameter_event) return result
def set_parameters_atomically(self, parameter_list): result = None if self._parameters_callback: result = self._parameters_callback(parameter_list) else: result = SetParametersResult(successful=True) if result.successful: parameter_event = ParameterEvent() for param in parameter_list: if Parameter.Type.NOT_SET == param.type_: if Parameter.Type.NOT_SET != self.get_parameter( param.name).type_: # Parameter deleted. (Parameter had value and new value is not set) parameter_event.deleted_parameters.append( param.to_parameter_msg()) # Delete any unset parameters regardless of their previous value. # We don't currently store NOT_SET parameters so this is an extra precaution. if param.name in self._parameters: del self._parameters[param.name] else: if Parameter.Type.NOT_SET == self.get_parameter( param.name).type_: # Parameter is new. (Parameter had no value and new value is set) parameter_event.new_parameters.append( param.to_parameter_msg()) else: # Parameter changed. (Parameter had a value and new value is set) parameter_event.changed_parameters.append( param.to_parameter_msg()) self._parameters[param.name] = param self._parameter_event_publisher.publish(parameter_event) return result
def _set_parameters_atomically( self, parameter_list: List[Parameter]) -> SetParametersResult: """ Set the given parameters, all at one time, and then aggregate result. This method does not check if the parameters were declared beforehand, and is intended for internal use of this class. If a callback was registered previously with :func:`set_parameters_callback`, it will be called prior to setting the parameters for the node only once for all parameters. If the callback prevents the parameters from being set, then it will be reflected in the returned result; no exceptions will be raised in this case. For each successfully set parameter, a :class:`ParameterEvent` message is published. If the value type of the parameter is NOT_SET, and the existing parameter type is something else, then the parameter will be implicitly undeclared. :param parameter_list: The list of parameters to set. :return: Aggregate result of setting all the parameters atomically. """ result = None if self._parameters_callback: result = self._parameters_callback(parameter_list) else: result = SetParametersResult(successful=True) if result.successful: parameter_event = ParameterEvent() # Add fully qualified path of node to parameter event if self.get_namespace() == '/': parameter_event.node = self.get_namespace() + self.get_name() else: parameter_event.node = self.get_namespace( ) + '/' + self.get_name() for param in parameter_list: if Parameter.Type.NOT_SET == param.type_: if Parameter.Type.NOT_SET != self.get_parameter_or( param.name).type_: # Parameter deleted. (Parameter had value and new value is not set) parameter_event.deleted_parameters.append( param.to_parameter_msg()) # Delete any unset parameters regardless of their previous value. # We don't currently store NOT_SET parameters so this is an extra precaution. if param.name in self._parameters: del self._parameters[param.name] if param.name in self._descriptors: del self._descriptors[param.name] else: if Parameter.Type.NOT_SET == self.get_parameter_or( param.name).type_: # Parameter is new. (Parameter had no value and new value is set) parameter_event.new_parameters.append( param.to_parameter_msg()) else: # Parameter changed. (Parameter had a value and new value is set) parameter_event.changed_parameters.append( param.to_parameter_msg()) self._parameters[param.name] = param parameter_event.stamp = self._clock.now().to_msg() self._parameter_event_publisher.publish(parameter_event) return result