Program Listing for File rclc_parameter.h

Return to documentation for file (include/rclc_parameter/rclc_parameter.h)

// Copyright (c) 2021 - for information on the respective copyright owner
//
// 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 RCLC_PARAMETER__RCLC_PARAMETER_H_
#define RCLC_PARAMETER__RCLC_PARAMETER_H_

#if __cplusplus
extern "C"
{
#endif  // if __cplusplus

#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <rcl/types.h>

#include <rcl_interfaces/msg/parameter.h>
#include <rcl_interfaces/msg/parameter_value.h>
#include <rcl_interfaces/msg/parameter_event.h>
#include <rcl_interfaces/srv/get_parameter_types.h>
#include <rcl_interfaces/srv/get_parameters.h>
#include <rcl_interfaces/msg/set_parameters_result.h>
#include <rcl_interfaces/srv/list_parameters.h>
#include <rcl_interfaces/srv/set_parameters.h>
#include <rcl_interfaces/srv/describe_parameters.h>
#include <rcl_interfaces/msg/parameter_descriptor.h>
#include <rosidl_runtime_c/string_functions.h>
#include <rosidl_runtime_c/primitives_sequence_functions.h>

#include <rclc_parameter/visibility_control.h>

// Alias for rcl_interfaces types

typedef struct rcl_interfaces__srv__GetParameters_Request GetParameters_Request;
typedef struct rcl_interfaces__srv__GetParameters_Response GetParameters_Response;

typedef struct rcl_interfaces__srv__GetParameterTypes_Request GetParameterTypes_Request;
typedef struct rcl_interfaces__srv__GetParameterTypes_Response GetParameterTypes_Response;

typedef struct rcl_interfaces__srv__SetParameters_Request SetParameters_Request;
typedef struct rcl_interfaces__srv__SetParameters_Response SetParameters_Response;
typedef struct rcl_interfaces__msg__SetParametersResult SetParameters_Result;

typedef struct rcl_interfaces__srv__DescribeParameters_Request DescribeParameters_Request;
typedef struct rcl_interfaces__srv__DescribeParameters_Response DescribeParameters_Response;

typedef struct rcl_interfaces__srv__ListParameters_Request ListParameters_Request;
typedef struct rcl_interfaces__srv__ListParameters_Response ListParameters_Response;

typedef struct rcl_interfaces__msg__Parameter Parameter;
typedef struct rcl_interfaces__msg__ParameterValue ParameterValue;
typedef struct rcl_interfaces__msg__Parameter__Sequence Parameter__Sequence;
typedef struct rcl_interfaces__msg__ParameterDescriptor ParameterDescriptor;
typedef struct rcl_interfaces__msg__ParameterDescriptor__Sequence ParameterDescriptor__Sequence;
typedef struct rcl_interfaces__msg__ParameterEvent ParameterEvent;

// Number of RCLC executor handles required for a parameter server
#define RCLC_EXECUTOR_PARAMETER_SERVER_HANDLES 5
#define RCLC_PARAMETER_MODIFICATION_REJECTED 4001
#define RCLC_PARAMETER_TYPE_MISMATCH 4002
#define RCLC_PARAMETER_UNSUPORTED_ON_LOW_MEM 4003
#define RCLC_PARAMETER_DISABLED_ON_CALLBACK 40004

typedef bool (* rclc_parameter_callback_t)(
  const Parameter * old_param,
  const Parameter * new_param,
  void * context);

// Allowed RCLC parameter types
typedef enum rclc_parameter_type_t
{
  RCLC_PARAMETER_NOT_SET = 0,
  RCLC_PARAMETER_BOOL,
  RCLC_PARAMETER_INT,
  RCLC_PARAMETER_DOUBLE
} rclc_parameter_type_t;

// RCLC parameter server options
typedef struct rclc_parameter_options_t
{
  bool notify_changed_over_dds;
  size_t max_params;
  bool allow_undeclared_parameters;
  bool low_mem_mode;
} rclc_parameter_options_t;

// Container for RCLC parameter server
typedef struct rclc_parameter_server_t
{
  rcl_service_t get_service;
  rcl_service_t get_types_service;
  rcl_service_t set_service;
  rcl_service_t list_service;
  rcl_service_t describe_service;
  rcl_publisher_t event_publisher;

  GetParameters_Request get_request;
  GetParameters_Response get_response;

  GetParameterTypes_Request get_types_request;
  GetParameterTypes_Response get_types_response;

  SetParameters_Request set_request;
  SetParameters_Response set_response;

  ListParameters_Request list_request;
  ListParameters_Response list_response;

  DescribeParameters_Request describe_request;
  DescribeParameters_Response describe_response;

  Parameter__Sequence parameter_list;
  ParameterDescriptor__Sequence parameter_descriptors;

  ParameterEvent event_list;

  rclc_parameter_callback_t on_modification;
  void * context;
  bool on_callback;

  bool notify_changed_over_dds;
  bool allow_undeclared_parameters;
  bool low_mem_mode;
} rclc_parameter_server_t;

RCLC_PARAMETER_PUBLIC
rcl_ret_t rclc_parameter_server_init_default(
  rclc_parameter_server_t * parameter_server,
  rcl_node_t * node);

RCLC_PARAMETER_PUBLIC
rcl_ret_t rclc_parameter_server_init_with_option(
  rclc_parameter_server_t * parameter_server,
  rcl_node_t * node,
  const rclc_parameter_options_t * options);

RCLC_PARAMETER_PUBLIC
rcl_ret_t rclc_parameter_server_fini(
  rclc_parameter_server_t * parameter_server,
  rcl_node_t * node);

RCLC_PARAMETER_PUBLIC
rcl_ret_t rclc_executor_add_parameter_server(
  rclc_executor_t * executor,
  rclc_parameter_server_t * parameter_server,
  rclc_parameter_callback_t on_modification);

RCLC_PARAMETER_PUBLIC
rcl_ret_t rclc_executor_add_parameter_server_with_context(
  rclc_executor_t * executor,
  rclc_parameter_server_t * parameter_server,
  rclc_parameter_callback_t on_modification,
  void * context);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_add_parameter(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  rclc_parameter_type_t type);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_delete_parameter(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_set_bool(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  bool value);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_set_int(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  int64_t value);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_set_double(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  double value);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_get_bool(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  bool * output);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_get_int(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  int64_t * output);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_parameter_get_double(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  double * output);


RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_add_parameter_description(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  const char * parameter_description,
  const char * additional_constraints);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_set_parameter_read_only(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  bool read_only);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_add_parameter_constraint_integer(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  int64_t from_value,
  int64_t to_value,
  uint64_t step);

RCLC_PARAMETER_PUBLIC
rcl_ret_t
rclc_add_parameter_constraint_double(
  rclc_parameter_server_t * parameter_server,
  const char * parameter_name,
  double from_value,
  double to_value,
  double step);

#if __cplusplus
}
#endif  // if __cplusplus

#endif  // RCLC_PARAMETER__RCLC_PARAMETER_H_