Skip to content

Commit

Permalink
Implementing methods related with ParameterDescriptors.
Browse files Browse the repository at this point in the history
- Addressing minor comments on API.

Signed-off-by: Juan Ignacio Ubeira <jubeira@ekumenlabs.com>
  • Loading branch information
Juan Ignacio Ubeira committed Apr 29, 2019
1 parent 4440e85 commit 3f2803a
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 16 deletions.
6 changes: 6 additions & 0 deletions rclpy/rclpy/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,9 @@ class InvalidParameterValueException(Exception):

def __init__(self, *args):
Exception.__init__(self, 'Invalid parameter value.', *args)

class ParameterImmutableException(Exception):
"""Raised when a read-only parameter is modified."""

def __init__(self, *args):
Exception.__init__(self, 'Attempted to modify an read-only parameter.', *args)
31 changes: 20 additions & 11 deletions rclpy/rclpy/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@
from rclpy.clock import ROSClock
from rclpy.constants import S_TO_NS
from rclpy.context import Context
from rclpy.exceptions import NotInitializedException, ParameterNotDeclaredException
from rclpy.exceptions import InvalidParameterException
from rclpy.exceptions import InvalidParameterValueException
from rclpy.exceptions import NotInitializedException
from rclpy.exceptions import ParameterAlreadyDeclaredException
from rclpy.exceptions import ParameterNotDeclaredException
from rclpy.executors import Executor
from rclpy.expand_topic_name import expand_topic_name
from rclpy.guard_condition import GuardCondition
Expand Down Expand Up @@ -283,7 +287,7 @@ def undeclare_parameter(self, name: str):
raise ParameterNotDeclaredException()

def has_parameter(self, name: str) -> bool:
"""Returns true if parameter is declared; false otherwise."""
"""Returns True if parameter is declared; False otherwise."""
return name in self._parameters

def get_parameters(self, names: List[str]) -> List[Parameter]:
Expand Down Expand Up @@ -315,10 +319,7 @@ def get_parameter_or(self, name: str, alternative_value: Parameter) -> Parameter
:param name: Name of the parameter to get.
:alternative_value: Alternative parameter to get if it had not been declared before.
"""
if has_parameter(name):
return self._parameters[name]
else:
return alternative_value
return self._parameters.get(name, alternative_value)

def set_parameters(self, parameter_list: List[Parameter]) -> List[SetParametersResult]:
"""
Expand Down Expand Up @@ -454,10 +455,15 @@ def describe_parameter(self, name: str) -> ParameterDescriptor:
:raises ParameterNotDeclaredException: if parameter had not been declared before
and undeclared parameters are not allowed.
"""
# TODO(jubeira): Implement this method.
pass
try:
return self._parameters[name].descriptor
except KeyError e:
if self._allow_undeclared_parameters:
return ParameterDescriptor()
else:
raise ParameterNotDeclaredException()

def describe_parameters(self, name: List[str]) -> List[ParameterDescriptor]:
def describe_parameters(self, names: List[str]) -> List[ParameterDescriptor]:
"""
Gets the parameter descriptors of a given list of parameters.
Expand All @@ -468,8 +474,11 @@ def describe_parameters(self, name: List[str]) -> List[ParameterDescriptor]:
:raises ParameterNotDeclaredException: if at least one parameter
had not been declared before and undeclared parameters are not allowed.
"""
# TODO(jubeira): Implement this method.
pass
parameter_descriptors = []
for name in names:
parameter_descriptors.append(self.describe_parameter(name))

return parameter_descriptors

def set_parameters_callback(
self,
Expand Down
11 changes: 7 additions & 4 deletions rclpy/rclpy/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ def from_parameter_msg(cls, param_msg):
value = param_msg.value.string_array_value
return cls(param_msg.name, type_, value)

# TODO(jubeira): Add support for ParameterDescriptor.
def __init__(self, name, type_, value=None):
def __init__(self, name, type_, value=None, descriptor=ParameterDescriptor()):
if not isinstance(type_, Parameter.Type):
raise TypeError("type must be an instance of '{}'".format(repr(Parameter.Type)))

Expand All @@ -97,6 +96,9 @@ def __init__(self, name, type_, value=None):
self._type_ = type_
self._name = name
self._value = value
descriptor.name = name
descriptor.value = value
self._descriptor = descriptor

@property
def name(self):
Expand All @@ -110,8 +112,9 @@ def type_(self):
def value(self):
return self._value

def get_descriptor(self):
return ParameterDescriptor(name=self.name, type=self.type_.value)
@property
def descriptor(self):
return self._descriptor

def get_parameter_value(self):
parameter_value = ParameterValue(type=self.type_.value)
Expand Down
2 changes: 1 addition & 1 deletion rclpy/rclpy/parameter_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def __init__(self, node):
def _describe_parameters_callback(self, request, response):
for name in request.names:
p = self._node.get_parameter(name)
response.descriptors.append(p.get_descriptor())
response.descriptors.append(p.descriptor)
return response

def _get_parameters_callback(self, request, response):
Expand Down

0 comments on commit 3f2803a

Please sign in to comment.