Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions rcl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ set(${PROJECT_NAME}_sources
src/rcl/graph.c
src/rcl/guard_condition.c
src/rcl/node.c
src/rcl/parameter.c
src/rcl/parameter_client.c
src/rcl/parameter_service.c
src/rcl/publisher.c
src/rcl/rcl.c
src/rcl/rmw_implementation_identifier_check.c
Expand Down
161 changes: 161 additions & 0 deletions rcl/include/rcl/parameter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
// Copyright 2016 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef RCL__PARAMETER_H_
#define RCL__PARAMETER_H_

#if __cplusplus
extern "C"
{
#endif

#include "rcl_interfaces/msg/parameter.h"
#include "rcl_interfaces/msg/parameter_event.h"

typedef int rcl_param_action_t;
#define RCL_GET_PARAMETERS 0
#define RCL_GET_PARAMETER_TYPES 1
#define RCL_SET_PARAMETERS 2
#define RCL_SET_PARAMETERS_ATOMICALLY 3
#define RCL_LIST_PARAMETERS 4
#define RCL_NUMBER_OF_PARAMETER_ACTIONS 5
#define RCL_PARAMETER_ACTION_UNKNOWN 6

/// rcl_parameter_client_set_<TYPE> adds the parameter key, value pair to the
/// pending set_parameters_request

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_bool(
rcl_interfaces__msg__Parameter * parameter, const char * parameter_name, bool value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_integer(
rcl_interfaces__msg__Parameter * parameter, const char * parameter_name, int value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_double(
rcl_interfaces__msg__Parameter * parameter, const char * parameter_name, double value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_string(
rcl_interfaces__msg__Parameter * parameter,
const char * parameter_name,
const char * value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_bytes(
rcl_interfaces__msg__Parameter * parameter,
const char * parameter_name,
const uint8_t * value);

// etc. for all types

/// Get the boolean value of the parameter, or return error if the parameter is not a boolean.
RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_get_bool(const rcl_interfaces__msg__Parameter * parameter, bool * output);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_get_int(const rcl_interfaces__msg__Parameter * parameter, int * output);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_get_double(const rcl_interfaces__msg__Parameter * parameter, double * output);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_get_string(
const rcl_interfaces__msg__Parameter * parameter, rosidl_generator_c__String * output);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_get_bytes(
const rcl_interfaces__msg__Parameter * parameter, rosidl_generator_c__byte__Array * output);


RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_value_bool(
rcl_interfaces__msg__ParameterValue * parameter_value, bool value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_value_integer(
rcl_interfaces__msg__ParameterValue * parameter_value, int value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_value_double(
rcl_interfaces__msg__ParameterValue * parameter_value, double value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_value_string(
rcl_interfaces__msg__ParameterValue * parameter_value,
const char * value);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_set_value_bytes(
rcl_interfaces__msg__ParameterValue * parameter_value,
const uint8_t * value);

// etc. for all types

// Some other convenience function ideas:
// Get type enum from a ParameterValue
// rcl_parameter_get_type(rcl_interfaces__msg__ParameterValue * parameter_value, uint8 type)

// Get type enum from a Parameter
// rcl_parameter_get_type(rcl_interfaces__msg__Parameter * parameter, uint8 type)

bool rcl_parameter_value_compare(
const rcl_interfaces__msg__ParameterValue * parameter1,
const rcl_interfaces__msg__ParameterValue * parameter2);

// diff the new state and the old state of parameters to populate a ParameterEvent message struct
RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_convert_changes_to_event(
const rcl_interfaces__msg__Parameter__Array * prior_state,
const rcl_interfaces__msg__Parameter__Array * new_state,
rcl_interfaces__msg__ParameterEvent * parameter_event);

#if __cplusplus
}
#endif

#endif // RCL__PARAMETER_H_
182 changes: 182 additions & 0 deletions rcl/include/rcl/parameter_client.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
// Copyright 2016 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef RCL__PARAMETER_CLIENT_H_
#define RCL__PARAMETER_CLIENT_H_

#if __cplusplus
extern "C"
{
#endif

#include <rcl_interfaces/msg/list_parameters_result__struct.h>
#include <rcl_interfaces/msg/parameter__struct.h>
#include <rcl_interfaces/msg/parameter_event__struct.h>
#include <rcl_interfaces/msg/set_parameters_result__struct.h>

#include "rcl/client.h"
#include "rcl/node.h"
#include "rcl/parameter.h"
#include "rcl/wait.h"

/// TODO: documentation!!!

/// Internal rcl implementation struct
struct rcl_parameter_client_impl_t;

/// There is no sync/async parameter client distinction in rcl.
typedef struct rcl_parameter_client_t
{
struct rcl_parameter_client_impl_t * impl;
} rcl_parameter_client_t;

typedef struct rcl_parameter_client_options_t
{
// quality of service settings for all parameter-related services
rmw_qos_profile_t qos;
rcl_allocator_t allocator;
char * remote_node_name;
rmw_qos_profile_t parameter_event_qos;
} rcl_parameter_client_options_t;

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_parameter_client_options_t
rcl_parameter_client_get_default_options(void);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_parameter_client_t
rcl_get_zero_initialized_parameter_client(void);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_init(
rcl_parameter_client_t * parameter_client,
rcl_node_t * node,
const rcl_parameter_client_options_t * options
);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_fini(rcl_parameter_client_t * parameter_client);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_send_set_request(
const rcl_parameter_client_t * parameter_client,
const rcl_interfaces__msg__Parameter__Array * parameters,
int64_t * sequence_number);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_interfaces__msg__SetParametersResult__Array *
rcl_parameter_client_take_set_response(
const rcl_parameter_client_t * parameter_client,
rmw_request_id_t * request_header);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_send_get_request(
const rcl_parameter_client_t * client,
const rosidl_generator_c__String__Array * names,
int64_t * sequence_number);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_interfaces__msg__ParameterValue__Array *
rcl_parameter_client_take_get_response(
const rcl_parameter_client_t * client,
rmw_request_id_t * request_header);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_send_get_types_request(
const rcl_parameter_client_t * client,
const rosidl_generator_c__String__Array * parameter_names,
int64_t * sequence_number);

RCL_PUBLIC
RCL_WARN_UNUSED
rosidl_generator_c__uint8__Array *
rcl_parameter_client_take_get_types_response(
const rcl_parameter_client_t * client,
rmw_request_id_t * request_header);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_send_set_atomically_request(
const rcl_parameter_client_t * client,
const rcl_interfaces__msg__Parameter__Array * parameter_values,
int64_t * sequence_number);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_interfaces__msg__SetParametersResult *
rcl_parameter_client_take_set_atomically_response(
const rcl_parameter_client_t * client,
rmw_request_id_t * request_header);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_send_list_request(
const rcl_parameter_client_t * client,
const rosidl_generator_c__String__Array * prefixes,
uint64_t depth,
int64_t * sequence_number);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_interfaces__msg__ListParametersResult *
rcl_parameter_client_take_list_response(
const rcl_parameter_client_t * client,
rmw_request_id_t * request_header);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_take_event(
const rcl_parameter_client_t * client,
rcl_interfaces__msg__ParameterEvent * parameter_event,
rmw_message_info_t * message_info
);

RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_wait_set_add_parameter_client(
rcl_wait_set_t * wait_set,
const rcl_parameter_client_t * parameter_client);

// To be called after rcl_wait
RCL_PUBLIC
RCL_WARN_UNUSED
rcl_ret_t
rcl_parameter_client_get_pending_action(
const rcl_wait_set_t * wait_set,
const rcl_parameter_client_t * parameter_client,
rcl_param_action_t * action);

#if __cplusplus
}
#endif

#endif // RCL__PARAMETER_CLIENT_H_
Loading