diff --git a/versions/v3.0.0/_add_service_exception_8hpp_source.html b/versions/v3.0.0/_add_service_exception_8hpp_source.html new file mode 100644 index 00000000..be9c43e3 --- /dev/null +++ b/versions/v3.0.0/_add_service_exception_8hpp_source.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions/AddServiceException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
AddServiceException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_components/exceptions/ComponentException.hpp"
+
4
+ +
6
+ +
13public:
+
14 explicit AddServiceException(const std::string& msg) : ComponentException("AddServiceException", msg) {}
+
15};
+
16}// namespace modulo_components::exceptions
+
An exception class to notify errors when adding a service.
+
A base class for all component exceptions.
+
Modulo component exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_add_signal_exception_8hpp_source.html b/versions/v3.0.0/_add_signal_exception_8hpp_source.html new file mode 100644 index 00000000..72d26319 --- /dev/null +++ b/versions/v3.0.0/_add_signal_exception_8hpp_source.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions/AddSignalException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
AddSignalException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_components/exceptions/ComponentException.hpp"
+
4
+ +
6
+ +
13public:
+
14 explicit AddSignalException(const std::string& msg) : ComponentException("AddSignalException", msg) {}
+
15};
+
16}// namespace modulo_components::exceptions
+
An exception class to notify errors when adding a signal.
+
A base class for all component exceptions.
+
Modulo component exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_component_8cpp_source.html b/versions/v3.0.0/_component_8cpp_source.html new file mode 100644 index 00000000..d9fc4358 --- /dev/null +++ b/versions/v3.0.0/_component_8cpp_source.html @@ -0,0 +1,148 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/src/Component.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Component.cpp
+
+
+
1#include "modulo_components/Component.hpp"
+
2
+
3using namespace modulo_core::communication;
+
4
+
5namespace modulo_components {
+
6
+
7Component::Component(const rclcpp::NodeOptions& node_options, const std::string& fallback_name) :
+
8 ComponentInterface<rclcpp::Node>(node_options, PublisherType::PUBLISHER, fallback_name), started_(false) {
+
9 this->add_predicate("is_finished", false);
+
10}
+
11
+
12void Component::step() {
+
13 try {
+ +
15 this->publish_outputs();
+
16 this->publish_predicates();
+
17 } catch (const std::exception& ex) {
+
18 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to execute step function:" << ex.what());
+
19 this->raise_error();
+
20 }
+
21}
+
22
+ +
24 if (this->started_) {
+
25 RCLCPP_ERROR(this->get_logger(), "Failed to start execution thread: Thread has already been started.");
+
26 return;
+
27 }
+
28 this->started_ = true;
+
29 this->execute_thread_ = std::thread([this]() { this->on_execute(); });
+
30}
+
31
+
32void Component::on_execute() {
+
33 try {
+
34 if (!this->on_execute_callback()) {
+
35 this->raise_error();
+
36 return;
+
37 }
+
38 } catch (const std::exception& ex) {
+
39 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to run the execute function: " << ex.what());
+
40 this->raise_error();
+
41 return;
+
42 }
+
43 RCLCPP_DEBUG(this->get_logger(), "Execution finished, setting 'is_finished' predicate to true.");
+
44 this->set_predicate("is_finished", true);
+
45}
+
46
+ +
48 return true;
+
49}
+
50}// namespace modulo_components
+
virtual bool on_execute_callback()
Execute the component logic. To be redefined in derived classes.
Definition: Component.cpp:47
+
Component(const rclcpp::NodeOptions &node_options, const std::string &fallback_name="Component")
Constructor from node options.
Definition: Component.cpp:7
+
void execute()
Start the execution thread.
Definition: Component.cpp:23
+
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
+
virtual void raise_error()
Put the component in error state by setting the 'in_error_state' predicate to true.
+
void add_predicate(const std::string &predicate_name, bool predicate_value)
Add a predicate to the map of predicates.
+
void publish_outputs()
Helper function to publish all output signals.
+
void set_predicate(const std::string &predicate_name, bool predicate_value)
Set the value of the predicate given as parameter, if the predicate is not found does not do anything...
+
void publish_predicates()
Helper function to publish all predicates.
+
void evaluate_periodic_callbacks()
Helper function to evaluate all periodic function callbacks.
+
Modulo components.
Definition: Component.hpp:12
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
+ + + + diff --git a/versions/v3.0.0/_component_8hpp_source.html b/versions/v3.0.0/_component_8hpp_source.html new file mode 100644 index 00000000..5738587d --- /dev/null +++ b/versions/v3.0.0/_component_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/Component.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
Component.hpp
+
+
+
1#pragma once
+
2
+
3#include <thread>
+
4
+
5#include <rclcpp/node.hpp>
+
6
+
7#include "modulo_components/ComponentInterface.hpp"
+
8#include "modulo_components/utilities/utilities.hpp"
+
9#include "modulo_core/EncodedState.hpp"
+
10#include "modulo_core/exceptions/CoreException.hpp"
+
11
+ +
13
+
26class Component : public ComponentInterface<rclcpp::Node> {
+
27public:
+
28 friend class ComponentPublicInterface;
+
29
+
35 explicit Component(const rclcpp::NodeOptions& node_options, const std::string& fallback_name = "Component");
+
36
+
40 virtual ~Component() = default;
+
41
+
42protected:
+
46 void execute();
+
47
+
52 virtual bool on_execute_callback();
+
53
+
63 template<typename DataT>
+
64 void add_output(
+
65 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic = "",
+
66 bool fixed_topic = false, bool publish_on_step = true
+
67 );
+
68
+
69private:
+
73 void step() override;
+
74
+
79 void on_execute();
+
80
+
81 // TODO hide ROS methods
+
82 using ComponentInterface<rclcpp::Node>::create_output;
+
83 using ComponentInterface<rclcpp::Node>::inputs_;
+
84 using ComponentInterface<rclcpp::Node>::outputs_;
+
85 using ComponentInterface<rclcpp::Node>::qos_;
+ +
87 using ComponentInterface<rclcpp::Node>::publish_outputs;
+ +
89
+
90 std::thread execute_thread_;
+
91 bool started_;
+
92};
+
93
+
94template<typename DataT>
+ +
96 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
97 bool fixed_topic, bool publish_on_step
+
98) {
+
99 using namespace modulo_core::communication;
+
100 try {
+
101 auto parsed_signal_name = this->create_output(signal_name, data, default_topic, fixed_topic, publish_on_step);
+
102 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
+
103 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
104 "Adding output '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
+
105 auto message_pair = this->outputs_.at(parsed_signal_name)->get_message_pair();
+
106 switch (message_pair->get_type()) {
+
107 case MessageType::BOOL: {
+
108 auto publisher = this->create_publisher<std_msgs::msg::Bool>(topic_name, this->qos_);
+
109 this->outputs_.at(parsed_signal_name) =
+
110 std::make_shared<PublisherHandler<rclcpp::Publisher<std_msgs::msg::Bool>, std_msgs::msg::Bool>>(
+
111 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
112 break;
+
113 }
+
114 case MessageType::FLOAT64: {
+
115 auto publisher = this->create_publisher<std_msgs::msg::Float64>(topic_name, this->qos_);
+
116 this->outputs_.at(parsed_signal_name) =
+
117 std::make_shared<PublisherHandler<rclcpp::Publisher<std_msgs::msg::Float64>, std_msgs::msg::Float64>>(
+
118 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
119 break;
+
120 }
+
121 case MessageType::FLOAT64_MULTI_ARRAY: {
+
122 auto publisher = this->create_publisher<std_msgs::msg::Float64MultiArray>(topic_name, this->qos_);
+
123 this->outputs_.at(parsed_signal_name) = std::make_shared<
+ +
125 rclcpp::Publisher<std_msgs::msg::Float64MultiArray>, std_msgs::msg::Float64MultiArray>>(
+
126 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
127 break;
+
128 }
+
129 case MessageType::INT32: {
+
130 auto publisher = this->create_publisher<std_msgs::msg::Int32>(topic_name, this->qos_);
+
131 this->outputs_.at(parsed_signal_name) =
+
132 std::make_shared<PublisherHandler<rclcpp::Publisher<std_msgs::msg::Int32>, std_msgs::msg::Int32>>(
+
133 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
134 break;
+
135 }
+
136 case MessageType::STRING: {
+
137 auto publisher = this->create_publisher<std_msgs::msg::String>(topic_name, this->qos_);
+
138 this->outputs_.at(parsed_signal_name) =
+
139 std::make_shared<PublisherHandler<rclcpp::Publisher<std_msgs::msg::String>, std_msgs::msg::String>>(
+
140 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
141 break;
+
142 }
+
143 case MessageType::ENCODED_STATE: {
+
144 auto publisher = this->create_publisher<modulo_core::EncodedState>(topic_name, this->qos_);
+
145 this->outputs_.at(parsed_signal_name) =
+
146 std::make_shared<PublisherHandler<rclcpp::Publisher<modulo_core::EncodedState>, modulo_core::EncodedState>>(
+
147 PublisherType::PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
148 break;
+
149 }
+
150 }
+
151 } catch (const std::exception& ex) {
+
152 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add output '" << signal_name << "': " << ex.what());
+
153 }
+
154}
+
155}// namespace modulo_components
+
A wrapper for rclcpp::Node to simplify application composition through unified component interfaces.
Definition: Component.hpp:26
+
virtual ~Component()=default
Virtual default destructor.
+
virtual bool on_execute_callback()
Execute the component logic. To be redefined in derived classes.
Definition: Component.cpp:47
+
void add_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)
Add and configure an output signal of the component.
Definition: Component.hpp:95
+
void execute()
Start the execution thread.
Definition: Component.cpp:23
+
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
+
std::string create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of out...
+
void publish_outputs()
Helper function to publish all output signals.
+
void publish_predicates()
Helper function to publish all predicates.
+
rclcpp::QoS qos_
Quality of Service for ROS publishers and subscribers.
+
void evaluate_periodic_callbacks()
Helper function to evaluate all periodic function callbacks.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
Map of outputs.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
Map of inputs.
+
The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish da...
+
Modulo components.
Definition: Component.hpp:12
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
std_msgs::msg::UInt8MultiArray EncodedState
Define the EncodedState as UInt8MultiArray message type.
+
+ + + + diff --git a/versions/v3.0.0/_component_exception_8hpp_source.html b/versions/v3.0.0/_component_exception_8hpp_source.html new file mode 100644 index 00000000..03efff42 --- /dev/null +++ b/versions/v3.0.0/_component_exception_8hpp_source.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions/ComponentException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ComponentException.hpp
+
+
+
1#pragma once
+
2
+
3#include <stdexcept>
+
4#include <string>
+
5
+ +
11
+
17class ComponentException : public std::runtime_error {
+
18public:
+
19 explicit ComponentException(const std::string& msg) : ComponentException("ComponentException", msg) {};
+
20protected:
+
21 ComponentException(const std::string& prefix, const std::string& msg) : std::runtime_error(prefix + ": " + msg) {}
+
22};
+
23}// namespace modulo_components::exceptions
+
A base class for all component exceptions.
+
Modulo component exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_component_interface_8hpp_source.html b/versions/v3.0.0/_component_interface_8hpp_source.html new file mode 100644 index 00000000..5e268c59 --- /dev/null +++ b/versions/v3.0.0/_component_interface_8hpp_source.html @@ -0,0 +1,1165 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/ComponentInterface.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ComponentInterface.hpp
+
+
+
1#pragma once
+
2
+
3// TODO sort includes
+
4#include <rclcpp/parameter.hpp>
+
5#include <rclcpp/create_timer.hpp>
+
6#include <rclcpp/node.hpp>
+
7#include <rclcpp_lifecycle/lifecycle_node.hpp>
+
8
+
9#include <console_bridge/console.h>
+
10#include <tf2_msgs/msg/tf_message.hpp>
+
11#include <tf2_ros/transform_broadcaster.h>
+
12#include <tf2_ros/static_transform_broadcaster.h>
+
13#include <tf2_ros/buffer.h>
+
14#include <tf2_ros/transform_listener.h>
+
15
+
16#include <state_representation/parameters/ParameterMap.hpp>
+
17#include <state_representation/space/cartesian/CartesianPose.hpp>
+
18
+
19#include <modulo_core/communication/MessagePair.hpp>
+
20#include <modulo_core/communication/PublisherHandler.hpp>
+
21#include <modulo_core/communication/PublisherType.hpp>
+
22#include <modulo_core/communication/SubscriptionHandler.hpp>
+
23#include <modulo_core/exceptions/ParameterTranslationException.hpp>
+
24#include <modulo_core/translators/message_readers.hpp>
+
25#include <modulo_core/translators/message_writers.hpp>
+
26#include <modulo_core/translators/parameter_translators.hpp>
+
27
+
28#include <modulo_component_interfaces/srv/empty_trigger.hpp>
+
29#include <modulo_component_interfaces/srv/string_trigger.hpp>
+
30#include <modulo_component_interfaces/msg/predicate.hpp>
+
31
+
32#include "modulo_components/exceptions/AddServiceException.hpp"
+
33#include "modulo_components/exceptions/AddSignalException.hpp"
+
34#include "modulo_components/exceptions/ComponentParameterException.hpp"
+
35#include "modulo_components/exceptions/LookupTransformException.hpp"
+
36#include "modulo_components/utilities/utilities.hpp"
+
37#include "modulo_components/utilities/predicate_variant.hpp"
+
38
+
43namespace modulo_components {
+
44
+ +
52 bool success;
+
53 std::string message;
+
54};
+
55
+
61template<class NodeT>
+ +
63
+
72template<class NodeT>
+
73class ComponentInterface : public NodeT {
+
74public:
+
75 friend class ComponentInterfacePublicInterface<rclcpp::Node>;
+
76 friend class ComponentInterfacePublicInterface<rclcpp_lifecycle::LifecycleNode>;
+
77
+ +
85 const rclcpp::NodeOptions& node_options, modulo_core::communication::PublisherType publisher_type,
+
86 const std::string& fallback_name = "ComponentInterface"
+
87 );
+
88
+
92 virtual ~ComponentInterface() = default;
+
93
+
94 // TODO hide ROS methods
+
95
+
96protected:
+
100 virtual void step();
+
101
+ +
112 const std::shared_ptr<state_representation::ParameterInterface>& parameter, const std::string& description,
+
113 bool read_only = false
+
114 );
+
115
+
127 template<typename T>
+
128 void add_parameter(const std::string& name, const T& value, const std::string& description, bool read_only = false);
+
129
+
136 [[nodiscard]] std::shared_ptr<state_representation::ParameterInterface> get_parameter(const std::string& name) const;
+
137
+
145 template<typename T>
+
146 T get_parameter_value(const std::string& name) const;
+
147
+
156 template<typename T>
+
157 void set_parameter_value(const std::string& name, const T& value);
+
158
+
169 virtual bool
+
170 on_validate_parameter_callback(const std::shared_ptr<state_representation::ParameterInterface>& parameter);
+
171
+
177 void add_predicate(const std::string& predicate_name, bool predicate_value);
+
178
+
184 void add_predicate(const std::string& predicate_name, const std::function<bool(void)>& predicate_function);
+
185
+
192 [[nodiscard]] bool get_predicate(const std::string& predicate_name);
+
193
+
201 void set_predicate(const std::string& predicate_name, bool predicate_value);
+
202
+
210 void set_predicate(const std::string& predicate_name, const std::function<bool(void)>& predicate_function);
+
211
+
217 void add_trigger(const std::string& trigger_name);
+
218
+
223 void trigger(const std::string& trigger_name);
+
224
+
233 void declare_input(const std::string& signal_name, const std::string& default_topic = "", bool fixed_topic = false);
+
234
+
243 void declare_output(const std::string& signal_name, const std::string& default_topic = "", bool fixed_topic = false);
+
244
+
249 void remove_input(const std::string& signal_name);
+
250
+
255 void remove_output(const std::string& signal_name);
+
256
+
265 template<typename DataT>
+ +
267 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic = "",
+
268 bool fixed_topic = false
+
269 );
+
270
+
280 template<typename DataT>
+ +
282 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::function<void()>& callback,
+
283 const std::string& default_topic = "", bool fixed_topic = false
+
284 );
+
285
+
294 template<typename MsgT>
+ +
296 const std::string& signal_name, const std::function<void(const std::shared_ptr<MsgT>)>& callback,
+
297 const std::string& default_topic = "", bool fixed_topic = false
+
298 );
+
299
+
305 void add_service(const std::string& service_name, const std::function<ComponentServiceResponse(void)>& callback);
+
306
+ +
316 const std::string& service_name,
+
317 const std::function<ComponentServiceResponse(const std::string& string)>& callback
+
318 );
+
319
+
326 void add_periodic_callback(const std::string& name, const std::function<void(void)>& callback);
+
327
+ +
332
+ +
337
+ +
342
+
355 template<typename DataT>
+
356 std::string create_output(
+
357 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
358 bool fixed_topic, bool publish_on_step
+
359 );
+
360
+
365 [[nodiscard]] rclcpp::QoS get_qos() const;
+
366
+
371 void set_qos(const rclcpp::QoS& qos);
+
372
+
378 void publish_output(const std::string& signal_name);
+
379
+
384 void send_transform(const state_representation::CartesianPose& transform);
+
385
+
390 void send_transforms(const std::vector<state_representation::CartesianPose>& transforms);
+
391
+
396 void send_static_transform(const state_representation::CartesianPose& transform);
+
397
+
402 void send_static_transforms(const std::vector<state_representation::CartesianPose>& transforms);
+
403
+
414 [[nodiscard]] state_representation::CartesianPose lookup_transform(
+
415 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
416 const tf2::Duration& duration
+
417 );
+
418
+
429 [[nodiscard]] state_representation::CartesianPose lookup_transform(
+
430 const std::string& frame, const std::string& reference_frame = "world", double validity_period = -1.0,
+
431 const tf2::Duration& duration = tf2::Duration(std::chrono::microseconds(10)));
+
432
+
437 void publish_predicate(const std::string& name);
+
438
+ +
443
+ +
448
+ +
453
+
461 template<typename T>
+ +
463 const std::vector<state_representation::CartesianPose>& transforms, const std::shared_ptr<T>& tf_broadcaster,
+
464 bool is_static = false
+
465 );
+
466
+
470 virtual void raise_error();
+
471
+
472 std::map<std::string, std::shared_ptr<modulo_core::communication::SubscriptionInterface>> inputs_;
+
473 std::map<std::string, std::shared_ptr<modulo_core::communication::PublisherInterface>> outputs_;
+
474 std::map<std::string, bool> periodic_outputs_;
+
475
+
476 rclcpp::QoS qos_ = rclcpp::QoS(10);
+
477
+
478private:
+
484 rcl_interfaces::msg::SetParametersResult on_set_parameters_callback(const std::vector<rclcpp::Parameter>& parameters);
+
485
+
493 bool validate_parameter(const std::shared_ptr<state_representation::ParameterInterface>& parameter);
+
494
+
500 void add_variant_predicate(const std::string& name, const utilities::PredicateVariant& predicate);
+
501
+
507 void set_variant_predicate(const std::string& name, const utilities::PredicateVariant& predicate);
+
508
+
517 template<typename T>
+
518 bool remove_signal(
+
519 const std::string& signal_name, std::map<std::string, std::shared_ptr<T>>& signal_map, bool skip_check = false
+
520 );
+
521
+
531 void declare_signal(
+
532 const std::string& signal_name, const std::string& type, const std::string& default_topic, bool fixed_topic
+
533 );
+
534
+
542 std::string validate_service_name(const std::string& service_name);
+
543
+
554 [[nodiscard]] geometry_msgs::msg::TransformStamped lookup_ros_transform(
+
555 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
556 const tf2::Duration& duration
+
557 );
+
558
+ +
560 publisher_type_;
+
561
+
562 std::map<std::string, utilities::PredicateVariant> predicates_;
+
563 std::shared_ptr<rclcpp::Publisher<modulo_component_interfaces::msg::Predicate>>
+
564 predicate_publisher_;
+
565 std::map<std::string, bool> triggers_;
+
566
+
567 std::map<std::string, std::shared_ptr<rclcpp::Service<modulo_component_interfaces::srv::EmptyTrigger>>>
+
568 empty_services_;
+
569 std::map<std::string, std::shared_ptr<rclcpp::Service<modulo_component_interfaces::srv::StringTrigger>>>
+
570 string_services_;
+
571
+
572 std::map<std::string, std::function<void(void)>> periodic_callbacks_;
+
573
+
574 state_representation::ParameterMap parameter_map_;
+
575 std::shared_ptr<rclcpp::node_interfaces::OnSetParametersCallbackHandle>
+
576 parameter_cb_handle_;
+
577
+
578 std::shared_ptr<rclcpp::TimerBase> step_timer_;
+
579 std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
+
580 std::shared_ptr<tf2_ros::TransformListener> tf_listener_;
+
581 std::shared_ptr<tf2_ros::TransformBroadcaster> tf_broadcaster_;
+
582 std::shared_ptr<tf2_ros::StaticTransformBroadcaster> static_tf_broadcaster_;
+
583
+
584 bool set_parameter_callback_called_ = false;
+
585};
+
586
+
587template<class NodeT>
+
588ComponentInterface<NodeT>::ComponentInterface(
+
589 const rclcpp::NodeOptions& options, modulo_core::communication::PublisherType publisher_type,
+
590 const std::string& fallback_name
+
591) :
+
592 NodeT(utilities::parse_node_name(options, fallback_name), options), publisher_type_(publisher_type) {
+
593 // register the parameter change callback handler
+
594 parameter_cb_handle_ = NodeT::add_on_set_parameters_callback(
+
595 [this](const std::vector<rclcpp::Parameter>& parameters) -> rcl_interfaces::msg::SetParametersResult {
+
596 return this->on_set_parameters_callback(parameters);
+
597 });
+
598 this->add_parameter("period", 0.1, "The time interval in seconds for all periodic callbacks", true);
+
599
+
600 this->predicate_publisher_ =
+
601 rclcpp::create_publisher<modulo_component_interfaces::msg::Predicate>(*this, "/predicates", this->qos_);
+
602 this->add_predicate("in_error_state", false);
+
603
+
604 this->step_timer_ = this->create_wall_timer(
+
605 std::chrono::nanoseconds(static_cast<int64_t>(this->get_parameter_value<double>("period") * 1e9)),
+
606 [this] { this->step(); });
+
607}
+
608
+
609template<class NodeT>
+ +
611
+
612template<class NodeT>
+
613template<typename T>
+ +
615 const std::string& name, const T& value, const std::string& description, bool read_only
+
616) {
+
617 if (name.empty()) {
+
618 RCLCPP_ERROR(this->get_logger(), "Failed to add parameter: Provide a non empty string as a name.");
+
619 return;
+
620 }
+
621 this->add_parameter(state_representation::make_shared_parameter(name, value), description, read_only);
+
622}
+
623
+
624template<class NodeT>
+
625template<typename T>
+
626inline T ComponentInterface<NodeT>::get_parameter_value(const std::string& name) const {
+
627 try {
+
628 return this->parameter_map_.template get_parameter_value<T>(name);
+
629 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
+ +
631 "Failed to get parameter value of parameter '" + name + "': " + ex.what());
+
632 }
+
633}
+
634
+
635template<class NodeT>
+ +
637 const std::shared_ptr<state_representation::ParameterInterface>& parameter, const std::string& description,
+
638 bool read_only
+
639) {
+
640 this->set_parameter_callback_called_ = false;
+
641 rclcpp::Parameter ros_param;
+
642 try {
+
643 ros_param = modulo_core::translators::write_parameter(parameter);
+ +
645 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
+
646 }
+
647 if (!NodeT::has_parameter(parameter->get_name())) {
+
648 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding parameter '" << parameter->get_name() << "'.");
+
649 this->parameter_map_.set_parameter(parameter);
+
650 try {
+
651 rcl_interfaces::msg::ParameterDescriptor descriptor;
+
652 descriptor.description = description;
+
653 descriptor.read_only = read_only;
+
654 if (parameter->is_empty()) {
+
655 descriptor.dynamic_typing = true;
+
656 descriptor.type = modulo_core::translators::get_ros_parameter_type(parameter->get_parameter_type());
+
657 NodeT::declare_parameter(parameter->get_name(), rclcpp::ParameterValue{}, descriptor);
+
658 } else {
+
659 NodeT::declare_parameter(parameter->get_name(), ros_param.get_parameter_value(), descriptor);
+
660 }
+
661 if (!this->set_parameter_callback_called_) {
+
662 auto result = this->on_set_parameters_callback({NodeT::get_parameters({parameter->get_name()})});
+
663 if (!result.successful) {
+
664 NodeT::undeclare_parameter(parameter->get_name());
+
665 throw exceptions::ComponentParameterException(result.reason);
+
666 }
+
667 }
+
668 } catch (const std::exception& ex) {
+
669 this->parameter_map_.remove_parameter(parameter->get_name());
+
670 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
+
671 }
+
672 } else {
+
673 RCLCPP_DEBUG_STREAM(this->get_logger(), "Parameter '" << parameter->get_name() << "' already exists.");
+
674 }
+
675}
+
676
+
677template<class NodeT>
+
678inline std::shared_ptr<state_representation::ParameterInterface>
+
679ComponentInterface<NodeT>::get_parameter(const std::string& name) const {
+
680 try {
+
681 return this->parameter_map_.get_parameter(name);
+
682 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
+
683 throw exceptions::ComponentParameterException("Failed to get parameter '" + name + "': " + ex.what());
+
684 }
+
685}
+
686
+
687template<class NodeT>
+
688template<typename T>
+
689inline void ComponentInterface<NodeT>::set_parameter_value(const std::string& name, const T& value) {
+
690 try {
+
691 rcl_interfaces::msg::SetParametersResult result = NodeT::set_parameter(
+
692 modulo_core::translators::write_parameter(state_representation::make_shared_parameter(name, value)));
+
693 if (!result.successful) {
+
694 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
695 "Failed to set parameter value of parameter '" << name << "': " << result.reason);
+
696 }
+
697 } catch (const std::exception& ex) {
+
698 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
699 "Failed to set parameter value of parameter '" << name << "': " << ex.what());
+
700 }
+
701}
+
702
+
703template<class NodeT>
+ +
705 const std::shared_ptr<state_representation::ParameterInterface>& parameter
+
706) {
+
707 if (parameter->get_name() == "period") {
+
708 auto value = parameter->get_parameter_value<double>();
+
709 if (value <= 0.0 || !std::isfinite(value)) {
+
710 RCLCPP_ERROR(this->get_logger(), "Value for parameter 'period' has to be a positive finite number.");
+
711 return false;
+
712 }
+
713 }
+
714 return this->on_validate_parameter_callback(parameter);
+
715}
+
716
+
717template<class NodeT>
+ +
719 const std::shared_ptr<state_representation::ParameterInterface>&
+
720) {
+
721 return true;
+
722}
+
723
+
724template<class NodeT>
+
725inline rcl_interfaces::msg::SetParametersResult
+
726ComponentInterface<NodeT>::on_set_parameters_callback(const std::vector<rclcpp::Parameter>& parameters) {
+
727 rcl_interfaces::msg::SetParametersResult result;
+
728 result.successful = true;
+
729 for (const auto& ros_parameter : parameters) {
+
730 try {
+
731 if (ros_parameter.get_name().substr(0, 27) == "qos_overrides./tf.publisher") {
+
732 continue;
+
733 }
+
734 // get the associated parameter interface by name
+
735 auto parameter = parameter_map_.get_parameter(ros_parameter.get_name());
+
736
+
737 // convert the ROS parameter into a ParameterInterface without modifying the original
+
738 auto new_parameter = modulo_core::translators::read_parameter_const(ros_parameter, parameter);
+
739 if (!this->validate_parameter(new_parameter)) {
+
740 result.successful = false;
+
741 result.reason += "Validation of parameter '" + ros_parameter.get_name() + "' returned false!";
+
742 } else if (!new_parameter->is_empty()) {
+
743 // update the value of the parameter in the map
+
744 modulo_core::translators::copy_parameter_value(new_parameter, parameter);
+
745 }
+
746 } catch (const std::exception& ex) {
+
747 result.successful = false;
+
748 result.reason += ex.what();
+
749 }
+
750 }
+
751 this->set_parameter_callback_called_ = true;
+
752 return result;
+
753}
+
754
+
755template<class NodeT>
+
756inline void ComponentInterface<NodeT>::add_predicate(const std::string& name, bool predicate) {
+
757 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
+
758}
+
759
+
760template<class NodeT>
+ +
762 const std::string& name, const std::function<bool(void)>& predicate
+
763) {
+
764 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
+
765}
+
766
+
767template<class NodeT>
+ +
769 const std::string& name, const utilities::PredicateVariant& predicate
+
770) {
+
771 if (name.empty()) {
+
772 RCLCPP_ERROR(this->get_logger(), "Failed to add predicate: Provide a non empty string as a name.");
+
773 return;
+
774 }
+
775 if (this->predicates_.find(name) != this->predicates_.end()) {
+
776 RCLCPP_WARN_STREAM(this->get_logger(), "Predicate with name '" << name << "' already exists, overwriting.");
+
777 } else {
+
778 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding predicate '" << name << "'.");
+
779 }
+
780 this->predicates_.insert_or_assign(name, predicate);
+
781}
+
782
+
783template<class NodeT>
+
784inline bool ComponentInterface<NodeT>::get_predicate(const std::string& predicate_name) {
+
785 auto predicate_iterator = this->predicates_.find(predicate_name);
+
786 // if there is no predicate with that name simply return false with an error message
+
787 if (predicate_iterator == this->predicates_.end()) {
+
788 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
789 "Failed to get predicate '" << predicate_name
+
790 << "': Predicate does not exists, returning false.");
+
791 return false;
+
792 }
+
793 // try to get the value from the variant as a bool
+
794 auto* ptr_value = std::get_if<bool>(&predicate_iterator->second);
+
795 if (ptr_value) {
+
796 return *ptr_value;
+
797 }
+
798 // if previous check failed, it means the variant is actually a callback function
+
799 auto callback_function = std::get<std::function<bool(void)>>(predicate_iterator->second);
+
800 bool value = false;
+
801 try {
+
802 value = (callback_function)();
+
803 } catch (const std::exception& ex) {
+
804 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
805 "Failed to evaluate callback of predicate '" << predicate_name
+
806 << "', returning false: " << ex.what());
+
807 }
+
808 return value;
+
809}
+
810
+
811template<class NodeT>
+
812inline void ComponentInterface<NodeT>::add_trigger(const std::string& trigger_name) {
+
813 if (trigger_name.empty()) {
+
814 RCLCPP_ERROR(this->get_logger(), "Failed to add trigger: Provide a non empty string as a name.");
+
815 return;
+
816 }
+
817 if (this->triggers_.find(trigger_name) != this->triggers_.end()
+
818 || this->predicates_.find(trigger_name) != this->predicates_.end()) {
+
819 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add trigger: there is already a trigger or "
+
820 "predicate with name '" << trigger_name << "'.");
+
821 return;
+
822 }
+
823 this->triggers_.insert_or_assign(trigger_name, false);
+
824 this->add_predicate(
+
825 trigger_name, [this, trigger_name] {
+
826 auto value = this->triggers_.at(trigger_name);
+
827 this->triggers_.at(trigger_name) = false;
+
828 return value;
+
829 });
+
830}
+
831
+
832template<class NodeT>
+
833inline void ComponentInterface<NodeT>::trigger(const std::string& trigger_name) {
+
834 if (this->triggers_.find(trigger_name) == this->triggers_.end()) {
+
835 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to trigger: could not find trigger"
+
836 " with name '" << trigger_name << "'.");
+
837 return;
+
838 }
+
839 this->triggers_.at(trigger_name) = true;
+
840 publish_predicate(trigger_name);
+
841}
+
842
+
843template<class NodeT>
+ +
845 const std::string& name, const utilities::PredicateVariant& predicate
+
846) {
+
847 auto predicate_iterator = this->predicates_.find(name);
+
848 if (predicate_iterator == this->predicates_.end()) {
+
849 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
850 "Failed to set predicate '" << name << "': Predicate does not exist.");
+
851 return;
+
852 }
+
853 predicate_iterator->second = predicate;
+
854 this->publish_predicate(name);
+
855}
+
856
+
857template<class NodeT>
+
858inline void ComponentInterface<NodeT>::set_predicate(const std::string& name, bool predicate) {
+
859 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
+
860}
+
861
+
862template<class NodeT>
+ +
864 const std::string& name, const std::function<bool(void)>& predicate
+
865) {
+
866 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
+
867}
+
868
+
869template<class NodeT>
+
870template<typename T>
+ +
872 const std::string& signal_name, std::map<std::string, std::shared_ptr<T>>& signal_map, bool skip_check
+
873) {
+
874 if (!skip_check && signal_map.find(signal_name) == signal_map.cend()) {
+
875 return false;
+
876 } else {
+
877 RCLCPP_DEBUG_STREAM(this->get_logger(), "Removing signal '" << signal_name << "'.");
+
878 signal_map.at(signal_name).reset();
+
879 return signal_map.erase(signal_name);
+
880 }
+
881}
+
882
+
883template<class NodeT>
+
884inline void ComponentInterface<NodeT>::remove_input(const std::string& signal_name) {
+
885 if (!this->template remove_signal(signal_name, this->inputs_)) {
+
886 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
887 if (!this->template remove_signal(parsed_signal_name, this->inputs_)) {
+
888 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
889 "Unknown input '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
+
890 }
+
891 }
+
892}
+
893
+
894template<class NodeT>
+
895inline void ComponentInterface<NodeT>::remove_output(const std::string& signal_name) {
+
896 if (!this->template remove_signal(signal_name, this->outputs_)) {
+
897 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
898 if (!this->template remove_signal(parsed_signal_name, this->outputs_)) {
+
899 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
900 "Unknown output '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
+
901 }
+
902 }
+
903}
+
904
+
905template<class NodeT>
+ +
907 const std::string& signal_name, const std::string& type, const std::string& default_topic, bool fixed_topic
+
908) {
+
909 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
910 if (parsed_signal_name.empty()) {
+ +
912 "The parsed signal name for " + type + " '" + signal_name
+
913 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
+
914 }
+
915 if (this->inputs_.find(parsed_signal_name) != this->inputs_.cend()) {
+
916 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as input.");
+
917 }
+
918 if (this->outputs_.find(parsed_signal_name) != this->outputs_.cend()) {
+
919 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as output.");
+
920 }
+
921 std::string topic_name = default_topic.empty() ? "~/" + parsed_signal_name : default_topic;
+
922 auto parameter_name = parsed_signal_name + "_topic";
+
923 if (NodeT::has_parameter(parameter_name) && this->get_parameter(parameter_name)->is_empty()) {
+
924 this->set_parameter_value<std::string>(parameter_name, topic_name);
+
925 } else {
+
926 this->add_parameter(
+
927 parameter_name, topic_name, "Signal topic name of " + type + " '" + parsed_signal_name + "'", fixed_topic);
+
928 }
+
929 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
930 "Declared signal '" << parsed_signal_name << "' and parameter '" << parameter_name
+
931 << "' with value '" << topic_name << "'.");
+
932}
+
933
+
934template<class NodeT>
+ +
936 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
+
937) {
+
938 this->declare_signal(signal_name, "input", default_topic, fixed_topic);
+
939}
+
940
+
941template<class NodeT>
+ +
943 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
+
944) {
+
945 this->declare_signal(signal_name, "output", default_topic, fixed_topic);
+
946}
+
947
+
948template<class NodeT>
+
949template<typename DataT>
+ +
951 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
952 bool fixed_topic
+
953) {
+
954 this->add_input(signal_name, data, [] {}, default_topic, fixed_topic);
+
955}
+
956
+
957template<class NodeT>
+
958template<typename DataT>
+ +
960 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::function<void()>& user_callback,
+
961 const std::string& default_topic, bool fixed_topic
+
962) {
+
963 using namespace modulo_core::communication;
+
964 try {
+
965 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
966 if (data == nullptr) {
+ +
968 "Invalid data pointer for input '" + parsed_signal_name + "'.");
+
969 }
+
970 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
+
971 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
+
972 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
973 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
+
974 auto message_pair = make_shared_message_pair(data, this->get_clock());
+
975 std::shared_ptr<SubscriptionInterface> subscription_interface;
+
976 switch (message_pair->get_type()) {
+
977 case MessageType::BOOL: {
+
978 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Bool>>(message_pair);
+
979 auto subscription = NodeT::template create_subscription<std_msgs::msg::Bool>(
+
980 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
981 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
982 break;
+
983 }
+
984 case MessageType::FLOAT64: {
+
985 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Float64>>(message_pair);
+
986 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64>(
+
987 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
988 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
989 break;
+
990 }
+
991 case MessageType::FLOAT64_MULTI_ARRAY: {
+
992 auto subscription_handler =
+
993 std::make_shared<SubscriptionHandler<std_msgs::msg::Float64MultiArray>>(message_pair);
+
994 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64MultiArray>(
+
995 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
996 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
997 break;
+
998 }
+
999 case MessageType::INT32: {
+
1000 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Int32>>(message_pair);
+
1001 auto subscription = NodeT::template create_subscription<std_msgs::msg::Int32>(
+
1002 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1003 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1004 break;
+
1005 }
+
1006 case MessageType::STRING: {
+
1007 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::String>>(message_pair);
+
1008 auto subscription = NodeT::template create_subscription<std_msgs::msg::String>(
+
1009 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1010 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1011 break;
+
1012 }
+
1013 case MessageType::ENCODED_STATE: {
+
1014 auto subscription_handler = std::make_shared<SubscriptionHandler<modulo_core::EncodedState>>(message_pair);
+
1015 auto subscription = NodeT::template create_subscription<modulo_core::EncodedState>(
+
1016 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1017 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1018 break;
+
1019 }
+
1020 }
+
1021 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
+
1022 } catch (const std::exception& ex) {
+
1023 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
+
1024 }
+
1025}
+
1026
+
1027template<class NodeT>
+
1028template<typename MsgT>
+ +
1030 const std::string& signal_name, const std::function<void(const std::shared_ptr<MsgT>)>& callback,
+
1031 const std::string& default_topic, bool fixed_topic
+
1032) {
+
1033 using namespace modulo_core::communication;
+
1034 try {
+
1035 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1036 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
+
1037 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
+
1038 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
1039 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
+
1040 auto subscription = NodeT::template create_subscription<MsgT>(topic_name, this->qos_, callback);
+
1041 auto subscription_interface =
+
1042 std::make_shared<SubscriptionHandler<MsgT>>()->create_subscription_interface(subscription);
+
1043 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
+
1044 } catch (const std::exception& ex) {
+
1045 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
+
1046 }
+
1047}
+
1048
+
1049template<class NodeT>
+
1050inline std::string ComponentInterface<NodeT>::validate_service_name(const std::string& service_name) {
+
1051 std::string parsed_service_name = utilities::parse_topic_name(service_name);
+
1052 if (parsed_service_name.empty()) {
+ +
1054 "The parsed service name for service '" + service_name
+
1055 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
+
1056 }
+
1057 if (this->empty_services_.find(parsed_service_name) != this->empty_services_.cend()
+
1058 || this->string_services_.find(parsed_service_name) != this->string_services_.cend()) {
+
1059 throw exceptions::AddServiceException("Service with name '" + parsed_service_name + "' already exists.");
+
1060 }
+
1061 return parsed_service_name;
+
1062}
+
1063
+
1064template<class NodeT>
+ +
1066 const std::string& service_name, const std::function<ComponentServiceResponse(void)>& callback
+
1067) {
+
1068 try {
+
1069 std::string parsed_service_name = this->validate_service_name(service_name);
+
1070 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding empty service '" << parsed_service_name << "'.");
+
1071 auto service = NodeT::template create_service<modulo_component_interfaces::srv::EmptyTrigger>(
+
1072 "~/" + parsed_service_name, [callback](
+
1073 const std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Request>,
+
1074 std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Response> response
+
1075 ) {
+
1076 try {
+
1077 auto callback_response = callback();
+
1078 response->success = callback_response.success;
+
1079 response->message = callback_response.message;
+
1080 } catch (const std::exception& ex) {
+
1081 response->success = false;
+
1082 response->message = ex.what();
+
1083 }
+
1084 });
+
1085 this->empty_services_.insert_or_assign(parsed_service_name, service);
+
1086 } catch (const std::exception& ex) {
+
1087 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
+
1088 }
+
1089}
+
1090
+
1091template<class NodeT>
+ +
1093 const std::string& service_name, const std::function<ComponentServiceResponse(const std::string& string)>& callback
+
1094) {
+
1095 try {
+
1096 std::string parsed_service_name = this->validate_service_name(service_name);
+
1097 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding string service '" << parsed_service_name << "'.");
+
1098 auto service = NodeT::template create_service<modulo_component_interfaces::srv::StringTrigger>(
+
1099 "~/" + parsed_service_name, [callback](
+
1100 const std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Request> request,
+
1101 std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Response> response
+
1102 ) {
+
1103 try {
+
1104 auto callback_response = callback(request->payload);
+
1105 response->success = callback_response.success;
+
1106 response->message = callback_response.message;
+
1107 } catch (const std::exception& ex) {
+
1108 response->success = false;
+
1109 response->message = ex.what();
+
1110 }
+
1111 });
+
1112 this->string_services_.insert_or_assign(parsed_service_name, service);
+
1113 } catch (const std::exception& ex) {
+
1114 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
+
1115 }
+
1116}
+
1117
+
1118template<class NodeT>
+
1119inline void
+
1120ComponentInterface<NodeT>::add_periodic_callback(const std::string& name, const std::function<void()>& callback) {
+
1121 if (name.empty()) {
+
1122 RCLCPP_ERROR(this->get_logger(), "Failed to add periodic function: Provide a non empty string as a name.");
+
1123 return;
+
1124 }
+
1125 if (this->periodic_callbacks_.find(name) != this->periodic_callbacks_.end()) {
+
1126 RCLCPP_WARN_STREAM(this->get_logger(), "Periodic function '" << name << "' already exists, overwriting.");
+
1127 } else {
+
1128 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding periodic function '" << name << "'.");
+
1129 }
+
1130 this->periodic_callbacks_.template insert_or_assign(name, callback);
+
1131}
+
1132
+
1133template<class NodeT>
+ +
1135 if (this->tf_broadcaster_ == nullptr) {
+
1136 RCLCPP_DEBUG(this->get_logger(), "Adding TF broadcaster.");
+
1137 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1138 this->tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(*this);
+
1139 } else {
+
1140 RCLCPP_DEBUG(this->get_logger(), "TF broadcaster already exists.");
+
1141 }
+
1142}
+
1143
+
1144template<class NodeT>
+ +
1146 if (this->static_tf_broadcaster_ == nullptr) {
+
1147 RCLCPP_DEBUG(this->get_logger(), "Adding static TF broadcaster.");
+
1148 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1149 tf2_ros::StaticBroadcasterQoS qos;
+
1150 rclcpp::PublisherOptionsWithAllocator<std::allocator<void>> options;
+
1151 this->static_tf_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(*this, qos, options);
+
1152 } else {
+
1153 RCLCPP_DEBUG(this->get_logger(), "Static TF broadcaster already exists.");
+
1154 }
+
1155}
+
1156
+
1157template<class NodeT>
+ +
1159 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
+
1160 RCLCPP_DEBUG(this->get_logger(), "Adding TF buffer and listener.");
+
1161 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1162 this->tf_buffer_ = std::make_shared<tf2_ros::Buffer>(this->get_clock());
+
1163 this->tf_listener_ = std::make_shared<tf2_ros::TransformListener>(*this->tf_buffer_);
+
1164 } else {
+
1165 RCLCPP_DEBUG(this->get_logger(), "TF buffer and listener already exist.");
+
1166 }
+
1167}
+
1168
+
1169template<class NodeT>
+
1170inline void ComponentInterface<NodeT>::send_transform(const state_representation::CartesianPose& transform) {
+
1171 this->send_transforms(std::vector<state_representation::CartesianPose>{transform});
+
1172}
+
1173
+
1174template<class NodeT>
+
1175inline void
+
1176ComponentInterface<NodeT>::send_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
+
1177 this->template publish_transforms(transforms, this->tf_broadcaster_);
+
1178}
+
1179
+
1180template<class NodeT>
+
1181inline void ComponentInterface<NodeT>::send_static_transform(const state_representation::CartesianPose& transform) {
+
1182 this->send_static_transforms(std::vector<state_representation::CartesianPose>{transform});
+
1183}
+
1184
+
1185template<class NodeT>
+
1186inline void
+
1187ComponentInterface<NodeT>::send_static_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
+
1188 this->template publish_transforms(transforms, this->static_tf_broadcaster_, true);
+
1189}
+
1190
+
1191template<class NodeT>
+
1192template<typename T>
+ +
1194 const std::vector<state_representation::CartesianPose>& transforms, const std::shared_ptr<T>& tf_broadcaster,
+
1195 bool is_static
+
1196) {
+
1197 std::string modifier = is_static ? "static " : "";
+
1198 if (tf_broadcaster == nullptr) {
+
1199 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1200 "Failed to send " << modifier << "transform: No " << modifier
+
1201 << "TF broadcaster configured.");
+
1202 return;
+
1203 }
+
1204 try {
+
1205 std::vector<geometry_msgs::msg::TransformStamped> transform_messages;
+
1206 transform_messages.reserve(transforms.size());
+
1207 for (const auto& tf : transforms) {
+
1208 geometry_msgs::msg::TransformStamped transform_message;
+
1209 modulo_core::translators::write_message(transform_message, tf, this->get_clock()->now());
+
1210 transform_messages.emplace_back(transform_message);
+
1211 }
+
1212 tf_broadcaster->sendTransform(transform_messages);
+
1213 } catch (const std::exception& ex) {
+
1214 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1215 "Failed to send " << modifier << "transform: " << ex.what());
+
1216 }
+
1217}
+
1218
+
1219template<class NodeT>
+
1220inline geometry_msgs::msg::TransformStamped ComponentInterface<NodeT>::lookup_ros_transform(
+
1221 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
1222 const tf2::Duration& duration
+
1223) {
+
1224 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
+
1225 throw exceptions::LookupTransformException("Failed to lookup transform: To TF buffer / listener configured.");
+
1226 }
+
1227 try {
+
1228 return this->tf_buffer_->lookupTransform(reference_frame, frame, time_point, duration);;
+
1229 } catch (const tf2::TransformException& ex) {
+
1230 throw exceptions::LookupTransformException(std::string("Failed to lookup transform: ").append(ex.what()));
+
1231 }
+
1232}
+
1233
+
1234template<class NodeT>
+
1235inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
+
1236 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
1237 const tf2::Duration& duration
+
1238) {
+
1239 auto transform = this->lookup_ros_transform(frame, reference_frame, time_point, duration);
+
1240 state_representation::CartesianPose result(frame, reference_frame);
+
1241 modulo_core::translators::read_message(result, transform);
+
1242 return result;
+
1243}
+
1244
+
1245template<class NodeT>
+
1246inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
+
1247 const std::string& frame, const std::string& reference_frame, double validity_period, const tf2::Duration& duration
+
1248) {
+
1249 auto transform =
+
1250 this->lookup_ros_transform(frame, reference_frame, tf2::TimePoint(std::chrono::microseconds(0)), duration);
+
1251 if (validity_period > 0.0 && (this->get_clock()->now() - transform.header.stamp).seconds() > validity_period) {
+
1252 throw exceptions::LookupTransformException("Failed to lookup transform: Latest transform is too old!");
+
1253 }
+
1254 state_representation::CartesianPose result(frame, reference_frame);
+
1255 modulo_core::translators::read_message(result, transform);
+
1256 return result;
+
1257}
+
1258
+
1259template<class NodeT>
+
1260inline void ComponentInterface<NodeT>::publish_predicate(const std::string& name) {
+
1261 modulo_component_interfaces::msg::Predicate message;
+
1262 message.component = this->get_node_base_interface()->get_fully_qualified_name();
+
1263 message.predicate = name;
+
1264 message.value = this->get_predicate(name);
+
1265 this->predicate_publisher_->publish(message);
+
1266}
+
1267
+
1268template<class NodeT>
+ +
1270 for (const auto& predicate : this->predicates_) {
+
1271 this->publish_predicate(predicate.first);
+
1272 }
+
1273}
+
1274
+
1275template<class NodeT>
+
1276inline void ComponentInterface<NodeT>::publish_output(const std::string& signal_name) {
+
1277 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1278 if (this->outputs_.find(parsed_signal_name) == this->outputs_.cend()) {
+
1279 throw exceptions::ComponentException("Output with name '" + signal_name + "' doesn't exist.");
+
1280 }
+
1281 if (this->periodic_outputs_.at(parsed_signal_name)) {
+
1282 throw exceptions::ComponentException("An output that is published periodically cannot be triggered manually.");
+
1283 }
+
1284 try {
+
1285 this->outputs_.at(parsed_signal_name)->publish();
+
1286 } catch (const modulo_core::exceptions::CoreException& ex) {
+
1287 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1288 "Failed to publish output '" << parsed_signal_name << "': " << ex.what());
+
1289 }
+
1290}
+
1291
+
1292template<class NodeT>
+ +
1294 for (const auto& [signal, publisher] : this->outputs_) {
+
1295 try {
+
1296 if (this->periodic_outputs_.at(signal)) {
+
1297 publisher->publish();
+
1298 }
+
1299 } catch (const modulo_core::exceptions::CoreException& ex) {
+
1300 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1301 "Failed to publish output '" << signal << "': " << ex.what());
+
1302 }
+
1303 }
+
1304}
+
1305
+
1306template<class NodeT>
+ +
1308 for (const auto& [name, callback] : this->periodic_callbacks_) {
+
1309 try {
+
1310 callback();
+
1311 } catch (const std::exception& ex) {
+
1312 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1313 "Failed to evaluate periodic function callback '" << name << "': " << ex.what());
+
1314 }
+
1315 }
+
1316}
+
1317
+
1318template<class NodeT>
+
1319template<typename DataT>
+ +
1321 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
1322 bool fixed_topic, bool publish_on_step
+
1323) {
+
1324 using namespace modulo_core::communication;
+
1325 try {
+
1326 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1327 if (data == nullptr) {
+ +
1329 "Invalid data pointer for output '" + parsed_signal_name + "'.");
+
1330 }
+
1331 this->declare_output(parsed_signal_name, default_topic, fixed_topic);
+
1332 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
1333 "Creating output '" << parsed_signal_name << "' (provided signal name was '" << signal_name
+
1334 << "').");
+
1335 auto message_pair = make_shared_message_pair(data, this->get_clock());
+
1336 this->outputs_.insert_or_assign(
+
1337 parsed_signal_name, std::make_shared<PublisherInterface>(this->publisher_type_, message_pair));
+
1338 this->periodic_outputs_.insert_or_assign(parsed_signal_name, publish_on_step);
+
1339 return parsed_signal_name;
+
1340 } catch (const exceptions::AddSignalException&) {
+
1341 throw;
+
1342 } catch (const std::exception& ex) {
+
1343 throw exceptions::AddSignalException(ex.what());
+
1344 }
+
1345}
+
1346
+
1347template<class NodeT>
+ +
1349 RCLCPP_DEBUG(this->get_logger(), "raise_error called: Setting predicate 'in_error_state' to true.");
+
1350 this->set_predicate("in_error_state", true);
+
1351}
+
1352
+
1353template<class NodeT>
+
1354inline rclcpp::QoS ComponentInterface<NodeT>::get_qos() const {
+
1355 return this->qos_;
+
1356}
+
1357
+
1358template<class NodeT>
+
1359inline void ComponentInterface<NodeT>::set_qos(const rclcpp::QoS& qos) {
+
1360 this->qos_ = qos;
+
1361}
+
1362}// namespace modulo_components
+
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
+
void add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)
Add a parameter.
+
std::string create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of out...
+
T get_parameter_value(const std::string &name) const
Get a parameter value by name.
+
virtual void raise_error()
Put the component in error state by setting the 'in_error_state' predicate to true.
+
void add_predicate(const std::string &predicate_name, bool predicate_value)
Add a predicate to the map of predicates.
+
virtual void step()
Step function that is called periodically.
+
void add_periodic_callback(const std::string &name, const std::function< void(void)> &callback)
Add a periodic callback function.
+
void send_static_transforms(const std::vector< state_representation::CartesianPose > &transforms)
Send a vector of static transforms to TF.
+
void publish_outputs()
Helper function to publish all output signals.
+
void remove_output(const std::string &signal_name)
Remove an output from the map of outputs.
+
void add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)
Add a service to trigger a callback function with no input arguments.
+
void set_predicate(const std::string &predicate_name, bool predicate_value)
Set the value of the predicate given as parameter, if the predicate is not found does not do anything...
+
void publish_predicates()
Helper function to publish all predicates.
+
void add_trigger(const std::string &trigger_name)
Add a trigger to the component. Triggers are predicates that are always false except when it's trigge...
+
void trigger(const std::string &trigger_name)
Latch the trigger with the provided name.
+
void declare_input(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
Declare an input to create the topic parameter without adding it to the map of inputs yet.
+
bool get_predicate(const std::string &predicate_name)
Get the logical value of a predicate.
+
rclcpp::QoS qos_
Quality of Service for ROS publishers and subscribers.
+
void publish_output(const std::string &signal_name)
Trigger the publishing of an output.
+
void evaluate_periodic_callbacks()
Helper function to evaluate all periodic function callbacks.
+
void add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)
Add and configure an input signal of the component.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
Map of outputs.
+
rclcpp::QoS get_qos() const
Getter of the Quality of Service attribute.
+
void send_transform(const state_representation::CartesianPose &transform)
Send a transform to TF.
+
void remove_input(const std::string &signal_name)
Remove an input from the map of inputs.
+
void add_tf_broadcaster()
Configure a transform broadcaster.
+
void send_transforms(const std::vector< state_representation::CartesianPose > &transforms)
Send a vector of transforms to TF.
+
void add_static_tf_broadcaster()
Configure a static transform broadcaster.
+
void send_static_transform(const state_representation::CartesianPose &transform)
Send a static transform to TF.
+
void add_tf_listener()
Configure a transform buffer and listener.
+
std::shared_ptr< state_representation::ParameterInterface > get_parameter(const std::string &name) const
Get a parameter by name.
+
std::map< std::string, bool > periodic_outputs_
Map of outputs with periodic publishing flag.
+
void set_parameter_value(const std::string &name, const T &value)
Set the value of a parameter.
+
void declare_output(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
Declare an output to create the topic parameter without adding it to the map of outputs yet.
+
void publish_transforms(const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)
Helper function to send a vector of transforms through a transform broadcaster.
+
void set_qos(const rclcpp::QoS &qos)
Set the Quality of Service for ROS publishers and subscribers.
+
virtual bool on_validate_parameter_callback(const std::shared_ptr< state_representation::ParameterInterface > &parameter)
Parameter validation function to be redefined by derived Component classes.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
Map of inputs.
+
void publish_predicate(const std::string &name)
Helper function to publish a predicate.
+
state_representation::CartesianPose lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)
Look up a transform from TF.
+
Friend class to the ComponentInterface to allow test fixtures to access protected and private members...
+
An exception class to notify errors when adding a service.
+
An exception class to notify errors when adding a signal.
+
A base class for all component exceptions.
+
An exception class to notify errors with component parameters.
+
An exception class to notify an error while looking up TF transforms.
+
A base class for all core exceptions.
+
An exception class to notify that a certain pointer is null.
+
An exception class to notify incompatibility when translating parameters from different sources.
+
Modulo components.
Definition: Component.hpp:12
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
void write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
Convert a CartesianState to a ROS geometry_msgs::msg::Accel.
+
rclcpp::Parameter write_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter)
Write a ROS Parameter from a ParameterInterface pointer.
+
rclcpp::ParameterType get_ros_parameter_type(const state_representation::ParameterType &parameter_type)
Given a state representation parameter type, get the corresponding ROS parameter type.
+
void copy_parameter_value(const std::shared_ptr< const state_representation::ParameterInterface > &source_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)
Copy the value of one parameter interface into another.
+
void read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)
Convert a ROS geometry_msgs::msg::Accel to a CartesianState.
+
std::shared_ptr< state_representation::ParameterInterface > read_parameter_const(const rclcpp::Parameter &ros_parameter, const std::shared_ptr< const state_representation::ParameterInterface > &parameter)
Update the parameter value of a ParameterInterface from a ROS Parameter object only if the two parame...
+
Response structure to be returned by component services.
+
+ + + + diff --git a/versions/v3.0.0/_component_parameter_exception_8hpp_source.html b/versions/v3.0.0/_component_parameter_exception_8hpp_source.html new file mode 100644 index 00000000..d5f7d7e2 --- /dev/null +++ b/versions/v3.0.0/_component_parameter_exception_8hpp_source.html @@ -0,0 +1,100 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions/ComponentParameterException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ComponentParameterException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_components/exceptions/ComponentException.hpp"
+
4
+ +
6
+ +
14public:
+
15 explicit ComponentParameterException(const std::string& msg) :
+
16 ComponentException("ComponentParameterException", msg) {}
+
17};
+
18}// namespace modulo_components::exceptions
+
A base class for all component exceptions.
+
An exception class to notify errors with component parameters.
+
Modulo component exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_core_exception_8hpp_source.html b/versions/v3.0.0/_core_exception_8hpp_source.html new file mode 100644 index 00000000..4b9bdd24 --- /dev/null +++ b/versions/v3.0.0/_core_exception_8hpp_source.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/CoreException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CoreException.hpp
+
+
+
1#pragma once
+
2
+
3#include <stdexcept>
+
4#include <string>
+
5
+ +
11
+
17class CoreException : public std::runtime_error {
+
18public:
+
19 explicit CoreException(const std::string& msg) : CoreException("CoreException", msg) {};
+
20protected:
+
21 CoreException(const std::string& prefix, const std::string& msg) : std::runtime_error(prefix + ": " + msg) {}
+
22};
+
23}// namespace modulo_core::exceptions
+
A base class for all core exceptions.
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_encoded_state_8hpp_source.html b/versions/v3.0.0/_encoded_state_8hpp_source.html new file mode 100644 index 00000000..2d2b2c8a --- /dev/null +++ b/versions/v3.0.0/_encoded_state_8hpp_source.html @@ -0,0 +1,96 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/EncodedState.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
EncodedState.hpp
+
+
+
1#pragma once
+
2
+
3#include <std_msgs/msg/u_int8_multi_array.hpp>
+
4
+
9namespace modulo_core {
+
10
+
15typedef std_msgs::msg::UInt8MultiArray EncodedState;
+
16
+
17}// namespace modulo_core
+
Modulo Core.
Definition: MessagePair.hpp:10
+
std_msgs::msg::UInt8MultiArray EncodedState
Define the EncodedState as UInt8MultiArray message type.
+
+ + + + diff --git a/versions/v3.0.0/_invalid_pointer_cast_exception_8hpp_source.html b/versions/v3.0.0/_invalid_pointer_cast_exception_8hpp_source.html new file mode 100644 index 00000000..e767da11 --- /dev/null +++ b/versions/v3.0.0/_invalid_pointer_cast_exception_8hpp_source.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/InvalidPointerCastException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
InvalidPointerCastException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+ +
6
+ +
13public:
+
14 explicit InvalidPointerCastException(const std::string& msg) : CoreException("InvalidPointerCastException", msg) {}
+
15};
+
16}// namespace modulo_core::exceptions
+
17
+
18
+
A base class for all core exceptions.
+
An exception class to notify if the result of getting an instance of a derived class through dynamic ...
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_invalid_pointer_exception_8hpp_source.html b/versions/v3.0.0/_invalid_pointer_exception_8hpp_source.html new file mode 100644 index 00000000..8d4306bc --- /dev/null +++ b/versions/v3.0.0/_invalid_pointer_exception_8hpp_source.html @@ -0,0 +1,100 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/InvalidPointerException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
InvalidPointerException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+ +
6
+ +
13public:
+
14 explicit InvalidPointerException(const std::string& msg) : CoreException("InvalidPointerException", msg) {}
+
15};
+
16}// namespace modulo_core::exceptions
+
17
+
A base class for all core exceptions.
+
An exception class to notify if an object has no reference count (if the object is not owned by any p...
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_lifecycle_component_8cpp_source.html b/versions/v3.0.0/_lifecycle_component_8cpp_source.html new file mode 100644 index 00000000..7738ce58 --- /dev/null +++ b/versions/v3.0.0/_lifecycle_component_8cpp_source.html @@ -0,0 +1,433 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/src/LifecycleComponent.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LifecycleComponent.cpp
+
+
+
1#include "modulo_components/LifecycleComponent.hpp"
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+
5using namespace modulo_core::communication;
+
6
+
7namespace modulo_components {
+
8
+
9LifecycleComponent::LifecycleComponent(const rclcpp::NodeOptions& node_options, const std::string& fallback_name) :
+
10 ComponentInterface<rclcpp_lifecycle::LifecycleNode>(
+
11 node_options, PublisherType::LIFECYCLE_PUBLISHER, fallback_name) {
+
12 this->add_predicate(
+
13 "is_unconfigured", [this] {
+
14 return this->get_current_state().id() == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED;
+
15 });
+
16 this->add_predicate(
+
17 "is_inactive", [this] {
+
18 return this->get_current_state().id() == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE;
+
19 });
+
20 this->add_predicate(
+
21 "is_active", [this] {
+
22 return this->get_current_state().id() == lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE;
+
23 });
+
24 this->add_predicate(
+
25 "is_finalized", [this] {
+
26 return this->get_current_state().id() == lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED;
+
27 });
+
28}
+
29
+
30void LifecycleComponent::step() {
+
31 try {
+
32 if (this->get_predicate("is_active")) {
+ +
34 this->on_step_callback();
+
35 this->publish_outputs();
+
36 }
+
37 this->publish_predicates();
+
38 } catch (const std::exception& ex) {
+
39 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to execute step function:" << ex.what());
+
40 // TODO handle error in lifecycle component
+
41// this->raise_error();
+
42 }
+
43}
+
44
+
45rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
46LifecycleComponent::on_configure(const rclcpp_lifecycle::State& previous_state) {
+
47 RCLCPP_DEBUG(this->get_logger(), "on_configure called from previous state %s", previous_state.label().c_str());
+
48 if (previous_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED) {
+
49 RCLCPP_WARN(get_logger(), "Invalid transition 'configure' from state %s.", previous_state.label().c_str());
+
50 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
51 }
+
52 if (!this->handle_configure()) {
+
53 RCLCPP_WARN(get_logger(), "Configuration failed! Reverting to the unconfigured state.");
+
54 // perform cleanup actions to ensure the component is unconfigured
+
55 if (this->handle_cleanup()) {
+
56 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
57 } else {
+
58 RCLCPP_ERROR(get_logger(),
+
59 "Could not revert to the unconfigured state! Entering into the error processing transition state.");
+
60 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
61 }
+
62 }
+
63 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
64}
+
65
+
66bool LifecycleComponent::handle_configure() {
+
67 bool result = this->on_configure_callback();
+
68 return result && this->configure_outputs();
+
69}
+
70
+ +
72 return true;
+
73}
+
74
+
75rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
76LifecycleComponent::on_cleanup(const rclcpp_lifecycle::State& previous_state) {
+
77 RCLCPP_DEBUG(this->get_logger(), "on_cleanup called from previous state %s", previous_state.label().c_str());
+
78 if (previous_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) {
+
79 RCLCPP_WARN(get_logger(), "Invalid transition 'cleanup' from state %s.", previous_state.label().c_str());
+
80 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
81 }
+
82 if (!this->handle_cleanup()) {
+
83 RCLCPP_ERROR(get_logger(), "Cleanup failed! Entering into the error processing transition state.");
+
84 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
85 }
+
86 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
87}
+
88
+
89bool LifecycleComponent::handle_cleanup() {
+
90 return this->on_cleanup_callback();
+
91}
+
92
+ +
94 return true;
+
95}
+
96
+
97rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
98LifecycleComponent::on_activate(const rclcpp_lifecycle::State& previous_state) {
+
99 RCLCPP_DEBUG(this->get_logger(), "on_activate called from previous state %s", previous_state.label().c_str());
+
100 if (previous_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) {
+
101 RCLCPP_WARN(get_logger(), "Invalid transition 'activate' from state %s.", previous_state.label().c_str());
+
102 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
103 }
+
104 if (!this->handle_activate()) {
+
105 RCLCPP_WARN(get_logger(), "Activation failed! Reverting to the inactive state.");
+
106 // perform deactivation actions to ensure the component is inactive
+
107 if (this->handle_deactivate()) {
+
108 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
109 } else {
+
110 RCLCPP_ERROR(get_logger(),
+
111 "Could not revert to the inactive state! Entering into the error processing transition state.");
+
112 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
113 }
+
114 }
+
115 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
116}
+
117
+
118bool LifecycleComponent::handle_activate() {
+
119 bool result = this->activate_outputs();
+
120 return result && this->on_activate_callback();
+
121}
+
122
+ +
124 return true;
+
125}
+
126
+
127rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
128LifecycleComponent::on_deactivate(const rclcpp_lifecycle::State& previous_state) {
+
129 RCLCPP_DEBUG(this->get_logger(), "on_deactivate called from previous state %s", previous_state.label().c_str());
+
130 if (previous_state.id() != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) {
+
131 RCLCPP_WARN(get_logger(), "Invalid transition 'deactivate' from state %s.", previous_state.label().c_str());
+
132 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::FAILURE;
+
133 }
+
134 if (!this->handle_deactivate()) {
+
135 RCLCPP_ERROR(get_logger(), "Deactivation failed! Entering into the error processing transition state.");
+
136 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
137 }
+
138 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
139}
+
140
+
141bool LifecycleComponent::handle_deactivate() {
+
142 bool result = this->on_deactivate_callback();
+
143 return result && this->deactivate_outputs();
+
144}
+
145
+ +
147 return true;
+
148}
+
149
+
150rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
151LifecycleComponent::on_shutdown(const rclcpp_lifecycle::State& previous_state) {
+
152 RCLCPP_DEBUG(this->get_logger(), "on_shutdown called from previous state %s", previous_state.label().c_str());
+
153 switch (previous_state.id()) {
+
154 case lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED:
+
155 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
156 case lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE:
+
157 if (!this->handle_deactivate()) {
+
158 RCLCPP_DEBUG(get_logger(), "Shutdown failed during intermediate deactivation!");
+
159 break;
+
160 }
+
161 [[fallthrough]];
+
162 case lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE:
+
163 if (!this->handle_cleanup()) {
+
164 RCLCPP_DEBUG(get_logger(), "Shutdown failed during intermediate cleanup!");
+
165 break;
+
166 }
+
167 [[fallthrough]];
+
168 case lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED:
+
169 if (!this->handle_shutdown()) {
+
170 break;
+
171 }
+
172 // TODO: reset and finalize all needed properties
+
173 // this->handlers_.clear();
+
174 // this->daemons_.clear();
+
175 // this->parameters_.clear();
+
176 // this->shutdown_ = true;
+
177 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
178 default:
+
179 RCLCPP_WARN(get_logger(), "Invalid transition 'shutdown' from state %s.", previous_state.label().c_str());
+
180 break;
+
181 }
+
182 RCLCPP_ERROR(get_logger(), "Entering into the error processing transition state.");
+
183 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
184}
+
185
+
186bool LifecycleComponent::handle_shutdown() {
+
187 bool result = this->on_shutdown_callback();
+
188 return result && this->clear_signals();
+
189}
+
190
+ +
192 return true;
+
193}
+
194
+
195rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
196LifecycleComponent::on_error(const rclcpp_lifecycle::State& previous_state) {
+
197 RCLCPP_DEBUG(this->get_logger(), "on_error called from previous state %s", previous_state.label().c_str());
+
198 this->set_predicate("in_error_state", true);
+
199 bool error_handled;
+
200 try {
+
201 error_handled = this->handle_error();
+
202 } catch (const std::exception& ex) {
+
203 RCLCPP_DEBUG(this->get_logger(), "Exception caught during on_error handling: %s", ex.what());
+
204 error_handled = false;
+
205 }
+
206 if (!error_handled) {
+
207 RCLCPP_ERROR(get_logger(), "Error processing failed! Entering into the finalized state.");
+
208 // TODO: reset and finalize all needed properties
+
209 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR;
+
210 }
+
211 this->set_predicate("in_error_state", false);
+
212 return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+
213}
+
214
+
215bool LifecycleComponent::handle_error() {
+
216 return this->on_error_callback();
+
217}
+
218
+ +
220 return true;
+
221}
+
222
+
223bool LifecycleComponent::configure_outputs() {
+
224 bool success = true;
+
225 for (auto& [name, interface] : this->outputs_) {
+
226 try {
+
227 auto topic_name = this->get_parameter_value<std::string>(name + "_topic");
+
228 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
229 "Configuring output '" << name << "' with topic name '" << topic_name << "'.");
+
230 auto message_pair = interface->get_message_pair();
+
231 switch (message_pair->get_type()) {
+
232 case MessageType::BOOL: {
+
233 auto publisher = this->create_publisher<std_msgs::msg::Bool>(topic_name, this->qos_);
+
234 interface = std::make_shared<
+ +
236 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Bool>, std_msgs::msg::Bool>>(
+
237 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
238 break;
+
239 }
+
240 case MessageType::FLOAT64: {
+
241 auto publisher = this->create_publisher<std_msgs::msg::Float64>(topic_name, this->qos_);
+
242 interface = std::make_shared<
+ +
244 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64>, std_msgs::msg::Float64>>(
+
245 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
246 break;
+
247 }
+
248 case MessageType::FLOAT64_MULTI_ARRAY: {
+
249 auto publisher = this->create_publisher<std_msgs::msg::Float64MultiArray>(
+
250 topic_name, this->qos_);
+
251 interface = std::make_shared<
+ +
253 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64MultiArray>,
+
254 std_msgs::msg::Float64MultiArray>>(
+
255 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
256 break;
+
257 }
+
258 case MessageType::INT32: {
+
259 auto publisher = this->create_publisher<std_msgs::msg::Int32>(topic_name, this->qos_);
+
260 interface = std::make_shared<
+ +
262 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Int32>, std_msgs::msg::Int32>>(
+
263 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
264 break;
+
265 }
+
266 case MessageType::STRING: {
+
267 auto publisher = this->create_publisher<std_msgs::msg::String>(topic_name, this->qos_);
+
268 interface = std::make_shared<
+ +
270 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::String>, std_msgs::msg::String>>(
+
271 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
272 break;
+
273 }
+
274 case MessageType::ENCODED_STATE: {
+
275 auto publisher = this->create_publisher<modulo_core::EncodedState>(topic_name, this->qos_);
+
276 interface = std::make_shared<
+ +
278 rclcpp_lifecycle::LifecyclePublisher<modulo_core::EncodedState>, modulo_core::EncodedState>>(
+
279 PublisherType::LIFECYCLE_PUBLISHER, publisher)->create_publisher_interface(message_pair);
+
280 break;
+
281 }
+
282 }
+
283 } catch (const modulo_core::exceptions::CoreException& ex) {
+
284 success = false;
+
285 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to configure output '" << name << "': " << ex.what());
+
286 }
+
287 }
+
288 return success;
+
289}
+
290
+
291bool LifecycleComponent::clear_signals() {
+
292 RCLCPP_DEBUG(this->get_logger(), "Clearing all inputs and outputs.");
+
293 this->inputs_.clear();
+
294 this->outputs_.clear();
+
295 return true;
+
296}
+
297
+
298bool LifecycleComponent::activate_outputs() {
+
299 bool success = true;
+
300 for (auto const& [name, interface] : this->outputs_) {
+
301 try {
+
302 interface->activate();
+
303 } catch (const modulo_core::exceptions::CoreException& ex) {
+
304 success = false;
+
305 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to activate output '" << name << "': " << ex.what());
+
306 }
+
307 }
+
308 RCLCPP_DEBUG(this->get_logger(), "All outputs activated.");
+
309 return success;
+
310}
+
311
+
312bool LifecycleComponent::deactivate_outputs() {
+
313 bool success = true;
+
314 for (auto const& [name, interface] : this->outputs_) {
+
315 try {
+
316 interface->deactivate();
+
317 } catch (const modulo_core::exceptions::CoreException& ex) {
+
318 success = false;
+
319 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to deactivate output '" << name << "': " << ex.what());
+
320 }
+
321 }
+
322 RCLCPP_DEBUG(this->get_logger(), "All outputs deactivated.");
+
323 return success;
+
324}
+
325}// namespace modulo_components
+
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
+
void add_predicate(const std::string &predicate_name, bool predicate_value)
Add a predicate to the map of predicates.
+
void publish_outputs()
Helper function to publish all output signals.
+
void set_predicate(const std::string &predicate_name, bool predicate_value)
Set the value of the predicate given as parameter, if the predicate is not found does not do anything...
+ +
bool get_predicate(const std::string &predicate_name)
Get the logical value of a predicate.
+
rclcpp::QoS qos_
Quality of Service for ROS publishers and subscribers.
+
void evaluate_periodic_callbacks()
Helper function to evaluate all periodic function callbacks.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
Map of outputs.
+
virtual bool on_shutdown_callback()
Steps to execute when shutting down the component.
+
virtual bool on_deactivate_callback()
Steps to execute when deactivating the component.
+
virtual bool on_activate_callback()
Steps to execute when activating the component.
+
virtual bool on_cleanup_callback()
Steps to execute when cleaning up the component.
+
LifecycleComponent(const rclcpp::NodeOptions &node_options, const std::string &fallback_name="LifecycleComponent")
Constructor from node options.
+
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
+
virtual bool on_error_callback()
Steps to execute when handling errors.
+
virtual bool on_configure_callback()
Steps to execute when configuring the component.
+
The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish da...
+
A base class for all core exceptions.
+
Modulo components.
Definition: Component.hpp:12
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
std_msgs::msg::UInt8MultiArray EncodedState
Define the EncodedState as UInt8MultiArray message type.
+
+ + + + diff --git a/versions/v3.0.0/_lifecycle_component_8hpp_source.html b/versions/v3.0.0/_lifecycle_component_8hpp_source.html new file mode 100644 index 00000000..388c402a --- /dev/null +++ b/versions/v3.0.0/_lifecycle_component_8hpp_source.html @@ -0,0 +1,221 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/LifecycleComponent.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LifecycleComponent.hpp
+
+
+
1#pragma once
+
2
+
3#include <lifecycle_msgs/msg/state.hpp>
+
4#include <rclcpp_lifecycle/lifecycle_node.hpp>
+
5
+
6#include "modulo_components/ComponentInterface.hpp"
+
7#include "modulo_core/EncodedState.hpp"
+
8
+
9namespace modulo_components {
+
10
+
30class LifecycleComponent : public ComponentInterface<rclcpp_lifecycle::LifecycleNode> {
+
31public:
+
32 friend class LifecycleComponentPublicInterface;
+
33
+
39 explicit LifecycleComponent(
+
40 const rclcpp::NodeOptions& node_options, const std::string& fallback_name = "LifecycleComponent"
+
41 );
+
42
+
46 virtual ~LifecycleComponent() = default;
+
47
+
48protected:
+
55 virtual bool on_configure_callback();
+
56
+
63 virtual bool on_cleanup_callback();
+
64
+
71 virtual bool on_activate_callback();
+
72
+
79 virtual bool on_deactivate_callback();
+
80
+
87 virtual bool on_shutdown_callback();
+
88
+
95 virtual bool on_error_callback();
+
96
+
100 virtual void on_step_callback();
+
101
+
111 template<typename DataT>
+
112 void add_output(
+
113 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic = "",
+
114 bool fixed_topic = false, bool publish_on_step = true
+
115 );
+
116
+
117private:
+
128 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
129 on_configure(const rclcpp_lifecycle::State& previous_state) override;
+
130
+
136 bool handle_configure();
+
137
+
147 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
148 on_cleanup(const rclcpp_lifecycle::State& previous_state) override;
+
149
+
155 bool handle_cleanup();
+
156
+
167 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
168 on_activate(const rclcpp_lifecycle::State& previous_state) override;
+
169
+
175 bool handle_activate();
+
176
+
186 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
187 on_deactivate(const rclcpp_lifecycle::State& previous_state) override;
+
188
+
194 bool handle_deactivate();
+
195
+
205 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
206 on_shutdown(const rclcpp_lifecycle::State& previous_state) override;
+
207
+
213 bool handle_shutdown();
+
214
+
225 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
+
226 on_error(const rclcpp_lifecycle::State& previous_state) override;
+
227
+
233 bool handle_error();
+
234
+
239 void step() override;
+
240
+
245 bool configure_outputs();
+
246
+
251 bool activate_outputs();
+
252
+
257 bool deactivate_outputs();
+
258
+
262 bool clear_signals();
+
263
+
264 // TODO hide ROS methods
+
265 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::create_output;
+
266 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::inputs_;
+
267 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::outputs_;
+
268 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::qos_;
+
269 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::publish_predicates;
+
270 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::publish_outputs;
+
271 using ComponentInterface<rclcpp_lifecycle::LifecycleNode>::evaluate_periodic_callbacks;
+
272};
+
273
+ +
275
+
276template<typename DataT>
+ +
278 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
279 bool fixed_topic, bool publish_on_step
+
280) {
+
281 if (this->get_current_state().id() != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED
+
282 && this->get_current_state().id() != lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) {
+
283 RCLCPP_WARN_STREAM_THROTTLE(
+
284 this->get_logger(), *this->get_clock(), 1000,
+
285 "Adding output in state " << this->get_current_state().label() << " is not allowed.");
+
286 return;
+
287 }
+
288 try {
+
289 this->create_output(signal_name, data, default_topic, fixed_topic, publish_on_step);
+
290 } catch (const exceptions::AddSignalException& ex) {
+
291 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add output '" << signal_name << "': " << ex.what());
+
292 }
+
293}
+
294
+
295// TODO, if we raise error we need to manually call the lifecycle change state callback,
+
296// call callback function that this service calls
+
297}// namespace modulo_components
+
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
+
std::string create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of out...
+
void publish_outputs()
Helper function to publish all output signals.
+ +
rclcpp::QoS qos_
Quality of Service for ROS publishers and subscribers.
+
void evaluate_periodic_callbacks()
Helper function to evaluate all periodic function callbacks.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
Map of outputs.
+
std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
Map of inputs.
+
A wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified com...
+
virtual bool on_shutdown_callback()
Steps to execute when shutting down the component.
+
virtual bool on_deactivate_callback()
Steps to execute when deactivating the component.
+
void add_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)
Add an output signal of the component.
+
virtual bool on_activate_callback()
Steps to execute when activating the component.
+
virtual bool on_cleanup_callback()
Steps to execute when cleaning up the component.
+
virtual ~LifecycleComponent()=default
Virtual default destructor.
+
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
+
virtual bool on_error_callback()
Steps to execute when handling errors.
+
virtual bool on_configure_callback()
Steps to execute when configuring the component.
+
An exception class to notify errors when adding a signal.
+
Modulo components.
Definition: Component.hpp:12
+
+ + + + diff --git a/versions/v3.0.0/_lookup_transform_exception_8hpp_source.html b/versions/v3.0.0/_lookup_transform_exception_8hpp_source.html new file mode 100644 index 00000000..5fc9293a --- /dev/null +++ b/versions/v3.0.0/_lookup_transform_exception_8hpp_source.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions/LookupTransformException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LookupTransformException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_components/exceptions/ComponentException.hpp"
+
4
+ +
6
+ +
14public:
+
15 explicit LookupTransformException(const std::string& msg) : ComponentException("LookupTransformException", msg) {}
+
16};
+
17}// namespace modulo_components::exceptions
+
A base class for all component exceptions.
+
An exception class to notify an error while looking up TF transforms.
+
Modulo component exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_message_pair_8cpp_source.html b/versions/v3.0.0/_message_pair_8cpp_source.html new file mode 100644 index 00000000..8cb5b888 --- /dev/null +++ b/versions/v3.0.0/_message_pair_8cpp_source.html @@ -0,0 +1,131 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication/MessagePair.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessagePair.cpp
+
+
+
1#include "modulo_core/communication/MessagePair.hpp"
+
2
+
3#include <utility>
+
4
+ +
6
+
7template<>
+ +
9 std::shared_ptr<bool> data, std::shared_ptr<rclcpp::Clock> clock
+
10) :
+
11 MessagePairInterface(MessageType::BOOL), data_(std::move(data)), clock_(std::move(clock)) {}
+
12
+
13template<>
+
14MessagePair<std_msgs::msg::Float64, double>::MessagePair(
+
15 std::shared_ptr<double> data, std::shared_ptr<rclcpp::Clock> clock
+
16) :
+
17 MessagePairInterface(MessageType::FLOAT64), data_(std::move(data)), clock_(std::move(clock)) {}
+
18
+
19template<>
+
20MessagePair<std_msgs::msg::Float64MultiArray, std::vector<double>>::MessagePair(
+
21 std::shared_ptr<std::vector<double>> data, std::shared_ptr<rclcpp::Clock> clock
+
22) :
+
23 MessagePairInterface(MessageType::FLOAT64_MULTI_ARRAY), data_(std::move(data)), clock_(std::move(clock)) {}
+
24
+
25template<>
+
26MessagePair<std_msgs::msg::Int32, int>::MessagePair(
+
27 std::shared_ptr<int> data, std::shared_ptr<rclcpp::Clock> clock
+
28) :
+
29 MessagePairInterface(MessageType::INT32), data_(std::move(data)), clock_(std::move(clock)) {}
+
30
+
31template<>
+
32MessagePair<std_msgs::msg::String, std::string>::MessagePair(
+
33 std::shared_ptr<std::string> data, std::shared_ptr<rclcpp::Clock> clock
+
34) :
+
35 MessagePairInterface(MessageType::STRING), data_(std::move(data)), clock_(std::move(clock)) {}
+
36
+
37template<>
+
38MessagePair<EncodedState, state_representation::State>::MessagePair(
+
39 std::shared_ptr<state_representation::State> data, std::shared_ptr<rclcpp::Clock> clock
+
40) :
+
41 MessagePairInterface(MessageType::ENCODED_STATE), data_(std::move(data)), clock_(std::move(clock)) {}
+
42
+
43}// namespace modulo_core::communication
+
MessagePair(std::shared_ptr< DataT > data, std::shared_ptr< rclcpp::Clock > clock)
Constructor of the MessagePair.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
MessageType
Enum of all supported ROS message types for the MessagePairInterface.
Definition: MessageType.hpp:13
+
+ + + + diff --git a/versions/v3.0.0/_message_pair_8hpp_source.html b/versions/v3.0.0/_message_pair_8hpp_source.html new file mode 100644 index 00000000..119c0dd3 --- /dev/null +++ b/versions/v3.0.0/_message_pair_8hpp_source.html @@ -0,0 +1,213 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/MessagePair.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessagePair.hpp
+
+
+
1#pragma once
+
2
+
3#include <rclcpp/clock.hpp>
+
4
+
5#include "modulo_core/communication/MessagePairInterface.hpp"
+
6#include "modulo_core/exceptions/NullPointerException.hpp"
+
7#include "modulo_core/translators/message_readers.hpp"
+
8#include "modulo_core/translators/message_writers.hpp"
+
9
+ +
11
+
19template<typename MsgT, typename DataT>
+ +
21public:
+
27 MessagePair(std::shared_ptr<DataT> data, std::shared_ptr<rclcpp::Clock> clock);
+
28
+
35 [[nodiscard]] MsgT write_message() const;
+
36
+
43 void read_message(const MsgT& message);
+
44
+
48 [[nodiscard]] std::shared_ptr<DataT> get_data() const;
+
49
+
54 void set_data(const std::shared_ptr<DataT>& data);
+
55
+
56private:
+
57 std::shared_ptr<DataT> data_;
+
58 std::shared_ptr<rclcpp::Clock> clock_;
+
59};
+
60
+
61template<typename MsgT, typename DataT>
+ +
63 if (this->data_ == nullptr) {
+
64 throw exceptions::NullPointerException("The message pair data is not set, nothing to write");
+
65 }
+
66 auto message = MsgT();
+
67 translators::write_message(message, *this->data_, clock_->now());
+
68 return message;
+
69}
+
70
+
71template<>
+ +
73 if (this->data_ == nullptr) {
+
74 throw exceptions::NullPointerException("The message pair data is not set, nothing to write");
+
75 }
+
76 auto message = EncodedState();
+
77 translators::write_message(message, this->data_, clock_->now());
+
78 return message;
+
79}
+
80
+
81template<typename MsgT, typename DataT>
+
82inline void MessagePair<MsgT, DataT>::read_message(const MsgT& message) {
+
83 if (this->data_ == nullptr) {
+
84 throw exceptions::NullPointerException("The message pair data is not set, nothing to read");
+
85 }
+
86 translators::read_message(*this->data_, message);
+
87}
+
88
+
89template<>
+ +
91 if (this->data_ == nullptr) {
+
92 throw exceptions::NullPointerException("The message pair data is not set, nothing to read");
+
93 }
+
94 translators::read_message(this->data_, message);
+
95}
+
96
+
97template<typename MsgT, typename DataT>
+
98inline std::shared_ptr<DataT> MessagePair<MsgT, DataT>::get_data() const {
+
99 return this->data_;
+
100}
+
101
+
102template<typename MsgT, typename DataT>
+
103inline void MessagePair<MsgT, DataT>::set_data(const std::shared_ptr<DataT>& data) {
+
104 if (data == nullptr) {
+
105 throw exceptions::NullPointerException("Provide a valid pointer");
+
106 }
+
107 this->data_ = data;
+
108}
+
109
+
110template<typename DataT>
+
111inline std::shared_ptr<MessagePairInterface>
+
112make_shared_message_pair(const std::shared_ptr<DataT>& data, const std::shared_ptr<rclcpp::Clock>& clock) {
+
113 return std::make_shared<MessagePair<EncodedState, state_representation::State>>(
+
114 std::dynamic_pointer_cast<state_representation::State>(data), clock);
+
115}
+
116
+
117template<>
+
118inline std::shared_ptr<MessagePairInterface>
+
119make_shared_message_pair(const std::shared_ptr<bool>& data, const std::shared_ptr<rclcpp::Clock>& clock) {
+
120 return std::make_shared<MessagePair<std_msgs::msg::Bool, bool>>(data, clock);
+
121}
+
122
+
123template<>
+
124inline std::shared_ptr<MessagePairInterface>
+
125make_shared_message_pair(const std::shared_ptr<double>& data, const std::shared_ptr<rclcpp::Clock>& clock) {
+
126 return std::make_shared<MessagePair<std_msgs::msg::Float64, double>>(data, clock);
+
127}
+
128
+
129template<>
+
130inline std::shared_ptr<MessagePairInterface> make_shared_message_pair(
+
131 const std::shared_ptr<std::vector<double>>& data, const std::shared_ptr<rclcpp::Clock>& clock
+
132) {
+
133 return std::make_shared < MessagePair<std_msgs::msg::Float64MultiArray, std::vector < double>>>(data, clock);
+
134}
+
135
+
136template<>
+
137inline std::shared_ptr<MessagePairInterface>
+
138make_shared_message_pair(const std::shared_ptr<int>& data, const std::shared_ptr<rclcpp::Clock>& clock) {
+
139 return std::make_shared<MessagePair<std_msgs::msg::Int32, int>>(data, clock);
+
140}
+
141
+
142template<>
+
143inline std::shared_ptr<MessagePairInterface>
+
144make_shared_message_pair(const std::shared_ptr<std::string>& data, const std::shared_ptr<rclcpp::Clock>& clock) {
+
145 return std::make_shared<MessagePair<std_msgs::msg::String, std::string>>(data, clock);
+
146}
+
147}// namespace modulo_core::communication
+
The MessagePair stores a pointer to a variable and translates the value of this pointer back and fort...
Definition: MessagePair.hpp:20
+
std::shared_ptr< DataT > get_data() const
Get the data pointer.
Definition: MessagePair.hpp:98
+
MsgT write_message() const
Write the value of the data pointer to a ROS message.
Definition: MessagePair.hpp:62
+
void read_message(const MsgT &message)
Read a ROS message and store the value in the data pointer.
Definition: MessagePair.hpp:82
+
MessagePair(std::shared_ptr< DataT > data, std::shared_ptr< rclcpp::Clock > clock)
Constructor of the MessagePair.
+
void set_data(const std::shared_ptr< DataT > &data)
Set the data pointer.
+
Interface class to enable non-templated writing and reading ROS messages from derived MessagePair ins...
+
An exception class to notify that a certain pointer is null.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
void write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
Convert a CartesianState to a ROS geometry_msgs::msg::Accel.
+
void read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)
Convert a ROS geometry_msgs::msg::Accel to a CartesianState.
+
std_msgs::msg::UInt8MultiArray EncodedState
Define the EncodedState as UInt8MultiArray message type.
+
+ + + + diff --git a/versions/v3.0.0/_message_pair_interface_8cpp_source.html b/versions/v3.0.0/_message_pair_interface_8cpp_source.html new file mode 100644 index 00000000..db652319 --- /dev/null +++ b/versions/v3.0.0/_message_pair_interface_8cpp_source.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication/MessagePairInterface.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessagePairInterface.cpp
+
+
+
1#include "modulo_core/communication/MessagePairInterface.hpp"
+
2
+ +
4
+ +
6
+ +
8 return this->type_;
+
9}
+
10}// namespace modulo_core::communication
+
MessagePairInterface(MessageType type)
Constructor with the message type.
+
MessageType get_type() const
Get the MessageType of the MessagePairInterface.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
MessageType
Enum of all supported ROS message types for the MessagePairInterface.
Definition: MessageType.hpp:13
+
+ + + + diff --git a/versions/v3.0.0/_message_pair_interface_8hpp_source.html b/versions/v3.0.0/_message_pair_interface_8hpp_source.html new file mode 100644 index 00000000..bd5cf50f --- /dev/null +++ b/versions/v3.0.0/_message_pair_interface_8hpp_source.html @@ -0,0 +1,160 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/MessagePairInterface.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessagePairInterface.hpp
+
+
+
1#pragma once
+
2
+
3#include <memory>
+
4
+
5#include "modulo_core/communication/MessageType.hpp"
+
6#include "modulo_core/exceptions/InvalidPointerCastException.hpp"
+
7#include "modulo_core/exceptions/InvalidPointerException.hpp"
+
8
+ +
10
+
11// forward declaration of derived MessagePair class
+
12template<typename MsgT, typename DataT>
+
13class MessagePair;
+
14
+
20class MessagePairInterface : public std::enable_shared_from_this<MessagePairInterface> {
+
21public:
+
26 explicit MessagePairInterface(MessageType type);
+
27
+
31 virtual ~MessagePairInterface() = default;
+
32
+
36 MessagePairInterface(const MessagePairInterface& message_pair) = default;
+
37
+
56 template<typename MsgT, typename DataT>
+
57 [[nodiscard]] std::shared_ptr<MessagePair<MsgT, DataT>> get_message_pair(bool validate_pointer = true);
+
58
+
68 template<typename MsgT, typename DataT>
+
69 [[nodiscard]] MsgT write();
+
70
+
80 template<typename MsgT, typename DataT>
+
81 void read(const MsgT& message);
+
82
+
87 MessageType get_type() const;
+
88
+
89private:
+
90 MessageType type_;
+
91};
+
92
+
93template<typename MsgT, typename DataT>
+
94inline std::shared_ptr<MessagePair<MsgT, DataT>> MessagePairInterface::get_message_pair(bool validate_pointer) {
+
95 std::shared_ptr<MessagePair<MsgT, DataT>> message_pair_ptr;
+
96 try {
+
97 message_pair_ptr = std::dynamic_pointer_cast<MessagePair<MsgT, DataT>>(this->shared_from_this());
+
98 } catch (const std::exception& ex) {
+
99 if (validate_pointer) {
+
100 throw exceptions::InvalidPointerException("Message pair interface is not managed by a valid pointer");
+
101 }
+
102 }
+
103 if (message_pair_ptr == nullptr && validate_pointer) {
+ +
105 "Unable to cast message pair interface to a message pair pointer of requested type");
+
106 }
+
107 return message_pair_ptr;
+
108}
+
109
+
110template<typename MsgT, typename DataT>
+ +
112 return this->template get_message_pair<MsgT, DataT>()->write_message();
+
113}
+
114
+
115template<typename MsgT, typename DataT>
+
116inline void MessagePairInterface::read(const MsgT& message) {
+
117 this->template get_message_pair<MsgT, DataT>()->read_message(message);
+
118}
+
119}// namespace modulo_core::communication
+
Interface class to enable non-templated writing and reading ROS messages from derived MessagePair ins...
+
virtual ~MessagePairInterface()=default
Default virtual destructor.
+
std::shared_ptr< MessagePair< MsgT, DataT > > get_message_pair(bool validate_pointer=true)
Get a pointer to a derived MessagePair instance from a MessagePairInterface pointer.
+
MessageType get_type() const
Get the MessageType of the MessagePairInterface.
+
MsgT write()
Get the ROS message of a derived MessagePair instance through the MessagePairInterface pointer.
+
void read(const MsgT &message)
Read a ROS message and set the data of the derived MessagePair instance through the MessagePairInterf...
+
MessagePairInterface(const MessagePairInterface &message_pair)=default
Copy constructor from another MessagePairInterface.
+
An exception class to notify if the result of getting an instance of a derived class through dynamic ...
+
An exception class to notify if an object has no reference count (if the object is not owned by any p...
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
MessageType
Enum of all supported ROS message types for the MessagePairInterface.
Definition: MessageType.hpp:13
+
+ + + + diff --git a/versions/v3.0.0/_message_translation_exception_8hpp_source.html b/versions/v3.0.0/_message_translation_exception_8hpp_source.html new file mode 100644 index 00000000..20d70656 --- /dev/null +++ b/versions/v3.0.0/_message_translation_exception_8hpp_source.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/MessageTranslationException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessageTranslationException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+ +
6
+ +
12public:
+
13 explicit MessageTranslationException(const std::string& msg) : CoreException("MessageTranslationException", msg) {}
+
14};
+
15}// namespace modulo_core::exceptions
+
16
+
17
+
A base class for all core exceptions.
+
An exception class to notify that the translation of a ROS message failed.
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_message_type_8hpp_source.html b/versions/v3.0.0/_message_type_8hpp_source.html new file mode 100644 index 00000000..107147bb --- /dev/null +++ b/versions/v3.0.0/_message_type_8hpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/MessageType.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
MessageType.hpp
+
+
+
1#pragma once
+
2
+ +
8
+
13enum class MessageType {
+
14 BOOL, FLOAT64, FLOAT64_MULTI_ARRAY, INT32, STRING, ENCODED_STATE
+
15};
+
16}// namespace modulo_core::communication
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
MessageType
Enum of all supported ROS message types for the MessagePairInterface.
Definition: MessageType.hpp:13
+
+ + + + diff --git a/versions/v3.0.0/_null_pointer_exception_8hpp_source.html b/versions/v3.0.0/_null_pointer_exception_8hpp_source.html new file mode 100644 index 00000000..4cf118b1 --- /dev/null +++ b/versions/v3.0.0/_null_pointer_exception_8hpp_source.html @@ -0,0 +1,100 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/NullPointerException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
NullPointerException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+ +
6
+ +
13public:
+
14 explicit NullPointerException(const std::string& msg) : CoreException("NullPointerException", msg) {}
+
15};
+
16}// namespace modulo_core::exceptions
+
17
+
A base class for all core exceptions.
+
An exception class to notify that a certain pointer is null.
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_parameter_translation_exception_8hpp_source.html b/versions/v3.0.0/_parameter_translation_exception_8hpp_source.html new file mode 100644 index 00000000..0de07d26 --- /dev/null +++ b/versions/v3.0.0/_parameter_translation_exception_8hpp_source.html @@ -0,0 +1,102 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions/ParameterTranslationException.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ParameterTranslationException.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/exceptions/CoreException.hpp"
+
4
+ +
6
+ +
14public:
+
15 explicit ParameterTranslationException(const std::string& msg) :
+
16 CoreException("ParameterTranslationException", msg) {}
+
17};
+
18}// namespace modulo_core::exceptions
+
19
+
20
+
A base class for all core exceptions.
+
An exception class to notify incompatibility when translating parameters from different sources.
+
Modulo Core exceptions module for defining exception classes.
+
+ + + + diff --git a/versions/v3.0.0/_predicates_listener_8cpp_source.html b/versions/v3.0.0/_predicates_listener_8cpp_source.html new file mode 100644 index 00000000..ec1bdaa9 --- /dev/null +++ b/versions/v3.0.0/_predicates_listener_8cpp_source.html @@ -0,0 +1,124 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/src/testutils/PredicatesListener.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PredicatesListener.cpp
+
+
+
1#include "modulo_utils/testutils/PredicatesListener.hpp"
+
2
+
3namespace modulo_utils::testutils {
+
4
+
5PredicatesListener::PredicatesListener(
+
6 const std::string& component, const std::vector<std::string>& predicates, const rclcpp::NodeOptions& node_options
+
7) : rclcpp::Node("predicates_listener", node_options) {
+
8 this->received_future_ = this->received_.get_future();
+
9 for (const auto& predicate : predicates) {
+
10 this->predicates_.insert_or_assign(predicate, false);
+
11 }
+
12 this->subscription_ = this->create_subscription<modulo_component_interfaces::msg::Predicate>(
+
13 "/predicates", 10, [this, component](const std::shared_ptr<modulo_component_interfaces::msg::Predicate> message) {
+
14 if (message->component == component) {
+
15 for (auto& predicate : this->predicates_) {
+
16 if (message->predicate == predicate.first) {
+
17 predicate.second = message->value;
+
18 if (message->value) {
+
19 this->received_.set_value();
+
20 }
+
21 }
+
22 }
+
23 }
+
24 });
+
25}
+
26
+
27void PredicatesListener::reset_future() {
+
28 this->received_ = std::promise<void>();
+
29 this->received_future_ = this->received_.get_future();
+
30}
+
31
+
32const std::shared_future<void>& PredicatesListener::get_predicate_future() const {
+
33 return this->received_future_;
+
34}
+
35
+
36const std::map<std::string, bool>& PredicatesListener::get_predicate_values() const {
+
37 return this->predicates_;
+
38}
+
39}// namespace modulo_utils::testutils
+
+ + + + diff --git a/versions/v3.0.0/_predicates_listener_8hpp_source.html b/versions/v3.0.0/_predicates_listener_8hpp_source.html new file mode 100644 index 00000000..76221feb --- /dev/null +++ b/versions/v3.0.0/_predicates_listener_8hpp_source.html @@ -0,0 +1,117 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/include/modulo_utils/testutils/PredicatesListener.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PredicatesListener.hpp
+
+
+
1#pragma once
+
2
+
3#include <future>
+
4#include <map>
+
5
+
6#include <rclcpp/rclcpp.hpp>
+
7#include <modulo_component_interfaces/msg/predicate.hpp>
+
8
+
9namespace modulo_utils::testutils {
+
10
+
11using namespace std::chrono_literals;
+
12
+
13class PredicatesListener : public rclcpp::Node {
+
14public:
+ +
16 const std::string& component, const std::vector<std::string>& predicates,
+
17 const rclcpp::NodeOptions& node_options = rclcpp::NodeOptions());
+
18
+
19 void reset_future();
+
20
+
21 [[nodiscard]] const std::shared_future<void>& get_predicate_future() const;
+
22
+
23 [[nodiscard]] const std::map<std::string, bool>& get_predicate_values() const;
+
24
+
25private:
+
26 std::shared_ptr<rclcpp::Subscription<modulo_component_interfaces::msg::Predicate>> subscription_;
+
27 std::map<std::string, bool> predicates_;
+
28 std::shared_future<void> received_future_;
+
29 std::promise<void> received_;
+
30};
+
31}// namespace modulo_utils::testutils
+ +
+ + + + diff --git a/versions/v3.0.0/_publisher_handler_8hpp_source.html b/versions/v3.0.0/_publisher_handler_8hpp_source.html new file mode 100644 index 00000000..32024caa --- /dev/null +++ b/versions/v3.0.0/_publisher_handler_8hpp_source.html @@ -0,0 +1,193 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/PublisherHandler.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PublisherHandler.hpp
+
+
+
1#pragma once
+
2
+
3#include <rclcpp/logging.hpp>
+
4
+
5#include "modulo_core/communication/PublisherInterface.hpp"
+
6#include "modulo_core/exceptions/NullPointerException.hpp"
+
7
+ +
9
+
17template<typename PubT, typename MsgT>
+ +
19public:
+
25 PublisherHandler(PublisherType type, std::shared_ptr<PubT> publisher);
+
26
+
30 ~PublisherHandler() override;
+
31
+
36 void on_activate();
+
37
+
42 void on_deactivate();
+
43
+
49 void publish(const MsgT& message) const;
+
50
+
55 std::shared_ptr<PublisherInterface>
+
56 create_publisher_interface(const std::shared_ptr<MessagePairInterface>& message_pair);
+
57
+
58private:
+
59 std::shared_ptr<PubT> publisher_;
+
60};
+
61
+
62template<typename PubT, typename MsgT>
+
63PublisherHandler<PubT, MsgT>::PublisherHandler(PublisherType type, std::shared_ptr<PubT> publisher) :
+
64 PublisherInterface(type), publisher_(std::move(publisher)) {}
+
65
+
66template<typename PubT, typename MsgT>
+ +
68 this->publisher_.reset();
+
69}
+
70
+
71template<typename PubT, typename MsgT>
+ +
73 if (this->publisher_ == nullptr) {
+
74 throw exceptions::NullPointerException("Publisher not set");
+
75 }
+
76 if (this->get_type() == PublisherType::LIFECYCLE_PUBLISHER) {
+
77 try {
+
78 this->publisher_->on_activate();
+
79 } catch (const std::exception& ex) {
+
80 throw exceptions::CoreException(ex.what());
+
81 }
+
82 } else {
+
83 RCLCPP_DEBUG(rclcpp::get_logger("PublisherHandler"), "Only LifecyclePublishers can be deactivated");
+
84 }
+
85}
+
86
+
87template<typename PubT, typename MsgT>
+ +
89 if (this->publisher_ == nullptr) {
+
90 throw exceptions::NullPointerException("Publisher not set");
+
91 }
+
92 if (this->get_type() == PublisherType::LIFECYCLE_PUBLISHER) {
+
93 try {
+
94 this->publisher_->on_deactivate();
+
95 } catch (const std::exception& ex) {
+
96 throw exceptions::CoreException(ex.what());
+
97 }
+
98 } else {
+
99 RCLCPP_DEBUG(rclcpp::get_logger("PublisherHandler"), "Only LifecyclePublishers can be deactivated");
+
100 }
+
101}
+
102
+
103template<typename PubT, typename MsgT>
+
104void PublisherHandler<PubT, MsgT>::publish(const MsgT& message) const {
+
105 if (this->publisher_ == nullptr) {
+
106 throw exceptions::NullPointerException("Publisher not set");
+
107 }
+
108 try {
+
109 this->publisher_->publish(message);
+
110 } catch (const std::exception& ex) {
+
111 throw exceptions::CoreException(ex.what());
+
112 }
+
113}
+
114
+
115template<typename PubT, typename MsgT>
+ +
117 const std::shared_ptr<MessagePairInterface>& message_pair
+
118) {
+
119 std::shared_ptr<PublisherInterface> publisher_interface;
+
120 try {
+
121 publisher_interface = std::shared_ptr<PublisherInterface>(this->shared_from_this());
+
122 } catch (const std::exception& ex) {
+
123 throw exceptions::CoreException(ex.what());
+
124 }
+
125 publisher_interface->set_message_pair(message_pair);
+
126 return publisher_interface;
+
127}
+
128}// namespace modulo_core::communication
+
The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish da...
+
std::shared_ptr< PublisherInterface > create_publisher_interface(const std::shared_ptr< MessagePairInterface > &message_pair)
Create a PublisherInterface instance from the current PublisherHandler.
+
~PublisherHandler() override
Destructor to explicitly reset the publisher pointer.
+
void on_deactivate()
Deactivate the ROS publisher if applicable.
+
void on_activate()
Activate the ROS publisher if applicable.
+
PublisherHandler(PublisherType type, std::shared_ptr< PubT > publisher)
Constructor with the publisher type and the pointer to the ROS publisher.
+
Interface class to enable non-templated activating/deactivating/publishing of ROS publishers from der...
+
void publish()
Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler i...
+
A base class for all core exceptions.
+
An exception class to notify that a certain pointer is null.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
+ + + + diff --git a/versions/v3.0.0/_publisher_interface_8cpp_source.html b/versions/v3.0.0/_publisher_interface_8cpp_source.html new file mode 100644 index 00000000..d3a28a30 --- /dev/null +++ b/versions/v3.0.0/_publisher_interface_8cpp_source.html @@ -0,0 +1,251 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication/PublisherInterface.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PublisherInterface.cpp
+
+
+
1#include "modulo_core/communication/PublisherInterface.hpp"
+
2
+
3#include <utility>
+
4
+
5#include <rclcpp/publisher.hpp>
+
6#include <rclcpp_lifecycle/lifecycle_publisher.hpp>
+
7#include <std_msgs/msg/bool.hpp>
+
8#include <std_msgs/msg/float64.hpp>
+
9#include <std_msgs/msg/float64_multi_array.hpp>
+
10#include <std_msgs/msg/int32.hpp>
+
11#include <std_msgs/msg/string.hpp>
+
12
+
13#include "modulo_core/communication/PublisherHandler.hpp"
+
14#include "modulo_core/exceptions/NullPointerException.hpp"
+
15
+ +
17
+
18PublisherInterface::PublisherInterface(PublisherType type, std::shared_ptr<MessagePairInterface> message_pair) :
+
19 type_(type), message_pair_(std::move(message_pair)) {}
+
20
+ +
22 if (this->message_pair_ == nullptr) {
+
23 throw exceptions::NullPointerException("Message pair is not set, cannot deduce message type");
+
24 }
+
25 switch (this->message_pair_->get_type()) {
+
26 case MessageType::BOOL:
+
27 this->template get_handler<
+
28 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Bool>, std_msgs::msg::Bool
+
29 >()->on_activate();
+
30 break;
+
31 case MessageType::FLOAT64:
+
32 this->template get_handler<
+
33 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64>, std_msgs::msg::Float64
+
34 >()->on_activate();
+
35 break;
+
36 case MessageType::FLOAT64_MULTI_ARRAY:
+
37 this->template get_handler<
+
38 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64MultiArray>, std_msgs::msg::Float64MultiArray
+
39 >()->on_activate();
+
40 break;
+
41 case MessageType::INT32:
+
42 this->template get_handler<
+
43 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Int32>, std_msgs::msg::Int32
+
44 >()->on_activate();
+
45 break;
+
46 case MessageType::STRING:
+
47 this->template get_handler<
+
48 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::String>, std_msgs::msg::String
+
49 >()->on_activate();
+
50 break;
+
51 case MessageType::ENCODED_STATE:
+
52 this->template get_handler<rclcpp_lifecycle::LifecyclePublisher<EncodedState>, EncodedState>()->on_activate();
+
53 break;
+
54 }
+
55}
+
56
+ +
58 if (this->message_pair_ == nullptr) {
+
59 throw exceptions::NullPointerException("Message pair is not set, cannot deduce message type");
+
60 }
+
61 switch (this->message_pair_->get_type()) {
+
62 case MessageType::BOOL:
+
63 this->template get_handler<
+
64 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Bool>, std_msgs::msg::Bool
+
65 >()->on_deactivate();
+
66 break;
+
67 case MessageType::FLOAT64:
+
68 this->template get_handler<
+
69 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64>, std_msgs::msg::Float64
+
70 >()->on_deactivate();
+
71 break;
+
72 case MessageType::FLOAT64_MULTI_ARRAY:
+
73 this->template get_handler<
+
74 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Float64MultiArray>, std_msgs::msg::Float64MultiArray
+
75 >()->on_deactivate();
+
76 break;
+
77 case MessageType::INT32:
+
78 this->template get_handler<
+
79 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::Int32>, std_msgs::msg::Int32
+
80 >()->on_deactivate();
+
81 break;
+
82 case MessageType::STRING:
+
83 this->template get_handler<
+
84 rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::String>, std_msgs::msg::String
+
85 >()->on_deactivate();
+
86 break;
+
87 case MessageType::ENCODED_STATE:
+
88 this->template get_handler<rclcpp_lifecycle::LifecyclePublisher<EncodedState>, EncodedState>()->on_deactivate();
+
89 break;
+
90 }
+
91}
+
92
+ +
94 try {
+
95 if (this->message_pair_ == nullptr) {
+
96 throw exceptions::NullPointerException("Message pair is not set, nothing to publish");
+
97 }
+
98 switch (this->message_pair_->get_type()) {
+
99 case MessageType::BOOL:
+
100 this->publish(this->message_pair_->write<std_msgs::msg::Bool, bool>());
+
101 break;
+
102 case MessageType::FLOAT64:
+
103 this->publish(this->message_pair_->write<std_msgs::msg::Float64, double>());
+
104 break;
+
105 case MessageType::FLOAT64_MULTI_ARRAY:
+
106 this->publish(this->message_pair_->write<std_msgs::msg::Float64MultiArray, std::vector<double>>());
+
107 break;
+
108 case MessageType::INT32:
+
109 this->publish(this->message_pair_->write<std_msgs::msg::Int32, int>());
+
110 break;
+
111 case MessageType::STRING:
+
112 this->publish(this->message_pair_->write<std_msgs::msg::String, std::string>());
+
113 break;
+
114 case MessageType::ENCODED_STATE:
+
115 if (!this->message_pair_->get_message_pair<
+
116 EncodedState, state_representation::State
+
117 >()->get_data()->is_empty()) {
+
118 this->publish(this->message_pair_->write<EncodedState, state_representation::State>());
+
119 }
+
120 break;
+
121 }
+
122 } catch (const exceptions::CoreException& ex) {
+
123 throw;
+
124 }
+
125}
+
126
+
127template<typename MsgT>
+
128void PublisherInterface::publish(const MsgT& message) {
+
129 switch (this->get_type()) {
+
130 case PublisherType::PUBLISHER:
+
131 this->template get_handler<rclcpp::Publisher<MsgT>, MsgT>()->publish(message);
+
132 break;
+
133 case PublisherType::LIFECYCLE_PUBLISHER:
+
134 this->template get_handler<rclcpp_lifecycle::LifecyclePublisher<MsgT>, MsgT>()->publish(message);
+
135 break;
+
136 }
+
137}
+
138
+
139std::shared_ptr<MessagePairInterface> PublisherInterface::get_message_pair() const {
+
140 return this->message_pair_;
+
141}
+
142
+
143void PublisherInterface::set_message_pair(const std::shared_ptr<MessagePairInterface>& message_pair) {
+
144 if (message_pair == nullptr) {
+
145 throw exceptions::NullPointerException("Provide a valid pointer");
+
146 }
+
147 this->message_pair_ = message_pair;
+
148}
+
149
+ +
151 return this->type_;
+
152}
+
153}// namespace modulo_core::communication
+
void deactivate()
Deactivate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointe...
+
PublisherType get_type() const
Get the type of the publisher interface.
+
void publish()
Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler i...
+
std::shared_ptr< MessagePairInterface > get_message_pair() const
Get the pointer to the message pair of the PublisherInterface.
+
std::shared_ptr< PublisherHandler< PubT, MsgT > > get_handler(bool validate_pointer=true)
Get a pointer to a derived PublisherHandler instance from a PublisherInterface pointer.
+
PublisherInterface(PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)
Constructor with the message type and message pair.
+
void set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)
Set the pointer to the message pair of the PublisherInterface.
+
void activate()
Activate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer.
+
A base class for all core exceptions.
+
An exception class to notify that a certain pointer is null.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
std_msgs::msg::UInt8MultiArray EncodedState
Define the EncodedState as UInt8MultiArray message type.
+
+ + + + diff --git a/versions/v3.0.0/_publisher_interface_8hpp_source.html b/versions/v3.0.0/_publisher_interface_8hpp_source.html new file mode 100644 index 00000000..dcaf94ca --- /dev/null +++ b/versions/v3.0.0/_publisher_interface_8hpp_source.html @@ -0,0 +1,162 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/PublisherInterface.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PublisherInterface.hpp
+
+
+
1#pragma once
+
2
+
3#include <memory>
+
4
+
5#include "modulo_core/communication/MessagePair.hpp"
+
6#include "modulo_core/communication/PublisherType.hpp"
+
7#include "modulo_core/exceptions/InvalidPointerCastException.hpp"
+
8#include "modulo_core/exceptions/InvalidPointerException.hpp"
+
9
+ +
11
+
12// forward declaration of derived Publisher class
+
13template<typename PubT, typename MsgT>
+
14class PublisherHandler;
+
15
+
21class PublisherInterface : public std::enable_shared_from_this<PublisherInterface> {
+
22public:
+
28 explicit PublisherInterface(PublisherType type, std::shared_ptr<MessagePairInterface> message_pair = nullptr);
+
29
+
33 PublisherInterface(const PublisherInterface& publisher) = default;
+
34
+
38 virtual ~PublisherInterface() = default;
+
39
+
58 template<typename PubT, typename MsgT>
+
59 std::shared_ptr<PublisherHandler<PubT, MsgT>> get_handler(bool validate_pointer = true);
+
60
+
69 void activate();
+
70
+
79 void deactivate();
+
80
+
91 void publish();
+
92
+
96 [[nodiscard]] std::shared_ptr<MessagePairInterface> get_message_pair() const;
+
97
+
102 void set_message_pair(const std::shared_ptr<MessagePairInterface>& message_pair);
+
103
+
108 PublisherType get_type() const;
+
109
+
110private:
+
121 template<typename MsgT>
+
122 void publish(const MsgT& message);
+
123
+
124 PublisherType type_;
+
125 std::shared_ptr<MessagePairInterface> message_pair_;
+
126};
+
127
+
128template<typename PubT, typename MsgT>
+
129inline std::shared_ptr<PublisherHandler<PubT, MsgT>> PublisherInterface::get_handler(bool validate_pointer) {
+
130 std::shared_ptr<PublisherHandler<PubT, MsgT>> publisher_ptr;
+
131 try {
+
132 publisher_ptr = std::dynamic_pointer_cast<PublisherHandler<PubT, MsgT>>(this->shared_from_this());
+
133 } catch (const std::exception& ex) {
+
134 if (validate_pointer) {
+
135 throw exceptions::InvalidPointerException("Publisher interface is not managed by a valid pointer");
+
136 }
+
137 }
+
138 if (publisher_ptr == nullptr && validate_pointer) {
+ +
140 "Unable to cast publisher interface to a publisher pointer of requested type");
+
141 }
+
142 return publisher_ptr;
+
143}
+
144}// namespace modulo_core::communication
+
Interface class to enable non-templated activating/deactivating/publishing of ROS publishers from der...
+
virtual ~PublisherInterface()=default
Default virtual destructor.
+
void deactivate()
Deactivate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointe...
+
PublisherInterface(const PublisherInterface &publisher)=default
Copy constructor from another PublisherInterface.
+
PublisherType get_type() const
Get the type of the publisher interface.
+
void publish()
Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler i...
+
std::shared_ptr< MessagePairInterface > get_message_pair() const
Get the pointer to the message pair of the PublisherInterface.
+
std::shared_ptr< PublisherHandler< PubT, MsgT > > get_handler(bool validate_pointer=true)
Get a pointer to a derived PublisherHandler instance from a PublisherInterface pointer.
+
void set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)
Set the pointer to the message pair of the PublisherInterface.
+
void activate()
Activate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer.
+
An exception class to notify if the result of getting an instance of a derived class through dynamic ...
+
An exception class to notify if an object has no reference count (if the object is not owned by any p...
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
+ + + + diff --git a/versions/v3.0.0/_publisher_type_8hpp_source.html b/versions/v3.0.0/_publisher_type_8hpp_source.html new file mode 100644 index 00000000..112feb5f --- /dev/null +++ b/versions/v3.0.0/_publisher_type_8hpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/PublisherType.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PublisherType.hpp
+
+
+
1#pragma once
+
2
+ +
4
+
9enum class PublisherType {
+
10 PUBLISHER, LIFECYCLE_PUBLISHER
+
11};
+
12}// namespace modulo_core::communication
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
PublisherType
Enum of supported ROS publisher types for the PublisherInterface.
+
+ + + + diff --git a/versions/v3.0.0/_service_client_8hpp_source.html b/versions/v3.0.0/_service_client_8hpp_source.html new file mode 100644 index 00000000..5c0853c1 --- /dev/null +++ b/versions/v3.0.0/_service_client_8hpp_source.html @@ -0,0 +1,114 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/include/modulo_utils/testutils/ServiceClient.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ServiceClient.hpp
+
+
+
1#pragma once
+
2
+
3#include <chrono>
+
4#include <exception>
+
5
+
6#include <rclcpp/rclcpp.hpp>
+
7
+
8namespace modulo_utils::testutils {
+
9
+
10using namespace std::chrono_literals;
+
11
+
12template<typename SrvT>
+
13class ServiceClient : public rclcpp::Node {
+
14public:
+
15 ServiceClient(const rclcpp::NodeOptions& options, const std::string& service) : rclcpp::Node("client_node", options) {
+
16 this->client_ = this->create_client<SrvT>(service);
+
17 if (!this->client_->wait_for_service(1s)) {
+
18 throw std::runtime_error("Service not available");
+
19 }
+
20 }
+
21
+
22 typename rclcpp::Client<SrvT>::FutureAndRequestId call_async(const std::shared_ptr<typename SrvT::Request>& request) {
+
23 return this->client_->async_send_request(request);
+
24 }
+
25
+
26 std::shared_ptr<rclcpp::Client<SrvT>> client_;
+
27};
+
28}// namespace modulo_utils::testutils
+ +
+ + + + diff --git a/versions/v3.0.0/_subscription_handler_8cpp_source.html b/versions/v3.0.0/_subscription_handler_8cpp_source.html new file mode 100644 index 00000000..507e867d --- /dev/null +++ b/versions/v3.0.0/_subscription_handler_8cpp_source.html @@ -0,0 +1,195 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication/SubscriptionHandler.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
SubscriptionHandler.cpp
+
+
+
1#include "modulo_core/communication/SubscriptionHandler.hpp"
+
2
+
3#include <utility>
+
4
+ +
6
+
7template<>
+
8SubscriptionHandler<std_msgs::msg::Bool>::SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair) :
+
9 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
10
+
11template<>
+
12SubscriptionHandler<std_msgs::msg::Float64>::SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair) :
+
13 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
14template<>
+
15SubscriptionHandler<std_msgs::msg::Float64MultiArray>::SubscriptionHandler(
+
16 std::shared_ptr<MessagePairInterface> message_pair
+
17) :
+
18 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
19
+
20template<>
+
21SubscriptionHandler<std_msgs::msg::Int32>::SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair) :
+
22 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
23
+
24template<>
+
25SubscriptionHandler<std_msgs::msg::String>::SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair) :
+
26 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
27
+
28template<>
+
29SubscriptionHandler<EncodedState>::SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair) :
+
30 SubscriptionInterface(std::move(message_pair)), clock_(std::make_shared<rclcpp::Clock>()) {}
+
31
+
32template<>
+
33std::function<void(const std::shared_ptr<std_msgs::msg::Bool>)>
+
34SubscriptionHandler<std_msgs::msg::Bool>::get_callback() {
+
35 return [this](const std::shared_ptr<std_msgs::msg::Bool> message) {
+
36 try {
+
37 this->get_message_pair()->template read<std_msgs::msg::Bool, bool>(*message);
+
38 this->user_callback_();
+
39 } catch (...) {
+
40 this->handle_callback_exceptions();
+
41 }
+
42 };
+
43}
+
44
+
45template<>
+
46std::function<void(const std::shared_ptr<std_msgs::msg::Float64>)>
+
47SubscriptionHandler<std_msgs::msg::Float64>::get_callback() {
+
48 return [this](const std::shared_ptr<std_msgs::msg::Float64> message) {
+
49 try {
+
50 this->get_message_pair()->template read<std_msgs::msg::Float64, double>(*message);
+
51 this->user_callback_();
+
52 } catch (...) {
+
53 this->handle_callback_exceptions();
+
54 }
+
55 };
+
56}
+
57
+
58template<>
+
59std::function<void(const std::shared_ptr<std_msgs::msg::Float64MultiArray>)>
+
60SubscriptionHandler<std_msgs::msg::Float64MultiArray>::get_callback() {
+
61 return [this](const std::shared_ptr<std_msgs::msg::Float64MultiArray> message) {
+
62 try {
+
63 this->get_message_pair()->template read<std_msgs::msg::Float64MultiArray, std::vector<double>>(*message);
+
64 this->user_callback_();
+
65 } catch (...) {
+
66 this->handle_callback_exceptions();
+
67 }
+
68 };
+
69}
+
70
+
71template<>
+
72std::function<void(const std::shared_ptr<std_msgs::msg::Int32>)>
+
73SubscriptionHandler<std_msgs::msg::Int32>::get_callback() {
+
74 return [this](const std::shared_ptr<std_msgs::msg::Int32> message) {
+
75 try {
+
76 this->get_message_pair()->template read<std_msgs::msg::Int32, int>(*message);
+
77 this->user_callback_();
+
78 } catch (...) {
+
79 this->handle_callback_exceptions();
+
80 }
+
81 };
+
82}
+
83
+
84template<>
+
85std::function<void(const std::shared_ptr<std_msgs::msg::String>)>
+
86SubscriptionHandler<std_msgs::msg::String>::get_callback() {
+
87 return [this](const std::shared_ptr<std_msgs::msg::String> message) {
+
88 try {
+
89 this->get_message_pair()->template read<std_msgs::msg::String, std::string>(*message);
+
90 this->user_callback_();
+
91 } catch (...) {
+
92 this->handle_callback_exceptions();
+
93 }
+
94 };
+
95}
+
96
+
97template<>
+
98std::function<void(const std::shared_ptr<EncodedState>)> SubscriptionHandler<EncodedState>::get_callback() {
+
99 return [this](const std::shared_ptr<EncodedState> message) {
+
100 try {
+
101 this->get_message_pair()->template read<EncodedState, state_representation::State>(*message);
+
102 this->user_callback_();
+
103 } catch (...) {
+
104 this->handle_callback_exceptions();
+
105 }
+
106 };
+
107}
+
108}// namespace modulo_core::communication
+
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair=nullptr)
Constructor with the message pair.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
+ + + + diff --git a/versions/v3.0.0/_subscription_handler_8hpp_source.html b/versions/v3.0.0/_subscription_handler_8hpp_source.html new file mode 100644 index 00000000..7d057e16 --- /dev/null +++ b/versions/v3.0.0/_subscription_handler_8hpp_source.html @@ -0,0 +1,185 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/SubscriptionHandler.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
SubscriptionHandler.hpp
+
+
+
1#pragma once
+
2
+
3#include "modulo_core/communication/SubscriptionInterface.hpp"
+
4#include "modulo_core/exceptions/NullPointerException.hpp"
+
5
+ +
7
+
13template<typename MsgT>
+ +
15public:
+
20 explicit SubscriptionHandler(std::shared_ptr<MessagePairInterface> message_pair = nullptr);
+
21
+
25 ~SubscriptionHandler() override;
+
26
+
30 [[nodiscard]] std::shared_ptr<rclcpp::Subscription<MsgT>> get_subscription() const;
+
31
+
37 void set_subscription(const std::shared_ptr<rclcpp::Subscription<MsgT>>& subscription);
+
38
+
43 void set_user_callback(const std::function<void()>& user_callback);
+
44
+
48 std::function<void(const std::shared_ptr<MsgT>)> get_callback();
+
49
+
55 std::function<void(const std::shared_ptr<MsgT>)> get_callback(const std::function<void()>& user_callback);
+
56
+
65 std::shared_ptr<SubscriptionInterface>
+
66 create_subscription_interface(const std::shared_ptr<rclcpp::Subscription<MsgT>>& subscription);
+
67
+
68private:
+
72 void handle_callback_exceptions();
+
73
+
74 std::shared_ptr<rclcpp::Subscription<MsgT>> subscription_;
+
75 std::shared_ptr<rclcpp::Clock> clock_;
+
76 std::function<void()> user_callback_ = []{};
+
77};
+
78
+
79template<typename MsgT>
+ +
81 this->subscription_.reset();
+
82}
+
83
+
84template<typename MsgT>
+
85std::shared_ptr<rclcpp::Subscription<MsgT>> SubscriptionHandler<MsgT>::get_subscription() const {
+
86 return this->subscription_;
+
87}
+
88
+
89template<typename MsgT>
+
90void SubscriptionHandler<MsgT>::set_subscription(const std::shared_ptr<rclcpp::Subscription<MsgT>>& subscription) {
+
91 if (subscription == nullptr) {
+
92 throw exceptions::NullPointerException("Provide a valid pointer");
+
93 }
+
94 this->subscription_ = subscription;
+
95}
+
96
+
97template<typename MsgT>
+
98void SubscriptionHandler<MsgT>::set_user_callback(const std::function<void()>& user_callback) {
+
99 this->user_callback_ = user_callback;
+
100}
+
101
+
102template<typename MsgT>
+
103std::function<void(const std::shared_ptr<MsgT>)>
+
104SubscriptionHandler<MsgT>::get_callback(const std::function<void()>& user_callback) {
+
105 this->set_user_callback(user_callback);
+
106 return this->get_callback();
+
107}
+
108
+
109template<typename MsgT>
+
110std::shared_ptr<SubscriptionInterface> SubscriptionHandler<MsgT>::create_subscription_interface(
+
111 const std::shared_ptr<rclcpp::Subscription<MsgT>>& subscription
+
112) {
+
113 this->set_subscription(subscription);
+
114 return std::shared_ptr<SubscriptionInterface>(this->shared_from_this());
+
115}
+
116
+
117template<typename MsgT>
+ +
119 try {
+
120 // re-throw the original exception
+
121 throw;
+
122 } catch (const exceptions::CoreException& ex) {
+
123 RCLCPP_WARN_STREAM_THROTTLE(rclcpp::get_logger("SubscriptionHandler"), *this->clock_, 1000,
+
124 "Exception in subscription callback: " << ex.what());
+
125 } catch (const std::exception& ex) {
+
126 RCLCPP_WARN_STREAM_THROTTLE(rclcpp::get_logger("SubscriptionHandler"), *this->clock_, 1000,
+
127 "Unhandled exception in subscription user callback: " << ex.what());
+
128 }
+
129}
+
130
+
131}// namespace modulo_core::communication
+
The SubscriptionHandler handles different types of ROS subscriptions to receive data from those subsc...
+
std::function< void(const std::shared_ptr< MsgT >)> get_callback()
Get a callback function that will be associated with the ROS subscription to receive and translate me...
+
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair=nullptr)
Constructor with the message pair.
+
~SubscriptionHandler() override
Destructor to explicitly reset the subscription pointer.
+
std::shared_ptr< SubscriptionInterface > create_subscription_interface(const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)
Create a SubscriptionInterface pointer through an instance of a SubscriptionHandler by providing a RO...
+
std::shared_ptr< rclcpp::Subscription< MsgT > > get_subscription() const
Getter of the ROS subscription.
+
void set_subscription(const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)
Setter of the ROS subscription.
+
void set_user_callback(const std::function< void()> &user_callback)
Setter of a user callback function to be executed after the subscription callback.
+
Interface class to enable non-templated subscriptions with ROS subscriptions from derived Subscriptio...
+
A base class for all core exceptions.
+
An exception class to notify that a certain pointer is null.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
+ + + + diff --git a/versions/v3.0.0/_subscription_interface_8cpp_source.html b/versions/v3.0.0/_subscription_interface_8cpp_source.html new file mode 100644 index 00000000..b94a182d --- /dev/null +++ b/versions/v3.0.0/_subscription_interface_8cpp_source.html @@ -0,0 +1,110 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication/SubscriptionInterface.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
SubscriptionInterface.cpp
+
+
+
1#include "modulo_core/communication/SubscriptionInterface.hpp"
+
2
+
3#include "modulo_core/exceptions/NullPointerException.hpp"
+
4
+ +
6
+
7SubscriptionInterface::SubscriptionInterface(std::shared_ptr<MessagePairInterface> message_pair) :
+
8 message_pair_(std::move(message_pair)) {}
+
9
+
10std::shared_ptr<MessagePairInterface> SubscriptionInterface::get_message_pair() const {
+
11 return this->message_pair_;
+
12}
+
13
+
14void SubscriptionInterface::set_message_pair(const std::shared_ptr<MessagePairInterface>& message_pair) {
+
15 if (message_pair == nullptr) {
+
16 throw exceptions::NullPointerException("Provide a valid pointer");
+
17 }
+
18 this->message_pair_ = message_pair;
+
19}
+
20}// namespace modulo_core::communication
+
SubscriptionInterface(std::shared_ptr< MessagePairInterface > message_pair=nullptr)
Constructor with the message pair.
+
void set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)
Set the pointer to the message pair of the SubscriptionInterface.
+
std::shared_ptr< MessagePairInterface > get_message_pair() const
Get the pointer to the message pair of the SubscriptionInterface.
+
An exception class to notify that a certain pointer is null.
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
+ + + + diff --git a/versions/v3.0.0/_subscription_interface_8hpp_source.html b/versions/v3.0.0/_subscription_interface_8hpp_source.html new file mode 100644 index 00000000..51dc8b19 --- /dev/null +++ b/versions/v3.0.0/_subscription_interface_8hpp_source.html @@ -0,0 +1,144 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication/SubscriptionInterface.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
SubscriptionInterface.hpp
+
+
+
1#pragma once
+
2
+
3#include <rclcpp/subscription.hpp>
+
4
+
5#include "modulo_core/communication/MessagePair.hpp"
+
6#include "modulo_core/exceptions/InvalidPointerCastException.hpp"
+
7#include "modulo_core/exceptions/InvalidPointerException.hpp"
+
8
+ +
10
+
11// forward declaration of derived SubscriptionHandler class
+
12template<typename MsgT>
+
13class SubscriptionHandler;
+
14
+
20class SubscriptionInterface : public std::enable_shared_from_this<SubscriptionInterface> {
+
21public:
+
26 explicit SubscriptionInterface(std::shared_ptr<MessagePairInterface> message_pair = nullptr);
+
27
+
31 SubscriptionInterface(const SubscriptionInterface& subscription) = default;
+
32
+
36 virtual ~SubscriptionInterface() = default;
+
37
+
56 template<typename MsgT>
+
57 std::shared_ptr<SubscriptionHandler<MsgT>> get_handler(bool validate_pointer = true);
+
58
+
62 [[nodiscard]] std::shared_ptr<MessagePairInterface> get_message_pair() const;
+
63
+
68 void set_message_pair(const std::shared_ptr<MessagePairInterface>& message_pair);
+
69
+
70private:
+
71 std::shared_ptr<MessagePairInterface> message_pair_;
+
72};
+
73
+
74template<typename MsgT>
+
75inline std::shared_ptr<SubscriptionHandler<MsgT>> SubscriptionInterface::get_handler(bool validate_pointer) {
+
76 std::shared_ptr<SubscriptionHandler<MsgT>> subscription_ptr;
+
77 try {
+
78 subscription_ptr = std::dynamic_pointer_cast<SubscriptionHandler<MsgT>>(this->shared_from_this());
+
79 } catch (const std::exception& ex) {
+
80 if (validate_pointer) {
+
81 throw exceptions::InvalidPointerException("Subscription interface is not managed by a valid pointer");
+
82 }
+
83 }
+
84 if (subscription_ptr == nullptr && validate_pointer) {
+ +
86 "Unable to cast subscription interface to a subscription pointer of requested type");
+
87 }
+
88 return subscription_ptr;
+
89}
+
90}// namespace modulo_core::communication
+
Interface class to enable non-templated subscriptions with ROS subscriptions from derived Subscriptio...
+
SubscriptionInterface(const SubscriptionInterface &subscription)=default
Copy constructor from another SubscriptionInterface.
+
std::shared_ptr< SubscriptionHandler< MsgT > > get_handler(bool validate_pointer=true)
Get a pointer to a derived SubscriptionHandler instance from a SubscriptionInterface pointer.
+
void set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)
Set the pointer to the message pair of the SubscriptionInterface.
+
std::shared_ptr< MessagePairInterface > get_message_pair() const
Get the pointer to the message pair of the SubscriptionInterface.
+
virtual ~SubscriptionInterface()=default
Default virtual destructor.
+
An exception class to notify if the result of getting an instance of a derived class through dynamic ...
+
An exception class to notify if an object has no reference count (if the object is not owned by any p...
+
Modulo Core communication module for handling messages on publication and subscription interfaces.
Definition: MessagePair.hpp:10
+
+ + + + diff --git a/versions/v3.0.0/annotated.html b/versions/v3.0.0/annotated.html new file mode 100644 index 00000000..498d2054 --- /dev/null +++ b/versions/v3.0.0/annotated.html @@ -0,0 +1,116 @@ + + + + + + + +Modulo: Class List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Nmodulo_componentsModulo components
 NexceptionsModulo component exception classes
 CAddServiceExceptionAn exception class to notify errors when adding a service
 CAddSignalExceptionAn exception class to notify errors when adding a signal
 CComponentExceptionA base class for all component exceptions
 CComponentParameterExceptionAn exception class to notify errors with component parameters
 CLookupTransformExceptionAn exception class to notify an error while looking up TF transforms
 CComponentA wrapper for rclcpp::Node to simplify application composition through unified component interfaces
 CComponentInterfaceBase interface class for modulo components to wrap a ROS Node with custom behaviour
 CComponentInterfacePublicInterfaceFriend class to the ComponentInterface to allow test fixtures to access protected and private members
 CComponentServiceResponseResponse structure to be returned by component services
 CLifecycleComponentA wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions
 Nmodulo_coreModulo Core
 NcommunicationModulo Core communication module for handling messages on publication and subscription interfaces
 CMessagePairThe MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages
 CMessagePairInterfaceInterface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting
 CPublisherHandlerThe PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers
 CPublisherInterfaceInterface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting
 CSubscriptionHandlerThe SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions
 CSubscriptionInterfaceInterface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting
 NexceptionsModulo Core exceptions module for defining exception classes
 CCoreExceptionA base class for all core exceptions
 CInvalidPointerCastExceptionAn exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class
 CInvalidPointerExceptionAn exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting
 CMessageTranslationExceptionAn exception class to notify that the translation of a ROS message failed
 CNullPointerExceptionAn exception class to notify that a certain pointer is null
 CParameterTranslationExceptionAn exception class to notify incompatibility when translating parameters from different sources
 Nmodulo_utils
 Ntestutils
 CPredicatesListener
 CServiceClient
+
+
+ + + + diff --git a/versions/v3.0.0/bc_s.png b/versions/v3.0.0/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/versions/v3.0.0/bc_s.png differ diff --git a/versions/v3.0.0/bc_sd.png b/versions/v3.0.0/bc_sd.png new file mode 100644 index 00000000..31ca888d Binary files /dev/null and b/versions/v3.0.0/bc_sd.png differ diff --git a/versions/v3.0.0/bdwn.png b/versions/v3.0.0/bdwn.png new file mode 100644 index 00000000..940a0b95 Binary files /dev/null and b/versions/v3.0.0/bdwn.png differ diff --git a/versions/v3.0.0/classes.html b/versions/v3.0.0/classes.html new file mode 100644 index 00000000..62df2adb --- /dev/null +++ b/versions/v3.0.0/classes.html @@ -0,0 +1,108 @@ + + + + + + + +Modulo: Class Index + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | C | I | L | M | N | P | S
+
+
+
A
+
AddServiceException (modulo_components::exceptions)
AddSignalException (modulo_components::exceptions)
+
+
C
+
Component (modulo_components)
ComponentException (modulo_components::exceptions)
ComponentInterface (modulo_components)
ComponentInterfacePublicInterface (modulo_components)
ComponentParameterException (modulo_components::exceptions)
ComponentServiceResponse (modulo_components)
CoreException (modulo_core::exceptions)
+
+
I
+
InvalidPointerCastException (modulo_core::exceptions)
InvalidPointerException (modulo_core::exceptions)
+
+
L
+
LifecycleComponent (modulo_components)
LookupTransformException (modulo_components::exceptions)
+
+
M
+
MessagePair (modulo_core::communication)
MessagePairInterface (modulo_core::communication)
MessageTranslationException (modulo_core::exceptions)
+
+
N
+
NullPointerException (modulo_core::exceptions)
+
+
P
+
ParameterTranslationException (modulo_core::exceptions)
PredicatesListener (modulo_utils::testutils)
PublisherHandler (modulo_core::communication)
PublisherInterface (modulo_core::communication)
+
+
S
+
ServiceClient (modulo_utils::testutils)
SubscriptionHandler (modulo_core::communication)
SubscriptionInterface (modulo_core::communication)
+
+
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_component-members.html b/versions/v3.0.0/classmodulo__components_1_1_component-members.html new file mode 100644 index 00000000..93be979b --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_component-members.html @@ -0,0 +1,142 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::Component Member List
+
+
+ +

This is the complete list of members for modulo_components::Component, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_input(const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)modulo_components::Componentinlineprotected
add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_parameter(const std::string &name, const T &value, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_periodic_callback(const std::string &name, const std::function< void(void)> &callback)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_static_tf_broadcaster()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_tf_broadcaster()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_tf_listener()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
add_trigger(const std::string &trigger_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
Component(const rclcpp::NodeOptions &node_options, const std::string &fallback_name="Component")modulo_components::Componentexplicit
ComponentInterface(const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")modulo_components::ComponentInterface< rclcpp::Node >explicit
ComponentPublicInterface (defined in modulo_components::Component)modulo_components::Componentfriend
create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
declare_input(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
declare_output(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
evaluate_periodic_callbacks()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
execute()modulo_components::Componentprotected
get_parameter(const std::string &name) constmodulo_components::ComponentInterface< rclcpp::Node >inlineprotected
get_parameter_value(const std::string &name) constmodulo_components::ComponentInterface< rclcpp::Node >inlineprotected
get_predicate(const std::string &predicate_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
get_qos() constmodulo_components::ComponentInterface< rclcpp::Node >inlineprotected
inputs_modulo_components::ComponentInterface< rclcpp::Node >protected
lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
lookup_transform(const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
on_execute_callback()modulo_components::Componentprotectedvirtual
on_validate_parameter_callback(const std::shared_ptr< state_representation::ParameterInterface > &parameter)modulo_components::ComponentInterface< rclcpp::Node >inlineprotectedvirtual
outputs_modulo_components::ComponentInterface< rclcpp::Node >protected
periodic_outputs_modulo_components::ComponentInterface< rclcpp::Node >protected
publish_output(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
publish_outputs()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
publish_predicate(const std::string &name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
publish_predicates()modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
publish_transforms(const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
qos_modulo_components::ComponentInterface< rclcpp::Node >protected
raise_error()modulo_components::ComponentInterface< rclcpp::Node >inlineprotectedvirtual
remove_input(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
remove_output(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
send_static_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
send_static_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
send_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
send_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
set_parameter_value(const std::string &name, const T &value)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
set_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
set_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
set_qos(const rclcpp::QoS &qos)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
trigger(const std::string &trigger_name)modulo_components::ComponentInterface< rclcpp::Node >inlineprotected
~Component()=defaultmodulo_components::Componentvirtual
~ComponentInterface()=defaultmodulo_components::ComponentInterface< rclcpp::Node >virtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_component.html b/versions/v3.0.0/classmodulo__components_1_1_component.html new file mode 100644 index 00000000..6f2c0145 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_component.html @@ -0,0 +1,505 @@ + + + + + + + +Modulo: modulo_components::Component Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +Friends | +List of all members
+
modulo_components::Component Class Reference
+
+
+ +

A wrapper for rclcpp::Node to simplify application composition through unified component interfaces. + More...

+ +

#include <Component.hpp>

+
+Inheritance diagram for modulo_components::Component:
+
+
+ + +modulo_components::ComponentInterface< rclcpp::Node > + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

 Component (const rclcpp::NodeOptions &node_options, const std::string &fallback_name="Component")
 Constructor from node options. More...
 
+virtual ~Component ()=default
 Virtual default destructor.
 
- Public Member Functions inherited from modulo_components::ComponentInterface< rclcpp::Node >
 ComponentInterface (const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")
 Constructor from node options. More...
 
+virtual ~ComponentInterface ()=default
 Virtual default destructor.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

void execute ()
 Start the execution thread. More...
 
virtual bool on_execute_callback ()
 Execute the component logic. To be redefined in derived classes. More...
 
template<typename DataT >
void add_output (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)
 Add and configure an output signal of the component. More...
 
- Protected Member Functions inherited from modulo_components::ComponentInterface< rclcpp::Node >
virtual void step ()
 Step function that is called periodically. More...
 
void add_parameter (const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
void add_parameter (const std::string &name, const T &value, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
std::shared_ptr< state_representation::ParameterInterface > get_parameter (const std::string &name) const
 Get a parameter by name. More...
 
get_parameter_value (const std::string &name) const
 Get a parameter value by name. More...
 
void set_parameter_value (const std::string &name, const T &value)
 Set the value of a parameter. More...
 
virtual bool on_validate_parameter_callback (const std::shared_ptr< state_representation::ParameterInterface > &parameter)
 Parameter validation function to be redefined by derived Component classes. More...
 
void add_predicate (const std::string &predicate_name, bool predicate_value)
 Add a predicate to the map of predicates. More...
 
void add_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Add a predicate to the map of predicates based on a function to periodically call. More...
 
bool get_predicate (const std::string &predicate_name)
 Get the logical value of a predicate. More...
 
void set_predicate (const std::string &predicate_name, bool predicate_value)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void set_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void add_trigger (const std::string &trigger_name)
 Add a trigger to the component. Triggers are predicates that are always false except when it's triggered in which case it is set back to false immediately after it is read. More...
 
void trigger (const std::string &trigger_name)
 Latch the trigger with the provided name. More...
 
void declare_input (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an input to create the topic parameter without adding it to the map of inputs yet. More...
 
void declare_output (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an output to create the topic parameter without adding it to the map of outputs yet. More...
 
void remove_input (const std::string &signal_name)
 Remove an input from the map of inputs. More...
 
void remove_output (const std::string &signal_name)
 Remove an output from the map of outputs. More...
 
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_input (const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)
 Add a service to trigger a callback function with no input arguments. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)
 Add a service to trigger a callback function with a string payload. More...
 
void add_periodic_callback (const std::string &name, const std::function< void(void)> &callback)
 Add a periodic callback function. More...
 
void add_tf_broadcaster ()
 Configure a transform broadcaster. More...
 
void add_static_tf_broadcaster ()
 Configure a static transform broadcaster. More...
 
void add_tf_listener ()
 Configure a transform buffer and listener. More...
 
std::string create_output (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
 Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of outputs. More...
 
rclcpp::QoS get_qos () const
 Getter of the Quality of Service attribute. More...
 
void set_qos (const rclcpp::QoS &qos)
 Set the Quality of Service for ROS publishers and subscribers. More...
 
void publish_output (const std::string &signal_name)
 Trigger the publishing of an output. More...
 
void send_transform (const state_representation::CartesianPose &transform)
 Send a transform to TF. More...
 
void send_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of transforms to TF. More...
 
void send_static_transform (const state_representation::CartesianPose &transform)
 Send a static transform to TF. More...
 
void send_static_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of static transforms to TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)
 Look up a transform from TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))
 Look up a transform from TF. More...
 
void publish_predicate (const std::string &name)
 Helper function to publish a predicate. More...
 
void publish_predicates ()
 Helper function to publish all predicates. More...
 
void publish_outputs ()
 Helper function to publish all output signals. More...
 
void evaluate_periodic_callbacks ()
 Helper function to evaluate all periodic function callbacks. More...
 
void publish_transforms (const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)
 Helper function to send a vector of transforms through a transform broadcaster. More...
 
virtual void raise_error ()
 Put the component in error state by setting the 'in_error_state' predicate to true. More...
 
+ + + +

+Friends

class ComponentPublicInterface
 
+ + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from modulo_components::ComponentInterface< rclcpp::Node >
std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
 Map of inputs. More...
 
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
 Map of outputs. More...
 
std::map< std::string, bool > periodic_outputs_
 Map of outputs with periodic publishing flag. More...
 
rclcpp::QoS qos_
 Quality of Service for ROS publishers and subscribers. More...
 
+

Detailed Description

+

A wrapper for rclcpp::Node to simplify application composition through unified component interfaces.

+

This class is intended for direct inheritance to implement custom components that perform one-shot or externally triggered operations. Examples of triggered behavior include providing a service, processing signals or publishing outputs on a periodic timer. One-shot behaviors may include interacting with the filesystem or publishing a predefined sequence of outputs. Developers should override on_validate_parameter_callback() if any parameters are added and on_execute_callback() to implement any one-shot behavior. In the latter case, execute() should be invoked at the end of the derived constructor.

See also
LifecycleComponent for a state-based composition alternative
+ +

Definition at line 26 of file Component.hpp.

+

Constructor & Destructor Documentation

+ +

◆ Component()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_components::Component::Component (const rclcpp::NodeOptions & node_options,
const std::string & fallback_name = "Component" 
)
+
+explicit
+
+ +

Constructor from node options.

+
Parameters
+ + + +
node_optionsNode options as used in ROS2 Node
fallback_nameThe name of the component if it was not provided through the node options
+
+
+ +

Definition at line 7 of file Component.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ add_output()

+ +
+
+
+template<typename DataT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::Component::add_output (const std::string & signal_name,
const std::shared_ptr< DataT > & data,
const std::string & default_topic = "",
bool fixed_topic = false,
bool publish_on_step = true 
)
+
+inlineprotected
+
+ +

Add and configure an output signal of the component.

+
Template Parameters
+ + +
DataTType of the data pointer
+
+
+
Parameters
+ + + + + + +
signal_nameName of the output signal
dataData to transmit on the output signal
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the output signal is fixed
publish_on_stepIf true, the output is published periodically on step
+
+
+ +

Definition at line 95 of file Component.hpp.

+ +
+
+ +

◆ execute()

+ +
+
+ + + + + +
+ + + + + + + +
void modulo_components::Component::execute ()
+
+protected
+
+ +

Start the execution thread.

+ +

Definition at line 23 of file Component.cpp.

+ +
+
+ +

◆ on_execute_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::Component::on_execute_callback ()
+
+protectedvirtual
+
+ +

Execute the component logic. To be redefined in derived classes.

+
Returns
True, if the execution was successful, false otherwise
+ +

Definition at line 47 of file Component.cpp.

+ +
+
+

Friends And Related Function Documentation

+ +

◆ ComponentPublicInterface

+ +
+
+ + + + + +
+ + + + +
friend class ComponentPublicInterface
+
+friend
+
+ +

Definition at line 28 of file Component.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_component.png b/versions/v3.0.0/classmodulo__components_1_1_component.png new file mode 100644 index 00000000..a96ce11b Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1_component.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1_component_interface-members.html b/versions/v3.0.0/classmodulo__components_1_1_component_interface-members.html new file mode 100644 index 00000000..145b53c4 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_component_interface-members.html @@ -0,0 +1,139 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::ComponentInterface< NodeT > Member List
+
+
+ +

This is the complete list of members for modulo_components::ComponentInterface< NodeT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< NodeT >inlineprotected
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< NodeT >inlineprotected
add_input(const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< NodeT >inlineprotected
add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< NodeT >inlineprotected
add_parameter(const std::string &name, const T &value, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< NodeT >inlineprotected
add_periodic_callback(const std::string &name, const std::function< void(void)> &callback)modulo_components::ComponentInterface< NodeT >inlineprotected
add_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< NodeT >inlineprotected
add_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< NodeT >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)modulo_components::ComponentInterface< NodeT >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)modulo_components::ComponentInterface< NodeT >inlineprotected
add_static_tf_broadcaster()modulo_components::ComponentInterface< NodeT >inlineprotected
add_tf_broadcaster()modulo_components::ComponentInterface< NodeT >inlineprotected
add_tf_listener()modulo_components::ComponentInterface< NodeT >inlineprotected
add_trigger(const std::string &trigger_name)modulo_components::ComponentInterface< NodeT >inlineprotected
ComponentInterface(const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")modulo_components::ComponentInterface< NodeT >explicit
ComponentInterfacePublicInterface< rclcpp::Node > (defined in modulo_components::ComponentInterface< NodeT >)modulo_components::ComponentInterface< NodeT >friend
ComponentInterfacePublicInterface< rclcpp_lifecycle::LifecycleNode > (defined in modulo_components::ComponentInterface< NodeT >)modulo_components::ComponentInterface< NodeT >friend
create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)modulo_components::ComponentInterface< NodeT >inlineprotected
declare_input(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< NodeT >inlineprotected
declare_output(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< NodeT >inlineprotected
evaluate_periodic_callbacks()modulo_components::ComponentInterface< NodeT >inlineprotected
get_parameter(const std::string &name) constmodulo_components::ComponentInterface< NodeT >inlineprotected
get_parameter_value(const std::string &name) constmodulo_components::ComponentInterface< NodeT >inlineprotected
get_predicate(const std::string &predicate_name)modulo_components::ComponentInterface< NodeT >inlineprotected
get_qos() constmodulo_components::ComponentInterface< NodeT >inlineprotected
inputs_modulo_components::ComponentInterface< NodeT >protected
lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)modulo_components::ComponentInterface< NodeT >inlineprotected
lookup_transform(const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))modulo_components::ComponentInterface< NodeT >inlineprotected
on_validate_parameter_callback(const std::shared_ptr< state_representation::ParameterInterface > &parameter)modulo_components::ComponentInterface< NodeT >inlineprotectedvirtual
outputs_modulo_components::ComponentInterface< NodeT >protected
periodic_outputs_modulo_components::ComponentInterface< NodeT >protected
publish_output(const std::string &signal_name)modulo_components::ComponentInterface< NodeT >inlineprotected
publish_outputs()modulo_components::ComponentInterface< NodeT >inlineprotected
publish_predicate(const std::string &name)modulo_components::ComponentInterface< NodeT >inlineprotected
publish_predicates()modulo_components::ComponentInterface< NodeT >inlineprotected
publish_transforms(const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)modulo_components::ComponentInterface< NodeT >inlineprotected
qos_modulo_components::ComponentInterface< NodeT >protected
raise_error()modulo_components::ComponentInterface< NodeT >inlineprotectedvirtual
remove_input(const std::string &signal_name)modulo_components::ComponentInterface< NodeT >inlineprotected
remove_output(const std::string &signal_name)modulo_components::ComponentInterface< NodeT >inlineprotected
send_static_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< NodeT >inlineprotected
send_static_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< NodeT >inlineprotected
send_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< NodeT >inlineprotected
send_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< NodeT >inlineprotected
set_parameter_value(const std::string &name, const T &value)modulo_components::ComponentInterface< NodeT >inlineprotected
set_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< NodeT >inlineprotected
set_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< NodeT >inlineprotected
set_qos(const rclcpp::QoS &qos)modulo_components::ComponentInterface< NodeT >inlineprotected
step()modulo_components::ComponentInterface< NodeT >inlineprotectedvirtual
trigger(const std::string &trigger_name)modulo_components::ComponentInterface< NodeT >inlineprotected
~ComponentInterface()=defaultmodulo_components::ComponentInterface< NodeT >virtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_component_interface.html b/versions/v3.0.0/classmodulo__components_1_1_component_interface.html new file mode 100644 index 00000000..3dee6489 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_component_interface.html @@ -0,0 +1,2527 @@ + + + + + + + +Modulo: modulo_components::ComponentInterface< NodeT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +Protected Attributes | +Friends | +List of all members
+
modulo_components::ComponentInterface< NodeT > Class Template Reference
+
+
+ +

Base interface class for modulo components to wrap a ROS Node with custom behaviour. + More...

+ +

#include <ComponentInterface.hpp>

+
+Inheritance diagram for modulo_components::ComponentInterface< NodeT >:
+
+
+ +
+ + + + + + + + +

+Public Member Functions

 ComponentInterface (const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")
 Constructor from node options. More...
 
+virtual ~ComponentInterface ()=default
 Virtual default destructor.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

virtual void step ()
 Step function that is called periodically. More...
 
void add_parameter (const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
template<typename T >
void add_parameter (const std::string &name, const T &value, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
std::shared_ptr< state_representation::ParameterInterface > get_parameter (const std::string &name) const
 Get a parameter by name. More...
 
template<typename T >
get_parameter_value (const std::string &name) const
 Get a parameter value by name. More...
 
template<typename T >
void set_parameter_value (const std::string &name, const T &value)
 Set the value of a parameter. More...
 
virtual bool on_validate_parameter_callback (const std::shared_ptr< state_representation::ParameterInterface > &parameter)
 Parameter validation function to be redefined by derived Component classes. More...
 
void add_predicate (const std::string &predicate_name, bool predicate_value)
 Add a predicate to the map of predicates. More...
 
void add_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Add a predicate to the map of predicates based on a function to periodically call. More...
 
bool get_predicate (const std::string &predicate_name)
 Get the logical value of a predicate. More...
 
void set_predicate (const std::string &predicate_name, bool predicate_value)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void set_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void add_trigger (const std::string &trigger_name)
 Add a trigger to the component. Triggers are predicates that are always false except when it's triggered in which case it is set back to false immediately after it is read. More...
 
void trigger (const std::string &trigger_name)
 Latch the trigger with the provided name. More...
 
void declare_input (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an input to create the topic parameter without adding it to the map of inputs yet. More...
 
void declare_output (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an output to create the topic parameter without adding it to the map of outputs yet. More...
 
void remove_input (const std::string &signal_name)
 Remove an input from the map of inputs. More...
 
void remove_output (const std::string &signal_name)
 Remove an output from the map of outputs. More...
 
template<typename DataT >
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
template<typename DataT >
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
template<typename MsgT >
void add_input (const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)
 Add a service to trigger a callback function with no input arguments. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)
 Add a service to trigger a callback function with a string payload. More...
 
void add_periodic_callback (const std::string &name, const std::function< void(void)> &callback)
 Add a periodic callback function. More...
 
void add_tf_broadcaster ()
 Configure a transform broadcaster. More...
 
void add_static_tf_broadcaster ()
 Configure a static transform broadcaster. More...
 
void add_tf_listener ()
 Configure a transform buffer and listener. More...
 
template<typename DataT >
std::string create_output (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
 Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of outputs. More...
 
rclcpp::QoS get_qos () const
 Getter of the Quality of Service attribute. More...
 
void set_qos (const rclcpp::QoS &qos)
 Set the Quality of Service for ROS publishers and subscribers. More...
 
void publish_output (const std::string &signal_name)
 Trigger the publishing of an output. More...
 
void send_transform (const state_representation::CartesianPose &transform)
 Send a transform to TF. More...
 
void send_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of transforms to TF. More...
 
void send_static_transform (const state_representation::CartesianPose &transform)
 Send a static transform to TF. More...
 
void send_static_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of static transforms to TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)
 Look up a transform from TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))
 Look up a transform from TF. More...
 
void publish_predicate (const std::string &name)
 Helper function to publish a predicate. More...
 
void publish_predicates ()
 Helper function to publish all predicates. More...
 
void publish_outputs ()
 Helper function to publish all output signals. More...
 
void evaluate_periodic_callbacks ()
 Helper function to evaluate all periodic function callbacks. More...
 
template<typename T >
void publish_transforms (const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)
 Helper function to send a vector of transforms through a transform broadcaster. More...
 
virtual void raise_error ()
 Put the component in error state by setting the 'in_error_state' predicate to true. More...
 
+ + + + + + + + + + + + + +

+Protected Attributes

std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
 Map of inputs. More...
 
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
 Map of outputs. More...
 
std::map< std::string, bool > periodic_outputs_
 Map of outputs with periodic publishing flag. More...
 
rclcpp::QoS qos_ = rclcpp::QoS(10)
 Quality of Service for ROS publishers and subscribers. More...
 
+ + + + + +

+Friends

class ComponentInterfacePublicInterface< rclcpp::Node >
 
class ComponentInterfacePublicInterface< rclcpp_lifecycle::LifecycleNode >
 
+

Detailed Description

+
template<class NodeT>
+class modulo_components::ComponentInterface< NodeT >

Base interface class for modulo components to wrap a ROS Node with custom behaviour.

+

This class is not intended for direct inheritance and usage by end-users. Instead, it defines the common interfaces for the derived classes modulo_components::Component and modulo_components::LifecycleComponent.

See also
Component, LifecycleComponent
+
Template Parameters
+ + +
NodeTThe rclcpp Node type
+
+
+ +

Definition at line 73 of file ComponentInterface.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ComponentInterface()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
modulo_components::ComponentInterface< NodeT >::ComponentInterface (const rclcpp::NodeOptions & node_options,
modulo_core::communication::PublisherType publisher_type,
const std::string & fallback_name = "ComponentInterface< NodeT >" 
)
+
+explicit
+
+ +

Constructor from node options.

+
Parameters
+ + + + +
node_optionsNode options as used in ROS2 Node / LifecycleNode
publisher_typeThe type of publisher that also indicates if the component is lifecycle or not
fallback_nameThe name of the component if it was not provided through the node options
+
+
+ +

Definition at line 588 of file ComponentInterface.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ add_input() [1/3]

+ +
+
+
+template<class NodeT >
+
+template<typename MsgT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_input (const std::string & signal_name,
const std::function< void(const std::shared_ptr< MsgT >)> & callback,
const std::string & default_topic = "",
bool fixed_topic = false 
)
+
+inlineprotected
+
+ +

Add and configure an input signal of the component.

+
Template Parameters
+ + +
MsgTThe ROS message type of the subscription
+
+
+
Parameters
+ + + + + +
signal_nameName of the input signal
callbackThe callback to use for the subscription
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the input signal is fixed
+
+
+ +

Definition at line 1029 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_input() [2/3]

+ +
+
+
+template<class NodeT >
+
+template<typename DataT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_input (const std::string & signal_name,
const std::shared_ptr< DataT > & data,
const std::function< void()> & callback,
const std::string & default_topic = "",
bool fixed_topic = false 
)
+
+inlineprotected
+
+ +

Add and configure an input signal of the component.

+
Template Parameters
+ + +
DataTType of the data pointer
+
+
+
Parameters
+ + + + + + +
signal_nameName of the input signal
dataData to receive on the input signal
callbackCallback function to trigger after receiving the input signal
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the input signal is fixed
+
+
+ +

Definition at line 959 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_input() [3/3]

+ +
+
+
+template<class NodeT >
+
+template<typename DataT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_input (const std::string & signal_name,
const std::shared_ptr< DataT > & data,
const std::string & default_topic = "",
bool fixed_topic = false 
)
+
+inlineprotected
+
+ +

Add and configure an input signal of the component.

+
Template Parameters
+ + +
DataTType of the data pointer
+
+
+
Parameters
+ + + + + +
signal_nameName of the input signal
dataData to receive on the input signal
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the input signal is fixed
+
+
+ +

Definition at line 950 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_parameter() [1/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_parameter (const std::shared_ptr< state_representation::ParameterInterface > & parameter,
const std::string & description,
bool read_only = false 
)
+
+inlineprotected
+
+ +

Add a parameter.

+

This method stores a pointer reference to an existing Parameter object in the local parameter map and declares the equivalent ROS parameter on the ROS interface.

Parameters
+ + + + +
parameterA ParameterInterface pointer to a Parameter instance
descriptionThe description of the parameter
read_onlyIf true, the value of the parameter cannot be changed after declaration @raise ComponentParameterError if the parameter could not be added
+
+
+ +

Definition at line 636 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_parameter() [2/2]

+ +
+
+
+template<class NodeT >
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_parameter (const std::string & name,
const T & value,
const std::string & description,
bool read_only = false 
)
+
+inlineprotected
+
+ +

Add a parameter.

+

This method creates a new Parameter object instance to reference in the local parameter map and declares the equivalent ROS parameter on the ROS interface.

Template Parameters
+ + +
TThe type of the parameter
+
+
+
Parameters
+ + + + + +
nameThe name of the parameter
valueThe value of the parameter
descriptionThe description of the parameter
read_onlyIf true, the value of the parameter cannot be changed after declaration @raise ComponentParameterError if the parameter could not be added
+
+
+ +

Definition at line 614 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_periodic_callback()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_periodic_callback (const std::string & name,
const std::function< void(void)> & callback 
)
+
+inlineprotected
+
+ +

Add a periodic callback function.

+

The provided function is evaluated periodically at the component step period.

Parameters
+ + + +
nameThe name of the callback
callbackThe callback function that is evaluated periodically
+
+
+ +

Definition at line 1120 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_predicate() [1/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_predicate (const std::string & predicate_name,
bool predicate_value 
)
+
+inlineprotected
+
+ +

Add a predicate to the map of predicates.

+
Parameters
+ + + +
predicate_namethe name of the associated predicate
predicate_valuethe boolean value of the predicate
+
+
+ +

Definition at line 756 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_predicate() [2/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_predicate (const std::string & predicate_name,
const std::function< bool(void)> & predicate_function 
)
+
+inlineprotected
+
+ +

Add a predicate to the map of predicates based on a function to periodically call.

+
Parameters
+ + + +
predicate_namethe name of the associated predicate
predicate_functionthe function to call that returns the value of the predicate
+
+
+ +

Definition at line 761 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_service() [1/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_service (const std::string & service_name,
const std::function< ComponentServiceResponse(const std::string &string)> & callback 
)
+
+inlineprotected
+
+ +

Add a service to trigger a callback function with a string payload.

+

The string payload can have an arbitrary format to parameterize and control the callback behaviour as desired. It is the responsibility of the service callback to parse the string according to some payload format. When adding a service with a string payload, be sure to document the payload format appropriately.

Parameters
+ + + +
service_nameThe name of the service
callbackA service callback function with a string argument that returns a ComponentServiceResponse
+
+
+ +

Definition at line 1092 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_service() [2/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_service (const std::string & service_name,
const std::function< ComponentServiceResponse(void)> & callback 
)
+
+inlineprotected
+
+ +

Add a service to trigger a callback function with no input arguments.

+
Parameters
+ + + +
service_nameThe name of the service
callbackA service callback function with no arguments that returns a ComponentServiceResponse
+
+
+ +

Definition at line 1065 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_static_tf_broadcaster()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::add_static_tf_broadcaster
+
+inlineprotected
+
+ +

Configure a static transform broadcaster.

+ +

Definition at line 1145 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_tf_broadcaster()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::add_tf_broadcaster
+
+inlineprotected
+
+ +

Configure a transform broadcaster.

+ +

Definition at line 1134 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_tf_listener()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::add_tf_listener
+
+inlineprotected
+
+ +

Configure a transform buffer and listener.

+ +

Definition at line 1158 of file ComponentInterface.hpp.

+ +
+
+ +

◆ add_trigger()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::add_trigger (const std::string & trigger_name)
+
+inlineprotected
+
+ +

Add a trigger to the component. Triggers are predicates that are always false except when it's triggered in which case it is set back to false immediately after it is read.

+
Parameters
+ + +
trigger_nameThe name of the trigger
+
+
+ +

Definition at line 812 of file ComponentInterface.hpp.

+ +
+
+ +

◆ create_output()

+ +
+
+
+template<class NodeT >
+
+template<typename DataT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::string modulo_components::ComponentInterface< NodeT >::create_output (const std::string & signal_name,
const std::shared_ptr< DataT > & data,
const std::string & default_topic,
bool fixed_topic,
bool publish_on_step 
)
+
+inlineprotected
+
+ +

Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of outputs.

+
Template Parameters
+ + +
DataTType of the data pointer
+
+
+
Parameters
+ + + + + + +
signal_nameName of the output signal
dataData to transmit on the output signal
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the output signal is fixed
publish_on_stepIf true, the output is published periodically on step
+
+
+
Exceptions
+ + +
modulo_components::exceptions::AddSignalExceptionif the output could not be created (empty name, already registered)
+
+
+
Returns
The parsed signal name
+ +

Definition at line 1320 of file ComponentInterface.hpp.

+ +
+
+ +

◆ declare_input()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::declare_input (const std::string & signal_name,
const std::string & default_topic = "",
bool fixed_topic = false 
)
+
+inlineprotected
+
+ +

Declare an input to create the topic parameter without adding it to the map of inputs yet.

+
Parameters
+ + + + +
signal_nameThe signal name of the input
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the signal is fixed
+
+
+
Exceptions
+ + +
modulo_components::exceptions::AddSignalExceptionif the input could not be declared (empty name or already created)
+
+
+ +

Definition at line 935 of file ComponentInterface.hpp.

+ +
+
+ +

◆ declare_output()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::declare_output (const std::string & signal_name,
const std::string & default_topic = "",
bool fixed_topic = false 
)
+
+inlineprotected
+
+ +

Declare an output to create the topic parameter without adding it to the map of outputs yet.

+
Parameters
+ + + + +
signal_nameThe signal name of the output
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the signal is fixed
+
+
+
Exceptions
+ + +
modulo_components::exceptions::AddSignalExceptionif the output could not be declared (empty name or already created)
+
+
+ +

Definition at line 942 of file ComponentInterface.hpp.

+ +
+
+ +

◆ evaluate_periodic_callbacks()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::evaluate_periodic_callbacks
+
+inlineprotected
+
+ +

Helper function to evaluate all periodic function callbacks.

+ +

Definition at line 1307 of file ComponentInterface.hpp.

+ +
+
+ +

◆ get_parameter()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
std::shared_ptr< state_representation::ParameterInterface > modulo_components::ComponentInterface< NodeT >::get_parameter (const std::string & name) const
+
+inlineprotected
+
+ +

Get a parameter by name.

+
Parameters
+ + +
nameThe name of the parameter
+
+
+
Exceptions
+ + +
modulo_components::exceptions::ComponentParameterExceptionif the parameter could not be found
+
+
+
Returns
The ParameterInterface pointer to a Parameter instance
+ +

Definition at line 679 of file ComponentInterface.hpp.

+ +
+
+ +

◆ get_parameter_value()

+ +
+
+
+template<class NodeT >
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
T modulo_components::ComponentInterface< NodeT >::get_parameter_value (const std::string & name) const
+
+inlineprotected
+
+ +

Get a parameter value by name.

+
Template Parameters
+ + +
TThe type of the parameter
+
+
+
Parameters
+ + +
nameThe name of the parameter
+
+
+
Exceptions
+ + +
modulo_components::exceptions::ComponentParameterExceptionif the parameter value could not be accessed
+
+
+
Returns
The value of the parameter
+ +

Definition at line 626 of file ComponentInterface.hpp.

+ +
+
+ +

◆ get_predicate()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
bool modulo_components::ComponentInterface< NodeT >::get_predicate (const std::string & predicate_name)
+
+inlineprotected
+
+ +

Get the logical value of a predicate.

+

If the predicate is not found or the callable function fails, the return value is false.

Parameters
+ + +
predicate_namethe name of the predicate to retrieve from the map of predicates
+
+
+
Returns
the value of the predicate as a boolean
+ +

Definition at line 784 of file ComponentInterface.hpp.

+ +
+
+ +

◆ get_qos()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
rclcpp::QoS modulo_components::ComponentInterface< NodeT >::get_qos
+
+inlineprotected
+
+ +

Getter of the Quality of Service attribute.

+
Returns
The Quality of Service attribute
+ +

Definition at line 1354 of file ComponentInterface.hpp.

+ +
+
+ +

◆ lookup_transform() [1/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
state_representation::CartesianPose modulo_components::ComponentInterface< NodeT >::lookup_transform (const std::string & frame,
const std::string & reference_frame,
const tf2::TimePoint & time_point,
const tf2::Duration & duration 
)
+
+inlineprotected
+
+ +

Look up a transform from TF.

+
Parameters
+ + + + + +
frameThe desired frame of the transform
reference_frameThe desired reference frame of the transform
time_pointThe time at which the value of the transform is desired
durationHow long to block the lookup call before failing
+
+
+
Exceptions
+ + +
modulo_components::exceptions::LookupTransformExceptionif TF buffer/listener are unconfigured or if the lookupTransform call failed
+
+
+
Returns
If it exists, the requested transform
+ +

Definition at line 1235 of file ComponentInterface.hpp.

+ +
+
+ +

◆ lookup_transform() [2/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
state_representation::CartesianPose modulo_components::ComponentInterface< NodeT >::lookup_transform (const std::string & frame,
const std::string & reference_frame = "world",
double validity_period = -1.0,
const tf2::Duration & duration = tf2::Duration(std::chrono::microseconds(10)) 
)
+
+inlineprotected
+
+ +

Look up a transform from TF.

+
Parameters
+ + + + + +
frameThe desired frame of the transform
reference_frameThe desired reference frame of the transform
validity_periodThe validity period of the latest transform from the time of lookup in seconds
durationHow long to block the lookup call before failing
+
+
+
Exceptions
+ + +
modulo_components::exceptions::LookupTransformExceptionif TF buffer/listener are unconfigured, if the lookupTransform call failed, or if the transform is too old
+
+
+
Returns
If it exists and is still valid, the requested transform
+ +

Definition at line 1246 of file ComponentInterface.hpp.

+ +
+
+ +

◆ on_validate_parameter_callback()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
bool modulo_components::ComponentInterface< NodeT >::on_validate_parameter_callback (const std::shared_ptr< state_representation::ParameterInterface > & parameter)
+
+inlineprotectedvirtual
+
+ +

Parameter validation function to be redefined by derived Component classes.

+

This method is automatically invoked whenever the ROS interface tried to modify a parameter. Validation and sanitization can be performed by reading or writing the value of the parameter through the ParameterInterface pointer, depending on the parameter name and desired component behaviour. If the validation returns true, the updated parameter value (including any modifications) is applied. If the validation returns false, any changes to the parameter are discarded and the parameter value is not changed.

Parameters
+ + +
parameterA ParameterInterface pointer to a Parameter instance
+
+
+
Returns
The validation result
+ +

Definition at line 718 of file ComponentInterface.hpp.

+ +
+
+ +

◆ publish_output()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::publish_output (const std::string & signal_name)
+
+inlineprotected
+
+ +

Trigger the publishing of an output.

+
Parameters
+ + +
signal_nameThe name of the output signal
+
+
+
Exceptions
+ + +
ComponentExceptionif the output is being published periodically or if the signal name could not be found
+
+
+ +

Definition at line 1276 of file ComponentInterface.hpp.

+ +
+
+ +

◆ publish_outputs()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::publish_outputs
+
+inlineprotected
+
+ +

Helper function to publish all output signals.

+ +

Definition at line 1293 of file ComponentInterface.hpp.

+ +
+
+ +

◆ publish_predicate()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::publish_predicate (const std::string & name)
+
+inlineprotected
+
+ +

Helper function to publish a predicate.

+
Parameters
+ + +
nameThe name of the predicate to publish
+
+
+ +

Definition at line 1260 of file ComponentInterface.hpp.

+ +
+
+ +

◆ publish_predicates()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::publish_predicates
+
+inlineprotected
+
+ +

Helper function to publish all predicates.

+ +

Definition at line 1269 of file ComponentInterface.hpp.

+ +
+
+ +

◆ publish_transforms()

+ +
+
+
+template<class NodeT >
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::publish_transforms (const std::vector< state_representation::CartesianPose > & transforms,
const std::shared_ptr< T > & tf_broadcaster,
bool is_static = false 
)
+
+inlineprotected
+
+ +

Helper function to send a vector of transforms through a transform broadcaster.

+
Template Parameters
+ + +
TThe type of the broadcaster (tf2_ros::TransformBroadcaster or tf2_ros::StaticTransformBroadcaster)
+
+
+
Parameters
+ + + + +
transformsThe transforms to send
tf_broadcasterA pointer to a configured transform broadcaster object
is_staticIf true, treat the broadcaster as a static frame broadcaster for the sake of log messages
+
+
+ +

Definition at line 1193 of file ComponentInterface.hpp.

+ +
+
+ +

◆ raise_error()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::raise_error
+
+inlineprotectedvirtual
+
+ +

Put the component in error state by setting the 'in_error_state' predicate to true.

+ +

Definition at line 1348 of file ComponentInterface.hpp.

+ +
+
+ +

◆ remove_input()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::remove_input (const std::string & signal_name)
+
+inlineprotected
+
+ +

Remove an input from the map of inputs.

+
Parameters
+ + +
signal_nameThe name of the input
+
+
+ +

Definition at line 884 of file ComponentInterface.hpp.

+ +
+
+ +

◆ remove_output()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::remove_output (const std::string & signal_name)
+
+inlineprotected
+
+ +

Remove an output from the map of outputs.

+
Parameters
+ + +
signal_nameThe name of the output
+
+
+ +

Definition at line 895 of file ComponentInterface.hpp.

+ +
+
+ +

◆ send_static_transform()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::send_static_transform (const state_representation::CartesianPose & transform)
+
+inlineprotected
+
+ +

Send a static transform to TF.

+
Parameters
+ + +
transformThe transform to send
+
+
+ +

Definition at line 1181 of file ComponentInterface.hpp.

+ +
+
+ +

◆ send_static_transforms()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::send_static_transforms (const std::vector< state_representation::CartesianPose > & transforms)
+
+inlineprotected
+
+ +

Send a vector of static transforms to TF.

+
Parameters
+ + +
transformsThe vector of transforms to send
+
+
+ +

Definition at line 1187 of file ComponentInterface.hpp.

+ +
+
+ +

◆ send_transform()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::send_transform (const state_representation::CartesianPose & transform)
+
+inlineprotected
+
+ +

Send a transform to TF.

+
Parameters
+ + +
transformThe transform to send
+
+
+ +

Definition at line 1170 of file ComponentInterface.hpp.

+ +
+
+ +

◆ send_transforms()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::send_transforms (const std::vector< state_representation::CartesianPose > & transforms)
+
+inlineprotected
+
+ +

Send a vector of transforms to TF.

+
Parameters
+ + +
transformsThe vector of transforms to send
+
+
+ +

Definition at line 1176 of file ComponentInterface.hpp.

+ +
+
+ +

◆ set_parameter_value()

+ +
+
+
+template<class NodeT >
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::set_parameter_value (const std::string & name,
const T & value 
)
+
+inlineprotected
+
+ +

Set the value of a parameter.

+

The parameter must have been previously declared. This method preserves the reference to the original Parameter instance

Template Parameters
+ + +
TThe type of the parameter
+
+
+
Parameters
+ + +
nameThe name of the parameter
+
+
+
Returns
The value of the parameter
+ +

Definition at line 689 of file ComponentInterface.hpp.

+ +
+
+ +

◆ set_predicate() [1/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::set_predicate (const std::string & predicate_name,
bool predicate_value 
)
+
+inlineprotected
+
+ +

Set the value of the predicate given as parameter, if the predicate is not found does not do anything.

+

Even though the predicates are published periodically, the new value of this predicate will be published once immediately after setting it.

Parameters
+ + + +
predicate_namethe name of the predicate to retrieve from the map of predicates
predicate_valuethe new value of the predicate
+
+
+ +

Definition at line 858 of file ComponentInterface.hpp.

+ +
+
+ +

◆ set_predicate() [2/2]

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::set_predicate (const std::string & predicate_name,
const std::function< bool(void)> & predicate_function 
)
+
+inlineprotected
+
+ +

Set the value of the predicate given as parameter, if the predicate is not found does not do anything.

+

Even though the predicates are published periodically, the new value of this predicate will be published once immediately after setting it.

Parameters
+ + + +
predicate_namethe name of the predicate to retrieve from the map of predicates
predicate_functionthe function to call that returns the value of the predicate
+
+
+ +

Definition at line 863 of file ComponentInterface.hpp.

+ +
+
+ +

◆ set_qos()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::set_qos (const rclcpp::QoS & qos)
+
+inlineprotected
+
+ +

Set the Quality of Service for ROS publishers and subscribers.

+
Parameters
+ + +
qosThe desired Quality of Service
+
+
+ +

Definition at line 1359 of file ComponentInterface.hpp.

+ +
+
+ +

◆ step()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
void modulo_components::ComponentInterface< NodeT >::step
+
+inlineprotectedvirtual
+
+ +

Step function that is called periodically.

+ +

Definition at line 610 of file ComponentInterface.hpp.

+ +
+
+ +

◆ trigger()

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + + + + + +
void modulo_components::ComponentInterface< NodeT >::trigger (const std::string & trigger_name)
+
+inlineprotected
+
+ +

Latch the trigger with the provided name.

+
Parameters
+ + +
trigger_nameThe name of the trigger
+
+
+ +

Definition at line 833 of file ComponentInterface.hpp.

+ +
+
+

Friends And Related Function Documentation

+ +

◆ ComponentInterfacePublicInterface< rclcpp::Node >

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
friend class ComponentInterfacePublicInterface< rclcpp::Node >
+
+friend
+
+ +

Definition at line 53 of file ComponentInterface.hpp.

+ +
+
+ +

◆ ComponentInterfacePublicInterface< rclcpp_lifecycle::LifecycleNode >

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
friend class ComponentInterfacePublicInterface< rclcpp_lifecycle::LifecycleNode >
+
+friend
+
+ +

Definition at line 53 of file ComponentInterface.hpp.

+ +
+
+

Member Data Documentation

+ +

◆ inputs_

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
std::map<std::string, std::shared_ptr<modulo_core::communication::SubscriptionInterface> > modulo_components::ComponentInterface< NodeT >::inputs_
+
+protected
+
+ +

Map of inputs.

+ +

Definition at line 472 of file ComponentInterface.hpp.

+ +
+
+ +

◆ outputs_

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
std::map<std::string, std::shared_ptr<modulo_core::communication::PublisherInterface> > modulo_components::ComponentInterface< NodeT >::outputs_
+
+protected
+
+ +

Map of outputs.

+ +

Definition at line 473 of file ComponentInterface.hpp.

+ +
+
+ +

◆ periodic_outputs_

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
std::map<std::string, bool> modulo_components::ComponentInterface< NodeT >::periodic_outputs_
+
+protected
+
+ +

Map of outputs with periodic publishing flag.

+ +

Definition at line 474 of file ComponentInterface.hpp.

+ +
+
+ +

◆ qos_

+ +
+
+
+template<class NodeT >
+ + + + + +
+ + + + +
rclcpp::QoS modulo_components::ComponentInterface< NodeT >::qos_ = rclcpp::QoS(10)
+
+protected
+
+ +

Quality of Service for ROS publishers and subscribers.

+ +

Definition at line 476 of file ComponentInterface.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_component_interface.png b/versions/v3.0.0/classmodulo__components_1_1_component_interface.png new file mode 100644 index 00000000..41d2ffbb Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1_component_interface.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1_component_interface_public_interface.html b/versions/v3.0.0/classmodulo__components_1_1_component_interface_public_interface.html new file mode 100644 index 00000000..b40eab42 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_component_interface_public_interface.html @@ -0,0 +1,104 @@ + + + + + + + +Modulo: modulo_components::ComponentInterfacePublicInterface< NodeT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::ComponentInterfacePublicInterface< NodeT > Class Template Reference
+
+
+ +

Friend class to the ComponentInterface to allow test fixtures to access protected and private members. + More...

+ +

#include <ComponentInterface.hpp>

+

Detailed Description

+
template<class NodeT>
+class modulo_components::ComponentInterfacePublicInterface< NodeT >

Friend class to the ComponentInterface to allow test fixtures to access protected and private members.

+
Template Parameters
+ + +
NodeTThe rclcpp Node type
+
+
+ +

Definition at line 62 of file ComponentInterface.hpp.

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component-members.html b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component-members.html new file mode 100644 index 00000000..97400c39 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component-members.html @@ -0,0 +1,147 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::LifecycleComponent Member List
+
+
+ +

This is the complete list of members for modulo_components::LifecycleComponent, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_input(const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)modulo_components::LifecycleComponentinlineprotected
add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_parameter(const std::string &name, const T &value, const std::string &description, bool read_only=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_periodic_callback(const std::string &name, const std::function< void(void)> &callback)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_service(const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_static_tf_broadcaster()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_tf_broadcaster()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_tf_listener()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
add_trigger(const std::string &trigger_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
ComponentInterface(const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >explicit
create_output(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
declare_input(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
declare_output(const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
evaluate_periodic_callbacks()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
get_parameter(const std::string &name) constmodulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
get_parameter_value(const std::string &name) constmodulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
get_predicate(const std::string &predicate_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
get_qos() constmodulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
inputs_modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >protected
LifecycleComponent(const rclcpp::NodeOptions &node_options, const std::string &fallback_name="LifecycleComponent")modulo_components::LifecycleComponentexplicit
LifecycleComponentPublicInterface (defined in modulo_components::LifecycleComponent)modulo_components::LifecycleComponentfriend
lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
lookup_transform(const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
on_activate_callback()modulo_components::LifecycleComponentprotectedvirtual
on_cleanup_callback()modulo_components::LifecycleComponentprotectedvirtual
on_configure_callback()modulo_components::LifecycleComponentprotectedvirtual
on_deactivate_callback()modulo_components::LifecycleComponentprotectedvirtual
on_error_callback()modulo_components::LifecycleComponentprotectedvirtual
on_shutdown_callback()modulo_components::LifecycleComponentprotectedvirtual
on_step_callback()modulo_components::LifecycleComponentinlineprotectedvirtual
on_validate_parameter_callback(const std::shared_ptr< state_representation::ParameterInterface > &parameter)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotectedvirtual
outputs_modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >protected
periodic_outputs_modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >protected
publish_output(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
publish_outputs()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
publish_predicate(const std::string &name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
publish_predicates()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
publish_transforms(const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
qos_modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >protected
raise_error()modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotectedvirtual
remove_input(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
remove_output(const std::string &signal_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
send_static_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
send_static_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
send_transform(const state_representation::CartesianPose &transform)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
send_transforms(const std::vector< state_representation::CartesianPose > &transforms)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
set_parameter_value(const std::string &name, const T &value)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
set_predicate(const std::string &predicate_name, bool predicate_value)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
set_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
set_qos(const rclcpp::QoS &qos)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
trigger(const std::string &trigger_name)modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >inlineprotected
~ComponentInterface()=defaultmodulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >virtual
~LifecycleComponent()=defaultmodulo_components::LifecycleComponentvirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.html b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.html new file mode 100644 index 00000000..dfb7d87a --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.html @@ -0,0 +1,679 @@ + + + + + + + +Modulo: modulo_components::LifecycleComponent Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +Friends | +List of all members
+
modulo_components::LifecycleComponent Class Reference
+
+
+ +

A wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions. + More...

+ +

#include <LifecycleComponent.hpp>

+
+Inheritance diagram for modulo_components::LifecycleComponent:
+
+
+ + +modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode > + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

 LifecycleComponent (const rclcpp::NodeOptions &node_options, const std::string &fallback_name="LifecycleComponent")
 Constructor from node options. More...
 
+virtual ~LifecycleComponent ()=default
 Virtual default destructor.
 
- Public Member Functions inherited from modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >
 ComponentInterface (const rclcpp::NodeOptions &node_options, modulo_core::communication::PublisherType publisher_type, const std::string &fallback_name="ComponentInterface")
 Constructor from node options. More...
 
+virtual ~ComponentInterface ()=default
 Virtual default destructor.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

virtual bool on_configure_callback ()
 Steps to execute when configuring the component. More...
 
virtual bool on_cleanup_callback ()
 Steps to execute when cleaning up the component. More...
 
virtual bool on_activate_callback ()
 Steps to execute when activating the component. More...
 
virtual bool on_deactivate_callback ()
 Steps to execute when deactivating the component. More...
 
virtual bool on_shutdown_callback ()
 Steps to execute when shutting down the component. More...
 
virtual bool on_error_callback ()
 Steps to execute when handling errors. More...
 
virtual void on_step_callback ()
 Steps to execute periodically. To be redefined by derived Component classes. More...
 
template<typename DataT >
void add_output (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false, bool publish_on_step=true)
 Add an output signal of the component. More...
 
- Protected Member Functions inherited from modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >
virtual void step ()
 Step function that is called periodically. More...
 
void add_parameter (const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
void add_parameter (const std::string &name, const T &value, const std::string &description, bool read_only=false)
 Add a parameter. More...
 
std::shared_ptr< state_representation::ParameterInterface > get_parameter (const std::string &name) const
 Get a parameter by name. More...
 
get_parameter_value (const std::string &name) const
 Get a parameter value by name. More...
 
void set_parameter_value (const std::string &name, const T &value)
 Set the value of a parameter. More...
 
virtual bool on_validate_parameter_callback (const std::shared_ptr< state_representation::ParameterInterface > &parameter)
 Parameter validation function to be redefined by derived Component classes. More...
 
void add_predicate (const std::string &predicate_name, bool predicate_value)
 Add a predicate to the map of predicates. More...
 
void add_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Add a predicate to the map of predicates based on a function to periodically call. More...
 
bool get_predicate (const std::string &predicate_name)
 Get the logical value of a predicate. More...
 
void set_predicate (const std::string &predicate_name, bool predicate_value)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void set_predicate (const std::string &predicate_name, const std::function< bool(void)> &predicate_function)
 Set the value of the predicate given as parameter, if the predicate is not found does not do anything. More...
 
void add_trigger (const std::string &trigger_name)
 Add a trigger to the component. Triggers are predicates that are always false except when it's triggered in which case it is set back to false immediately after it is read. More...
 
void trigger (const std::string &trigger_name)
 Latch the trigger with the provided name. More...
 
void declare_input (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an input to create the topic parameter without adding it to the map of inputs yet. More...
 
void declare_output (const std::string &signal_name, const std::string &default_topic="", bool fixed_topic=false)
 Declare an output to create the topic parameter without adding it to the map of outputs yet. More...
 
void remove_input (const std::string &signal_name)
 Remove an input from the map of inputs. More...
 
void remove_output (const std::string &signal_name)
 Remove an output from the map of outputs. More...
 
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_input (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_input (const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)
 Add and configure an input signal of the component. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)
 Add a service to trigger a callback function with no input arguments. More...
 
void add_service (const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)
 Add a service to trigger a callback function with a string payload. More...
 
void add_periodic_callback (const std::string &name, const std::function< void(void)> &callback)
 Add a periodic callback function. More...
 
void add_tf_broadcaster ()
 Configure a transform broadcaster. More...
 
void add_static_tf_broadcaster ()
 Configure a static transform broadcaster. More...
 
void add_tf_listener ()
 Configure a transform buffer and listener. More...
 
std::string create_output (const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic, bool fixed_topic, bool publish_on_step)
 Helper function to parse the signal name and add an unconfigured PublisherInterface to the map of outputs. More...
 
rclcpp::QoS get_qos () const
 Getter of the Quality of Service attribute. More...
 
void set_qos (const rclcpp::QoS &qos)
 Set the Quality of Service for ROS publishers and subscribers. More...
 
void publish_output (const std::string &signal_name)
 Trigger the publishing of an output. More...
 
void send_transform (const state_representation::CartesianPose &transform)
 Send a transform to TF. More...
 
void send_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of transforms to TF. More...
 
void send_static_transform (const state_representation::CartesianPose &transform)
 Send a static transform to TF. More...
 
void send_static_transforms (const std::vector< state_representation::CartesianPose > &transforms)
 Send a vector of static transforms to TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)
 Look up a transform from TF. More...
 
state_representation::CartesianPose lookup_transform (const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))
 Look up a transform from TF. More...
 
void publish_predicate (const std::string &name)
 Helper function to publish a predicate. More...
 
void publish_predicates ()
 Helper function to publish all predicates. More...
 
void publish_outputs ()
 Helper function to publish all output signals. More...
 
void evaluate_periodic_callbacks ()
 Helper function to evaluate all periodic function callbacks. More...
 
void publish_transforms (const std::vector< state_representation::CartesianPose > &transforms, const std::shared_ptr< T > &tf_broadcaster, bool is_static=false)
 Helper function to send a vector of transforms through a transform broadcaster. More...
 
virtual void raise_error ()
 Put the component in error state by setting the 'in_error_state' predicate to true. More...
 
+ + + +

+Friends

class LifecycleComponentPublicInterface
 
+ + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from modulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >
std::map< std::string, std::shared_ptr< modulo_core::communication::SubscriptionInterface > > inputs_
 Map of inputs. More...
 
std::map< std::string, std::shared_ptr< modulo_core::communication::PublisherInterface > > outputs_
 Map of outputs. More...
 
std::map< std::string, bool > periodic_outputs_
 Map of outputs with periodic publishing flag. More...
 
rclcpp::QoS qos_
 Quality of Service for ROS publishers and subscribers. More...
 
+

Detailed Description

+

A wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions.

+

This class is intended for direct inheritance to implement custom state-based components that perform different behaviors based on their state and on state transitions. An example of state-based behaviour is a signal component that requires configuration steps to determine which inputs to register and subsequently should publish outputs only when the component is activated. Developers should override on_validate_parameter_callback() if any parameters are added. In addition, the following state transition callbacks should be overridden whenever custom transition behavior is needed:

+ +

Definition at line 30 of file LifecycleComponent.hpp.

+

Constructor & Destructor Documentation

+ +

◆ LifecycleComponent()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_components::LifecycleComponent::LifecycleComponent (const rclcpp::NodeOptions & node_options,
const std::string & fallback_name = "LifecycleComponent" 
)
+
+explicit
+
+ +

Constructor from node options.

+
Parameters
+ + + +
node_optionsNode options as used in ROS2 LifecycleNode
fallback_nameThe name of the component if it was not provided through the node options
+
+
+ +

Definition at line 9 of file LifecycleComponent.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ add_output()

+ +
+
+
+template<typename DataT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void modulo_components::LifecycleComponent::add_output (const std::string & signal_name,
const std::shared_ptr< DataT > & data,
const std::string & default_topic = "",
bool fixed_topic = false,
bool publish_on_step = true 
)
+
+inlineprotected
+
+ +

Add an output signal of the component.

+
Template Parameters
+ + +
DataTType of the data pointer
+
+
+
Parameters
+ + + + + + +
signal_nameName of the output signal
dataData to transmit on the output signal
default_topicIf set, the default value for the topic name to use
fixed_topicIf true, the topic name of the output signal is fixed
publish_on_stepIf true, the output is published periodically on step
+
+
+ +

Definition at line 277 of file LifecycleComponent.hpp.

+ +
+
+ +

◆ on_activate_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_activate_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when activating the component.

+

This method can be overridden by derived Component classes. Activation generally involves final setup steps before the on_step callback is periodically evaluated.

Returns
True if activation is successful, false otherwise
+ +

Definition at line 123 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_cleanup_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_cleanup_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when cleaning up the component.

+

This method can be overridden by derived Component classes. Cleanup generally involves resetting the properties and states to initial conditions.

Returns
True if cleanup is successful, false otherwise
+ +

Definition at line 93 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_configure_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_configure_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when configuring the component.

+

This method can be overridden by derived Component classes. Configuration generally involves reading parameters and adding inputs and outputs.

Returns
True if configuration is successful, false otherwise
+ +

Definition at line 71 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_deactivate_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_deactivate_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when deactivating the component.

+

This method can be overridden by derived Component classes. Deactivation generally involves any steps to reset the component to an inactive state.

Returns
True if deactivation is successful, false otherwise
+ +

Definition at line 146 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_error_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_error_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when handling errors.

+

This method can be overridden by derived Component classes. Error handling generally involves recovering and resetting the component to an unconfigured state.

Returns
True if error handling is successful, false otherwise
+ +

Definition at line 219 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_shutdown_callback()

+ +
+
+ + + + + +
+ + + + + + + +
bool modulo_components::LifecycleComponent::on_shutdown_callback ()
+
+protectedvirtual
+
+ +

Steps to execute when shutting down the component.

+

This method can be overridden by derived Component classes. Shutdown generally involves the destruction of any threads or properties not handled by the base class.

Returns
True if shutdown is successful, false otherwise
+ +

Definition at line 191 of file LifecycleComponent.cpp.

+ +
+
+ +

◆ on_step_callback()

+ +
+
+ + + + + +
+ + + + + + + +
void modulo_components::LifecycleComponent::on_step_callback ()
+
+inlineprotectedvirtual
+
+ +

Steps to execute periodically. To be redefined by derived Component classes.

+ +

Definition at line 274 of file LifecycleComponent.hpp.

+ +
+
+

Friends And Related Function Documentation

+ +

◆ LifecycleComponentPublicInterface

+ +
+
+ + + + + +
+ + + + +
friend class LifecycleComponentPublicInterface
+
+friend
+
+ +

Definition at line 32 of file LifecycleComponent.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.png b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.png new file mode 100644 index 00000000..52351437 Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1_lifecycle_component.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html new file mode 100644 index 00000000..ed986ccf --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::exceptions::AddServiceException Member List
+
+
+ +

This is the complete list of members for modulo_components::exceptions::AddServiceException, including all inherited members.

+ + + + +
AddServiceException(const std::string &msg) (defined in modulo_components::exceptions::AddServiceException)modulo_components::exceptions::AddServiceExceptioninlineexplicit
ComponentException(const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineexplicit
ComponentException(const std::string &prefix, const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineprotected
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.html new file mode 100644 index 00000000..f037db2a --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_components::exceptions::AddServiceException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_components::exceptions::AddServiceException Class Reference
+
+
+ +

An exception class to notify errors when adding a service. + More...

+ +

#include <AddServiceException.hpp>

+
+Inheritance diagram for modulo_components::exceptions::AddServiceException:
+
+
+ + +modulo_components::exceptions::ComponentException + +
+ + + + + + + +

+Public Member Functions

 AddServiceException (const std::string &msg)
 
- Public Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify errors when adding a service.

+

This is an exception class to be thrown if there is a problem while adding a service to the component.

+ +

Definition at line 12 of file AddServiceException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ AddServiceException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_components::exceptions::AddServiceException::AddServiceException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 14 of file AddServiceException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.png b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.png new file mode 100644 index 00000000..cb7df987 Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_service_exception.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html new file mode 100644 index 00000000..e8fadd34 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::exceptions::AddSignalException Member List
+
+
+ +

This is the complete list of members for modulo_components::exceptions::AddSignalException, including all inherited members.

+ + + + +
AddSignalException(const std::string &msg) (defined in modulo_components::exceptions::AddSignalException)modulo_components::exceptions::AddSignalExceptioninlineexplicit
ComponentException(const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineexplicit
ComponentException(const std::string &prefix, const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineprotected
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html new file mode 100644 index 00000000..d452b518 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_components::exceptions::AddSignalException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_components::exceptions::AddSignalException Class Reference
+
+
+ +

An exception class to notify errors when adding a signal. + More...

+ +

#include <AddSignalException.hpp>

+
+Inheritance diagram for modulo_components::exceptions::AddSignalException:
+
+
+ + +modulo_components::exceptions::ComponentException + +
+ + + + + + + +

+Public Member Functions

 AddSignalException (const std::string &msg)
 
- Public Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify errors when adding a signal.

+

This is an exception class to be thrown if there is a problem while adding a signal to the component.

+ +

Definition at line 12 of file AddSignalException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ AddSignalException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_components::exceptions::AddSignalException::AddSignalException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 14 of file AddSignalException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.png b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.png new file mode 100644 index 00000000..3a13ba58 Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_add_signal_exception.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception-members.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception-members.html new file mode 100644 index 00000000..e91f9ae3 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception-members.html @@ -0,0 +1,90 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::exceptions::ComponentException Member List
+
+
+ +

This is the complete list of members for modulo_components::exceptions::ComponentException, including all inherited members.

+ + + +
ComponentException(const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineexplicit
ComponentException(const std::string &prefix, const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineprotected
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.html new file mode 100644 index 00000000..0a389e19 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.html @@ -0,0 +1,192 @@ + + + + + + + +Modulo: modulo_components::exceptions::ComponentException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
modulo_components::exceptions::ComponentException Class Reference
+
+
+ +

A base class for all component exceptions. + More...

+ +

#include <ComponentException.hpp>

+
+Inheritance diagram for modulo_components::exceptions::ComponentException:
+
+
+ + +modulo_components::exceptions::AddServiceException +modulo_components::exceptions::AddSignalException +modulo_components::exceptions::ComponentParameterException +modulo_components::exceptions::LookupTransformException + +
+ + + + +

+Public Member Functions

 ComponentException (const std::string &msg)
 
+ + + +

+Protected Member Functions

 ComponentException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

A base class for all component exceptions.

+

This inherits from std::runtime_exception.

+ +

Definition at line 17 of file ComponentException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ComponentException() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_components::exceptions::ComponentException::ComponentException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 19 of file ComponentException.hpp.

+ +
+
+ +

◆ ComponentException() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_components::exceptions::ComponentException::ComponentException (const std::string & prefix,
const std::string & msg 
)
+
+inlineprotected
+
+ +

Definition at line 21 of file ComponentException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.png b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.png new file mode 100644 index 00000000..4fff051b Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_exception.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html new file mode 100644 index 00000000..a89e0b18 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::exceptions::ComponentParameterException Member List
+
+
+ +

This is the complete list of members for modulo_components::exceptions::ComponentParameterException, including all inherited members.

+ + + + +
ComponentException(const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineexplicit
ComponentException(const std::string &prefix, const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineprotected
ComponentParameterException(const std::string &msg) (defined in modulo_components::exceptions::ComponentParameterException)modulo_components::exceptions::ComponentParameterExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html new file mode 100644 index 00000000..ef20b1fe --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_components::exceptions::ComponentParameterException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_components::exceptions::ComponentParameterException Class Reference
+
+
+ +

An exception class to notify errors with component parameters. + More...

+ +

#include <ComponentParameterException.hpp>

+
+Inheritance diagram for modulo_components::exceptions::ComponentParameterException:
+
+
+ + +modulo_components::exceptions::ComponentException + +
+ + + + + + + +

+Public Member Functions

 ComponentParameterException (const std::string &msg)
 
- Public Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify errors with component parameters.

+

This is an exception class to be thrown if there is a problem with component parameters (overriding, inconsistent types, undeclared, ...).

+ +

Definition at line 13 of file ComponentParameterException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ComponentParameterException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_components::exceptions::ComponentParameterException::ComponentParameterException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 15 of file ComponentParameterException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.png b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.png new file mode 100644 index 00000000..855ff75e Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.png differ diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html new file mode 100644 index 00000000..17aef199 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components::exceptions::LookupTransformException Member List
+
+
+ +

This is the complete list of members for modulo_components::exceptions::LookupTransformException, including all inherited members.

+ + + + +
ComponentException(const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineexplicit
ComponentException(const std::string &prefix, const std::string &msg) (defined in modulo_components::exceptions::ComponentException)modulo_components::exceptions::ComponentExceptioninlineprotected
LookupTransformException(const std::string &msg) (defined in modulo_components::exceptions::LookupTransformException)modulo_components::exceptions::LookupTransformExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html new file mode 100644 index 00000000..1d7b6956 --- /dev/null +++ b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_components::exceptions::LookupTransformException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_components::exceptions::LookupTransformException Class Reference
+
+
+ +

An exception class to notify an error while looking up TF transforms. + More...

+ +

#include <LookupTransformException.hpp>

+
+Inheritance diagram for modulo_components::exceptions::LookupTransformException:
+
+
+ + +modulo_components::exceptions::ComponentException + +
+ + + + + + + +

+Public Member Functions

 LookupTransformException (const std::string &msg)
 
- Public Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_components::exceptions::ComponentException
 ComponentException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify an error while looking up TF transforms.

+

This is an exception class to be thrown if there is a problem with looking up a TF transform (unconfigured buffer/listener, TF2 exception).

+ +

Definition at line 13 of file LookupTransformException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ LookupTransformException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_components::exceptions::LookupTransformException::LookupTransformException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 15 of file LookupTransformException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.png b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.png new file mode 100644 index 00000000..a2aed5fb Binary files /dev/null and b/versions/v3.0.0/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair-members.html new file mode 100644 index 00000000..d0b54a82 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair-members.html @@ -0,0 +1,108 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::MessagePair< MsgT, DataT > Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::MessagePair< MsgT, DataT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
get_data() constmodulo_core::communication::MessagePair< MsgT, DataT >inline
get_message_pair(bool validate_pointer=true)modulo_core::communication::MessagePairInterfaceinline
get_type() constmodulo_core::communication::MessagePairInterface
MessagePair(std::shared_ptr< DataT > data, std::shared_ptr< rclcpp::Clock > clock)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< bool > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< double > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< std::vector< double > > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< int > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< std::string > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePair(std::shared_ptr< state_representation::State > data, std::shared_ptr< rclcpp::Clock > clock) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >
MessagePairInterface(MessageType type)modulo_core::communication::MessagePairInterfaceexplicit
MessagePairInterface(const MessagePairInterface &message_pair)=defaultmodulo_core::communication::MessagePairInterface
read(const MsgT &message)modulo_core::communication::MessagePairInterfaceinline
read_message(const MsgT &message)modulo_core::communication::MessagePair< MsgT, DataT >inline
read_message(const EncodedState &message) (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >inline
set_data(const std::shared_ptr< DataT > &data)modulo_core::communication::MessagePair< MsgT, DataT >inline
write()modulo_core::communication::MessagePairInterfaceinline
write_message() constmodulo_core::communication::MessagePair< MsgT, DataT >inline
write_message() const (defined in modulo_core::communication::MessagePair< MsgT, DataT >)modulo_core::communication::MessagePair< MsgT, DataT >inline
~MessagePairInterface()=defaultmodulo_core::communication::MessagePairInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.html new file mode 100644 index 00000000..1d1fee98 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.html @@ -0,0 +1,602 @@ + + + + + + + +Modulo: modulo_core::communication::MessagePair< MsgT, DataT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::MessagePair< MsgT, DataT > Class Template Reference
+
+
+ +

The MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages. + More...

+ +

#include <MessagePair.hpp>

+
+Inheritance diagram for modulo_core::communication::MessagePair< MsgT, DataT >:
+
+
+ + +modulo_core::communication::MessagePairInterface + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 MessagePair (std::shared_ptr< DataT > data, std::shared_ptr< rclcpp::Clock > clock)
 Constructor of the MessagePair. More...
 
MsgT write_message () const
 Write the value of the data pointer to a ROS message. More...
 
void read_message (const MsgT &message)
 Read a ROS message and store the value in the data pointer. More...
 
std::shared_ptr< DataT > get_data () const
 Get the data pointer. More...
 
void set_data (const std::shared_ptr< DataT > &data)
 Set the data pointer. More...
 
EncodedState write_message () const
 
void read_message (const EncodedState &message)
 
 MessagePair (std::shared_ptr< bool > data, std::shared_ptr< rclcpp::Clock > clock)
 
 MessagePair (std::shared_ptr< double > data, std::shared_ptr< rclcpp::Clock > clock)
 
 MessagePair (std::shared_ptr< std::vector< double > > data, std::shared_ptr< rclcpp::Clock > clock)
 
 MessagePair (std::shared_ptr< int > data, std::shared_ptr< rclcpp::Clock > clock)
 
 MessagePair (std::shared_ptr< std::string > data, std::shared_ptr< rclcpp::Clock > clock)
 
 MessagePair (std::shared_ptr< state_representation::State > data, std::shared_ptr< rclcpp::Clock > clock)
 
- Public Member Functions inherited from modulo_core::communication::MessagePairInterface
 MessagePairInterface (MessageType type)
 Constructor with the message type. More...
 
+virtual ~MessagePairInterface ()=default
 Default virtual destructor.
 
MessagePairInterface (const MessagePairInterface &message_pair)=default
 Copy constructor from another MessagePairInterface.
 
template<typename MsgT , typename DataT >
std::shared_ptr< MessagePair< MsgT, DataT > > get_message_pair (bool validate_pointer=true)
 Get a pointer to a derived MessagePair instance from a MessagePairInterface pointer. More...
 
template<typename MsgT , typename DataT >
MsgT write ()
 Get the ROS message of a derived MessagePair instance through the MessagePairInterface pointer. More...
 
template<typename MsgT , typename DataT >
void read (const MsgT &message)
 Read a ROS message and set the data of the derived MessagePair instance through the MessagePairInterface pointer. More...
 
MessageType get_type () const
 Get the MessageType of the MessagePairInterface. More...
 
+

Detailed Description

+
template<typename MsgT, typename DataT>
+class modulo_core::communication::MessagePair< MsgT, DataT >

The MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages.

+
Template Parameters
+ + + +
MsgTROS message type of the MessagePair
DataTData type corresponding to the ROS message type
+
+
+ +

Definition at line 20 of file MessagePair.hpp.

+

Constructor & Destructor Documentation

+ +

◆ MessagePair() [1/7]

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< MsgT, DataT >::MessagePair (std::shared_ptr< DataT > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Constructor of the MessagePair.

+
Parameters
+ + + +
dataThe pointer referring to the data stored in the MessagePair
clockThe ROS clock for translating messages
+
+
+ +
+
+ +

◆ MessagePair() [2/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< std_msgs::msg::Bool, bool >::MessagePair (std::shared_ptr< bool > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 8 of file MessagePair.cpp.

+ +
+
+ +

◆ MessagePair() [3/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< std_msgs::msg::Float64, double >::MessagePair (std::shared_ptr< double > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 14 of file MessagePair.cpp.

+ +
+
+ +

◆ MessagePair() [4/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< std_msgs::msg::Float64MultiArray, std::vector< double > >::MessagePair (std::shared_ptr< std::vector< double > > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 20 of file MessagePair.cpp.

+ +
+
+ +

◆ MessagePair() [5/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< std_msgs::msg::Int32, int >::MessagePair (std::shared_ptr< int > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 26 of file MessagePair.cpp.

+ +
+
+ +

◆ MessagePair() [6/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< std_msgs::msg::String, std::string >::MessagePair (std::shared_ptr< std::string > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 32 of file MessagePair.cpp.

+ +
+
+ +

◆ MessagePair() [7/7]

+ +
+
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::MessagePair< EncodedState, state_representation::State >::MessagePair (std::shared_ptr< state_representation::State > data,
std::shared_ptr< rclcpp::Clock > clock 
)
+
+ +

Definition at line 38 of file MessagePair.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ get_data()

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + +
std::shared_ptr< DataT > modulo_core::communication::MessagePair< MsgT, DataT >::get_data
+
+inline
+
+ +

Get the data pointer.

+ +

Definition at line 98 of file MessagePair.hpp.

+ +
+
+ +

◆ read_message() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
void modulo_core::communication::MessagePair< EncodedState, state_representation::State >::read_message (const EncodedStatemessage)
+
+inline
+
+ +

Definition at line 90 of file MessagePair.hpp.

+ +
+
+ +

◆ read_message() [2/2]

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + + + + + +
void modulo_core::communication::MessagePair< MsgT, DataT >::read_message (const MsgT & message)
+
+inline
+
+ +

Read a ROS message and store the value in the data pointer.

+
Parameters
+ + +
messageThe ROS message to read
+
+
+
Exceptions
+ + + +
modulo_core::exceptions::NullPointerExceptionif the data pointer is null
modulo_core::exceptions::MessageTranslationExceptionif the message could not be read
+
+
+ +

Definition at line 82 of file MessagePair.hpp.

+ +
+
+ +

◆ set_data()

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + + + + + +
void modulo_core::communication::MessagePair< MsgT, DataT >::set_data (const std::shared_ptr< DataT > & data)
+
+inline
+
+ +

Set the data pointer.

+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the provided data pointer is null
+
+
+ +

Definition at line 103 of file MessagePair.hpp.

+ +
+
+ +

◆ write_message() [1/2]

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + +
MsgT modulo_core::communication::MessagePair< MsgT, DataT >::write_message
+
+inline
+
+ +

Write the value of the data pointer to a ROS message.

+
Returns
The value of the data pointer as a ROS message
+
Exceptions
+ + + +
modulo_core::exceptions::NullPointerExceptionif the data pointer is null
modulo_core::exceptions::MessageTranslationExceptionif the data could not be written to message
+
+
+ +

Definition at line 62 of file MessagePair.hpp.

+ +
+
+ +

◆ write_message() [2/2]

+ +
+
+ + + + + +
+ + + + + + + +
EncodedState modulo_core::communication::MessagePair< EncodedState, state_representation::State >::write_message () const
+
+inline
+
+ +

Definition at line 72 of file MessagePair.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.png new file mode 100644 index 00000000..23861810 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html new file mode 100644 index 00000000..8577f324 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::MessagePairInterface Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::MessagePairInterface, including all inherited members.

+ + + + + + + + +
get_message_pair(bool validate_pointer=true)modulo_core::communication::MessagePairInterfaceinline
get_type() constmodulo_core::communication::MessagePairInterface
MessagePairInterface(MessageType type)modulo_core::communication::MessagePairInterfaceexplicit
MessagePairInterface(const MessagePairInterface &message_pair)=defaultmodulo_core::communication::MessagePairInterface
read(const MsgT &message)modulo_core::communication::MessagePairInterfaceinline
write()modulo_core::communication::MessagePairInterfaceinline
~MessagePairInterface()=defaultmodulo_core::communication::MessagePairInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.html new file mode 100644 index 00000000..fdf71f86 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.html @@ -0,0 +1,335 @@ + + + + + + + +Modulo: modulo_core::communication::MessagePairInterface Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::MessagePairInterface Class Reference
+
+
+ +

Interface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting. + More...

+ +

#include <MessagePairInterface.hpp>

+
+Inheritance diagram for modulo_core::communication::MessagePairInterface:
+
+
+ + +modulo_core::communication::MessagePair< MsgT, DataT > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 MessagePairInterface (MessageType type)
 Constructor with the message type. More...
 
+virtual ~MessagePairInterface ()=default
 Default virtual destructor.
 
MessagePairInterface (const MessagePairInterface &message_pair)=default
 Copy constructor from another MessagePairInterface.
 
template<typename MsgT , typename DataT >
std::shared_ptr< MessagePair< MsgT, DataT > > get_message_pair (bool validate_pointer=true)
 Get a pointer to a derived MessagePair instance from a MessagePairInterface pointer. More...
 
template<typename MsgT , typename DataT >
MsgT write ()
 Get the ROS message of a derived MessagePair instance through the MessagePairInterface pointer. More...
 
template<typename MsgT , typename DataT >
void read (const MsgT &message)
 Read a ROS message and set the data of the derived MessagePair instance through the MessagePairInterface pointer. More...
 
MessageType get_type () const
 Get the MessageType of the MessagePairInterface. More...
 
+

Detailed Description

+

Interface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting.

+ +

Definition at line 20 of file MessagePairInterface.hpp.

+

Constructor & Destructor Documentation

+ +

◆ MessagePairInterface()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::communication::MessagePairInterface::MessagePairInterface (MessageType type)
+
+explicit
+
+ +

Constructor with the message type.

+
Parameters
+ + +
typeThe message type of the message pair
+
+
+ +

Definition at line 5 of file MessagePairInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ get_message_pair()

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + + + + + +
std::shared_ptr< MessagePair< MsgT, DataT > > modulo_core::communication::MessagePairInterface::get_message_pair (bool validate_pointer = true)
+
+inline
+
+ +

Get a pointer to a derived MessagePair instance from a MessagePairInterface pointer.

+

If a MessagePairInterface pointer is used to address a derived MessagePair instance, this method will return a pointer to that derived instance through dynamic down-casting. The downcast will fail if the base MessagePairInterface object has no reference count (if the object is not owned by any pointer), or if the derived object is not a correctly typed instance of a MessagePair. By default, an InvalidPointerCastException is thrown when the downcast fails. If this validation is disabled by setting the validate_pointer flag to false, it will not throw an exception and instead return a null pointer.

Template Parameters
+ + + +
MsgTThe ROS message type of the MessagePair
DataTThe data type of the MessagePair
+
+
+
Parameters
+ + +
validate_pointerIf true, throw an exception when down-casting fails
+
+
+
Exceptions
+ + + +
modulo_core::exceptions::InvalidPointerExceptionif the base MessagePairInterface object has no reference count and validate_pointer is set to true
modulo_core::exceptions::InvalidPointerCastExceptionif the derived object from the dynamic down-casting is not a correctly typed instance of a MessagePair
+
+
+
Returns
A pointer to a derived MessagePair instance of the desired type, or a null pointer if down-casting failed and validate_pointer was set to false.
+ +

Definition at line 94 of file MessagePairInterface.hpp.

+ +
+
+ +

◆ get_type()

+ +
+
+ + + + + + + +
MessageType modulo_core::communication::MessagePairInterface::get_type () const
+
+ +

Get the MessageType of the MessagePairInterface.

+
See also
MessageType
+ +

Definition at line 7 of file MessagePairInterface.cpp.

+ +
+
+ +

◆ read()

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + + + + + +
void modulo_core::communication::MessagePairInterface::read (const MsgT & message)
+
+inline
+
+ +

Read a ROS message and set the data of the derived MessagePair instance through the MessagePairInterface pointer.

+

This throws an InvalidPointerCastException if the MessagePairInterface does not point to a valid MessagePair instance or if the specified types does not match the type of the MessagePair instance.

Template Parameters
+ + + +
MsgTThe ROS message type of the MessagePair
DataTThe data type of the MessagePair
+
+
+
Parameters
+ + +
messageThe ROS message to read from
+
+
+ +

Definition at line 116 of file MessagePairInterface.hpp.

+ +
+
+ +

◆ write()

+ +
+
+
+template<typename MsgT , typename DataT >
+ + + + + +
+ + + + +
MsgT modulo_core::communication::MessagePairInterface::write
+
+inline
+
+ +

Get the ROS message of a derived MessagePair instance through the MessagePairInterface pointer.

+

This throws an InvalidPointerCastException if the MessagePairInterface does not point to a valid MessagePair instance or if the specified types does not match the type of the MessagePair instance.

See also
MessagePairInterface::get_message_pair()
+
Template Parameters
+ + + +
MsgTThe ROS message type of the MessagePair
DataTThe data type of the MessagePair
+
+
+
Returns
The ROS message containing the data from the underlying MessagePair instance
+ +

Definition at line 111 of file MessagePairInterface.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.png new file mode 100644 index 00000000..173df8fb Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_message_pair_interface.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler-members.html new file mode 100644 index 00000000..e1afc39e --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler-members.html @@ -0,0 +1,104 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::PublisherHandler< PubT, MsgT > Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::PublisherHandler< PubT, MsgT >, including all inherited members.

+ + + + + + + + + + + + + + + + + +
activate()modulo_core::communication::PublisherInterface
create_publisher_interface(const std::shared_ptr< MessagePairInterface > &message_pair)modulo_core::communication::PublisherHandler< PubT, MsgT >
deactivate()modulo_core::communication::PublisherInterface
get_handler(bool validate_pointer=true)modulo_core::communication::PublisherInterfaceinline
get_message_pair() constmodulo_core::communication::PublisherInterface
get_type() constmodulo_core::communication::PublisherInterface
on_activate()modulo_core::communication::PublisherHandler< PubT, MsgT >
on_deactivate()modulo_core::communication::PublisherHandler< PubT, MsgT >
publish(const MsgT &message) constmodulo_core::communication::PublisherHandler< PubT, MsgT >
modulo_core::communication::PublisherInterface::publish()modulo_core::communication::PublisherInterface
PublisherHandler(PublisherType type, std::shared_ptr< PubT > publisher)modulo_core::communication::PublisherHandler< PubT, MsgT >
PublisherInterface(PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)modulo_core::communication::PublisherInterfaceexplicit
PublisherInterface(const PublisherInterface &publisher)=defaultmodulo_core::communication::PublisherInterface
set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)modulo_core::communication::PublisherInterface
~PublisherHandler() overridemodulo_core::communication::PublisherHandler< PubT, MsgT >
~PublisherInterface()=defaultmodulo_core::communication::PublisherInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.html new file mode 100644 index 00000000..508f9388 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.html @@ -0,0 +1,362 @@ + + + + + + + +Modulo: modulo_core::communication::PublisherHandler< PubT, MsgT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::PublisherHandler< PubT, MsgT > Class Template Reference
+
+
+ +

The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers. + More...

+ +

#include <PublisherHandler.hpp>

+
+Inheritance diagram for modulo_core::communication::PublisherHandler< PubT, MsgT >:
+
+
+ + +modulo_core::communication::PublisherInterface + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 PublisherHandler (PublisherType type, std::shared_ptr< PubT > publisher)
 Constructor with the publisher type and the pointer to the ROS publisher. More...
 
 ~PublisherHandler () override
 Destructor to explicitly reset the publisher pointer. More...
 
void on_activate ()
 Activate the ROS publisher if applicable. More...
 
void on_deactivate ()
 Deactivate the ROS publisher if applicable. More...
 
void publish (const MsgT &message) const
 Publish the ROS message through the ROS publisher. More...
 
std::shared_ptr< PublisherInterfacecreate_publisher_interface (const std::shared_ptr< MessagePairInterface > &message_pair)
 Create a PublisherInterface instance from the current PublisherHandler. More...
 
- Public Member Functions inherited from modulo_core::communication::PublisherInterface
 PublisherInterface (PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)
 Constructor with the message type and message pair. More...
 
PublisherInterface (const PublisherInterface &publisher)=default
 Copy constructor from another PublisherInterface.
 
+virtual ~PublisherInterface ()=default
 Default virtual destructor.
 
template<typename PubT , typename MsgT >
std::shared_ptr< PublisherHandler< PubT, MsgT > > get_handler (bool validate_pointer=true)
 Get a pointer to a derived PublisherHandler instance from a PublisherInterface pointer. More...
 
void activate ()
 Activate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
void deactivate ()
 Deactivate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
void publish ()
 Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
std::shared_ptr< MessagePairInterfaceget_message_pair () const
 Get the pointer to the message pair of the PublisherInterface. More...
 
void set_message_pair (const std::shared_ptr< MessagePairInterface > &message_pair)
 Set the pointer to the message pair of the PublisherInterface. More...
 
PublisherType get_type () const
 Get the type of the publisher interface. More...
 
+

Detailed Description

+
template<typename PubT, typename MsgT>
+class modulo_core::communication::PublisherHandler< PubT, MsgT >

The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers.

+
Template Parameters
+ + + +
PubTThe ROS publisher type
MsgTThe ROS message type of the ROS publisher
+
+
+ +

Definition at line 18 of file PublisherHandler.hpp.

+

Constructor & Destructor Documentation

+ +

◆ PublisherHandler()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::PublisherHandler< PubT, MsgT >::PublisherHandler (PublisherType type,
std::shared_ptr< PubT > publisher 
)
+
+ +

Constructor with the publisher type and the pointer to the ROS publisher.

+
Parameters
+ + + +
typeThe publisher type
publisherThe pointer to the ROS publisher
+
+
+ +

Definition at line 63 of file PublisherHandler.hpp.

+ +
+
+ +

◆ ~PublisherHandler()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + + +
+ + + + +
modulo_core::communication::PublisherHandler< PubT, MsgT >::~PublisherHandler
+
+override
+
+ +

Destructor to explicitly reset the publisher pointer.

+ +

Definition at line 67 of file PublisherHandler.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ create_publisher_interface()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + + + + + +
std::shared_ptr< PublisherInterface > modulo_core::communication::PublisherHandler< PubT, MsgT >::create_publisher_interface (const std::shared_ptr< MessagePairInterface > & message_pair)
+
+ +

Create a PublisherInterface instance from the current PublisherHandler.

+
Parameters
+ + +
message_pairThe message pair of the PublisherInterface
+
+
+ +

Definition at line 116 of file PublisherHandler.hpp.

+ +
+
+ +

◆ on_activate()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + +
void modulo_core::communication::PublisherHandler< PubT, MsgT >::on_activate
+
+ +

Activate the ROS publisher if applicable.

+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the publisher pointer is null
+
+
+ +

Definition at line 72 of file PublisherHandler.hpp.

+ +
+
+ +

◆ on_deactivate()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + +
void modulo_core::communication::PublisherHandler< PubT, MsgT >::on_deactivate
+
+ +

Deactivate the ROS publisher if applicable.

+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the publisher pointer is null
+
+
+ +

Definition at line 88 of file PublisherHandler.hpp.

+ +
+
+ +

◆ publish()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + + + + + +
void modulo_core::communication::PublisherHandler< PubT, MsgT >::publish (const MsgT & message) const
+
+ +

Publish the ROS message through the ROS publisher.

+
Parameters
+ + +
messageThe ROS message to publish
+
+
+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the publisher pointer is null
+
+
+ +

Definition at line 104 of file PublisherHandler.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.png new file mode 100644 index 00000000..42d50947 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_handler.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface-members.html new file mode 100644 index 00000000..01afa8bb --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface-members.html @@ -0,0 +1,98 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::PublisherInterface Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::PublisherInterface, including all inherited members.

+ + + + + + + + + + + +
activate()modulo_core::communication::PublisherInterface
deactivate()modulo_core::communication::PublisherInterface
get_handler(bool validate_pointer=true)modulo_core::communication::PublisherInterfaceinline
get_message_pair() constmodulo_core::communication::PublisherInterface
get_type() constmodulo_core::communication::PublisherInterface
publish()modulo_core::communication::PublisherInterface
PublisherInterface(PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)modulo_core::communication::PublisherInterfaceexplicit
PublisherInterface(const PublisherInterface &publisher)=defaultmodulo_core::communication::PublisherInterface
set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)modulo_core::communication::PublisherInterface
~PublisherInterface()=defaultmodulo_core::communication::PublisherInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.html new file mode 100644 index 00000000..95219f0f --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.html @@ -0,0 +1,404 @@ + + + + + + + +Modulo: modulo_core::communication::PublisherInterface Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::PublisherInterface Class Reference
+
+
+ +

Interface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting. + More...

+ +

#include <PublisherInterface.hpp>

+
+Inheritance diagram for modulo_core::communication::PublisherInterface:
+
+
+ + +modulo_core::communication::PublisherHandler< PubT, MsgT > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 PublisherInterface (PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)
 Constructor with the message type and message pair. More...
 
PublisherInterface (const PublisherInterface &publisher)=default
 Copy constructor from another PublisherInterface.
 
+virtual ~PublisherInterface ()=default
 Default virtual destructor.
 
template<typename PubT , typename MsgT >
std::shared_ptr< PublisherHandler< PubT, MsgT > > get_handler (bool validate_pointer=true)
 Get a pointer to a derived PublisherHandler instance from a PublisherInterface pointer. More...
 
void activate ()
 Activate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
void deactivate ()
 Deactivate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
void publish ()
 Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer. More...
 
std::shared_ptr< MessagePairInterfaceget_message_pair () const
 Get the pointer to the message pair of the PublisherInterface. More...
 
void set_message_pair (const std::shared_ptr< MessagePairInterface > &message_pair)
 Set the pointer to the message pair of the PublisherInterface. More...
 
PublisherType get_type () const
 Get the type of the publisher interface. More...
 
+

Detailed Description

+

Interface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting.

+ +

Definition at line 21 of file PublisherInterface.hpp.

+

Constructor & Destructor Documentation

+ +

◆ PublisherInterface()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_core::communication::PublisherInterface::PublisherInterface (PublisherType type,
std::shared_ptr< MessagePairInterfacemessage_pair = nullptr 
)
+
+explicit
+
+ +

Constructor with the message type and message pair.

+
Parameters
+ + + +
typeThe type of the publisher interface
message_pairThe message pair with the data to be published
+
+
+ +

Definition at line 18 of file PublisherInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ activate()

+ +
+
+ + + + + + + +
void modulo_core::communication::PublisherInterface::activate ()
+
+ +

Activate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer.

+

This throws an InvalidPointerCastException if the PublisherInterface does not point to a valid PublisherHandler instance or if the type of the message pair does not match the type of the PublisherHandler instance.

See also
PublisherInterface::get_handler
+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the message pair pointer is null
+
+
+ +

Definition at line 21 of file PublisherInterface.cpp.

+ +
+
+ +

◆ deactivate()

+ +
+
+ + + + + + + +
void modulo_core::communication::PublisherInterface::deactivate ()
+
+ +

Deactivate ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer.

+

This throws an InvalidPointerCastException if the PublisherInterface does not point to a valid PublisherHandler instance or if the type of the message pair does not match the type of the PublisherHandler instance.

See also
PublisherInterface::get_handler
+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the message pair pointer is null
+
+
+ +

Definition at line 57 of file PublisherInterface.cpp.

+ +
+
+ +

◆ get_handler()

+ +
+
+
+template<typename PubT , typename MsgT >
+ + + + + +
+ + + + + + + + +
std::shared_ptr< PublisherHandler< PubT, MsgT > > modulo_core::communication::PublisherInterface::get_handler (bool validate_pointer = true)
+
+inline
+
+ +

Get a pointer to a derived PublisherHandler instance from a PublisherInterface pointer.

+

If a PublisherInterface pointer is used to address a derived PublisherHandler instance, this method will return a pointer to that derived instance through dynamic down-casting. The downcast will fail if the base PublisherInterface object has no reference count (if the object is not owned by any pointer), or if the derived object is not a correctly typed instance of a PublisherHandler. By default, an InvalidPointerCastException is thrown when the downcast fails. If this validation is disabled by setting the validate_pointer flag to false, it will not throw an exception and instead return a null pointer.

Template Parameters
+ + + +
PubTThe ROS publisher type
MsgTThe ROS message type
+
+
+
Exceptions
+ + + +
modulo_core::exceptions::InvalidPointerExceptionif the base PublisherInterface object has no reference count and validate_pointer is set to true
modulo_core::exceptions::InvalidPointerCastExceptionif the derived object from the dynamic down-casting is not a correctly typed instance of a PublisherHandler
+
+
+
Parameters
+ + +
validate_pointerIf true, throw an exception when down-casting fails
+
+
+
Returns
A pointer to a derived PublisherHandler instance of the desired type, or a null pointer if down-casting failed and validate_pointer was set to false.
+ +

Definition at line 129 of file PublisherInterface.hpp.

+ +
+
+ +

◆ get_message_pair()

+ +
+
+ + + + + + + +
std::shared_ptr< MessagePairInterface > modulo_core::communication::PublisherInterface::get_message_pair () const
+
+ +

Get the pointer to the message pair of the PublisherInterface.

+ +

Definition at line 139 of file PublisherInterface.cpp.

+ +
+
+ +

◆ get_type()

+ +
+
+ + + + + + + +
PublisherType modulo_core::communication::PublisherInterface::get_type () const
+
+ +

Get the type of the publisher interface.

+
See also
PublisherType
+ +

Definition at line 150 of file PublisherInterface.cpp.

+ +
+
+ +

◆ publish()

+ +
+
+ + + + + + + +
void modulo_core::communication::PublisherInterface::publish ()
+
+ +

Publish the data stored in the message pair through the ROS publisher of a derived PublisherHandler instance through the PublisherInterface pointer.

+

This throws an InvalidPointerCastException if the PublisherInterface does not point to a valid PublisherHandler instance or if the type of the message pair does not match the type of the PublisherHandler instance.

See also
PublisherInterface::get_handler
+
Exceptions
+ + +
modulo_core::exceptions::CoreExceptionif the publishing failed for some reason (translation, null pointer, pointer cast, ...)
+
+
+ +

Definition at line 93 of file PublisherInterface.cpp.

+ +
+
+ +

◆ set_message_pair()

+ +
+
+ + + + + + + + +
void modulo_core::communication::PublisherInterface::set_message_pair (const std::shared_ptr< MessagePairInterface > & message_pair)
+
+ +

Set the pointer to the message pair of the PublisherInterface.

+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the provided message pair pointer is null
+
+
+ +

Definition at line 143 of file PublisherInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.png new file mode 100644 index 00000000..c4195016 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_publisher_interface.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler-members.html new file mode 100644 index 00000000..23191bc0 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler-members.html @@ -0,0 +1,114 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::SubscriptionHandler< MsgT > Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::SubscriptionHandler< MsgT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
create_subscription_interface(const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback()modulo_core::communication::SubscriptionHandler< MsgT >
get_callback(const std::function< void()> &user_callback)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_callback() (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
get_handler(bool validate_pointer=true)modulo_core::communication::SubscriptionInterfaceinline
get_message_pair() constmodulo_core::communication::SubscriptionInterface
get_subscription() constmodulo_core::communication::SubscriptionHandler< MsgT >
set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)modulo_core::communication::SubscriptionInterface
set_subscription(const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)modulo_core::communication::SubscriptionHandler< MsgT >
set_user_callback(const std::function< void()> &user_callback)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair=nullptr)modulo_core::communication::SubscriptionHandler< MsgT >explicit
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionHandler(std::shared_ptr< MessagePairInterface > message_pair) (defined in modulo_core::communication::SubscriptionHandler< MsgT >)modulo_core::communication::SubscriptionHandler< MsgT >
SubscriptionInterface(std::shared_ptr< MessagePairInterface > message_pair=nullptr)modulo_core::communication::SubscriptionInterfaceexplicit
SubscriptionInterface(const SubscriptionInterface &subscription)=defaultmodulo_core::communication::SubscriptionInterface
~SubscriptionHandler() overridemodulo_core::communication::SubscriptionHandler< MsgT >
~SubscriptionInterface()=defaultmodulo_core::communication::SubscriptionInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.html new file mode 100644 index 00000000..019c7abc --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.html @@ -0,0 +1,639 @@ + + + + + + + +Modulo: modulo_core::communication::SubscriptionHandler< MsgT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::SubscriptionHandler< MsgT > Class Template Reference
+
+
+ +

The SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions. + More...

+ +

#include <SubscriptionHandler.hpp>

+
+Inheritance diagram for modulo_core::communication::SubscriptionHandler< MsgT >:
+
+
+ + +modulo_core::communication::SubscriptionInterface + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair=nullptr)
 Constructor with the message pair. More...
 
 ~SubscriptionHandler () override
 Destructor to explicitly reset the subscription pointer. More...
 
std::shared_ptr< rclcpp::Subscription< MsgT > > get_subscription () const
 Getter of the ROS subscription. More...
 
void set_subscription (const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)
 Setter of the ROS subscription. More...
 
void set_user_callback (const std::function< void()> &user_callback)
 Setter of a user callback function to be executed after the subscription callback. More...
 
+std::function< void(const std::shared_ptr< MsgT >)> get_callback ()
 Get a callback function that will be associated with the ROS subscription to receive and translate messages.
 
std::function< void(const std::shared_ptr< MsgT >)> get_callback (const std::function< void()> &user_callback)
 Get a callback function that will be associated with the ROS subscription to receive and translate messages. More...
 
std::shared_ptr< SubscriptionInterfacecreate_subscription_interface (const std::shared_ptr< rclcpp::Subscription< MsgT > > &subscription)
 Create a SubscriptionInterface pointer through an instance of a SubscriptionHandler by providing a ROS subscription. More...
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
 SubscriptionHandler (std::shared_ptr< MessagePairInterface > message_pair)
 
std::function< void(const std::shared_ptr< std_msgs::msg::Bool >)> get_callback ()
 
std::function< void(const std::shared_ptr< std_msgs::msg::Float64 >)> get_callback ()
 
std::function< void(const std::shared_ptr< std_msgs::msg::Float64MultiArray >)> get_callback ()
 
std::function< void(const std::shared_ptr< std_msgs::msg::Int32 >)> get_callback ()
 
std::function< void(const std::shared_ptr< std_msgs::msg::String >)> get_callback ()
 
std::function< void(const std::shared_ptr< EncodedState >)> get_callback ()
 
- Public Member Functions inherited from modulo_core::communication::SubscriptionInterface
 SubscriptionInterface (std::shared_ptr< MessagePairInterface > message_pair=nullptr)
 Constructor with the message pair. More...
 
SubscriptionInterface (const SubscriptionInterface &subscription)=default
 Copy constructor from another SubscriptionInterface.
 
+virtual ~SubscriptionInterface ()=default
 Default virtual destructor.
 
template<typename MsgT >
std::shared_ptr< SubscriptionHandler< MsgT > > get_handler (bool validate_pointer=true)
 Get a pointer to a derived SubscriptionHandler instance from a SubscriptionInterface pointer. More...
 
std::shared_ptr< MessagePairInterfaceget_message_pair () const
 Get the pointer to the message pair of the SubscriptionInterface. More...
 
void set_message_pair (const std::shared_ptr< MessagePairInterface > &message_pair)
 Set the pointer to the message pair of the SubscriptionInterface. More...
 
+

Detailed Description

+
template<typename MsgT>
+class modulo_core::communication::SubscriptionHandler< MsgT >

The SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions.

+
Template Parameters
+ + +
MsgTThe ROS message type of the ROS subscription
+
+
+ +

Definition at line 14 of file SubscriptionHandler.hpp.

+

Constructor & Destructor Documentation

+ +

◆ SubscriptionHandler() [1/7]

+ +
+
+
+template<typename MsgT >
+ + + + + +
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< MsgT >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair = nullptr)
+
+explicit
+
+ +

Constructor with the message pair.

+
Parameters
+ + +
message_pairThe pointer to the message pair with the data that should be updated through the subscription
+
+
+ +
+
+ +

◆ ~SubscriptionHandler()

+ +
+
+
+template<typename MsgT >
+ + + + + +
+ + + + +
modulo_core::communication::SubscriptionHandler< MsgT >::~SubscriptionHandler
+
+override
+
+ +

Destructor to explicitly reset the subscription pointer.

+ +

Definition at line 80 of file SubscriptionHandler.hpp.

+ +
+
+ +

◆ SubscriptionHandler() [2/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< std_msgs::msg::Bool >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 8 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ SubscriptionHandler() [3/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< std_msgs::msg::Float64 >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 12 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ SubscriptionHandler() [4/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< std_msgs::msg::Float64MultiArray >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 15 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ SubscriptionHandler() [5/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< std_msgs::msg::Int32 >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 21 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ SubscriptionHandler() [6/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< std_msgs::msg::String >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 25 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ SubscriptionHandler() [7/7]

+ +
+
+ + + + + + + + +
modulo_core::communication::SubscriptionHandler< EncodedState >::SubscriptionHandler (std::shared_ptr< MessagePairInterfacemessage_pair)
+
+ +

Definition at line 29 of file SubscriptionHandler.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ create_subscription_interface()

+ +
+
+
+template<typename MsgT >
+ + + + + + + + +
std::shared_ptr< SubscriptionInterface > modulo_core::communication::SubscriptionHandler< MsgT >::create_subscription_interface (const std::shared_ptr< rclcpp::Subscription< MsgT > > & subscription)
+
+ +

Create a SubscriptionInterface pointer through an instance of a SubscriptionHandler by providing a ROS subscription.

+

This throws a NullPointerException if the ROS subscription is null.

See also
SubscriptionHandler::set_subscription
+
Parameters
+ + +
subscriptionThe ROS subscription
+
+
+
Returns
The resulting SubscriptionInterface pointer
+ +

Definition at line 110 of file SubscriptionHandler.hpp.

+ +
+
+ +

◆ get_callback() [1/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< std_msgs::msg::Bool >)> modulo_core::communication::SubscriptionHandler< std_msgs::msg::Bool >::get_callback ()
+
+ +

Definition at line 34 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [2/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< std_msgs::msg::Float64 >)> modulo_core::communication::SubscriptionHandler< std_msgs::msg::Float64 >::get_callback ()
+
+ +

Definition at line 47 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [3/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< std_msgs::msg::Float64MultiArray >)> modulo_core::communication::SubscriptionHandler< std_msgs::msg::Float64MultiArray >::get_callback ()
+
+ +

Definition at line 60 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [4/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< std_msgs::msg::Int32 >)> modulo_core::communication::SubscriptionHandler< std_msgs::msg::Int32 >::get_callback ()
+
+ +

Definition at line 73 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [5/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< std_msgs::msg::String >)> modulo_core::communication::SubscriptionHandler< std_msgs::msg::String >::get_callback ()
+
+ +

Definition at line 86 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [6/7]

+ +
+
+ + + + + + + +
std::function< void(const std::shared_ptr< EncodedState >)> modulo_core::communication::SubscriptionHandler< EncodedState >::get_callback ()
+
+ +

Definition at line 98 of file SubscriptionHandler.cpp.

+ +
+
+ +

◆ get_callback() [7/7]

+ +
+
+
+template<typename MsgT >
+ + + + + + + + +
std::function< void(const std::shared_ptr< MsgT >)> modulo_core::communication::SubscriptionHandler< MsgT >::get_callback (const std::function< void()> & user_callback)
+
+ +

Get a callback function that will be associated with the ROS subscription to receive and translate messages.

+

This variant also takes a user callback function to execute after the message is received and translated.

Parameters
+ + +
user_callbackVoid callback function for additional logic after the message is received and translated.
+
+
+ +

Definition at line 104 of file SubscriptionHandler.hpp.

+ +
+
+ +

◆ get_subscription()

+ +
+
+
+template<typename MsgT >
+ + + + +
std::shared_ptr< rclcpp::Subscription< MsgT > > modulo_core::communication::SubscriptionHandler< MsgT >::get_subscription
+
+ +

Getter of the ROS subscription.

+ +

Definition at line 85 of file SubscriptionHandler.hpp.

+ +
+
+ +

◆ set_subscription()

+ +
+
+
+template<typename MsgT >
+ + + + + + + + +
void modulo_core::communication::SubscriptionHandler< MsgT >::set_subscription (const std::shared_ptr< rclcpp::Subscription< MsgT > > & subscription)
+
+ +

Setter of the ROS subscription.

+
Parameters
+ + +
subscriptionThe ROS subscription
+
+
+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the provided subscription pointer is null
+
+
+ +

Definition at line 90 of file SubscriptionHandler.hpp.

+ +
+
+ +

◆ set_user_callback()

+ +
+
+
+template<typename MsgT >
+ + + + + + + + +
void modulo_core::communication::SubscriptionHandler< MsgT >::set_user_callback (const std::function< void()> & user_callback)
+
+ +

Setter of a user callback function to be executed after the subscription callback.

+
Parameters
+ + +
user_callbackThe ser callback function
+
+
+ +

Definition at line 98 of file SubscriptionHandler.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.png new file mode 100644 index 00000000..a6eb5ca6 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_handler.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface-members.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface-members.html new file mode 100644 index 00000000..62f1d465 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface-members.html @@ -0,0 +1,94 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::communication::SubscriptionInterface Member List
+
+
+ +

This is the complete list of members for modulo_core::communication::SubscriptionInterface, including all inherited members.

+ + + + + + + +
get_handler(bool validate_pointer=true)modulo_core::communication::SubscriptionInterfaceinline
get_message_pair() constmodulo_core::communication::SubscriptionInterface
set_message_pair(const std::shared_ptr< MessagePairInterface > &message_pair)modulo_core::communication::SubscriptionInterface
SubscriptionInterface(std::shared_ptr< MessagePairInterface > message_pair=nullptr)modulo_core::communication::SubscriptionInterfaceexplicit
SubscriptionInterface(const SubscriptionInterface &subscription)=defaultmodulo_core::communication::SubscriptionInterface
~SubscriptionInterface()=defaultmodulo_core::communication::SubscriptionInterfacevirtual
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.html b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.html new file mode 100644 index 00000000..c862e8e7 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.html @@ -0,0 +1,275 @@ + + + + + + + +Modulo: modulo_core::communication::SubscriptionInterface Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::communication::SubscriptionInterface Class Reference
+
+
+ +

Interface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting. + More...

+ +

#include <SubscriptionInterface.hpp>

+
+Inheritance diagram for modulo_core::communication::SubscriptionInterface:
+
+
+ + +modulo_core::communication::SubscriptionHandler< MsgT > + +
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 SubscriptionInterface (std::shared_ptr< MessagePairInterface > message_pair=nullptr)
 Constructor with the message pair. More...
 
SubscriptionInterface (const SubscriptionInterface &subscription)=default
 Copy constructor from another SubscriptionInterface.
 
+virtual ~SubscriptionInterface ()=default
 Default virtual destructor.
 
template<typename MsgT >
std::shared_ptr< SubscriptionHandler< MsgT > > get_handler (bool validate_pointer=true)
 Get a pointer to a derived SubscriptionHandler instance from a SubscriptionInterface pointer. More...
 
std::shared_ptr< MessagePairInterfaceget_message_pair () const
 Get the pointer to the message pair of the SubscriptionInterface. More...
 
void set_message_pair (const std::shared_ptr< MessagePairInterface > &message_pair)
 Set the pointer to the message pair of the SubscriptionInterface. More...
 
+

Detailed Description

+

Interface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting.

+ +

Definition at line 20 of file SubscriptionInterface.hpp.

+

Constructor & Destructor Documentation

+ +

◆ SubscriptionInterface()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::communication::SubscriptionInterface::SubscriptionInterface (std::shared_ptr< MessagePairInterfacemessage_pair = nullptr)
+
+explicit
+
+ +

Constructor with the message pair.

+
Parameters
+ + +
message_pairThe pointer to the message pair with the data that should be updated through the subscription
+
+
+ +

Definition at line 7 of file SubscriptionInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ get_handler()

+ +
+
+
+template<typename MsgT >
+ + + + + +
+ + + + + + + + +
std::shared_ptr< SubscriptionHandler< MsgT > > modulo_core::communication::SubscriptionInterface::get_handler (bool validate_pointer = true)
+
+inline
+
+ +

Get a pointer to a derived SubscriptionHandler instance from a SubscriptionInterface pointer.

+

If a SubscriptionInterface pointer is used to address a derived SubscriptionHandler instance, this method will return a pointer to that derived instance through dynamic down-casting. The downcast will fail if the base SubscriptionInterface object has no reference count (if the object is not owned by any pointer), or if the derived object is not a correctly typed instance of a SubscriptionHandler. By default, an InvalidPointerCastException is thrown when the downcast fails. If this validation is disabled by setting the validate_pointer flag to false, it will not throw an exception and instead return a null pointer.

Template Parameters
+ + + +
PubTThe ROS publisher type
MsgTThe ROS message type
+
+
+
Exceptions
+ + + +
modulo_core::exceptions::InvalidPointerExceptionif the base SubscriptionInterface object has no reference count and validate_pointer is set to true
modulo_core::exceptions::InvalidPointerCastExceptionif the derived object from the dynamic down-casting is not a correctly typed instance of a SubscriptionHandler
+
+
+
Parameters
+ + +
validate_pointerIf true, throw an exception when down-casting fails
+
+
+
Returns
A pointer to a derived SubscriptionHandler instance of the desired type, or a null pointer if down-casting failed and validate_pointer was set to false.
+ +

Definition at line 75 of file SubscriptionInterface.hpp.

+ +
+
+ +

◆ get_message_pair()

+ +
+
+ + + + + + + +
std::shared_ptr< MessagePairInterface > modulo_core::communication::SubscriptionInterface::get_message_pair () const
+
+ +

Get the pointer to the message pair of the SubscriptionInterface.

+ +

Definition at line 10 of file SubscriptionInterface.cpp.

+ +
+
+ +

◆ set_message_pair()

+ +
+
+ + + + + + + + +
void modulo_core::communication::SubscriptionInterface::set_message_pair (const std::shared_ptr< MessagePairInterface > & message_pair)
+
+ +

Set the pointer to the message pair of the SubscriptionInterface.

+
Exceptions
+ + +
modulo_core::exceptions::NullPointerExceptionif the provided message pair pointer is null
+
+
+ +

Definition at line 14 of file SubscriptionInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.png b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.png new file mode 100644 index 00000000..3add2369 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1communication_1_1_subscription_interface.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception-members.html new file mode 100644 index 00000000..98a7e9ae --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception-members.html @@ -0,0 +1,90 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::CoreException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::CoreException, including all inherited members.

+ + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.html new file mode 100644 index 00000000..aaaaf3a1 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.html @@ -0,0 +1,193 @@ + + + + + + + +Modulo: modulo_core::exceptions::CoreException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
modulo_core::exceptions::CoreException Class Reference
+
+
+ +

A base class for all core exceptions. + More...

+ +

#include <CoreException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::CoreException:
+
+
+ + +modulo_core::exceptions::InvalidPointerCastException +modulo_core::exceptions::InvalidPointerException +modulo_core::exceptions::MessageTranslationException +modulo_core::exceptions::NullPointerException +modulo_core::exceptions::ParameterTranslationException + +
+ + + + +

+Public Member Functions

 CoreException (const std::string &msg)
 
+ + + +

+Protected Member Functions

 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

A base class for all core exceptions.

+

This inherits from std::runtime_exception.

+ +

Definition at line 17 of file CoreException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ CoreException() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::CoreException::CoreException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 19 of file CoreException.hpp.

+ +
+
+ +

◆ CoreException() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_core::exceptions::CoreException::CoreException (const std::string & prefix,
const std::string & msg 
)
+
+inlineprotected
+
+ +

Definition at line 21 of file CoreException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.png new file mode 100644 index 00000000..5b70d3ac Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_core_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html new file mode 100644 index 00000000..0a4b16b4 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::InvalidPointerCastException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::InvalidPointerCastException, including all inherited members.

+ + + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
InvalidPointerCastException(const std::string &msg) (defined in modulo_core::exceptions::InvalidPointerCastException)modulo_core::exceptions::InvalidPointerCastExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html new file mode 100644 index 00000000..292baf10 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html @@ -0,0 +1,153 @@ + + + + + + + +Modulo: modulo_core::exceptions::InvalidPointerCastException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::exceptions::InvalidPointerCastException Class Reference
+
+
+ +

An exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class. + More...

+ +

#include <InvalidPointerCastException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::InvalidPointerCastException:
+
+
+ + +modulo_core::exceptions::CoreException + +
+ + + + + + + +

+Public Member Functions

 InvalidPointerCastException (const std::string &msg)
 
- Public Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class.

+ +

Definition at line 12 of file InvalidPointerCastException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ InvalidPointerCastException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::InvalidPointerCastException::InvalidPointerCastException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 14 of file InvalidPointerCastException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.png new file mode 100644 index 00000000..30f0bf63 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html new file mode 100644 index 00000000..bdef8f55 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::InvalidPointerException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::InvalidPointerException, including all inherited members.

+ + + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
InvalidPointerException(const std::string &msg) (defined in modulo_core::exceptions::InvalidPointerException)modulo_core::exceptions::InvalidPointerExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html new file mode 100644 index 00000000..5707ada9 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html @@ -0,0 +1,153 @@ + + + + + + + +Modulo: modulo_core::exceptions::InvalidPointerException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::exceptions::InvalidPointerException Class Reference
+
+
+ +

An exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting. + More...

+ +

#include <InvalidPointerException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::InvalidPointerException:
+
+
+ + +modulo_core::exceptions::CoreException + +
+ + + + + + + +

+Public Member Functions

 InvalidPointerException (const std::string &msg)
 
- Public Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting.

+ +

Definition at line 12 of file InvalidPointerException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ InvalidPointerException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::InvalidPointerException::InvalidPointerException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 14 of file InvalidPointerException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.png new file mode 100644 index 00000000..2d961438 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html new file mode 100644 index 00000000..6bee9730 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::MessageTranslationException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::MessageTranslationException, including all inherited members.

+ + + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
MessageTranslationException(const std::string &msg) (defined in modulo_core::exceptions::MessageTranslationException)modulo_core::exceptions::MessageTranslationExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html new file mode 100644 index 00000000..cc30f165 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html @@ -0,0 +1,153 @@ + + + + + + + +Modulo: modulo_core::exceptions::MessageTranslationException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::exceptions::MessageTranslationException Class Reference
+
+
+ +

An exception class to notify that the translation of a ROS message failed. + More...

+ +

#include <MessageTranslationException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::MessageTranslationException:
+
+
+ + +modulo_core::exceptions::CoreException + +
+ + + + + + + +

+Public Member Functions

 MessageTranslationException (const std::string &msg)
 
- Public Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify that the translation of a ROS message failed.

+ +

Definition at line 11 of file MessageTranslationException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ MessageTranslationException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::MessageTranslationException::MessageTranslationException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 13 of file MessageTranslationException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.png new file mode 100644 index 00000000..4b020d21 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_message_translation_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html new file mode 100644 index 00000000..786759f9 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::NullPointerException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::NullPointerException, including all inherited members.

+ + + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
NullPointerException(const std::string &msg) (defined in modulo_core::exceptions::NullPointerException)modulo_core::exceptions::NullPointerExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html new file mode 100644 index 00000000..c854cfd2 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_core::exceptions::NullPointerException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::exceptions::NullPointerException Class Reference
+
+
+ +

An exception class to notify that a certain pointer is null. + More...

+ +

#include <NullPointerException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::NullPointerException:
+
+
+ + +modulo_core::exceptions::CoreException + +
+ + + + + + + +

+Public Member Functions

 NullPointerException (const std::string &msg)
 
- Public Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify that a certain pointer is null.

+

This is an exception class to be thrown if a pointer is null or is trying to be set to a null pointer.

+ +

Definition at line 12 of file NullPointerException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ NullPointerException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::NullPointerException::NullPointerException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 14 of file NullPointerException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.png new file mode 100644 index 00000000..aba21048 Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.png differ diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html new file mode 100644 index 00000000..ae9cb76a --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core::exceptions::ParameterTranslationException Member List
+
+
+ +

This is the complete list of members for modulo_core::exceptions::ParameterTranslationException, including all inherited members.

+ + + + +
CoreException(const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineexplicit
CoreException(const std::string &prefix, const std::string &msg) (defined in modulo_core::exceptions::CoreException)modulo_core::exceptions::CoreExceptioninlineprotected
ParameterTranslationException(const std::string &msg) (defined in modulo_core::exceptions::ParameterTranslationException)modulo_core::exceptions::ParameterTranslationExceptioninlineexplicit
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html new file mode 100644 index 00000000..c8445035 --- /dev/null +++ b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html @@ -0,0 +1,154 @@ + + + + + + + +Modulo: modulo_core::exceptions::ParameterTranslationException Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_core::exceptions::ParameterTranslationException Class Reference
+
+
+ +

An exception class to notify incompatibility when translating parameters from different sources. + More...

+ +

#include <ParameterTranslationException.hpp>

+
+Inheritance diagram for modulo_core::exceptions::ParameterTranslationException:
+
+
+ + +modulo_core::exceptions::CoreException + +
+ + + + + + + +

+Public Member Functions

 ParameterTranslationException (const std::string &msg)
 
- Public Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &msg)
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from modulo_core::exceptions::CoreException
 CoreException (const std::string &prefix, const std::string &msg)
 
+

Detailed Description

+

An exception class to notify incompatibility when translating parameters from different sources.

+

This is an exception class to be thrown if there is a problem while translating from a ROS parameter to a state_representation parameter and vice versa.

+ +

Definition at line 13 of file ParameterTranslationException.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ParameterTranslationException()

+ +
+
+ + + + + +
+ + + + + + + + +
modulo_core::exceptions::ParameterTranslationException::ParameterTranslationException (const std::string & msg)
+
+inlineexplicit
+
+ +

Definition at line 15 of file ParameterTranslationException.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.png b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.png new file mode 100644 index 00000000..29afe23b Binary files /dev/null and b/versions/v3.0.0/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.png differ diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html new file mode 100644 index 00000000..34ca1797 --- /dev/null +++ b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html @@ -0,0 +1,92 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_utils::testutils::PredicatesListener Member List
+
+
+ +

This is the complete list of members for modulo_utils::testutils::PredicatesListener, including all inherited members.

+ + + + + +
get_predicate_future() const (defined in modulo_utils::testutils::PredicatesListener)modulo_utils::testutils::PredicatesListener
get_predicate_values() const (defined in modulo_utils::testutils::PredicatesListener)modulo_utils::testutils::PredicatesListener
PredicatesListener(const std::string &component, const std::vector< std::string > &predicates, const rclcpp::NodeOptions &node_options=rclcpp::NodeOptions()) (defined in modulo_utils::testutils::PredicatesListener)modulo_utils::testutils::PredicatesListener
reset_future() (defined in modulo_utils::testutils::PredicatesListener)modulo_utils::testutils::PredicatesListener
+ + + + diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.html b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.html new file mode 100644 index 00000000..82e754b9 --- /dev/null +++ b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.html @@ -0,0 +1,208 @@ + + + + + + + +Modulo: modulo_utils::testutils::PredicatesListener Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
modulo_utils::testutils::PredicatesListener Class Reference
+
+
+
+Inheritance diagram for modulo_utils::testutils::PredicatesListener:
+
+
+ +
+ + + + + + + + + + +

+Public Member Functions

 PredicatesListener (const std::string &component, const std::vector< std::string > &predicates, const rclcpp::NodeOptions &node_options=rclcpp::NodeOptions())
 
void reset_future ()
 
const std::shared_future< void > & get_predicate_future () const
 
const std::map< std::string, bool > & get_predicate_values () const
 
+

Detailed Description

+
+

Definition at line 13 of file PredicatesListener.hpp.

+

Constructor & Destructor Documentation

+ +

◆ PredicatesListener()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
modulo_utils::testutils::PredicatesListener::PredicatesListener (const std::string & component,
const std::vector< std::string > & predicates,
const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions() 
)
+
+ +

Definition at line 5 of file PredicatesListener.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ get_predicate_future()

+ +
+
+ + + + + + + +
const std::shared_future< void > & modulo_utils::testutils::PredicatesListener::get_predicate_future () const
+
+ +

Definition at line 32 of file PredicatesListener.cpp.

+ +
+
+ +

◆ get_predicate_values()

+ +
+
+ + + + + + + +
const std::map< std::string, bool > & modulo_utils::testutils::PredicatesListener::get_predicate_values () const
+
+ +

Definition at line 36 of file PredicatesListener.cpp.

+ +
+
+ +

◆ reset_future()

+ +
+
+ + + + + + + +
void modulo_utils::testutils::PredicatesListener::reset_future ()
+
+ +

Definition at line 27 of file PredicatesListener.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.png b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.png new file mode 100644 index 00000000..6d7d53c6 Binary files /dev/null and b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_predicates_listener.png differ diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client-members.html b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client-members.html new file mode 100644 index 00000000..eaf79c98 --- /dev/null +++ b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client-members.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: Member List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_utils::testutils::ServiceClient< SrvT > Member List
+
+
+ +

This is the complete list of members for modulo_utils::testutils::ServiceClient< SrvT >, including all inherited members.

+ + + + +
call_async(const std::shared_ptr< typename SrvT::Request > &request) (defined in modulo_utils::testutils::ServiceClient< SrvT >)modulo_utils::testutils::ServiceClient< SrvT >inline
client_ (defined in modulo_utils::testutils::ServiceClient< SrvT >)modulo_utils::testutils::ServiceClient< SrvT >
ServiceClient(const rclcpp::NodeOptions &options, const std::string &service) (defined in modulo_utils::testutils::ServiceClient< SrvT >)modulo_utils::testutils::ServiceClient< SrvT >inline
+ + + + diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.html b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.html new file mode 100644 index 00000000..1fa0355a --- /dev/null +++ b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.html @@ -0,0 +1,206 @@ + + + + + + + +Modulo: modulo_utils::testutils::ServiceClient< SrvT > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Public Attributes | +List of all members
+
modulo_utils::testutils::ServiceClient< SrvT > Class Template Reference
+
+
+
+Inheritance diagram for modulo_utils::testutils::ServiceClient< SrvT >:
+
+
+ +
+ + + + + + +

+Public Member Functions

 ServiceClient (const rclcpp::NodeOptions &options, const std::string &service)
 
rclcpp::Client< SrvT >::FutureAndRequestId call_async (const std::shared_ptr< typename SrvT::Request > &request)
 
+ + + +

+Public Attributes

std::shared_ptr< rclcpp::Client< SrvT > > client_
 
+

Detailed Description

+
template<typename SrvT>
+class modulo_utils::testutils::ServiceClient< SrvT >
+

Definition at line 13 of file ServiceClient.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ServiceClient()

+ +
+
+
+template<typename SrvT >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
modulo_utils::testutils::ServiceClient< SrvT >::ServiceClient (const rclcpp::NodeOptions & options,
const std::string & service 
)
+
+inline
+
+ +

Definition at line 15 of file ServiceClient.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ call_async()

+ +
+
+
+template<typename SrvT >
+ + + + + +
+ + + + + + + + +
rclcpp::Client< SrvT >::FutureAndRequestId modulo_utils::testutils::ServiceClient< SrvT >::call_async (const std::shared_ptr< typename SrvT::Request > & request)
+
+inline
+
+ +

Definition at line 22 of file ServiceClient.hpp.

+ +
+
+

Member Data Documentation

+ +

◆ client_

+ +
+
+
+template<typename SrvT >
+ + + + +
std::shared_ptr<rclcpp::Client<SrvT> > modulo_utils::testutils::ServiceClient< SrvT >::client_
+
+ +

Definition at line 26 of file ServiceClient.hpp.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.png b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.png new file mode 100644 index 00000000..31fbccf0 Binary files /dev/null and b/versions/v3.0.0/classmodulo__utils_1_1testutils_1_1_service_client.png differ diff --git a/versions/v3.0.0/closed.png b/versions/v3.0.0/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/versions/v3.0.0/closed.png differ diff --git a/versions/v3.0.0/dir_005db6f82a7eca80f4e3827434b589b4.html b/versions/v3.0.0/dir_005db6f82a7eca80f4e3827434b589b4.html new file mode 100644 index 00000000..66a3070f --- /dev/null +++ b/versions/v3.0.0/dir_005db6f82a7eca80f4e3827434b589b4.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/src/testutils Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
testutils Directory Reference
+
+
+ + + + +

+Files

file  PredicatesListener.cpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_049f97fddacb7dc6e4c718ac904130b4.html b/versions/v3.0.0/dir_049f97fddacb7dc6e4c718ac904130b4.html new file mode 100644 index 00000000..86a83118 --- /dev/null +++ b/versions/v3.0.0/dir_049f97fddacb7dc6e4c718ac904130b4.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/exceptions Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
exceptions Directory Reference
+
+
+ + + + + + + + + + + + + + +

+Files

file  CoreException.hpp [code]
 
file  InvalidPointerCastException.hpp [code]
 
file  InvalidPointerException.hpp [code]
 
file  MessageTranslationException.hpp [code]
 
file  NullPointerException.hpp [code]
 
file  ParameterTranslationException.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_05a91d83eeac941ff7d1774756f408e0.html b/versions/v3.0.0/dir_05a91d83eeac941ff7d1774756f408e0.html new file mode 100644 index 00000000..6972c122 --- /dev/null +++ b/versions/v3.0.0/dir_05a91d83eeac941ff7d1774756f408e0.html @@ -0,0 +1,102 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components Directory Reference
+
+
+ + + + + + +

+Directories

directory  exceptions
 
directory  utilities
 
+ + + + + + + +

+Files

file  Component.hpp [code]
 
file  ComponentInterface.hpp [code]
 
file  LifecycleComponent.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_2397dea4246cf971150250488a69dca4.html b/versions/v3.0.0/dir_2397dea4246cf971150250488a69dca4.html new file mode 100644 index 00000000..7be34fd5 --- /dev/null +++ b/versions/v3.0.0/dir_2397dea4246cf971150250488a69dca4.html @@ -0,0 +1,100 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core Directory Reference
+
+
+ + + + + + + + +

+Directories

directory  communication
 
directory  exceptions
 
directory  translators
 
+ + + +

+Files

file  EncodedState.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_30c9960b1e12cf048409514a1d0c5545.html b/versions/v3.0.0/dir_30c9960b1e12cf048409514a1d0c5545.html new file mode 100644 index 00000000..5ef11cdd --- /dev/null +++ b/versions/v3.0.0/dir_30c9960b1e12cf048409514a1d0c5545.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+ + + + +

+Directories

directory  modulo_core
 
+
+ + + + diff --git a/versions/v3.0.0/dir_349657725b3f4f657efe86018f81caee.html b/versions/v3.0.0/dir_349657725b3f4f657efe86018f81caee.html new file mode 100644 index 00000000..ced39244 --- /dev/null +++ b/versions/v3.0.0/dir_349657725b3f4f657efe86018f81caee.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/translators Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
translators Directory Reference
+
+
+ + + + + + + + +

+Files

file  message_readers.cpp [code]
 
file  message_writers.cpp [code]
 
file  parameter_translators.cpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_3e8f83d5963dbe4a7be4947f2eff491b.html b/versions/v3.0.0/dir_3e8f83d5963dbe4a7be4947f2eff491b.html new file mode 100644 index 00000000..d72dd012 --- /dev/null +++ b/versions/v3.0.0/dir_3e8f83d5963dbe4a7be4947f2eff491b.html @@ -0,0 +1,85 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+
+ + + + diff --git a/versions/v3.0.0/dir_5442966453c41df6861b650ae85469b6.html b/versions/v3.0.0/dir_5442966453c41df6861b650ae85469b6.html new file mode 100644 index 00000000..05048d5d --- /dev/null +++ b/versions/v3.0.0/dir_5442966453c41df6861b650ae85469b6.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/translators Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
translators Directory Reference
+
+
+ + + + + + + + +

+Files

file  message_readers.hpp [code]
 
file  message_writers.hpp [code]
 
file  parameter_translators.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html b/versions/v3.0.0/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html new file mode 100644 index 00000000..8018fc68 --- /dev/null +++ b/versions/v3.0.0/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/communication Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
communication Directory Reference
+
+
+ + + + + + + + + + + + +

+Files

file  MessagePair.cpp [code]
 
file  MessagePairInterface.cpp [code]
 
file  PublisherInterface.cpp [code]
 
file  SubscriptionHandler.cpp [code]
 
file  SubscriptionInterface.cpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_6df23892ff328103ad3e309d3548417b.html b/versions/v3.0.0/dir_6df23892ff328103ad3e309d3548417b.html new file mode 100644 index 00000000..e5716d72 --- /dev/null +++ b/versions/v3.0.0/dir_6df23892ff328103ad3e309d3548417b.html @@ -0,0 +1,85 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_component_interfaces Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_component_interfaces Directory Reference
+
+
+
+ + + + diff --git a/versions/v3.0.0/dir_727f33ea6496bb66c2db4f7101f40bd7.html b/versions/v3.0.0/dir_727f33ea6496bb66c2db4f7101f40bd7.html new file mode 100644 index 00000000..261c7fda --- /dev/null +++ b/versions/v3.0.0/dir_727f33ea6496bb66c2db4f7101f40bd7.html @@ -0,0 +1,85 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_core Directory Reference
+
+
+
+ + + + diff --git a/versions/v3.0.0/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html b/versions/v3.0.0/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html new file mode 100644 index 00000000..6cba5e94 --- /dev/null +++ b/versions/v3.0.0/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html @@ -0,0 +1,93 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/include/modulo_utils/testutils Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
testutils Directory Reference
+
+
+ + + + + + +

+Files

file  PredicatesListener.hpp [code]
 
file  ServiceClient.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_9d27c852c776d117417a91cf72db7998.html b/versions/v3.0.0/dir_9d27c852c776d117417a91cf72db7998.html new file mode 100644 index 00000000..0096834b --- /dev/null +++ b/versions/v3.0.0/dir_9d27c852c776d117417a91cf72db7998.html @@ -0,0 +1,93 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/utilities Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
utilities Directory Reference
+
+
+ + + + + + +

+Files

file  predicate_variant.hpp [code]
 
file  utilities.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_a02cdc010ded81c7c2ac77993f10de2b.html b/versions/v3.0.0/dir_a02cdc010ded81c7c2ac77993f10de2b.html new file mode 100644 index 00000000..803fc139 --- /dev/null +++ b/versions/v3.0.0/dir_a02cdc010ded81c7c2ac77993f10de2b.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+ + + + +

+Directories

directory  modulo_components
 
+
+ + + + diff --git a/versions/v3.0.0/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html b/versions/v3.0.0/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html new file mode 100644 index 00000000..d003bf8b --- /dev/null +++ b/versions/v3.0.0/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html @@ -0,0 +1,93 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
src Directory Reference
+
+
+ + + + + + +

+Directories

directory  communication
 
directory  translators
 
+
+ + + + diff --git a/versions/v3.0.0/dir_ad135c18ceef0560346390faedbedc87.html b/versions/v3.0.0/dir_ad135c18ceef0560346390faedbedc87.html new file mode 100644 index 00000000..54b90700 --- /dev/null +++ b/versions/v3.0.0/dir_ad135c18ceef0560346390faedbedc87.html @@ -0,0 +1,85 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_utils Directory Reference
+
+
+
+ + + + diff --git a/versions/v3.0.0/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html b/versions/v3.0.0/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html new file mode 100644 index 00000000..64964139 --- /dev/null +++ b/versions/v3.0.0/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/src Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
src Directory Reference
+
+
+ + + + +

+Directories

directory  testutils
 
+
+ + + + diff --git a/versions/v3.0.0/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html b/versions/v3.0.0/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html new file mode 100644 index 00000000..ba4c569b --- /dev/null +++ b/versions/v3.0.0/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html @@ -0,0 +1,85 @@ + + + + + + + +Modulo: /github/workspace/source Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
source Directory Reference
+
+
+
+ + + + diff --git a/versions/v3.0.0/dir_b6467040e22f64a215d0cd51303d2b49.html b/versions/v3.0.0/dir_b6467040e22f64a215d0cd51303d2b49.html new file mode 100644 index 00000000..f160a9b2 --- /dev/null +++ b/versions/v3.0.0/dir_b6467040e22f64a215d0cd51303d2b49.html @@ -0,0 +1,105 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/communication Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
communication Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Files

file  MessagePair.hpp [code]
 
file  MessagePairInterface.hpp [code]
 
file  MessageType.hpp [code]
 
file  PublisherHandler.hpp [code]
 
file  PublisherInterface.hpp [code]
 
file  PublisherType.hpp [code]
 
file  SubscriptionHandler.hpp [code]
 
file  SubscriptionInterface.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_bc830b16dafc1f86e0bebd2067294caf.html b/versions/v3.0.0/dir_bc830b16dafc1f86e0bebd2067294caf.html new file mode 100644 index 00000000..c6f3280c --- /dev/null +++ b/versions/v3.0.0/dir_bc830b16dafc1f86e0bebd2067294caf.html @@ -0,0 +1,93 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/src Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
src Directory Reference
+
+
+ + + + + + +

+Files

file  Component.cpp [code]
 
file  LifecycleComponent.cpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_f43720a52722f25f1201bb3ff6bb7f0f.html b/versions/v3.0.0/dir_f43720a52722f25f1201bb3ff6bb7f0f.html new file mode 100644 index 00000000..19f0430b --- /dev/null +++ b/versions/v3.0.0/dir_f43720a52722f25f1201bb3ff6bb7f0f.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_utils/include/modulo_utils Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_utils Directory Reference
+
+
+ + + + +

+Directories

directory  testutils
 
+
+ + + + diff --git a/versions/v3.0.0/dir_fc328347369410c3380b696ba11ab788.html b/versions/v3.0.0/dir_fc328347369410c3380b696ba11ab788.html new file mode 100644 index 00000000..76bca0ed --- /dev/null +++ b/versions/v3.0.0/dir_fc328347369410c3380b696ba11ab788.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/exceptions Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
exceptions Directory Reference
+
+
+ + + + + + + + + + + + +

+Files

file  AddServiceException.hpp [code]
 
file  AddSignalException.hpp [code]
 
file  ComponentException.hpp [code]
 
file  ComponentParameterException.hpp [code]
 
file  LookupTransformException.hpp [code]
 
+
+ + + + diff --git a/versions/v3.0.0/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html b/versions/v3.0.0/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html new file mode 100644 index 00000000..fa92604e --- /dev/null +++ b/versions/v3.0.0/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html @@ -0,0 +1,91 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
modulo_components Directory Reference
+
+
+ + + + +

+Directories

directory  src
 
+
+ + + + diff --git a/versions/v3.0.0/doc.png b/versions/v3.0.0/doc.png new file mode 100644 index 00000000..17edabff Binary files /dev/null and b/versions/v3.0.0/doc.png differ diff --git a/versions/v3.0.0/docd.png b/versions/v3.0.0/docd.png new file mode 100644 index 00000000..d7c94fda Binary files /dev/null and b/versions/v3.0.0/docd.png differ diff --git a/versions/v3.0.0/doxygen.css b/versions/v3.0.0/doxygen.css new file mode 100644 index 00000000..89dee6c4 --- /dev/null +++ b/versions/v3.0.0/doxygen.css @@ -0,0 +1,1973 @@ +/* The standard CSS for doxygen 1.9.5*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.png'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.png'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 10px; + width: 10px; +} +::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb-color); + border-radius: 8px; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/versions/v3.0.0/doxygen.svg b/versions/v3.0.0/doxygen.svg new file mode 100644 index 00000000..d42dad52 --- /dev/null +++ b/versions/v3.0.0/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versions/v3.0.0/dynsections.js b/versions/v3.0.0/dynsections.js new file mode 100644 index 00000000..1f4cd14a --- /dev/null +++ b/versions/v3.0.0/dynsections.js @@ -0,0 +1,130 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +Modulo: File List + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123456]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  source
  modulo_components
  include
  modulo_components
  exceptions
 AddServiceException.hpp
 AddSignalException.hpp
 ComponentException.hpp
 ComponentParameterException.hpp
 LookupTransformException.hpp
  utilities
 predicate_variant.hpp
 utilities.hpp
 Component.hpp
 ComponentInterface.hpp
 LifecycleComponent.hpp
  src
 Component.cpp
 LifecycleComponent.cpp
  modulo_core
  include
  modulo_core
  communication
 MessagePair.hpp
 MessagePairInterface.hpp
 MessageType.hpp
 PublisherHandler.hpp
 PublisherInterface.hpp
 PublisherType.hpp
 SubscriptionHandler.hpp
 SubscriptionInterface.hpp
  exceptions
 CoreException.hpp
 InvalidPointerCastException.hpp
 InvalidPointerException.hpp
 MessageTranslationException.hpp
 NullPointerException.hpp
 ParameterTranslationException.hpp
  translators
 message_readers.hpp
 message_writers.hpp
 parameter_translators.hpp
 EncodedState.hpp
  src
  communication
 MessagePair.cpp
 MessagePairInterface.cpp
 PublisherInterface.cpp
 SubscriptionHandler.cpp
 SubscriptionInterface.cpp
  translators
 message_readers.cpp
 message_writers.cpp
 parameter_translators.cpp
  modulo_utils
  include
  modulo_utils
  testutils
 PredicatesListener.hpp
 ServiceClient.hpp
  src
  testutils
 PredicatesListener.cpp
+
+
+ + + + diff --git a/versions/v3.0.0/folderclosed.png b/versions/v3.0.0/folderclosed.png new file mode 100644 index 00000000..bb8ab35e Binary files /dev/null and b/versions/v3.0.0/folderclosed.png differ diff --git a/versions/v3.0.0/folderopen.png b/versions/v3.0.0/folderopen.png new file mode 100644 index 00000000..d6c7f676 Binary files /dev/null and b/versions/v3.0.0/folderopen.png differ diff --git a/versions/v3.0.0/functions.html b/versions/v3.0.0/functions.html new file mode 100644 index 00000000..53597f58 --- /dev/null +++ b/versions/v3.0.0/functions.html @@ -0,0 +1,230 @@ + + + + + + + +Modulo: Class Members + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/versions/v3.0.0/functions_func.html b/versions/v3.0.0/functions_func.html new file mode 100644 index 00000000..e0e0b93b --- /dev/null +++ b/versions/v3.0.0/functions_func.html @@ -0,0 +1,218 @@ + + + + + + + +Modulo: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/versions/v3.0.0/functions_vars.html b/versions/v3.0.0/functions_vars.html new file mode 100644 index 00000000..8ed7c90d --- /dev/null +++ b/versions/v3.0.0/functions_vars.html @@ -0,0 +1,84 @@ + + + + + + + +Modulo: Class Members - Variables + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ + + + diff --git a/versions/v3.0.0/hierarchy.html b/versions/v3.0.0/hierarchy.html new file mode 100644 index 00000000..54cbc2e4 --- /dev/null +++ b/versions/v3.0.0/hierarchy.html @@ -0,0 +1,116 @@ + + + + + + + +Modulo: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Cmodulo_components::ComponentInterfacePublicInterface< NodeT >Friend class to the ComponentInterface to allow test fixtures to access protected and private members
 Cmodulo_components::ComponentServiceResponseResponse structure to be returned by component services
 Cstd::enable_shared_from_this
 Cmodulo_core::communication::MessagePairInterfaceInterface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting
 Cmodulo_core::communication::MessagePair< MsgT, DataT >The MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages
 Cmodulo_core::communication::PublisherInterfaceInterface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting
 Cmodulo_core::communication::PublisherHandler< PubT, MsgT >The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers
 Cmodulo_core::communication::SubscriptionInterfaceInterface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting
 Cmodulo_core::communication::SubscriptionHandler< MsgT >The SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions
 Crclcpp_lifecycle::LifecycleNode
 Cmodulo_components::ComponentInterface< rclcpp_lifecycle::LifecycleNode >
 Cmodulo_components::LifecycleComponentA wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions
 Crclcpp::Node
 Cmodulo_components::ComponentInterface< rclcpp::Node >
 Cmodulo_components::ComponentA wrapper for rclcpp::Node to simplify application composition through unified component interfaces
 Cmodulo_utils::testutils::PredicatesListener
 Cmodulo_utils::testutils::ServiceClient< SrvT >
 CNodeT
 Cmodulo_components::ComponentInterface< NodeT >Base interface class for modulo components to wrap a ROS Node with custom behaviour
 Cstd::runtime_error
 Cmodulo_components::exceptions::ComponentExceptionA base class for all component exceptions
 Cmodulo_components::exceptions::AddServiceExceptionAn exception class to notify errors when adding a service
 Cmodulo_components::exceptions::AddSignalExceptionAn exception class to notify errors when adding a signal
 Cmodulo_components::exceptions::ComponentParameterExceptionAn exception class to notify errors with component parameters
 Cmodulo_components::exceptions::LookupTransformExceptionAn exception class to notify an error while looking up TF transforms
 Cmodulo_core::exceptions::CoreExceptionA base class for all core exceptions
 Cmodulo_core::exceptions::InvalidPointerCastExceptionAn exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class
 Cmodulo_core::exceptions::InvalidPointerExceptionAn exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting
 Cmodulo_core::exceptions::MessageTranslationExceptionAn exception class to notify that the translation of a ROS message failed
 Cmodulo_core::exceptions::NullPointerExceptionAn exception class to notify that a certain pointer is null
 Cmodulo_core::exceptions::ParameterTranslationExceptionAn exception class to notify incompatibility when translating parameters from different sources
+
+
+ + + + diff --git a/versions/v3.0.0/index.html b/versions/v3.0.0/index.html new file mode 100644 index 00000000..5fb00127 --- /dev/null +++ b/versions/v3.0.0/index.html @@ -0,0 +1,118 @@ + + + + + + + +Modulo: Modulo + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Modulo
+
+
+

Modulo is an extension layer to ROS2 that adds interoperability support for aica-technology/control-libraries and provides a modular framework for application composition through custom component classes in both C++ and Python.

+

Documentation is available at aica-technology.github.io/modulo.

+

Modulo Core

+

The core package implements interoperability between ROS2 and state_representation data types, allowing state data and parameters to be directly translated and handled as messages on the ROS2 interface layer.

+

Modulo Components

+

Modulo components are wrappers for ROS2 Nodes which abstract low-level ROS methods for greater user convenience and consistency between components.

+

While ROS2 Nodes provide a highly flexible and customizable interface, there is often a significant amount of boilerplate code that is duplicated with each new Node. In addition, the interoperability of multiple nodes in an application depends on them using compatible message types and behaving in a generally consistent manner.

+

The component classes are intended to simplify the development of compatible application modules. They provide more concise methods for adding parameters, services, transforms, topic subscriptions and publications. They also introduce new concepts such as predicate broadcasting, error handling and the direct binding of data attributes to their corresponding interface.

+

The package provides two variant classes: modulo_components::Component and modulo_components::LifecycleComponent. See the package documentation for more information.

+

Modulo Component Interfaces

+

This package defines custom standard interfaces for modulo components.

+

Modulo Utils

+

This package contains shared test fixtures.

+
+

Additional resources

+

Interfacing with ROS1

+

It is possible to use a bridge service to interface ROS2 with ROS1 in order to publish/subscribe to topics from ROS1.

+

ROS provides a docker image with this service. Run the following lines to pull the bridge image, launch an interactive shell, and subsequently start the bridge topic.

+
# run the bridge image interactively
+
docker run --rm -it --net=host ros:galactic-ros1-bridge
+
# start the bridge service in the container
+
root@docker-desktop:/# ros2 run ros1_bridge dynamic_bridge --bridge-all-topics
+

Further reading

+ +

Authors and maintainers

+ +
+
+ + + + diff --git a/versions/v3.0.0/jquery.js b/versions/v3.0.0/jquery.js new file mode 100644 index 00000000..1dffb65b --- /dev/null +++ b/versions/v3.0.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/versions/v3.0.0/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html b/versions/v3.0.0/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html new file mode 100644 index 00000000..1bec9f7e --- /dev/null +++ b/versions/v3.0.0/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html @@ -0,0 +1,89 @@ + + + + + + + +Modulo: Modulo Component Interfaces + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Modulo Component Interfaces
+
+
+

This package defines custom standard interfaces for modulo components.

+

Services

+

Modulo component classes provide a simplified method to add services which trigger a pre-defined callback function. Services are either empty (with no request payload) or carry a string request. They return a common modulo_components::ComponentServiceResponse structure with a success flag and status message.

+

EmptyTrigger

+

The EmptyTrigger service request takes no parameters. The response contains a boolean success flag and a string message.

+

StringTrigger

+

The EmptyTrigger service request takes a string payload. The response contains a boolean success flag and a string message. It is the responsibility of the component to define the expected payload format and to document it appropriately.

+
+
+ + + + diff --git a/versions/v3.0.0/md__github_workspace_source_modulo_components__c_o_n_t_r_i_b_u_t_i_n_g.html b/versions/v3.0.0/md__github_workspace_source_modulo_components__c_o_n_t_r_i_b_u_t_i_n_g.html new file mode 100644 index 00000000..6c79d1aa --- /dev/null +++ b/versions/v3.0.0/md__github_workspace_source_modulo_components__c_o_n_t_r_i_b_u_t_i_n_g.html @@ -0,0 +1,99 @@ + + + + + + + +Modulo: Contributing + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Contributing
+
+
+

This document is still work in progress.

+

Exceptions

+

This section describes how a component should handle exceptions and errors.

+

As a general rule, a component interface methods do not throw an exception or raise an error unless there is no other meaningful option. More precisely, only non-void public/protected methods throw, i.e. all setters and add_xxx methods do not throw but catch all exceptions and log an error.

+

If an exception is thrown, it is either a ComponentException (in C++) or a ComponentError (in Python) or any derived exception, such that all exceptions thrown by a component can be caught with those base exceptions (for example in the periodic step function).

+

Currently, the following methods throw:

    +
  • get_parameter
  • +
  • get_parameter_value
  • +
  • lookup_transform
  • +
+

Logging

+

Similar to the exceptions, the logging of debug, info, and error messages should follow some principles:

+
    +
  • Methods that catch an exception and are not allow to rethrow, log an error with the exception message
  • +
  • add_xxx methods use non-throttled logging
  • +
  • Setters and getters as well as all other methods that are expected to be called at a high frequency use throttled logging
  • +
+
+
+ + + + diff --git a/versions/v3.0.0/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html b/versions/v3.0.0/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html new file mode 100644 index 00000000..a25f0f6e --- /dev/null +++ b/versions/v3.0.0/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html @@ -0,0 +1,101 @@ + + + + + + + +Modulo: Modulo Components + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Modulo Components
+
+
+

This package provides base component classes as wrappers for ROS2 Nodes for convenience and consistency when developing modules for a dynamically composed application.

+

Component

+

The modulo_components::Component (C++) and modulo_components.Component (Python) classes are wrappers for the standard ROS Node that simplify application composition through unified component interfaces.

+

This class is intended for direct inheritance to implement custom components that perform one-shot or externally triggered operations. Examples of triggered behavior include providing a service, processing signals or publishing outputs on a periodic timer. One-shot behaviors may include interacting with the filesystem or publishing a predefined sequence of outputs.

+

Developers should override on_validate_parameter_callback() if any parameters are added and on_execute_callback() to implement any one-shot behavior. In the latter case, execute() should be invoked at the end of the derived constructor.

+

LifecycleComponent

+

The modulo_components::Component (C++) and modulo_components.Component (Python) classes are state-based alternatives that follow the lifecycle pattern for managed nodes.

+

This class is intended for direct inheritance to implement custom state-based components that perform different behaviors based on their state and on state transitions. An example of state-based behaviour is a signal component that requires configuration steps to determine which inputs to register and subsequently should publish outputs only when the component is activated.

+

Developers should override on_validate_parameter_callback() if any parameters are added. In addition, the following state transition callbacks should be overridden whenever custom transition behavior is needed:

    +
  • on_configure_callback()
  • +
  • on_activate_callback()
  • +
  • on_deactivate_callback()
  • +
  • on_cleanup_callback()
  • +
  • on_shutdown_callback()
  • +
  • on_error_callback()
  • +
  • on_step_callback()
  • +
+

Further reading

+

See the generated C++ documentation for more details. Refer to the AICA Component SDK for usage examples and templates for creating custom components.

+
+
+ + + + diff --git a/versions/v3.0.0/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html b/versions/v3.0.0/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html new file mode 100644 index 00000000..c79d13b4 --- /dev/null +++ b/versions/v3.0.0/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html @@ -0,0 +1,190 @@ + + + + + + + +Modulo: Modulo Core + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Modulo Core
+
+
+

Modulo Core is an interface package to support the interoperability of the Robot Operating System (ROS) with AICA control libraries by providing communication and translation utilities.

+

This package is specifically designed for ROS2 and was developed on Galactic Geochelone.

+

Communication

+

In ROS, applications communicate through publishers and subscribers. Communication is handled in a particular format (a ROS message), which includes a serialized representation of the data as well as a message header. For example, data of type bool maps to the standard message std_msgs::msg::Bool.

+

If application A wishes to send data to application B, a publisher of A and a subscriber of B must be configured to the same ROS message type. The data is written into the message format and published by A. B receives the message and can read the data back out.

+

MessagePair

+

The communication module simplifies the process of sending and receiving data by binding data types to their respective message types in a MessagePair. MessagePair objects are templated containers holding a pointer to the data. With a MessagePair instance, it is possible to set and get the data or read and write the corresponding message with simple access methods. The conversion between the data and the message when reading or writing is handled by the translators module.

+

MessageType

+

The supported groupings of data types and message types is defined by the MessageType enumeration. See the MessageType header file.

+ + + + + + + + + + + + + + + +
MessageType C++ data type ROS message type
BOOL bool std_msgs::msgs::Bool
INT32 int std_msgs::msgs::Int32
FLOAT64 double std_msgs::msgs::FLOAT64
FLOAT64_MUlTI_ARRAY std::vector<double> std_msgs::msgs::FLOAT64MultiArray
STRING std::string std_msgs::msgs::String
ENCODED_STATE state_representation::State modulo_core::EncodedState
+

Encoded State

+

The ENCODED_STATE type supports all classes in the family of state_representation::State. It uses the clproto serialization library from control_libraries to encode State type messages to and from a binary format. The message type modulo_core::EncodedState is equivalent to the ROS std_msgs::msg::UInt8MultiArray.

+

The helper function state_representation::make_shared_state(state_instance) can be used to inject any State-derived instance in a std::shared_ptr<state_representation::State> pointer for the MessagePair.

+

MessagePairInterface

+

As MessagePair instances need to be templated by the data type and message type, they can be somewhat verbose to manage directly. For example, storing multiple MessagePair instances in a container or passing them as function arguments would require additional templating.

+

The MessagePairInterface is the non-templated base class of the MessagePair. By injecting a reference to a MessagePair into a MessagePairInterface pointer, it is possible to manage any MessagePair in a generic, type-agnostic way.

+

The MessageType property of the MessagePairInterface allows introspection of the contained MessagePair type, and, through dynamic down-casting, both the MessagePair instance and contained data may be retrieved.

+

Publisher and Subscription Interfaces

+

To send and receive ROS messages, applications must create publishers and subscribers templated to the corresponding ROS message type. A ROS publisher provides a publish method which takes a ROS message as the argument. A ROS subscription forwards an incoming ROS message to a callback function.

+

By virtue of the MessagePair design pattern, the underlying ROS message types can be fully encapsulated and hidden from the user, allowing applications to simply publish and subscribe to supported data types.

+

Publisher

+

The PublisherHandler is a templated wrapper for a ROS publisher that additionally holds a MessagePair reference. This allows the user to invoke a publish() method without having to pass a ROS message as an argument. Instead, the data referenced by the MessagePair is automatically translated into a ROS message and published.

+

The PublisherHandler supports multiple publisher types, namely for standard or lifecycle publishers.

+

The intended pattern for the developer is shown below. There are a few more setup steps compared to creating a standard ROS publisher. However, once the publisher interface has been established, modifying and publishing the referenced data is greatly simplified.

+
{c++}
+
using namespace modulo_core::communication;
+
typedef std_msgs::msg::FLOAT64 MsgT;
+
auto node = std::make_shared<rclcpp::Node>("example");
+
+
// hold a pointer reference to some data that should be published
+
auto data = std::make_shared<double>(1.0);
+
+
// make a MessagePair to bind the data pointer to the corresponding ROS message
+
auto message_pair = std::make_shared<MessagePair<MsgT, double>>(data, rclcpp::Clock());
+
+
// create the ROS publisher
+
auto publisher = node->create_publisher<MsgT>("topic", 10);
+
+
// create the PublisherHandler from the ROS publisher
+
auto publisher_handler =
+
std::make_shared<PublisherHandler<rclcpp::Publisher<MsgT>, MsgT>>(PublisherType::PUBLISHER, publisher);
+
+
// encapsulate the PublisherHandler in a PublisherInterface
+
std::shared_ptr<PublisherInterface> publisher_interface(publisher_handler);
+
+
// pass the MessagePair to the PublisherInterface
+
publisher_interface->set_message_pair(message_pair);
+
+
// now, the data can be published, with automatic translation of the data value into a ROS message
+
publisher_interface->publish();
+
+
// because the PublisherInterface holds a reference to the MessagePair, which in turn references the original data,
+
// any changes to the data value will be observed when publishing.
+
*data = 2.0;
+
publisher_interface->publish();
+

Subscription

+

The SubscriptionHandler is a templated wrapper for a ROS subscription that additionally holds a MessagePair reference. When the subscription receives a message, the SubscriptionHandler callback automatically translates the ROS message and updates the value of the data referenced by the MessagePair.

+
{c++}
+
using namespace modulo_core::communication;
+
typedef std_msgs::msg::FLOAT64 MsgT;
+
auto node = std::make_shared<rclcpp::Node>("example");
+
+
// hold a pointer reference to some data that should be published
+
auto data = std::make_shared<double>(1.0);
+
+
// make a MessagePair to bind the data pointer to the corresponding ROS message
+
auto message_pair = std::make_shared<MessagePair<MsgT, double>>(data, rclcpp::Clock());
+
+
// create the SubscriptionHandler
+
auto subscription_handler = std::make_shared<SubscriptionHandler<modulo_core::EncodedState>>(message_pair);
+
+
// create the ROS subscription and associate the SubscriptionHandler callback
+
auto subscription = node->create_subscription<modulo_core::EncodedState>(
+
"topic", 10, subscription_handler->get_callback());
+
+
// encapsulate the SubscriptionHandler in a SubscriptionInterface
+
auto subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
+
// because the SubscriptionInterface holds a reference to the MessagePair, which in turn references the original data,
+
// any received ROS message will be translated to update the referenced data value
+
wait_until_some_subscription_received();
+
assert(*data == 2.0);
+

Translators

+

The translation module provides functions to convert between ROS2 and state_representation data types.

+

Message Translators

+

As described in the Communication section, the ROS framework uses specific message formats to send data between applications. Wrapping and unwrapping the data values to and from the ROS message is handled by the message translators.

+

The message readers set the value of a particular data type from the corresponding ROS message instance.

+

The message writers format the value of a data type into the corresponding ROS message instance.

+

Parameter Translators

+

Conceptually, parameters are a way to label and transfer data with a name-value relationship. A parameter has a name and a data value of a particular data type. On an interface level, this allows parameter values to be retrieved or written by name in order to determine or configure the behaviour of particular elements.

+

The ROS Parameter is a specific implementation of the parameter concept which, together with the ParameterMessage, can be used to read and write named parameters on application nodes through the ROS interface. The ROS Parameter supports only simple types (atomic types, strings and arrays).

+

The control libraries state_representation::Parameter is another implementation that supports more data types, including State-derived objects and matrices.

+

The parameter translator utilities in modulo_core::translators convert between ROS and state_representation parameter formats, so that parameters can be sent on the ROS interface but consumed as state_representation objects locally.

+
+
+ + + + diff --git a/versions/v3.0.0/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html b/versions/v3.0.0/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html new file mode 100644 index 00000000..51ecf341 --- /dev/null +++ b/versions/v3.0.0/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html @@ -0,0 +1,83 @@ + + + + + + + +Modulo: Modulo Utils + + + + + + + + + +
+
+ + + + + + +
+
Modulo 3.0.0 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Modulo Utils
+
+
+

Utils package for shared test fixtures

+
+
+ + + + diff --git a/versions/v3.0.0/menu.js b/versions/v3.0.0/menu.js new file mode 100644 index 00000000..b0b26936 --- /dev/null +++ b/versions/v3.0.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/versions/v3.0.0/menudata.js b/versions/v3.0.0/menudata.js new file mode 100644 index 00000000..62c7ad42 --- /dev/null +++ b/versions/v3.0.0/menudata.js @@ -0,0 +1,87 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"g",url:"namespacemembers_func.html#index_g"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"w",url:"namespacemembers_func.html#index_w"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"q",url:"functions.html#index_q"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/versions/v3.0.0/message__readers_8cpp_source.html b/versions/v3.0.0/message__readers_8cpp_source.html new file mode 100644 index 00000000..eba43231 --- /dev/null +++ b/versions/v3.0.0/message__readers_8cpp_source.html @@ -0,0 +1,192 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/translators/message_readers.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    message_readers.cpp
    +
    +
    +
    1#include "modulo_core/translators/message_readers.hpp"
    +
    2
    + +
    4
    +
    5static Eigen::Vector3d read_point(const geometry_msgs::msg::Point& message) {
    +
    6 return {message.x, message.y, message.z};
    +
    7}
    +
    8
    +
    9static Eigen::Vector3d read_vector3(const geometry_msgs::msg::Vector3& message) {
    +
    10 return {message.x, message.y, message.z};
    +
    11}
    +
    12
    +
    13static Eigen::Quaterniond read_quaternion(const geometry_msgs::msg::Quaternion& message) {
    +
    14 return {message.w, message.x, message.y, message.z};
    +
    15}
    +
    16
    +
    17void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Accel& message) {
    +
    18 state.set_linear_acceleration(read_vector3(message.linear));
    +
    19 state.set_angular_acceleration(read_vector3(message.angular));
    +
    20}
    +
    21
    +
    22void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::AccelStamped& message) {
    +
    23 state.set_reference_frame(message.header.frame_id);
    +
    24 read_message(state, message.accel);
    +
    25}
    +
    26
    +
    27void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Pose& message) {
    +
    28 state.set_position(read_point(message.position));
    +
    29 state.set_orientation(read_quaternion(message.orientation));
    +
    30}
    +
    31
    +
    32void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::PoseStamped& message) {
    +
    33 state.set_reference_frame(message.header.frame_id);
    +
    34 read_message(state, message.pose);
    +
    35}
    +
    36
    +
    37void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Transform& message) {
    +
    38 state.set_position(read_vector3(message.translation));
    +
    39 state.set_orientation(read_quaternion(message.rotation));
    +
    40}
    +
    41
    +
    42void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::TransformStamped& message) {
    +
    43 state.set_reference_frame(message.header.frame_id);
    +
    44 state.set_name(message.child_frame_id);
    +
    45 read_message(state, message.transform);
    +
    46}
    +
    47
    +
    48void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Twist& message) {
    +
    49 state.set_linear_velocity(read_vector3(message.linear));
    +
    50 state.set_angular_velocity(read_vector3(message.angular));
    +
    51}
    +
    52
    +
    53void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::TwistStamped& message) {
    +
    54 state.set_reference_frame(message.header.frame_id);
    +
    55 read_message(state, message.twist);
    +
    56}
    +
    57
    +
    58void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Wrench& message) {
    +
    59 state.set_force(read_vector3(message.force));
    +
    60 state.set_torque(read_vector3(message.torque));
    +
    61}
    +
    62
    +
    63void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::WrenchStamped& message) {
    +
    64 state.set_reference_frame(message.header.frame_id);
    +
    65 read_message(state, message.wrench);
    +
    66}
    +
    67
    +
    68void read_message(state_representation::JointState& state, const sensor_msgs::msg::JointState& message) {
    +
    69 try {
    +
    70 state.set_names(message.name);
    +
    71 if (!message.position.empty()) {
    +
    72 state.set_positions(Eigen::VectorXd::Map(message.position.data(), message.position.size()));
    +
    73 }
    +
    74 if (!message.velocity.empty()) {
    +
    75 state.set_velocities(Eigen::VectorXd::Map(message.velocity.data(), message.velocity.size()));
    +
    76 }
    +
    77 if (!message.effort.empty()) {
    +
    78 state.set_torques(Eigen::VectorXd::Map(message.effort.data(), message.effort.size()));
    +
    79 }
    +
    80 } catch (const std::exception& ex) {
    + +
    82 }
    +
    83}
    +
    84
    +
    85void read_message(bool& state, const std_msgs::msg::Bool& message) {
    +
    86 state = message.data;
    +
    87}
    +
    88
    +
    89void read_message(double& state, const std_msgs::msg::Float64& message) {
    +
    90 state = message.data;
    +
    91}
    +
    92
    +
    93void read_message(std::vector<double>& state, const std_msgs::msg::Float64MultiArray& message) {
    +
    94 state = message.data;
    +
    95}
    +
    96
    +
    97void read_message(int& state, const std_msgs::msg::Int32& message) {
    +
    98 state = message.data;
    +
    99}
    +
    100
    +
    101void read_message(std::string& state, const std_msgs::msg::String& message) {
    +
    102 state = message.data;
    +
    103}
    +
    104}// namespace modulo_core::translators
    +
    An exception class to notify that the translation of a ROS message failed.
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    void read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)
    Convert a ROS geometry_msgs::msg::Accel to a CartesianState.
    +
    + + + + diff --git a/versions/v3.0.0/message__readers_8hpp_source.html b/versions/v3.0.0/message__readers_8hpp_source.html new file mode 100644 index 00000000..cff7f91e --- /dev/null +++ b/versions/v3.0.0/message__readers_8hpp_source.html @@ -0,0 +1,444 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/translators/message_readers.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    message_readers.hpp
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <set>
    +
    4
    +
    5#include <geometry_msgs/msg/accel_stamped.hpp>
    +
    6#include <geometry_msgs/msg/pose_stamped.hpp>
    +
    7#include <geometry_msgs/msg/transform_stamped.hpp>
    +
    8#include <geometry_msgs/msg/twist_stamped.hpp>
    +
    9#include <geometry_msgs/msg/wrench_stamped.hpp>
    +
    10#include <std_msgs/msg/bool.hpp>
    +
    11#include <std_msgs/msg/float64.hpp>
    +
    12#include <std_msgs/msg/float64_multi_array.hpp>
    +
    13#include <std_msgs/msg/int32.hpp>
    +
    14#include <std_msgs/msg/string.hpp>
    +
    15#include <sensor_msgs/msg/joint_state.hpp>
    +
    16
    +
    17#include <clproto.hpp>
    +
    18#include <state_representation/parameters/Parameter.hpp>
    +
    19#include <state_representation/space/cartesian/CartesianPose.hpp>
    +
    20#include <state_representation/space/joint/JointPositions.hpp>
    +
    21#include <state_representation/space/Jacobian.hpp>
    +
    22
    +
    23#include "modulo_core/EncodedState.hpp"
    +
    24#include "modulo_core/exceptions/MessageTranslationException.hpp"
    +
    25
    + +
    27
    +
    33void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Accel& message);
    +
    34
    +
    40void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::AccelStamped& message);
    +
    41
    +
    47void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Pose& message);
    +
    48
    +
    54void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::PoseStamped& message);
    +
    55
    +
    61void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Transform& message);
    +
    62
    +
    68void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::TransformStamped& message);
    +
    69
    +
    75void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Twist& message);
    +
    76
    +
    82void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::TwistStamped& message);
    +
    83
    +
    89void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::Wrench& message);
    +
    90
    +
    96void read_message(state_representation::CartesianState& state, const geometry_msgs::msg::WrenchStamped& message);
    +
    97
    +
    103void read_message(state_representation::JointState& state, const sensor_msgs::msg::JointState& message);
    +
    104
    +
    112template<typename T, typename U>
    +
    113void read_message(state_representation::Parameter<T>& state, const U& message) {
    +
    114 state.set_value(message.data);
    +
    115}
    +
    116
    +
    122void read_message(bool& state, const std_msgs::msg::Bool& message);
    +
    123
    +
    129void read_message(double& state, const std_msgs::msg::Float64& message);
    +
    130
    +
    136void read_message(std::vector<double>& state, const std_msgs::msg::Float64MultiArray& message);
    +
    137
    +
    143void read_message(int& state, const std_msgs::msg::Int32& message);
    +
    144
    +
    150void read_message(std::string& state, const std_msgs::msg::String& message);
    +
    151
    +
    159template<typename T>
    +
    160inline void read_message(T& state, const EncodedState& message) {
    +
    161 try {
    +
    162 std::string tmp(message.data.begin(), message.data.end());
    +
    163 state = clproto::decode<T>(tmp);
    +
    164 } catch (const std::exception& ex) {
    + +
    166 }
    +
    167}
    +
    168
    +
    179template<typename T>
    +
    180inline std::shared_ptr<T> safe_dynamic_pointer_cast(std::shared_ptr<state_representation::State>& state) {
    +
    181 auto derived_state_ptr = std::dynamic_pointer_cast<T>(state);
    +
    182 if (derived_state_ptr == nullptr) {
    + +
    184 "Dynamic casting of state " + state->get_name() + " failed.");
    +
    185 }
    +
    186 return derived_state_ptr;
    +
    187}
    +
    188
    +
    199template<typename T>
    + +
    201 std::shared_ptr<state_representation::State>& state, std::shared_ptr<state_representation::State>& new_state
    +
    202) {
    +
    203 auto derived_state_ptr = safe_dynamic_pointer_cast<T>(state);
    +
    204 auto received_state_ptr = safe_dynamic_pointer_cast<T>(new_state);
    +
    205 *derived_state_ptr = *received_state_ptr;
    +
    206}
    +
    207
    +
    224template<typename StateT, typename NewStateT>
    + +
    226 std::shared_ptr<state_representation::State>& state, std::shared_ptr<state_representation::State>& new_state,
    +
    227 std::function<void(StateT&, const NewStateT&)> conversion_callback = {}
    +
    228) {
    +
    229 auto derived_state_ptr = safe_dynamic_pointer_cast<StateT>(state);
    +
    230 auto derived_new_state_ptr = safe_dynamic_pointer_cast<NewStateT>(new_state);
    +
    231 StateT tmp_new_state;
    +
    232 tmp_new_state.set_name(derived_new_state_ptr->get_name());
    +
    233 tmp_new_state.set_reference_frame(derived_new_state_ptr->get_reference_frame());
    +
    234 if (!derived_new_state_ptr->is_empty()) {
    +
    235 if (conversion_callback) {
    +
    236 conversion_callback(tmp_new_state, *derived_new_state_ptr);
    +
    237 }
    +
    238 }
    +
    239 *derived_state_ptr = tmp_new_state;
    +
    240}
    +
    241
    +
    258template<typename StateT, typename NewStateT>
    + +
    260 std::shared_ptr<state_representation::State>& state, std::shared_ptr<state_representation::State>& new_state,
    +
    261 std::function<void(StateT&, const NewStateT&)> conversion_callback = {}
    +
    262) {
    +
    263 auto derived_state_ptr = safe_dynamic_pointer_cast<StateT>(state);
    +
    264 auto derived_new_state_ptr = safe_dynamic_pointer_cast<NewStateT>(new_state);
    +
    265 StateT tmp_new_state(derived_new_state_ptr->get_name(), derived_new_state_ptr->get_names());
    +
    266 if (!derived_new_state_ptr->is_empty()) {
    +
    267 if (conversion_callback) {
    +
    268 conversion_callback(tmp_new_state, *derived_new_state_ptr);
    +
    269 }
    +
    270 }
    +
    271 *derived_state_ptr = tmp_new_state;
    +
    272}
    +
    273
    +
    274template<>
    +
    275inline void read_message(std::shared_ptr<state_representation::State>& state, const EncodedState& message) {
    +
    276 using namespace state_representation;
    +
    277 std::string tmp(message.data.begin(), message.data.end());
    +
    278 std::shared_ptr<State> new_state;
    +
    279 try {
    +
    280 new_state = clproto::decode<std::shared_ptr<State >>(tmp);
    +
    281 } catch (const std::exception& ex) {
    +
    282 throw exceptions::MessageTranslationException(ex.what());
    +
    283 }
    +
    284 try {
    +
    285 switch (state->get_type()) {
    +
    286 case StateType::STATE: {
    +
    287 if (new_state->get_type() == StateType::STATE) {
    +
    288 *state = *new_state;
    +
    289 } else {
    +
    290 *state = State(new_state->get_name());
    +
    291 }
    +
    292 break;
    +
    293 }
    +
    294 case StateType::SPATIAL_STATE: {
    +
    295 std::set<StateType> spatial_state_types = {
    +
    296 StateType::SPATIAL_STATE, StateType::CARTESIAN_STATE, StateType::CARTESIAN_POSE, StateType::CARTESIAN_TWIST,
    +
    297 StateType::CARTESIAN_ACCELERATION, StateType::CARTESIAN_WRENCH
    +
    298 };
    +
    299 if (spatial_state_types.find(new_state->get_type()) != spatial_state_types.cend()) {
    +
    300 safe_spatial_state_conversion<SpatialState, SpatialState>(state, new_state);
    +
    301 } else {
    +
    302 safe_dynamic_cast<SpatialState>(state, new_state);
    +
    303 }
    +
    304 break;
    +
    305 }
    +
    306 case StateType::CARTESIAN_STATE: {
    +
    307 if (new_state->get_type() == StateType::CARTESIAN_POSE) {
    +
    308 safe_spatial_state_conversion<CartesianState, CartesianPose>(
    +
    309 state, new_state, [](CartesianState& a, const CartesianPose& b) {
    +
    310 a.set_pose(b.get_pose());
    +
    311 });
    +
    312 } else if (new_state->get_type() == StateType::CARTESIAN_TWIST) {
    +
    313 safe_spatial_state_conversion<CartesianState, CartesianTwist>(
    +
    314 state, new_state, [](CartesianState& a, const CartesianTwist& b) {
    +
    315 a.set_twist(b.get_twist());
    +
    316 });
    +
    317 } else if (new_state->get_type() == StateType::CARTESIAN_ACCELERATION) {
    +
    318 safe_spatial_state_conversion<CartesianState, CartesianAcceleration>(
    +
    319 state, new_state, [](CartesianState& a, const CartesianAcceleration& b) {
    +
    320 a.set_acceleration(b.get_acceleration());
    +
    321 });
    +
    322 } else if (new_state->get_type() == StateType::CARTESIAN_WRENCH) {
    +
    323 safe_spatial_state_conversion<CartesianState, CartesianWrench>(
    +
    324 state, new_state, [](CartesianState& a, const CartesianWrench& b) {
    +
    325 a.set_wrench(b.get_wrench());
    +
    326 });
    +
    327 } else {
    +
    328 safe_dynamic_cast<CartesianState>(state, new_state);
    +
    329 }
    +
    330 break;
    +
    331 }
    +
    332 case StateType::CARTESIAN_POSE: {
    +
    333 if (new_state->get_type() == StateType::CARTESIAN_STATE) {
    +
    334 safe_spatial_state_conversion<CartesianPose, CartesianState>(
    +
    335 state, new_state, [](CartesianPose& a, const CartesianState& b) {
    +
    336 a.set_pose(b.get_pose());
    +
    337 });
    +
    338 } else {
    +
    339 safe_dynamic_cast<CartesianPose>(state, new_state);
    +
    340 }
    +
    341 break;
    +
    342 }
    +
    343 case StateType::CARTESIAN_TWIST: {
    +
    344 if (new_state->get_type() == StateType::CARTESIAN_STATE) {
    +
    345 safe_spatial_state_conversion<CartesianTwist, CartesianState>(
    +
    346 state, new_state, [](CartesianTwist& a, const CartesianState& b) {
    +
    347 a.set_twist(b.get_twist());
    +
    348 });
    +
    349 } else {
    +
    350 safe_dynamic_cast<CartesianTwist>(state, new_state);
    +
    351 }
    +
    352 break;
    +
    353 }
    +
    354 case StateType::CARTESIAN_ACCELERATION: {
    +
    355 if (new_state->get_type() == StateType::CARTESIAN_STATE) {
    +
    356 safe_spatial_state_conversion<CartesianAcceleration, CartesianState>(
    +
    357 state, new_state, [](CartesianAcceleration& a, const CartesianState& b) {
    +
    358 a.set_acceleration(b.get_acceleration());
    +
    359 });
    +
    360 } else {
    +
    361 safe_dynamic_cast<CartesianAcceleration>(state, new_state);
    +
    362 }
    +
    363 break;
    +
    364 }
    +
    365 case StateType::CARTESIAN_WRENCH: {
    +
    366 if (new_state->get_type() == StateType::CARTESIAN_STATE) {
    +
    367 safe_spatial_state_conversion<CartesianWrench, CartesianState>(
    +
    368 state, new_state, [](CartesianWrench& a, const CartesianState& b) {
    +
    369 a.set_wrench(b.get_wrench());
    +
    370 });
    +
    371 } else {
    +
    372 safe_dynamic_cast<CartesianWrench>(state, new_state);
    +
    373 }
    +
    374 break;
    +
    375 }
    +
    376 case StateType::JOINT_STATE: {
    +
    377 auto derived_state = safe_dynamic_pointer_cast<JointState>(state);
    +
    378 if (new_state->get_type() == StateType::JOINT_POSITIONS) {
    +
    379 safe_joint_state_conversion<JointState, JointPositions>(
    +
    380 state, new_state, [](JointState& a, const JointPositions& b) {
    +
    381 a.set_positions(b.get_positions());
    +
    382 });
    +
    383 } else if (new_state->get_type() == StateType::JOINT_VELOCITIES) {
    +
    384 safe_joint_state_conversion<JointState, JointVelocities>(
    +
    385 state, new_state, [](JointState& a, const JointVelocities& b) {
    +
    386 a.set_velocities(b.get_velocities());
    +
    387 });
    +
    388 } else if (new_state->get_type() == StateType::JOINT_ACCELERATIONS) {
    +
    389 safe_joint_state_conversion<JointState, JointAccelerations>(
    +
    390 state, new_state, [](JointState& a, const JointAccelerations& b) {
    +
    391 a.set_accelerations(b.get_accelerations());
    +
    392 });
    +
    393 } else if (new_state->get_type() == StateType::JOINT_TORQUES) {
    +
    394 safe_joint_state_conversion<JointState, JointTorques>(
    +
    395 state, new_state, [](JointState& a, const JointTorques& b) {
    +
    396 a.set_torques(b.get_torques());
    +
    397 });
    +
    398 } else {
    +
    399 safe_dynamic_cast<JointState>(state, new_state);
    +
    400 }
    +
    401 break;
    +
    402 }
    +
    403 case StateType::JOINT_POSITIONS: {
    +
    404 if (new_state->get_type() == StateType::JOINT_STATE) {
    +
    405 safe_joint_state_conversion<JointPositions, JointState>(
    +
    406 state, new_state, [](JointPositions& a, const JointState& b) {
    +
    407 a.set_positions(b.get_positions());
    +
    408 });
    +
    409 } else {
    +
    410 safe_dynamic_cast<JointPositions>(state, new_state);
    +
    411 }
    +
    412 break;
    +
    413 }
    +
    414 case StateType::JOINT_VELOCITIES: {
    +
    415 if (new_state->get_type() == StateType::JOINT_STATE) {
    +
    416 safe_joint_state_conversion<JointVelocities, JointState>(
    +
    417 state, new_state, [](JointVelocities& a, const JointState& b) {
    +
    418 a.set_velocities(b.get_velocities());
    +
    419 });
    +
    420 } else {
    +
    421 safe_dynamic_cast<JointVelocities>(state, new_state);
    +
    422 }
    +
    423 break;
    +
    424 }
    +
    425 case StateType::JOINT_ACCELERATIONS: {
    +
    426 if (new_state->get_type() == StateType::JOINT_STATE) {
    +
    427 safe_joint_state_conversion<JointAccelerations, JointState>(
    +
    428 state, new_state, [](JointAccelerations& a, const JointState& b) {
    +
    429 a.set_accelerations(b.get_accelerations());
    +
    430 });
    +
    431 } else {
    +
    432 safe_dynamic_cast<JointAccelerations>(state, new_state);
    +
    433 }
    +
    434 break;
    +
    435 }
    +
    436 case StateType::JOINT_TORQUES: {
    +
    437 if (new_state->get_type() == StateType::JOINT_STATE) {
    +
    438 safe_joint_state_conversion<JointTorques, JointState>(
    +
    439 state, new_state, [](JointTorques& a, const JointState& b) {
    +
    440 a.set_torques(b.get_torques());
    +
    441 });
    +
    442 } else {
    +
    443 safe_dynamic_cast<JointTorques>(state, new_state);
    +
    444 }
    +
    445 break;
    +
    446 }
    +
    447 case StateType::JACOBIAN:
    +
    448 safe_dynamic_cast<Jacobian>(state, new_state);
    +
    449 break;
    +
    450 case StateType::PARAMETER: {
    +
    451 auto param_ptr = std::dynamic_pointer_cast<ParameterInterface>(state);
    +
    452 switch (param_ptr->get_parameter_type()) {
    +
    453 case ParameterType::BOOL:
    +
    454 safe_dynamic_cast<Parameter<bool>>(state, new_state);
    +
    455 break;
    +
    456 case ParameterType::BOOL_ARRAY:
    +
    457 safe_dynamic_cast<Parameter<std::vector<bool>>>(state, new_state);
    +
    458 break;
    +
    459 case ParameterType::INT:
    +
    460 safe_dynamic_cast<Parameter<int>>(state, new_state);
    +
    461 break;
    +
    462 case ParameterType::INT_ARRAY:
    +
    463 safe_dynamic_cast<Parameter<std::vector<int>>>(state, new_state);
    +
    464 break;
    +
    465 case ParameterType::DOUBLE:
    +
    466 safe_dynamic_cast<Parameter<double>>(state, new_state);
    +
    467 break;
    +
    468 case ParameterType::DOUBLE_ARRAY:
    +
    469 safe_dynamic_cast<Parameter<std::vector<double>>>(state, new_state);
    +
    470 break;
    +
    471 case ParameterType::STRING:
    +
    472 safe_dynamic_cast<Parameter<std::string>>(state, new_state);
    +
    473 break;
    +
    474 case ParameterType::STRING_ARRAY:
    +
    475 safe_dynamic_cast<Parameter<std::vector<std::string>>>(state, new_state);
    +
    476 break;
    +
    477 case ParameterType::VECTOR:
    +
    478 safe_dynamic_cast<Parameter<Eigen::VectorXd>>(state, new_state);
    +
    479 break;
    +
    480 case ParameterType::MATRIX:
    +
    481 safe_dynamic_cast<Parameter<Eigen::MatrixXd>>(state, new_state);
    +
    482 break;
    +
    483 default:
    +
    484 throw exceptions::MessageTranslationException(
    +
    485 "The ParameterType contained by parameter " + param_ptr->get_name() + " is unsupported.");
    +
    486 }
    +
    487 break;
    +
    488 }
    +
    489 default:
    +
    490 throw exceptions::MessageTranslationException(
    +
    491 "The StateType contained by state " + new_state->get_name() + " is unsupported.");
    +
    492 }
    +
    493 } catch (const exceptions::MessageTranslationException& ex) {
    +
    494 throw;
    +
    495 }
    +
    496}
    +
    497}// namespace modulo_core::translators
    +
    An exception class to notify that the translation of a ROS message failed.
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    void safe_spatial_state_conversion(std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state, std::function< void(StateT &, const NewStateT &)> conversion_callback={})
    Update the value referenced by a state pointer by dynamically casting and converting the value refere...
    +
    std::shared_ptr< T > safe_dynamic_pointer_cast(std::shared_ptr< state_representation::State > &state)
    Safely downcast a base state pointer to a derived state pointer.
    +
    void safe_dynamic_cast(std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state)
    Update the value referenced by a state pointer from a new_state pointer.
    +
    void safe_joint_state_conversion(std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state, std::function< void(StateT &, const NewStateT &)> conversion_callback={})
    Update the value referenced by a state pointer by dynamically casting and converting the value refere...
    +
    void read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)
    Convert a ROS geometry_msgs::msg::Accel to a CartesianState.
    +
    std_msgs::msg::UInt8MultiArray EncodedState
    Define the EncodedState as UInt8MultiArray message type.
    +
    + + + + diff --git a/versions/v3.0.0/message__writers_8cpp_source.html b/versions/v3.0.0/message__writers_8cpp_source.html new file mode 100644 index 00000000..740a902b --- /dev/null +++ b/versions/v3.0.0/message__writers_8cpp_source.html @@ -0,0 +1,279 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/translators/message_writers.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    message_writers.cpp
    +
    +
    +
    1#include "modulo_core/translators/message_writers.hpp"
    +
    2
    +
    3#include <state_representation/space/cartesian/CartesianPose.hpp>
    +
    4
    +
    5using namespace state_representation;
    +
    6
    + +
    8
    +
    9static void write_point(geometry_msgs::msg::Point& message, const Eigen::Vector3d& vector) {
    +
    10 message.x = vector.x();
    +
    11 message.y = vector.y();
    +
    12 message.z = vector.z();
    +
    13}
    +
    14
    +
    15static void write_vector3(geometry_msgs::msg::Vector3& message, const Eigen::Vector3d& vector) {
    +
    16 message.x = vector.x();
    +
    17 message.y = vector.y();
    +
    18 message.z = vector.z();
    +
    19}
    +
    20
    +
    21static void write_quaternion(geometry_msgs::msg::Quaternion& message, const Eigen::Quaterniond& quat) {
    +
    22 message.w = quat.w();
    +
    23 message.x = quat.x();
    +
    24 message.y = quat.y();
    +
    25 message.z = quat.z();
    +
    26}
    +
    27
    +
    28void write_message(geometry_msgs::msg::Accel& message, const CartesianState& state, const rclcpp::Time&) {
    +
    29 if (!state) {
    +
    30 throw exceptions::MessageTranslationException(
    +
    31 state.get_name() + " state is empty while attempting to write it to message");
    +
    32 }
    +
    33 write_vector3(message.linear, state.get_linear_acceleration());
    +
    34 write_vector3(message.angular, state.get_angular_acceleration());
    +
    35}
    +
    36
    +
    37void write_message(geometry_msgs::msg::AccelStamped& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    38 write_message(message.accel, state, time);
    +
    39 message.header.stamp = time;
    +
    40 message.header.frame_id = state.get_reference_frame();
    +
    41}
    +
    42
    +
    43void write_message(geometry_msgs::msg::Pose& message, const CartesianState& state, const rclcpp::Time&) {
    +
    44 if (!state) {
    +
    45 throw exceptions::MessageTranslationException(
    +
    46 state.get_name() + " state is empty while attempting to write it to message");
    +
    47 }
    +
    48 write_point(message.position, state.get_position());
    +
    49 write_quaternion(message.orientation, state.get_orientation());
    +
    50}
    +
    51
    +
    52void write_message(geometry_msgs::msg::PoseStamped& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    53 write_message(message.pose, state, time);
    +
    54 message.header.stamp = time;
    +
    55 message.header.frame_id = state.get_reference_frame();
    +
    56}
    +
    57
    +
    58void write_message(geometry_msgs::msg::Transform& message, const CartesianState& state, const rclcpp::Time&) {
    +
    59 if (!state) {
    +
    60 throw exceptions::MessageTranslationException(
    +
    61 state.get_name() + " state is empty while attempting to write it to message");
    +
    62 }
    +
    63 write_vector3(message.translation, state.get_position());
    +
    64 write_quaternion(message.rotation, state.get_orientation());
    +
    65}
    +
    66
    +
    67void
    +
    68write_message(geometry_msgs::msg::TransformStamped& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    69 write_message(message.transform, state, time);
    +
    70 message.header.stamp = time;
    +
    71 message.header.frame_id = state.get_reference_frame();
    +
    72 message.child_frame_id = state.get_name();
    +
    73}
    +
    74
    +
    75void write_message(geometry_msgs::msg::Twist& message, const CartesianState& state, const rclcpp::Time&) {
    +
    76 if (!state) {
    +
    77 throw exceptions::MessageTranslationException(
    +
    78 state.get_name() + " state is empty while attempting to write it to message");
    +
    79 }
    +
    80 write_vector3(message.linear, state.get_linear_velocity());
    +
    81 write_vector3(message.angular, state.get_angular_velocity());
    +
    82}
    +
    83
    +
    84void write_message(geometry_msgs::msg::TwistStamped& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    85 write_message(message.twist, state, time);
    +
    86 message.header.stamp = time;
    +
    87 message.header.frame_id = state.get_reference_frame();
    +
    88}
    +
    89
    +
    90void write_message(geometry_msgs::msg::Wrench& message, const CartesianState& state, const rclcpp::Time&) {
    +
    91 if (!state) {
    +
    92 throw exceptions::MessageTranslationException(
    +
    93 state.get_name() + " state is empty while attempting to write it to message");
    +
    94 }
    +
    95 write_vector3(message.force, state.get_force());
    +
    96 write_vector3(message.torque, state.get_torque());
    +
    97}
    +
    98
    +
    99void write_message(geometry_msgs::msg::WrenchStamped& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    100 write_message(message.wrench, state, time);
    +
    101 message.header.stamp = time;
    +
    102 message.header.frame_id = state.get_reference_frame();
    +
    103}
    +
    104
    +
    105void write_message(sensor_msgs::msg::JointState& message, const JointState& state, const rclcpp::Time& time) {
    +
    106 if (!state) {
    +
    107 throw exceptions::MessageTranslationException(
    +
    108 state.get_name() + " state is empty while attempting to write it to message");
    +
    109 }
    +
    110 message.header.stamp = time;
    +
    111 message.name = state.get_names();
    +
    112 message.position =
    +
    113 std::vector<double>(state.get_positions().data(), state.get_positions().data() + state.get_positions().size());
    +
    114 message.velocity =
    +
    115 std::vector<double>(state.get_velocities().data(), state.get_velocities().data() + state.get_velocities().size());
    +
    116 message.effort =
    +
    117 std::vector<double>(state.get_torques().data(), state.get_torques().data() + state.get_torques().size());
    +
    118}
    +
    119
    +
    120void write_message(tf2_msgs::msg::TFMessage& message, const CartesianState& state, const rclcpp::Time& time) {
    +
    121 if (!state) {
    +
    122 throw exceptions::MessageTranslationException(
    +
    123 state.get_name() + " state is empty while attempting to write it to message");
    +
    124 }
    +
    125 geometry_msgs::msg::TransformStamped transform;
    +
    126 write_message(transform, state, time);
    +
    127 message.transforms.push_back(transform);
    +
    128}
    +
    129
    +
    130template<typename U, typename T>
    +
    131void write_message(U& message, const Parameter<T>& state, const rclcpp::Time&) {
    +
    132 if (!state) {
    +
    133 throw exceptions::MessageTranslationException(
    +
    134 state.get_name() + " state is empty while attempting to write it to message");
    +
    135 }
    +
    136 message.data = state.get_value();
    +
    137}
    +
    138
    +
    139template void write_message<std_msgs::msg::Float64, double>(
    +
    140 std_msgs::msg::Float64& message, const Parameter<double>& state, const rclcpp::Time&
    +
    141);
    +
    142
    +
    143template void write_message<std_msgs::msg::Float64MultiArray, std::vector<double>>(
    +
    144 std_msgs::msg::Float64MultiArray& message, const Parameter<std::vector<double>>& state, const rclcpp::Time&
    +
    145);
    +
    146
    +
    147template void write_message<std_msgs::msg::Bool, bool>(
    +
    148 std_msgs::msg::Bool& message, const Parameter<bool>& state, const rclcpp::Time&
    +
    149);
    +
    150
    +
    151template void write_message<std_msgs::msg::String, std::string>(
    +
    152 std_msgs::msg::String& message, const Parameter<std::string>& state, const rclcpp::Time&
    +
    153);
    +
    154
    +
    155template<>
    +
    156void
    +
    157write_message(geometry_msgs::msg::Transform& message, const Parameter<CartesianPose>& state, const rclcpp::Time& time) {
    +
    158 write_message(message, state.get_value(), time);
    +
    159}
    +
    160
    +
    161template<>
    +
    162void write_message(
    +
    163 geometry_msgs::msg::TransformStamped& message, const Parameter<CartesianPose>& state, const rclcpp::Time& time
    +
    164) {
    +
    165 write_message(message, state.get_value(), time);
    +
    166}
    +
    167
    +
    168template<>
    +
    169void write_message(tf2_msgs::msg::TFMessage& message, const Parameter<CartesianPose>& state, const rclcpp::Time& time) {
    +
    170 write_message(message, state.get_value(), time);
    +
    171}
    +
    172
    +
    173void write_message(std_msgs::msg::Bool& message, const bool& state, const rclcpp::Time&) {
    +
    174 message.data = state;
    +
    175}
    +
    176
    +
    177void write_message(std_msgs::msg::Float64& message, const double& state, const rclcpp::Time&) {
    +
    178 message.data = state;
    +
    179}
    +
    180
    +
    181void write_message(std_msgs::msg::Float64MultiArray& message, const std::vector<double>& state, const rclcpp::Time&) {
    +
    182 message.data = state;
    +
    183}
    +
    184
    +
    185void write_message(std_msgs::msg::Int32& message, const int& state, const rclcpp::Time&) {
    +
    186 message.data = state;
    +
    187}
    +
    188
    +
    189void write_message(std_msgs::msg::String& message, const std::string& state, const rclcpp::Time&) {
    +
    190 message.data = state;
    +
    191}
    +
    192}// namespace modulo_core::translators
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    void write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
    Convert a CartesianState to a ROS geometry_msgs::msg::Accel.
    +
    + + + + diff --git a/versions/v3.0.0/message__writers_8hpp_source.html b/versions/v3.0.0/message__writers_8hpp_source.html new file mode 100644 index 00000000..f8d9ed7f --- /dev/null +++ b/versions/v3.0.0/message__writers_8hpp_source.html @@ -0,0 +1,192 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/translators/message_writers.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    message_writers.hpp
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <geometry_msgs/msg/accel_stamped.hpp>
    +
    4#include <geometry_msgs/msg/pose_stamped.hpp>
    +
    5#include <geometry_msgs/msg/transform_stamped.hpp>
    +
    6#include <geometry_msgs/msg/twist_stamped.hpp>
    +
    7#include <geometry_msgs/msg/wrench_stamped.hpp>
    +
    8#include <rclcpp/time.hpp>
    +
    9#include <sensor_msgs/msg/joint_state.hpp>
    +
    10#include <std_msgs/msg/bool.hpp>
    +
    11#include <std_msgs/msg/float64.hpp>
    +
    12#include <std_msgs/msg/float64_multi_array.hpp>
    +
    13#include <std_msgs/msg/int32.hpp>
    +
    14#include <std_msgs/msg/string.hpp>
    +
    15#include <tf2_msgs/msg/tf_message.hpp>
    +
    16
    +
    17#include <clproto.hpp>
    +
    18#include <state_representation/space/cartesian/CartesianState.hpp>
    +
    19#include <state_representation/space/joint/JointState.hpp>
    +
    20#include <state_representation/parameters/Parameter.hpp>
    +
    21
    +
    22#include "modulo_core/EncodedState.hpp"
    +
    23#include "modulo_core/exceptions/MessageTranslationException.hpp"
    +
    24
    + +
    26
    + +
    35 geometry_msgs::msg::Accel& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    36);
    +
    37
    + +
    46 geometry_msgs::msg::AccelStamped& message, const state_representation::CartesianState& state,
    +
    47 const rclcpp::Time& time
    +
    48);
    +
    49
    + +
    58 geometry_msgs::msg::Pose& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    59);
    +
    60
    + +
    69 geometry_msgs::msg::PoseStamped& message, const state_representation::CartesianState& state,
    +
    70 const rclcpp::Time& time
    +
    71);
    +
    72
    + +
    81 geometry_msgs::msg::Transform& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    82);
    +
    83
    + +
    92 geometry_msgs::msg::TransformStamped& message, const state_representation::CartesianState& state,
    +
    93 const rclcpp::Time& time
    +
    94);
    +
    95
    + +
    104 geometry_msgs::msg::Twist& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    105);
    +
    106
    + +
    115 geometry_msgs::msg::TwistStamped& message, const state_representation::CartesianState& state,
    +
    116 const rclcpp::Time& time
    +
    117);
    +
    118
    + +
    127 geometry_msgs::msg::Wrench& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    128);
    +
    129
    + +
    138 geometry_msgs::msg::WrenchStamped& message, const state_representation::CartesianState& state,
    +
    139 const rclcpp::Time& time
    +
    140);
    +
    141
    + +
    150 sensor_msgs::msg::JointState& message, const state_representation::JointState& state, const rclcpp::Time& time
    +
    151);
    +
    152
    + +
    161 tf2_msgs::msg::TFMessage& message, const state_representation::CartesianState& state, const rclcpp::Time& time
    +
    162);
    +
    163
    +
    173template<typename U, typename T>
    +
    174void write_message(U& message, const state_representation::Parameter<T>& state, const rclcpp::Time&);
    +
    175
    +
    182void write_message(std_msgs::msg::Bool& message, const bool& state, const rclcpp::Time& time);
    +
    183
    +
    190void write_message(std_msgs::msg::Float64& message, const double& state, const rclcpp::Time& time);
    +
    191
    +
    198void
    +
    199write_message(std_msgs::msg::Float64MultiArray& message, const std::vector<double>& state, const rclcpp::Time& time);
    +
    200
    +
    207void write_message(std_msgs::msg::Int32& message, const int& state, const rclcpp::Time& time);
    +
    208
    +
    215void write_message(std_msgs::msg::String& message, const std::string& state, const rclcpp::Time& time);
    +
    216
    +
    225template<typename T>
    +
    226inline void write_message(EncodedState& message, const T& state, const rclcpp::Time&) {
    +
    227 try {
    +
    228 std::string tmp = clproto::encode<T>(state);
    +
    229 message.data = std::vector<unsigned char>(tmp.begin(), tmp.end());
    +
    230 } catch (const std::exception& ex) {
    + +
    232 }
    +
    233}
    +
    234}// namespace modulo_core::translators
    +
    An exception class to notify that the translation of a ROS message failed.
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    void write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
    Convert a CartesianState to a ROS geometry_msgs::msg::Accel.
    +
    std_msgs::msg::UInt8MultiArray EncodedState
    Define the EncodedState as UInt8MultiArray message type.
    +
    + + + + diff --git a/versions/v3.0.0/namespacemembers.html b/versions/v3.0.0/namespacemembers.html new file mode 100644 index 00000000..5ac59359 --- /dev/null +++ b/versions/v3.0.0/namespacemembers.html @@ -0,0 +1,124 @@ + + + + + + + +Modulo: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    + +

    - c -

    + + +

    - e -

    + + +

    - g -

    + + +

    - m -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - w -

    +
    + + + + diff --git a/versions/v3.0.0/namespacemembers_enum.html b/versions/v3.0.0/namespacemembers_enum.html new file mode 100644 index 00000000..887d2903 --- /dev/null +++ b/versions/v3.0.0/namespacemembers_enum.html @@ -0,0 +1,82 @@ + + + + + + + +Modulo: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + + + + diff --git a/versions/v3.0.0/namespacemembers_func.html b/versions/v3.0.0/namespacemembers_func.html new file mode 100644 index 00000000..6f266994 --- /dev/null +++ b/versions/v3.0.0/namespacemembers_func.html @@ -0,0 +1,109 @@ + + + + + + + +Modulo: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +  + +

    - c -

    + + +

    - g -

    + + +

    - r -

    + + +

    - s -

    + + +

    - w -

    +
    + + + + diff --git a/versions/v3.0.0/namespacemembers_type.html b/versions/v3.0.0/namespacemembers_type.html new file mode 100644 index 00000000..93339944 --- /dev/null +++ b/versions/v3.0.0/namespacemembers_type.html @@ -0,0 +1,81 @@ + + + + + + + +Modulo: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__components.html b/versions/v3.0.0/namespacemodulo__components.html new file mode 100644 index 00000000..d2706d94 --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__components.html @@ -0,0 +1,117 @@ + + + + + + + +Modulo: modulo_components Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    modulo_components Namespace Reference
    +
    +
    + +

    Modulo components. +More...

    + + + + + + + + +

    +Namespaces

    namespace  exceptions
     Modulo component exception classes.
     
    namespace  utilities
     Modulo component utilities.
     
    + + + + + + + + + + + + + + + + +

    +Classes

    class  Component
     A wrapper for rclcpp::Node to simplify application composition through unified component interfaces. More...
     
    class  ComponentInterface
     Base interface class for modulo components to wrap a ROS Node with custom behaviour. More...
     
    class  ComponentInterfacePublicInterface
     Friend class to the ComponentInterface to allow test fixtures to access protected and private members. More...
     
    struct  ComponentServiceResponse
     Response structure to be returned by component services. More...
     
    class  LifecycleComponent
     A wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions. More...
     
    +

    Detailed Description

    +

    Modulo components.

    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__components_1_1exceptions.html b/versions/v3.0.0/namespacemodulo__components_1_1exceptions.html new file mode 100644 index 00000000..dd259790 --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__components_1_1exceptions.html @@ -0,0 +1,111 @@ + + + + + + + +Modulo: modulo_components::exceptions Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_components::exceptions Namespace Reference
    +
    +
    + +

    Modulo component exception classes. +More...

    + + + + + + + + + + + + + + + + + +

    +Classes

    class  AddServiceException
     An exception class to notify errors when adding a service. More...
     
    class  AddSignalException
     An exception class to notify errors when adding a signal. More...
     
    class  ComponentException
     A base class for all component exceptions. More...
     
    class  ComponentParameterException
     An exception class to notify errors with component parameters. More...
     
    class  LookupTransformException
     An exception class to notify an error while looking up TF transforms. More...
     
    +

    Detailed Description

    +

    Modulo component exception classes.

    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__components_1_1utilities.html b/versions/v3.0.0/namespacemodulo__components_1_1utilities.html new file mode 100644 index 00000000..53e9fced --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__components_1_1utilities.html @@ -0,0 +1,115 @@ + + + + + + + +Modulo: modulo_components::utilities Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_components::utilities Namespace Reference
    +
    +
    + +

    Modulo component utilities. +More...

    + + + + +

    +Typedefs

    typedef std::variant< bool, std::function< bool(void)> > PredicateVariant
     
    +

    Detailed Description

    +

    Modulo component utilities.

    +

    Typedef Documentation

    + +

    ◆ PredicateVariant

    + +
    +
    + + + + +
    typedef std::variant<bool, std::function<bool(void)> > modulo_components::utilities::PredicateVariant
    +
    + +

    Definition at line 7 of file predicate_variant.hpp.

    + +
    +
    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__core.html b/versions/v3.0.0/namespacemodulo__core.html new file mode 100644 index 00000000..d482ce63 --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__core.html @@ -0,0 +1,127 @@ + + + + + + + +Modulo: modulo_core Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    modulo_core Namespace Reference
    +
    +
    + +

    Modulo Core. +More...

    + + + + + + + + + + + +

    +Namespaces

    namespace  communication
     Modulo Core communication module for handling messages on publication and subscription interfaces.
     
    namespace  exceptions
     Modulo Core exceptions module for defining exception classes.
     
    namespace  translators
     Modulo Core translation module for converting between ROS2 and state_representation data types.
     
    + + + + +

    +Typedefs

    typedef std_msgs::msg::UInt8MultiArray EncodedState
     Define the EncodedState as UInt8MultiArray message type. More...
     
    +

    Detailed Description

    +

    Modulo Core.

    +

    Typedef Documentation

    + +

    ◆ EncodedState

    + +
    +
    + +

    Define the EncodedState as UInt8MultiArray message type.

    + +

    Definition at line 15 of file EncodedState.hpp.

    + +
    +
    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__core_1_1communication.html b/versions/v3.0.0/namespacemodulo__core_1_1communication.html new file mode 100644 index 00000000..bda5ecba --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__core_1_1communication.html @@ -0,0 +1,453 @@ + + + + + + + +Modulo: modulo_core::communication Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_core::communication Namespace Reference
    +
    +
    + +

    Modulo Core communication module for handling messages on publication and subscription interfaces. +More...

    + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  MessagePair
     The MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages. More...
     
    class  MessagePairInterface
     Interface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting. More...
     
    class  PublisherHandler
     The PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers. More...
     
    class  PublisherInterface
     Interface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting. More...
     
    class  SubscriptionHandler
     The SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions. More...
     
    class  SubscriptionInterface
     Interface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting. More...
     
    + + + + + + + +

    +Enumerations

    enum class  MessageType {
    +  BOOL +, FLOAT64 +, FLOAT64_MULTI_ARRAY +, INT32 +,
    +  STRING +, ENCODED_STATE +
    + }
     Enum of all supported ROS message types for the MessagePairInterface. More...
     
    enum class  PublisherType { PUBLISHER +, LIFECYCLE_PUBLISHER + }
     Enum of supported ROS publisher types for the PublisherInterface. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    template<typename DataT >
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< DataT > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    template<>
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< bool > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    template<>
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< double > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    template<>
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< std::vector< double > > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    template<>
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< int > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    template<>
    std::shared_ptr< MessagePairInterfacemake_shared_message_pair (const std::shared_ptr< std::string > &data, const std::shared_ptr< rclcpp::Clock > &clock)
     
    +

    Detailed Description

    +

    Modulo Core communication module for handling messages on publication and subscription interfaces.

    +

    Enumeration Type Documentation

    + +

    ◆ MessageType

    + +
    +
    + + + + + +
    + + + + +
    enum class modulo_core::communication::MessageType
    +
    +strong
    +
    + +

    Enum of all supported ROS message types for the MessagePairInterface.

    +
    See also
    MessagePairInterface
    + +

    Definition at line 13 of file MessageType.hpp.

    + +
    +
    + +

    ◆ PublisherType

    + +
    +
    + + + + + +
    + + + + +
    enum class modulo_core::communication::PublisherType
    +
    +strong
    +
    + +

    Enum of supported ROS publisher types for the PublisherInterface.

    +
    See also
    PublisherInterface
    + +

    Definition at line 9 of file PublisherType.hpp.

    + +
    +
    +

    Function Documentation

    + +

    ◆ make_shared_message_pair() [1/6]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< bool > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 119 of file MessagePair.hpp.

    + +
    +
    + +

    ◆ make_shared_message_pair() [2/6]

    + +
    +
    +
    +template<typename DataT >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< DataT > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 112 of file MessagePair.hpp.

    + +
    +
    + +

    ◆ make_shared_message_pair() [3/6]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< double > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 125 of file MessagePair.hpp.

    + +
    +
    + +

    ◆ make_shared_message_pair() [4/6]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< int > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 138 of file MessagePair.hpp.

    + +
    +
    + +

    ◆ make_shared_message_pair() [5/6]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< std::string > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 144 of file MessagePair.hpp.

    + +
    +
    + +

    ◆ make_shared_message_pair() [6/6]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< MessagePairInterface > modulo_core::communication::make_shared_message_pair (const std::shared_ptr< std::vector< double > > & data,
    const std::shared_ptr< rclcpp::Clock > & clock 
    )
    +
    +inline
    +
    + +

    Definition at line 130 of file MessagePair.hpp.

    + +
    +
    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__core_1_1exceptions.html b/versions/v3.0.0/namespacemodulo__core_1_1exceptions.html new file mode 100644 index 00000000..ac56789f --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__core_1_1exceptions.html @@ -0,0 +1,114 @@ + + + + + + + +Modulo: modulo_core::exceptions Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_core::exceptions Namespace Reference
    +
    +
    + +

    Modulo Core exceptions module for defining exception classes. +More...

    + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  CoreException
     A base class for all core exceptions. More...
     
    class  InvalidPointerCastException
     An exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class. More...
     
    class  InvalidPointerException
     An exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting. More...
     
    class  MessageTranslationException
     An exception class to notify that the translation of a ROS message failed. More...
     
    class  NullPointerException
     An exception class to notify that a certain pointer is null. More...
     
    class  ParameterTranslationException
     An exception class to notify incompatibility when translating parameters from different sources. More...
     
    +

    Detailed Description

    +

    Modulo Core exceptions module for defining exception classes.

    +
    + + + + diff --git a/versions/v3.0.0/namespacemodulo__core_1_1translators.html b/versions/v3.0.0/namespacemodulo__core_1_1translators.html new file mode 100644 index 00000000..070525fc --- /dev/null +++ b/versions/v3.0.0/namespacemodulo__core_1_1translators.html @@ -0,0 +1,3214 @@ + + + + + + + +Modulo: modulo_core::translators Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_core::translators Namespace Reference
    +
    +
    + +

    Modulo Core translation module for converting between ROS2 and state_representation data types. +More...

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)
     Convert a ROS geometry_msgs::msg::Accel to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::AccelStamped &message)
     Convert a ROS geometry_msgs::msg::AccelStamped to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::Pose &message)
     Convert a ROS geometry_msgs::msg::Pose to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::PoseStamped &message)
     Convert a ROS geometry_msgs::msg::PoseStamped to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::Transform &message)
     Convert a ROS geometry_msgs::msg::Transform to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::TransformStamped &message)
     Convert a ROS geometry_msgs::msg::TransformStamped to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::Twist &message)
     Convert a ROS geometry_msgs::msg::Twist to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::TwistStamped &message)
     Convert a ROS geometry_msgs::msg::TwistStamped to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::Wrench &message)
     Convert a ROS geometry_msgs::msg::Wrench to a CartesianState. More...
     
    void read_message (state_representation::CartesianState &state, const geometry_msgs::msg::WrenchStamped &message)
     Convert a ROS geometry_msgs::msg::WrenchStamped to a CartesianState. More...
     
    void read_message (state_representation::JointState &state, const sensor_msgs::msg::JointState &message)
     Convert a ROS sensor_msgs::msg::JointState to a JointState. More...
     
    template<typename T , typename U >
    void read_message (state_representation::Parameter< T > &state, const U &message)
     Template function to convert a ROS std_msgs::msg::T to a Parameter<T> More...
     
    void read_message (bool &state, const std_msgs::msg::Bool &message)
     Convert a ROS std_msgs::msg::Bool to a boolean. More...
     
    void read_message (double &state, const std_msgs::msg::Float64 &message)
     Convert a ROS std_msgs::msg::Float64 to a double. More...
     
    void read_message (std::vector< double > &state, const std_msgs::msg::Float64MultiArray &message)
     Convert a ROS std_msgs::msg::Float64MultiArray to a vector of double. More...
     
    void read_message (int &state, const std_msgs::msg::Int32 &message)
     Convert a ROS std_msgs::msg::Int32 to an integer. More...
     
    void read_message (std::string &state, const std_msgs::msg::String &message)
     Convert a ROS std_msgs::msg::String to a string. More...
     
    template<typename T >
    void read_message (T &state, const EncodedState &message)
     Convert a ROS std_msgs::msg::UInt8MultiArray message to a State using protobuf decoding. More...
     
    template<typename T >
    std::shared_ptr< T > safe_dynamic_pointer_cast (std::shared_ptr< state_representation::State > &state)
     Safely downcast a base state pointer to a derived state pointer. More...
     
    template<typename T >
    void safe_dynamic_cast (std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state)
     Update the value referenced by a state pointer from a new_state pointer. More...
     
    template<typename StateT , typename NewStateT >
    void safe_spatial_state_conversion (std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state, std::function< void(StateT &, const NewStateT &)> conversion_callback={})
     Update the value referenced by a state pointer by dynamically casting and converting the value referenced by a new_state pointer. More...
     
    template<typename StateT , typename NewStateT >
    void safe_joint_state_conversion (std::shared_ptr< state_representation::State > &state, std::shared_ptr< state_representation::State > &new_state, std::function< void(StateT &, const NewStateT &)> conversion_callback={})
     Update the value referenced by a state pointer by dynamically casting and converting the value referenced by a new_state pointer. More...
     
    template<>
    void read_message (std::shared_ptr< state_representation::State > &state, const EncodedState &message)
     
    void write_message (geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::Accel. More...
     
    void write_message (geometry_msgs::msg::AccelStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::AccelStamped. More...
     
    void write_message (geometry_msgs::msg::Pose &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::Pose. More...
     
    void write_message (geometry_msgs::msg::PoseStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::PoseStamped. More...
     
    void write_message (geometry_msgs::msg::Transform &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::Transform. More...
     
    void write_message (geometry_msgs::msg::TransformStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::TransformStamped. More...
     
    void write_message (geometry_msgs::msg::Twist &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::Twist. More...
     
    void write_message (geometry_msgs::msg::TwistStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::TwistStamped. More...
     
    void write_message (geometry_msgs::msg::Wrench &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::Wrench. More...
     
    void write_message (geometry_msgs::msg::WrenchStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS geometry_msgs::msg::WrenchStamped. More...
     
    void write_message (sensor_msgs::msg::JointState &message, const state_representation::JointState &state, const rclcpp::Time &time)
     Convert a JointState to a ROS sensor_msgs::msg::JointState. More...
     
    void write_message (tf2_msgs::msg::TFMessage &message, const state_representation::CartesianState &state, const rclcpp::Time &time)
     Convert a CartesianState to a ROS tf2_msgs::msg::TFMessage. More...
     
    template<typename U , typename T >
    void write_message (U &message, const state_representation::Parameter< T > &state, const rclcpp::Time &)
     Convert a Parameter<T> to a ROS equivalent representation. More...
     
    void write_message (std_msgs::msg::Bool &message, const bool &state, const rclcpp::Time &time)
     Convert a boolean to a ROS std_msgs::msg::Bool. More...
     
    void write_message (std_msgs::msg::Float64 &message, const double &state, const rclcpp::Time &time)
     Convert a double to a ROS std_msgs::msg::Float64. More...
     
    void write_message (std_msgs::msg::Float64MultiArray &message, const std::vector< double > &state, const rclcpp::Time &time)
     Convert a vector of double to a ROS std_msgs::msg::Float64MultiArray. More...
     
    void write_message (std_msgs::msg::Int32 &message, const int &state, const rclcpp::Time &time)
     Convert an integer to a ROS std_msgs::msg::Int32. More...
     
    void write_message (std_msgs::msg::String &message, const std::string &state, const rclcpp::Time &time)
     Convert a string to a ROS std_msgs::msg::String. More...
     
    template<typename T >
    void write_message (EncodedState &message, const T &state, const rclcpp::Time &)
     Convert a state to an EncodedState (std_msgs::msg::UInt8MultiArray) message using protobuf encoding. More...
     
    void copy_parameter_value (const std::shared_ptr< const state_representation::ParameterInterface > &source_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)
     Copy the value of one parameter interface into another. More...
     
    rclcpp::Parameter write_parameter (const std::shared_ptr< state_representation::ParameterInterface > &parameter)
     Write a ROS Parameter from a ParameterInterface pointer. More...
     
    std::shared_ptr< state_representation::ParameterInterface > read_parameter (const rclcpp::Parameter &ros_parameter)
     Create a new ParameterInterface from a ROS Parameter object. More...
     
    std::shared_ptr< state_representation::ParameterInterface > read_parameter_const (const rclcpp::Parameter &ros_parameter, const std::shared_ptr< const state_representation::ParameterInterface > &parameter)
     Update the parameter value of a ParameterInterface from a ROS Parameter object only if the two parameters have the same name and the ROS Parameter value can be interpreted as a ParameterInterface value. More...
     
    void read_parameter (const rclcpp::Parameter &ros_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)
     Update the parameter value of a ParameterInterface from a ROS Parameter object. More...
     
    rclcpp::ParameterType get_ros_parameter_type (const state_representation::ParameterType &parameter_type)
     Given a state representation parameter type, get the corresponding ROS parameter type. More...
     
    void write_message (geometry_msgs::msg::Accel &message, const CartesianState &state, const rclcpp::Time &)
     
    void write_message (geometry_msgs::msg::AccelStamped &message, const CartesianState &state, const rclcpp::Time &time)
     
    void write_message (geometry_msgs::msg::Pose &message, const CartesianState &state, const rclcpp::Time &)
     
    void write_message (geometry_msgs::msg::PoseStamped &message, const CartesianState &state, const rclcpp::Time &time)
     
    void write_message (geometry_msgs::msg::Transform &message, const CartesianState &state, const rclcpp::Time &)
     
    void write_message (geometry_msgs::msg::TransformStamped &message, const CartesianState &state, const rclcpp::Time &time)
     
    void write_message (geometry_msgs::msg::Twist &message, const CartesianState &state, const rclcpp::Time &)
     
    void write_message (geometry_msgs::msg::TwistStamped &message, const CartesianState &state, const rclcpp::Time &time)
     
    void write_message (geometry_msgs::msg::Wrench &message, const CartesianState &state, const rclcpp::Time &)
     
    void write_message (geometry_msgs::msg::WrenchStamped &message, const CartesianState &state, const rclcpp::Time &time)
     
    void write_message (sensor_msgs::msg::JointState &message, const JointState &state, const rclcpp::Time &time)
     
    void write_message (tf2_msgs::msg::TFMessage &message, const CartesianState &state, const rclcpp::Time &time)
     
    template<typename U , typename T >
    void write_message (U &message, const Parameter< T > &state, const rclcpp::Time &)
     
    +template void write_message< std_msgs::msg::Float64, double > (std_msgs::msg::Float64 &message, const Parameter< double > &state, const rclcpp::Time &)
     
    +template void write_message< std_msgs::msg::Float64MultiArray, std::vector< double > > (std_msgs::msg::Float64MultiArray &message, const Parameter< std::vector< double > > &state, const rclcpp::Time &)
     
    +template void write_message< std_msgs::msg::Bool, bool > (std_msgs::msg::Bool &message, const Parameter< bool > &state, const rclcpp::Time &)
     
    +template void write_message< std_msgs::msg::String, std::string > (std_msgs::msg::String &message, const Parameter< std::string > &state, const rclcpp::Time &)
     
    template<>
    void write_message (geometry_msgs::msg::Transform &message, const Parameter< CartesianPose > &state, const rclcpp::Time &time)
     
    template<>
    void write_message (geometry_msgs::msg::TransformStamped &message, const Parameter< CartesianPose > &state, const rclcpp::Time &time)
     
    template<>
    void write_message (tf2_msgs::msg::TFMessage &message, const Parameter< CartesianPose > &state, const rclcpp::Time &time)
     
    void copy_parameter_value (const std::shared_ptr< const ParameterInterface > &source_parameter, const std::shared_ptr< ParameterInterface > &parameter)
     
    rclcpp::Parameter write_parameter (const std::shared_ptr< ParameterInterface > &parameter)
     
    std::shared_ptr< ParameterInterface > read_parameter_const (const rclcpp::Parameter &ros_parameter, const std::shared_ptr< const ParameterInterface > &parameter)
     
    void read_parameter (const rclcpp::Parameter &ros_parameter, const std::shared_ptr< ParameterInterface > &parameter)
     
    rclcpp::ParameterType get_ros_parameter_type (const ParameterType &parameter_type)
     
    +

    Detailed Description

    +

    Modulo Core translation module for converting between ROS2 and state_representation data types.

    +

    Function Documentation

    + +

    ◆ copy_parameter_value() [1/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::copy_parameter_value (const std::shared_ptr< const ParameterInterface > & source_parameter,
    const std::shared_ptr< ParameterInterface > & parameter 
    )
    +
    + +

    Definition at line 15 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ copy_parameter_value() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::copy_parameter_value (const std::shared_ptr< const state_representation::ParameterInterface > & source_parameter,
    const std::shared_ptr< state_representation::ParameterInterface > & parameter 
    )
    +
    + +

    Copy the value of one parameter interface into another.

    +

    When referencing a Parameter instance through a ParameterInterface pointer, it is necessary to know the parameter type to get or set the parameter value. Sometimes it is desirable to update the parameter value from another compatible ParameterInterface, while still preserving the reference to the original instance. This helper function calls the getters and setters of the appropriate parameter type to modify the value of the parameter instance while preserving the reference of the original pointer.

    Parameters
    + + + +
    source_parameterThe ParameterInterface with a value to copy
    parameterThe destination ParameterInterface to be updated
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::ParameterTranslationExceptionif the copying failed
    +
    +
    + +
    +
    + +

    ◆ get_ros_parameter_type() [1/2]

    + +
    +
    + + + + + + + + +
    rclcpp::ParameterType modulo_core::translators::get_ros_parameter_type (const ParameterType & parameter_type)
    +
    + +

    Definition at line 254 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ get_ros_parameter_type() [2/2]

    + +
    +
    + + + + + + + + +
    rclcpp::ParameterType modulo_core::translators::get_ros_parameter_type (const state_representation::ParameterType & parameter_type)
    +
    + +

    Given a state representation parameter type, get the corresponding ROS parameter type.

    +
    Parameters
    + + +
    parameter_typeThe state representation parameter type
    +
    +
    +
    Returns
    The corresponding ROS parameter type
    + +
    +
    + +

    ◆ read_message() [1/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (bool & state,
    const std_msgs::msg::Bool & message 
    )
    +
    + +

    Convert a ROS std_msgs::msg::Bool to a boolean.

    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 85 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [2/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (double & state,
    const std_msgs::msg::Float64 & message 
    )
    +
    + +

    Convert a ROS std_msgs::msg::Float64 to a double.

    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 89 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [3/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (int & state,
    const std_msgs::msg::Int32 & message 
    )
    +
    + +

    Convert a ROS std_msgs::msg::Int32 to an integer.

    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 97 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [4/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::Accel & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::Accel to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 17 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [5/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::AccelStamped & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::AccelStamped to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 22 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [6/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::Pose & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::Pose to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 27 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [7/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::PoseStamped & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::PoseStamped to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 32 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [8/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::Transform & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::Transform to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 37 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [9/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::TransformStamped & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::TransformStamped to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 42 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [10/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::Twist & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::Twist to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 48 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [11/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::TwistStamped & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::TwistStamped to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 53 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [12/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::Wrench & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::Wrench to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 58 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [13/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::CartesianState & state,
    const geometry_msgs::msg::WrenchStamped & message 
    )
    +
    + +

    Convert a ROS geometry_msgs::msg::WrenchStamped to a CartesianState.

    +
    Parameters
    + + + +
    stateThe CartesianState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 63 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [14/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::JointState & state,
    const sensor_msgs::msg::JointState & message 
    )
    +
    + +

    Convert a ROS sensor_msgs::msg::JointState to a JointState.

    +
    Parameters
    + + + +
    stateThe JointState to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 68 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [15/19]

    + +
    +
    +
    +template<typename T , typename U >
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (state_representation::Parameter< T > & state,
    const U & message 
    )
    +
    + +

    Template function to convert a ROS std_msgs::msg::T to a Parameter<T>

    +
    Template Parameters
    + + + +
    TAll types of parameters supported in ROS std messages
    UAll types of parameters supported in ROS std messages
    +
    +
    +
    Parameters
    + + + +
    stateThe Parameter<T> to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 113 of file message_readers.hpp.

    + +
    +
    + +

    ◆ read_message() [16/19]

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (std::shared_ptr< state_representation::State > & state,
    const EncodedStatemessage 
    )
    +
    +inline
    +
    + +

    Definition at line 275 of file message_readers.hpp.

    + +
    +
    + +

    ◆ read_message() [17/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (std::string & state,
    const std_msgs::msg::String & message 
    )
    +
    + +

    Convert a ROS std_msgs::msg::String to a string.

    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 101 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [18/19]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (std::vector< double > & state,
    const std_msgs::msg::Float64MultiArray & message 
    )
    +
    + +

    Convert a ROS std_msgs::msg::Float64MultiArray to a vector of double.

    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    + +

    Definition at line 93 of file message_readers.cpp.

    + +
    +
    + +

    ◆ read_message() [19/19]

    + +
    +
    +
    +template<typename T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_message (T & state,
    const EncodedStatemessage 
    )
    +
    +inline
    +
    + +

    Convert a ROS std_msgs::msg::UInt8MultiArray message to a State using protobuf decoding.

    +
    Template Parameters
    + + +
    TA state_representation::State type
    +
    +
    +
    Parameters
    + + + +
    stateThe state to populate
    messageThe ROS message to read from
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the translation failed or is not supported.
    +
    +
    + +

    Definition at line 160 of file message_readers.hpp.

    + +
    +
    + +

    ◆ read_parameter() [1/3]

    + +
    +
    + + + + + + + + +
    std::shared_ptr< ParameterInterface > modulo_core::translators::read_parameter (const rclcpp::Parameter & ros_parameter)
    +
    + +

    Create a new ParameterInterface from a ROS Parameter object.

    +
    Parameters
    + + +
    ros_parameterThe ROS parameter object to read
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::ParameterTranslationExceptionif the ROS parameter could not be read
    +
    +
    +
    Returns
    A new ParameterInterface pointer
    + +

    Definition at line 139 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ read_parameter() [2/3]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_parameter (const rclcpp::Parameter & ros_parameter,
    const std::shared_ptr< ParameterInterface > & parameter 
    )
    +
    + +

    Definition at line 247 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ read_parameter() [3/3]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::read_parameter (const rclcpp::Parameter & ros_parameter,
    const std::shared_ptr< state_representation::ParameterInterface > & parameter 
    )
    +
    + +

    Update the parameter value of a ParameterInterface from a ROS Parameter object.

    +

    The destination ParameterInterface must have a compatible parameter name and type.

    Parameters
    + + + +
    ros_parameterThe ROS parameter object to read
    parameterAn existing ParameterInterface pointer
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::ParameterTranslationExceptionif the ROS parameter could not be read
    +
    +
    + +
    +
    + +

    ◆ read_parameter_const() [1/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< ParameterInterface > modulo_core::translators::read_parameter_const (const rclcpp::Parameter & ros_parameter,
    const std::shared_ptr< const ParameterInterface > & parameter 
    )
    +
    + +

    Definition at line 190 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ read_parameter_const() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    std::shared_ptr< state_representation::ParameterInterface > modulo_core::translators::read_parameter_const (const rclcpp::Parameter & ros_parameter,
    const std::shared_ptr< const state_representation::ParameterInterface > & parameter 
    )
    +
    + +

    Update the parameter value of a ParameterInterface from a ROS Parameter object only if the two parameters have the same name and the ROS Parameter value can be interpreted as a ParameterInterface value.

    +
    Parameters
    + + + +
    ros_parameterThe ROS parameter object to read
    parameterAn existing ParameterInterface pointer
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::ParameterTranslationExceptionif the ROS parameter could not be read
    +
    +
    +
    Returns
    A new ParameterInterface pointer with the updated value
    + +
    +
    + +

    ◆ safe_dynamic_cast()

    + +
    +
    +
    +template<typename T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::safe_dynamic_cast (std::shared_ptr< state_representation::State > & state,
    std::shared_ptr< state_representation::State > & new_state 
    )
    +
    +inline
    +
    + +

    Update the value referenced by a state pointer from a new_state pointer.

    +

    The base state and new_state pointers must reference state-derived instances of type T. This function dynamically downcasts each pointer to a pointer of the derived type and assigns the de-referenced value from the new_state parameter to the address of the state pointer.

    Template Parameters
    + + +
    TThe derived state type
    +
    +
    +
    Parameters
    + + + +
    stateA base state pointer referencing a state-derived instance to be modified
    new_stateA base state pointer referencing a state-derived instance to be copied into the state parameter
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif either parameter cannot be cast to state type T
    +
    +
    + +

    Definition at line 200 of file message_readers.hpp.

    + +
    +
    + +

    ◆ safe_dynamic_pointer_cast()

    + +
    +
    +
    +template<typename T >
    + + + + + +
    + + + + + + + + +
    std::shared_ptr< T > modulo_core::translators::safe_dynamic_pointer_cast (std::shared_ptr< state_representation::State > & state)
    +
    +inline
    +
    + +

    Safely downcast a base state pointer to a derived state pointer.

    +

    This utility function asserts that result of the dynamic pointer cast is not null, and throws an exception otherwise. This helps to prevent uncaught segmentation faults from a null pointer dynamic cast result being passed to subsequent execution steps.

    Template Parameters
    + + +
    TThe derived state type
    +
    +
    +
    Parameters
    + + +
    stateA base state pointer referencing a state-derived instance
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the dynamic cast results in a null pointer
    +
    +
    +
    Returns
    The derived pointer of type T
    + +

    Definition at line 180 of file message_readers.hpp.

    + +
    +
    + +

    ◆ safe_joint_state_conversion()

    + +
    +
    +
    +template<typename StateT , typename NewStateT >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::safe_joint_state_conversion (std::shared_ptr< state_representation::State > & state,
    std::shared_ptr< state_representation::State > & new_state,
    std::function< void(StateT &, const NewStateT &)> conversion_callback = {} 
    )
    +
    +inline
    +
    + +

    Update the value referenced by a state pointer by dynamically casting and converting the value referenced by a new_state pointer.

    +

    This utility function is intended to help the conversion between joint-state-derived instances encapsulated in base state pointers. It sets the name and joint names of the referenced state instance from the new_state, and then passes the referenced values to a user-defined conversion callback function. For example, if state is referencing a JointPositions instance A and new_state is referencing a JointState instance B, the conversion callback function should invoke A.set_positions(B.get_positions()).

    Template Parameters
    + + + +
    StateTThe derived joint state type of the destination state
    NewStateTThe derived joint state type of the new state
    +
    +
    +
    Parameters
    + + + + +
    stateA base state pointer referencing a joint-state-derived instance to be modified
    new_stateA base state pointer referencing a joint-state-derived instance to be converted into the state parameter
    conversion_callbackA callback function taking parameters of type StateT and NewStateT, where the referenced StateT instance can be modified as needed from the NewStateT value
    +
    +
    + +

    Definition at line 259 of file message_readers.hpp.

    + +
    +
    + +

    ◆ safe_spatial_state_conversion()

    + +
    +
    +
    +template<typename StateT , typename NewStateT >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::safe_spatial_state_conversion (std::shared_ptr< state_representation::State > & state,
    std::shared_ptr< state_representation::State > & new_state,
    std::function< void(StateT &, const NewStateT &)> conversion_callback = {} 
    )
    +
    +inline
    +
    + +

    Update the value referenced by a state pointer by dynamically casting and converting the value referenced by a new_state pointer.

    +

    This utility function is intended to help the conversion between spatial-state-derived instances encapsulated in base state pointers. It sets the name and reference frame of the referenced state instance from the new_state, and then passes the referenced values to a user-defined conversion callback function. For example, if state is referencing a CartesianPose instance A and new_state is referencing a CartesianState instance B, the conversion callback function should invoke A.set_pose(B.get_pose()).

    Template Parameters
    + + + +
    StateTThe derived spatial state type of the destination state
    NewStateTThe derived spatial state type of the new state
    +
    +
    +
    Parameters
    + + + + +
    stateA base state pointer referencing a spatial-state-derived instance to be modified
    new_stateA base state pointer referencing a spatial-state-derived instance to be converted into the state parameter
    conversion_callbackA callback function taking parameters of type StateT and NewStateT, where the referenced StateT instance can be modified as needed from the NewStateT value
    +
    +
    + +

    Definition at line 225 of file message_readers.hpp.

    + +
    +
    + +

    ◆ write_message() [1/35]

    + +
    +
    +
    +template<typename T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (EncodedStatemessage,
    const T & state,
    const rclcpp::Time &  
    )
    +
    +inline
    +
    + +

    Convert a state to an EncodedState (std_msgs::msg::UInt8MultiArray) message using protobuf encoding.

    +
    Template Parameters
    + + +
    TA state_representation::State type
    +
    +
    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the translation failed or is not supported.
    +
    +
    + +

    Definition at line 226 of file message_writers.hpp.

    + +
    +
    + +

    ◆ write_message() [2/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Accel & message,
    const CartesianState & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 28 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [3/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Accel & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::Accel.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [4/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::AccelStamped & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 37 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [5/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::AccelStamped & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::AccelStamped.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [6/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Pose & message,
    const CartesianState & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 43 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [7/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Pose & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::Pose.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [8/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::PoseStamped & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 52 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [9/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::PoseStamped & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::PoseStamped.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [10/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Transform & message,
    const CartesianState & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 58 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [11/35]

    + +
    +
    +
    +template<>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Transform & message,
    const Parameter< CartesianPose > & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 157 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [12/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Transform & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::Transform.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [13/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::TransformStamped & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 68 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [14/35]

    + +
    +
    +
    +template<>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::TransformStamped & message,
    const Parameter< CartesianPose > & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 162 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [15/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::TransformStamped & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::TransformStamped.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [16/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Twist & message,
    const CartesianState & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 75 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [17/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Twist & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::Twist.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [18/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::TwistStamped & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 84 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [19/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::TwistStamped & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::TwistStamped.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [20/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Wrench & message,
    const CartesianState & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 90 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [21/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::Wrench & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::Wrench.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [22/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::WrenchStamped & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 99 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [23/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (geometry_msgs::msg::WrenchStamped & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS geometry_msgs::msg::WrenchStamped.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [24/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (sensor_msgs::msg::JointState & message,
    const JointState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 105 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [25/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (sensor_msgs::msg::JointState & message,
    const state_representation::JointState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a JointState to a ROS sensor_msgs::msg::JointState.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [26/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (std_msgs::msg::Bool & message,
    const bool & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a boolean to a ROS std_msgs::msg::Bool.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    + +

    Definition at line 173 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [27/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (std_msgs::msg::Float64 & message,
    const double & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a double to a ROS std_msgs::msg::Float64.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    + +

    Definition at line 177 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [28/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (std_msgs::msg::Float64MultiArray & message,
    const std::vector< double > & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a vector of double to a ROS std_msgs::msg::Float64MultiArray.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    + +

    Definition at line 181 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [29/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (std_msgs::msg::Int32 & message,
    const int & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert an integer to a ROS std_msgs::msg::Int32.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    + +

    Definition at line 185 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [30/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (std_msgs::msg::String & message,
    const std::string & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a string to a ROS std_msgs::msg::String.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    + +

    Definition at line 189 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [31/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (tf2_msgs::msg::TFMessage & message,
    const CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 120 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [32/35]

    + +
    +
    +
    +template<>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (tf2_msgs::msg::TFMessage & message,
    const Parameter< CartesianPose > & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Definition at line 169 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [33/35]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (tf2_msgs::msg::TFMessage & message,
    const state_representation::CartesianState & state,
    const rclcpp::Time & time 
    )
    +
    + +

    Convert a CartesianState to a ROS tf2_msgs::msg::TFMessage.

    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_message() [34/35]

    + +
    +
    +
    +template<typename U , typename T >
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (U & message,
    const Parameter< T > & state,
    const rclcpp::Time &  
    )
    +
    + +

    Definition at line 131 of file message_writers.cpp.

    + +
    +
    + +

    ◆ write_message() [35/35]

    + +
    +
    +
    +template<typename U , typename T >
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void modulo_core::translators::write_message (U & message,
    const state_representation::Parameter< T > & state,
    const rclcpp::Time &  
    )
    +
    + +

    Convert a Parameter<T> to a ROS equivalent representation.

    +
    Template Parameters
    + + + +
    TAll types of parameters supported in ROS std messages
    UAll types of parameters supported in ROS std messages
    +
    +
    +
    Parameters
    + + + + +
    messageThe ROS message to populate
    stateThe state to read from
    timeThe time of the message
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::MessageTranslationExceptionif the provided state is empty.
    +
    +
    + +
    +
    + +

    ◆ write_parameter() [1/2]

    + +
    +
    + + + + + + + + +
    rclcpp::Parameter modulo_core::translators::write_parameter (const std::shared_ptr< ParameterInterface > & parameter)
    +
    + +

    Definition at line 87 of file parameter_translators.cpp.

    + +
    +
    + +

    ◆ write_parameter() [2/2]

    + +
    +
    + + + + + + + + +
    rclcpp::Parameter modulo_core::translators::write_parameter (const std::shared_ptr< state_representation::ParameterInterface > & parameter)
    +
    + +

    Write a ROS Parameter from a ParameterInterface pointer.

    +
    Parameters
    + + +
    parameterThe ParameterInterface pointer with a name and value
    +
    +
    +
    Exceptions
    + + +
    modulo_core::exceptions::ParameterTranslationExceptionif the ROS parameter could not be written
    +
    +
    +
    Returns
    A new ROS Parameter object
    + +
    +
    +
    + + + + diff --git a/versions/v3.0.0/namespaces.html b/versions/v3.0.0/namespaces.html new file mode 100644 index 00000000..13506fd2 --- /dev/null +++ b/versions/v3.0.0/namespaces.html @@ -0,0 +1,114 @@ + + + + + + + +Modulo: Namespace List + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    +
    [detail level 123]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Nmodulo_componentsModulo components
     NexceptionsModulo component exception classes
     CAddServiceExceptionAn exception class to notify errors when adding a service
     CAddSignalExceptionAn exception class to notify errors when adding a signal
     CComponentExceptionA base class for all component exceptions
     CComponentParameterExceptionAn exception class to notify errors with component parameters
     CLookupTransformExceptionAn exception class to notify an error while looking up TF transforms
     NutilitiesModulo component utilities
     CComponentA wrapper for rclcpp::Node to simplify application composition through unified component interfaces
     CComponentInterfaceBase interface class for modulo components to wrap a ROS Node with custom behaviour
     CComponentInterfacePublicInterfaceFriend class to the ComponentInterface to allow test fixtures to access protected and private members
     CComponentServiceResponseResponse structure to be returned by component services
     CLifecycleComponentA wrapper for rclcpp_lifecycle::LifecycleNode to simplify application composition through unified component interfaces while supporting lifecycle states and transitions
     Nmodulo_coreModulo Core
     NcommunicationModulo Core communication module for handling messages on publication and subscription interfaces
     CMessagePairThe MessagePair stores a pointer to a variable and translates the value of this pointer back and forth between the corresponding ROS messages
     CMessagePairInterfaceInterface class to enable non-templated writing and reading ROS messages from derived MessagePair instances through dynamic down-casting
     CPublisherHandlerThe PublisherHandler handles different types of ROS publishers to activate, deactivate and publish data with those publishers
     CPublisherInterfaceInterface class to enable non-templated activating/deactivating/publishing of ROS publishers from derived PublisherHandler instances through dynamic down-casting
     CSubscriptionHandlerThe SubscriptionHandler handles different types of ROS subscriptions to receive data from those subscriptions
     CSubscriptionInterfaceInterface class to enable non-templated subscriptions with ROS subscriptions from derived SubscriptionHandler instances through dynamic down-casting
     NexceptionsModulo Core exceptions module for defining exception classes
     CCoreExceptionA base class for all core exceptions
     CInvalidPointerCastExceptionAn exception class to notify if the result of getting an instance of a derived class through dynamic down-casting of an object of the base class is not a correctly typed instance of the derived class
     CInvalidPointerExceptionAn exception class to notify if an object has no reference count (if the object is not owned by any pointer) when attempting to get a derived instance through dynamic down-casting
     CMessageTranslationExceptionAn exception class to notify that the translation of a ROS message failed
     CNullPointerExceptionAn exception class to notify that a certain pointer is null
     CParameterTranslationExceptionAn exception class to notify incompatibility when translating parameters from different sources
     NtranslatorsModulo Core translation module for converting between ROS2 and state_representation data types
    +
    +
    + + + + diff --git a/versions/v3.0.0/nav_f.png b/versions/v3.0.0/nav_f.png new file mode 100644 index 00000000..72a58a52 Binary files /dev/null and b/versions/v3.0.0/nav_f.png differ diff --git a/versions/v3.0.0/nav_fd.png b/versions/v3.0.0/nav_fd.png new file mode 100644 index 00000000..032fbdd4 Binary files /dev/null and b/versions/v3.0.0/nav_fd.png differ diff --git a/versions/v3.0.0/nav_g.png b/versions/v3.0.0/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/versions/v3.0.0/nav_g.png differ diff --git a/versions/v3.0.0/nav_h.png b/versions/v3.0.0/nav_h.png new file mode 100644 index 00000000..33389b10 Binary files /dev/null and b/versions/v3.0.0/nav_h.png differ diff --git a/versions/v3.0.0/nav_hd.png b/versions/v3.0.0/nav_hd.png new file mode 100644 index 00000000..de80f18a Binary files /dev/null and b/versions/v3.0.0/nav_hd.png differ diff --git a/versions/v3.0.0/open.png b/versions/v3.0.0/open.png new file mode 100644 index 00000000..30f75c7e Binary files /dev/null and b/versions/v3.0.0/open.png differ diff --git a/versions/v3.0.0/pages.html b/versions/v3.0.0/pages.html new file mode 100644 index 00000000..8c77f994 --- /dev/null +++ b/versions/v3.0.0/pages.html @@ -0,0 +1,90 @@ + + + + + + + +Modulo: Related Pages + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    + + + + diff --git a/versions/v3.0.0/parameter__translators_8cpp_source.html b/versions/v3.0.0/parameter__translators_8cpp_source.html new file mode 100644 index 00000000..89cffad0 --- /dev/null +++ b/versions/v3.0.0/parameter__translators_8cpp_source.html @@ -0,0 +1,371 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/src/translators/parameter_translators.cpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    parameter_translators.cpp
    +
    +
    +
    1#include "modulo_core/translators/parameter_translators.hpp"
    +
    2
    +
    3#include <clproto.hpp>
    +
    4#include <state_representation/space/cartesian/CartesianPose.hpp>
    +
    5#include <state_representation/space/cartesian/CartesianState.hpp>
    +
    6#include <state_representation/space/joint/JointPositions.hpp>
    +
    7#include <state_representation/space/joint/JointState.hpp>
    +
    8
    +
    9#include "modulo_core/exceptions/ParameterTranslationException.hpp"
    +
    10
    +
    11using namespace state_representation;
    +
    12
    + +
    14
    + +
    16 const std::shared_ptr<const ParameterInterface>& source_parameter,
    +
    17 const std::shared_ptr<ParameterInterface>& parameter
    +
    18) {
    +
    19 if (source_parameter->get_parameter_type() != parameter->get_parameter_type()) {
    +
    20 throw exceptions::ParameterTranslationException(
    +
    21 "Source parameter " + source_parameter->get_name()
    +
    22 + " to be copied does not have the same type as destination parameter " + parameter->get_name());
    +
    23 }
    +
    24 switch (source_parameter->get_parameter_type()) {
    +
    25 case ParameterType::BOOL:
    +
    26 parameter->set_parameter_value(source_parameter->get_parameter_value<bool>());
    +
    27 return;
    +
    28 case ParameterType::BOOL_ARRAY:
    +
    29 parameter->set_parameter_value(source_parameter->get_parameter_value<std::vector<bool>>());
    +
    30 return;
    +
    31 case ParameterType::INT:
    +
    32 parameter->set_parameter_value(source_parameter->get_parameter_value<int>());
    +
    33 return;
    +
    34 case ParameterType::INT_ARRAY:
    +
    35 parameter->set_parameter_value(source_parameter->get_parameter_value<std::vector<int>>());
    +
    36 return;
    +
    37 case ParameterType::DOUBLE:
    +
    38 parameter->set_parameter_value(source_parameter->get_parameter_value<double>());
    +
    39 return;
    +
    40 case ParameterType::DOUBLE_ARRAY:
    +
    41 parameter->set_parameter_value(source_parameter->get_parameter_value<std::vector<double>>());
    +
    42 return;
    +
    43 case ParameterType::STRING:
    +
    44 parameter->set_parameter_value(source_parameter->get_parameter_value<std::string>());
    +
    45 return;
    +
    46 case ParameterType::STRING_ARRAY:
    +
    47 parameter->set_parameter_value(source_parameter->get_parameter_value<std::vector<std::string>>());
    +
    48 return;
    +
    49 case ParameterType::VECTOR:
    +
    50 parameter->set_parameter_value(source_parameter->get_parameter_value<Eigen::VectorXd>());
    +
    51 return;
    +
    52 case ParameterType::MATRIX:
    +
    53 parameter->set_parameter_value(source_parameter->get_parameter_value<Eigen::MatrixXd>());
    +
    54 return;
    +
    55 case ParameterType::STATE:
    +
    56 if (source_parameter->get_parameter_state_type() != parameter->get_parameter_state_type()) {
    +
    57 throw exceptions::ParameterTranslationException(
    +
    58 "Source parameter " + source_parameter->get_name()
    +
    59 + " to be copied does not have the same parameter state type as destination parameter "
    +
    60 + parameter->get_name());
    +
    61 }
    +
    62 switch (source_parameter->get_parameter_state_type()) {
    +
    63 case StateType::CARTESIAN_STATE:
    +
    64 parameter->set_parameter_value(source_parameter->get_parameter_value<CartesianState>());
    +
    65 return;
    +
    66 case StateType::CARTESIAN_POSE:
    +
    67 parameter->set_parameter_value(source_parameter->get_parameter_value<CartesianPose>());
    +
    68 return;
    +
    69 case StateType::JOINT_STATE:
    +
    70 parameter->set_parameter_value(source_parameter->get_parameter_value<JointState>());
    +
    71 return;
    +
    72 case StateType::JOINT_POSITIONS:
    +
    73 parameter->set_parameter_value(source_parameter->get_parameter_value<JointPositions>());
    +
    74 return;
    +
    75 default:
    +
    76 break;
    +
    77 }
    +
    78 break;
    +
    79 default:
    +
    80 break;
    +
    81 }
    +
    82 throw exceptions::ParameterTranslationException(
    +
    83 "Could not copy the value from source parameter " + source_parameter->get_name() + " into parameter "
    +
    84 + parameter->get_name());
    +
    85}
    +
    86
    +
    87rclcpp::Parameter write_parameter(const std::shared_ptr<ParameterInterface>& parameter) {
    +
    88 if (parameter->is_empty()) {
    +
    89 return rclcpp::Parameter(parameter->get_name());
    +
    90 }
    +
    91 switch (parameter->get_parameter_type()) {
    +
    92 case ParameterType::BOOL:
    +
    93 return {parameter->get_name(), parameter->get_parameter_value<bool>()};
    +
    94 case ParameterType::BOOL_ARRAY:
    +
    95 return {parameter->get_name(), parameter->get_parameter_value<std::vector<bool>>()};
    +
    96 case ParameterType::INT:
    +
    97 return {parameter->get_name(), parameter->get_parameter_value<int>()};
    +
    98 case ParameterType::INT_ARRAY:
    +
    99 return {parameter->get_name(), parameter->get_parameter_value<std::vector<int>>()};
    +
    100 case ParameterType::DOUBLE:
    +
    101 return {parameter->get_name(), parameter->get_parameter_value<double>()};
    +
    102 case ParameterType::DOUBLE_ARRAY:
    +
    103 return {parameter->get_name(), parameter->get_parameter_value<std::vector<double>>()};
    +
    104 case ParameterType::STRING:
    +
    105 return {parameter->get_name(), parameter->get_parameter_value<std::string>()};
    +
    106 case ParameterType::STRING_ARRAY:
    +
    107 return {parameter->get_name(), parameter->get_parameter_value<std::vector<std::string>>()};
    +
    108 case ParameterType::STATE: {
    +
    109 switch (parameter->get_parameter_state_type()) {
    +
    110 case StateType::CARTESIAN_STATE:
    +
    111 return {parameter->get_name(), clproto::to_json(parameter->get_parameter_value<CartesianState>())};
    +
    112 case StateType::CARTESIAN_POSE:
    +
    113 return {parameter->get_name(), clproto::to_json(parameter->get_parameter_value<CartesianPose>())};
    +
    114 case StateType::JOINT_STATE:
    +
    115 return {parameter->get_name(), clproto::to_json(parameter->get_parameter_value<JointState>())};
    +
    116 case StateType::JOINT_POSITIONS:
    +
    117 return {parameter->get_name(), clproto::to_json(parameter->get_parameter_value<JointPositions>())};
    +
    118 default:
    +
    119 break;
    +
    120 }
    +
    121 break;
    +
    122 }
    +
    123 case ParameterType::VECTOR: {
    +
    124 auto eigen_vector = parameter->get_parameter_value<Eigen::VectorXd>();
    +
    125 std::vector<double> vec(eigen_vector.data(), eigen_vector.data() + eigen_vector.size());
    +
    126 return {parameter->get_name(), vec};
    +
    127 }
    +
    128 case ParameterType::MATRIX: {
    +
    129 auto eigen_matrix = parameter->get_parameter_value<Eigen::MatrixXd>();
    +
    130 std::vector<double> vec(eigen_matrix.data(), eigen_matrix.data() + eigen_matrix.size());
    +
    131 return {parameter->get_name(), vec};
    +
    132 }
    +
    133 default:
    +
    134 break;
    +
    135 }
    +
    136 throw exceptions::ParameterTranslationException("Parameter " + parameter->get_name() + " could not be written!");
    +
    137}
    +
    138
    +
    139std::shared_ptr<ParameterInterface> read_parameter(const rclcpp::Parameter& parameter) {
    +
    140 switch (parameter.get_type()) {
    +
    141 case rclcpp::PARAMETER_BOOL:
    +
    142 return make_shared_parameter(parameter.get_name(), parameter.as_bool());
    +
    143 case rclcpp::PARAMETER_BOOL_ARRAY:
    +
    144 return make_shared_parameter(parameter.get_name(), parameter.as_bool_array());
    +
    145 case rclcpp::PARAMETER_INTEGER:
    +
    146 return make_shared_parameter(parameter.get_name(), static_cast<int>(parameter.as_int()));
    +
    147 case rclcpp::PARAMETER_INTEGER_ARRAY: {
    +
    148 auto array = parameter.as_integer_array();
    +
    149 std::vector<int> int_array(array.begin(), array.end());
    +
    150 return make_shared_parameter(parameter.get_name(), int_array);
    +
    151 }
    +
    152 case rclcpp::PARAMETER_DOUBLE:
    +
    153 return make_shared_parameter(parameter.get_name(), parameter.as_double());
    +
    154 case rclcpp::PARAMETER_DOUBLE_ARRAY:
    +
    155 return make_shared_parameter(parameter.get_name(), parameter.as_double_array());
    +
    156 case rclcpp::PARAMETER_STRING_ARRAY:
    +
    157 return make_shared_parameter<std::vector<std::string>>(parameter.get_name(), parameter.as_string_array());
    +
    158 case rclcpp::PARAMETER_STRING: {
    +
    159 // TODO: consider dedicated clproto::decode<std::shared_ptr<ParameterInterface>>(msg) specialization in library
    +
    160 std::string encoding;
    +
    161 try {
    +
    162 encoding = clproto::from_json(parameter.as_string());
    +
    163 } catch (const clproto::JsonParsingException&) {}
    +
    164 if (!clproto::is_valid(encoding)) {
    +
    165 return make_shared_parameter<std::string>(parameter.get_name(), parameter.as_string());
    +
    166 }
    +
    167 switch (clproto::check_message_type(encoding)) {
    +
    168 case clproto::CARTESIAN_STATE_MESSAGE:
    +
    169 return make_shared_parameter<CartesianState>(parameter.get_name(), clproto::decode<CartesianState>(encoding));
    +
    170 case clproto::CARTESIAN_POSE_MESSAGE:
    +
    171 return make_shared_parameter<CartesianPose>(parameter.get_name(), clproto::decode<CartesianPose>(encoding));
    +
    172 case clproto::JOINT_STATE_MESSAGE:
    +
    173 return make_shared_parameter<JointState>(parameter.get_name(), clproto::decode<JointState>(encoding));
    +
    174 case clproto::JOINT_POSITIONS_MESSAGE:
    +
    175 return make_shared_parameter<JointPositions>(parameter.get_name(), clproto::decode<JointPositions>(encoding));
    +
    176 default:
    + +
    178 "Parameter " + parameter.get_name() + " has an unsupported encoded message type");
    +
    179 }
    +
    180 }
    +
    181 case rclcpp::PARAMETER_BYTE_ARRAY:
    +
    182 // TODO: try clproto decode, re-use logic from above
    +
    183 throw exceptions::ParameterTranslationException("Parameter byte arrays are not currently supported.");
    +
    184 default:
    +
    185 break;
    +
    186 }
    +
    187 throw exceptions::ParameterTranslationException("Parameter " + parameter.get_name() + " could not be read!");
    +
    188}
    +
    189
    +
    190std::shared_ptr<ParameterInterface> read_parameter_const(
    +
    191 const rclcpp::Parameter& ros_parameter, const std::shared_ptr<const ParameterInterface>& parameter
    +
    192) {
    +
    193 if (ros_parameter.get_name() != parameter->get_name()) {
    + +
    195 "The ROS parameter " + ros_parameter.get_name()
    +
    196 + " to be read does not have the same name as the reference parameter " + parameter->get_name());
    +
    197 }
    +
    198 if (ros_parameter.get_type() == rclcpp::PARAMETER_NOT_SET) {
    +
    199 return make_shared_parameter_interface(
    +
    200 parameter->get_name(), parameter->get_parameter_type(), parameter->get_parameter_state_type());
    +
    201 }
    +
    202 auto new_parameter = read_parameter(ros_parameter);
    +
    203 if (new_parameter->get_parameter_type() == parameter->get_parameter_type()) {
    +
    204 if (new_parameter->get_parameter_state_type() != parameter->get_parameter_state_type()) {
    +
    205 throw exceptions::ParameterTranslationException(
    +
    206 "The received state parameter " + ros_parameter.get_name()
    +
    207 + " does not have the same state type as the reference parameter");
    +
    208 }
    +
    209 return new_parameter;
    +
    210 }
    +
    211 switch (new_parameter->get_parameter_type()) {
    +
    212 case ParameterType::DOUBLE_ARRAY: {
    +
    213 auto value = new_parameter->get_parameter_value<std::vector<double>>();
    +
    214 switch (parameter->get_parameter_type()) {
    +
    215 case ParameterType::VECTOR: {
    +
    216 Eigen::VectorXd vector = Eigen::Map<Eigen::VectorXd>(value.data(), static_cast<Eigen::Index>(value.size()));
    +
    217 new_parameter = make_shared_parameter(parameter->get_name(), vector);
    +
    218 break;
    +
    219 }
    +
    220 case ParameterType::MATRIX: {
    +
    221 auto matrix = parameter->get_parameter_value<Eigen::MatrixXd>();
    +
    222 if (static_cast<std::size_t>(matrix.size()) != value.size()) {
    +
    223 throw exceptions::ParameterTranslationException(
    +
    224 "The ROS parameter " + ros_parameter.get_name() + " with type double array has size "
    +
    225 + std::to_string(value.size()) + " while the reference parameter matrix " + parameter->get_name()
    +
    226 + " has size " + std::to_string(matrix.size()));
    +
    227 }
    +
    228 matrix = Eigen::Map<Eigen::MatrixXd>(value.data(), matrix.rows(), matrix.cols());
    +
    229 new_parameter = make_shared_parameter(parameter->get_name(), matrix);
    +
    230 break;
    +
    231 }
    +
    232 default:
    +
    233 throw exceptions::ParameterTranslationException(
    +
    234 "The ROS parameter " + ros_parameter.get_name()
    +
    235 + " with type double array cannot be interpreted by reference parameter " + parameter->get_name()
    +
    236 + " (type code " + std::to_string(static_cast<int>(parameter->get_parameter_type())) + ")");
    +
    237 }
    +
    238 break;
    +
    239 }
    +
    240 default:
    +
    241 throw exceptions::ParameterTranslationException(
    +
    242 "Incompatible parameter type encountered while reading parameter '" + parameter->get_name() + "'.");
    +
    243 }
    +
    244 return new_parameter;
    +
    245}
    +
    246
    +
    247void read_parameter(
    +
    248 const rclcpp::Parameter& ros_parameter, const std::shared_ptr<ParameterInterface>& parameter
    +
    249) {
    +
    250 auto new_parameter = read_parameter_const(ros_parameter, parameter);
    +
    251 copy_parameter_value(new_parameter, parameter);
    +
    252}
    +
    253
    +
    254rclcpp::ParameterType get_ros_parameter_type(const ParameterType& parameter_type) {
    +
    255 switch (parameter_type) {
    +
    256 case ParameterType::BOOL:
    +
    257 return rclcpp::ParameterType::PARAMETER_BOOL;
    +
    258 case ParameterType::BOOL_ARRAY:
    +
    259 return rclcpp::ParameterType::PARAMETER_BOOL_ARRAY;
    +
    260 case ParameterType::INT:
    +
    261 return rclcpp::ParameterType::PARAMETER_INTEGER;
    +
    262 case ParameterType::INT_ARRAY:
    +
    263 return rclcpp::ParameterType::PARAMETER_INTEGER_ARRAY;
    +
    264 case ParameterType::DOUBLE:
    +
    265 return rclcpp::ParameterType::PARAMETER_DOUBLE;
    +
    266 case ParameterType::DOUBLE_ARRAY:
    +
    267 case ParameterType::VECTOR:
    +
    268 case ParameterType::MATRIX:
    +
    269 return rclcpp::ParameterType::PARAMETER_DOUBLE_ARRAY;
    +
    270 case ParameterType::STRING:
    +
    271 return rclcpp::ParameterType::PARAMETER_STRING;
    +
    272 case ParameterType::STRING_ARRAY:
    +
    273 case ParameterType::STATE:
    +
    274 return rclcpp::ParameterType::PARAMETER_STRING_ARRAY;
    +
    275 default:
    +
    276 return rclcpp::ParameterType::PARAMETER_NOT_SET;
    +
    277 }
    +
    278}
    +
    279}// namespace modulo_core::translators
    +
    An exception class to notify incompatibility when translating parameters from different sources.
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    std::shared_ptr< state_representation::ParameterInterface > read_parameter(const rclcpp::Parameter &ros_parameter)
    Create a new ParameterInterface from a ROS Parameter object.
    +
    rclcpp::Parameter write_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter)
    Write a ROS Parameter from a ParameterInterface pointer.
    +
    rclcpp::ParameterType get_ros_parameter_type(const state_representation::ParameterType &parameter_type)
    Given a state representation parameter type, get the corresponding ROS parameter type.
    +
    void copy_parameter_value(const std::shared_ptr< const state_representation::ParameterInterface > &source_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)
    Copy the value of one parameter interface into another.
    +
    std::shared_ptr< state_representation::ParameterInterface > read_parameter_const(const rclcpp::Parameter &ros_parameter, const std::shared_ptr< const state_representation::ParameterInterface > &parameter)
    Update the parameter value of a ParameterInterface from a ROS Parameter object only if the two parame...
    +
    + + + + diff --git a/versions/v3.0.0/parameter__translators_8hpp_source.html b/versions/v3.0.0/parameter__translators_8hpp_source.html new file mode 100644 index 00000000..985e1a41 --- /dev/null +++ b/versions/v3.0.0/parameter__translators_8hpp_source.html @@ -0,0 +1,120 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_core/include/modulo_core/translators/parameter_translators.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    parameter_translators.hpp
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <rclcpp/parameter.hpp>
    +
    4#include <state_representation/parameters/Parameter.hpp>
    +
    5
    + +
    11
    + +
    24 const std::shared_ptr<const state_representation::ParameterInterface>& source_parameter,
    +
    25 const std::shared_ptr<state_representation::ParameterInterface>& parameter
    +
    26);
    +
    27
    +
    34rclcpp::Parameter write_parameter(const std::shared_ptr<state_representation::ParameterInterface>& parameter);
    +
    35
    +
    42std::shared_ptr<state_representation::ParameterInterface> read_parameter(const rclcpp::Parameter& ros_parameter);
    +
    43
    +
    52std::shared_ptr<state_representation::ParameterInterface> read_parameter_const(
    +
    53 const rclcpp::Parameter& ros_parameter,
    +
    54 const std::shared_ptr<const state_representation::ParameterInterface>& parameter
    +
    55);
    +
    56
    + +
    65 const rclcpp::Parameter& ros_parameter, const std::shared_ptr<state_representation::ParameterInterface>& parameter
    +
    66);
    +
    67
    +
    68
    +
    74rclcpp::ParameterType get_ros_parameter_type(const state_representation::ParameterType& parameter_type);
    +
    75
    +
    76}// namespace modulo_core::exceptions
    +
    Modulo Core translation module for converting between ROS2 and state_representation data types.
    +
    std::shared_ptr< state_representation::ParameterInterface > read_parameter(const rclcpp::Parameter &ros_parameter)
    Create a new ParameterInterface from a ROS Parameter object.
    +
    rclcpp::Parameter write_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter)
    Write a ROS Parameter from a ParameterInterface pointer.
    +
    rclcpp::ParameterType get_ros_parameter_type(const state_representation::ParameterType &parameter_type)
    Given a state representation parameter type, get the corresponding ROS parameter type.
    +
    void copy_parameter_value(const std::shared_ptr< const state_representation::ParameterInterface > &source_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)
    Copy the value of one parameter interface into another.
    +
    std::shared_ptr< state_representation::ParameterInterface > read_parameter_const(const rclcpp::Parameter &ros_parameter, const std::shared_ptr< const state_representation::ParameterInterface > &parameter)
    Update the parameter value of a ParameterInterface from a ROS Parameter object only if the two parame...
    +
    + + + + diff --git a/versions/v3.0.0/predicate__variant_8hpp_source.html b/versions/v3.0.0/predicate__variant_8hpp_source.html new file mode 100644 index 00000000..8ba5267d --- /dev/null +++ b/versions/v3.0.0/predicate__variant_8hpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/utilities/predicate_variant.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    predicate_variant.hpp
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <variant>
    +
    4
    + +
    6
    +
    7typedef std::variant<bool, std::function<bool(void)>> PredicateVariant;
    +
    8
    +
    9}// namespace modulo_components::utilities
    +
    Modulo component utilities.
    +
    + + + + diff --git a/versions/v3.0.0/search/all_0.js b/versions/v3.0.0/search/all_0.js new file mode 100644 index 00000000..2b6347bf --- /dev/null +++ b/versions/v3.0.0/search/all_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['activate_0',['activate',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#ad3cb237464da96e1dd2780b696bce139',1,'modulo_core::communication::PublisherInterface']]], + ['add_5finput_1',['add_input',['../classmodulo__components_1_1_component_interface.html#a7b7b874b7b1b96fd702a23295c85e008',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)'],['../classmodulo__components_1_1_component_interface.html#a17bfd14f0cae2058dfe89db603e72af1',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)'],['../classmodulo__components_1_1_component_interface.html#a4d1bb20a73749a4702f7ba61b00950bc',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)']]], + ['add_5foutput_2',['add_output',['../classmodulo__components_1_1_component.html#ab475ee0e8ea1b1f52c6f0720a0546e90',1,'modulo_components::Component::add_output()'],['../classmodulo__components_1_1_lifecycle_component.html#a22d31bd5f8a713b0ce757bea8622cbf3',1,'modulo_components::LifecycleComponent::add_output()']]], + ['add_5fparameter_3',['add_parameter',['../classmodulo__components_1_1_component_interface.html#a060729fbb4c67c3284d302e34662e26a',1,'modulo_components::ComponentInterface::add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)'],['../classmodulo__components_1_1_component_interface.html#ac232e7f3ebba4b686bf4724cfec51e44',1,'modulo_components::ComponentInterface::add_parameter(const std::string &name, const T &value, const std::string &description, bool read_only=false)']]], + ['add_5fperiodic_5fcallback_4',['add_periodic_callback',['../classmodulo__components_1_1_component_interface.html#a235805a50110892d8878035ef3606f8b',1,'modulo_components::ComponentInterface']]], + ['add_5fpredicate_5',['add_predicate',['../classmodulo__components_1_1_component_interface.html#a1e481802803014a22f7e2dd5c85a07f1',1,'modulo_components::ComponentInterface::add_predicate(const std::string &predicate_name, bool predicate_value)'],['../classmodulo__components_1_1_component_interface.html#a8ca709a0499ecd01bd35d3656799a2ab',1,'modulo_components::ComponentInterface::add_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)']]], + ['add_5fservice_6',['add_service',['../classmodulo__components_1_1_component_interface.html#a543fc375983c0c976f3c47bf8041dddc',1,'modulo_components::ComponentInterface::add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)'],['../classmodulo__components_1_1_component_interface.html#a790d9a153b6660de8e528a925099854e',1,'modulo_components::ComponentInterface::add_service(const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)']]], + ['add_5fstatic_5ftf_5fbroadcaster_7',['add_static_tf_broadcaster',['../classmodulo__components_1_1_component_interface.html#aacafd3ac505f480acc6495f5bcf9f7cd',1,'modulo_components::ComponentInterface']]], + ['add_5ftf_5fbroadcaster_8',['add_tf_broadcaster',['../classmodulo__components_1_1_component_interface.html#a95061be71c39f63969cc0bdddc655555',1,'modulo_components::ComponentInterface']]], + ['add_5ftf_5flistener_9',['add_tf_listener',['../classmodulo__components_1_1_component_interface.html#abcc9679e8c32c9b702d00bf30d1c46cf',1,'modulo_components::ComponentInterface']]], + ['add_5ftrigger_10',['add_trigger',['../classmodulo__components_1_1_component_interface.html#a5698b2a6b162e283890ee4e119712156',1,'modulo_components::ComponentInterface']]], + ['addserviceexception_11',['AddServiceException',['../classmodulo__components_1_1exceptions_1_1_add_service_exception.html',1,'modulo_components::exceptions']]], + ['addsignalexception_12',['AddSignalException',['../classmodulo__components_1_1exceptions_1_1_add_signal_exception.html',1,'modulo_components::exceptions']]] +]; diff --git a/versions/v3.0.0/search/all_1.js b/versions/v3.0.0/search/all_1.js new file mode 100644 index 00000000..a568eb8a --- /dev/null +++ b/versions/v3.0.0/search/all_1.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['component_0',['Component',['../classmodulo__components_1_1_component.html#ae19b0377e0b7fa7f43efff7adfae143b',1,'modulo_components::Component::Component()'],['../classmodulo__components_1_1_component.html',1,'modulo_components::Component']]], + ['componentexception_1',['ComponentException',['../classmodulo__components_1_1exceptions_1_1_component_exception.html',1,'modulo_components::exceptions']]], + ['componentinterface_2',['ComponentInterface',['../classmodulo__components_1_1_component_interface.html#ab52d6592ffae45e8221d6b24a0142f0a',1,'modulo_components::ComponentInterface::ComponentInterface()'],['../classmodulo__components_1_1_component_interface.html',1,'modulo_components::ComponentInterface< NodeT >']]], + ['componentinterface_3c_20rclcpp_3a_3anode_20_3e_3',['ComponentInterface< rclcpp::Node >',['../classmodulo__components_1_1_component_interface.html',1,'modulo_components']]], + ['componentinterface_3c_20rclcpp_5flifecycle_3a_3alifecyclenode_20_3e_4',['ComponentInterface< rclcpp_lifecycle::LifecycleNode >',['../classmodulo__components_1_1_component_interface.html',1,'modulo_components']]], + ['componentinterfacepublicinterface_5',['ComponentInterfacePublicInterface',['../classmodulo__components_1_1_component_interface_public_interface.html',1,'modulo_components']]], + ['componentparameterexception_6',['ComponentParameterException',['../classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html',1,'modulo_components::exceptions']]], + ['componentserviceresponse_7',['ComponentServiceResponse',['../structmodulo__components_1_1_component_service_response.html',1,'modulo_components']]], + ['contributing_8',['Contributing',['../md__github_workspace_source_modulo_components__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]], + ['copy_5fparameter_5fvalue_9',['copy_parameter_value',['../namespacemodulo__core_1_1translators.html#af16d1185354f2f64f06698b0d1b3fc3f',1,'modulo_core::translators']]], + ['coreexception_10',['CoreException',['../classmodulo__core_1_1exceptions_1_1_core_exception.html',1,'modulo_core::exceptions']]], + ['create_5foutput_11',['create_output',['../classmodulo__components_1_1_component_interface.html#a0f14ec870d465c291575c013bb1cedd4',1,'modulo_components::ComponentInterface']]], + ['create_5fpublisher_5finterface_12',['create_publisher_interface',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a95f0a5157539b3ffb1a936e4bbd60e23',1,'modulo_core::communication::PublisherHandler']]], + ['create_5fsubscription_5finterface_13',['create_subscription_interface',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a9adbe98500d927e5e76fb18c9f62e04b',1,'modulo_core::communication::SubscriptionHandler']]] +]; diff --git a/versions/v3.0.0/search/all_10.js b/versions/v3.0.0/search/all_10.js new file mode 100644 index 00000000..ced41b37 --- /dev/null +++ b/versions/v3.0.0/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['_7ecomponent_0',['~Component',['../classmodulo__components_1_1_component.html#a3973cf9c0bb9df9e21fb11fae1f8898f',1,'modulo_components::Component']]], + ['_7ecomponentinterface_1',['~ComponentInterface',['../classmodulo__components_1_1_component_interface.html#adf2b4c82aaa0fdc02f0a719c59a79729',1,'modulo_components::ComponentInterface']]], + ['_7elifecyclecomponent_2',['~LifecycleComponent',['../classmodulo__components_1_1_lifecycle_component.html#a534d2620117f9b2420418d4d6ca48a12',1,'modulo_components::LifecycleComponent']]], + ['_7emessagepairinterface_3',['~MessagePairInterface',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a1b0177982d2972d701692b3c89705aae',1,'modulo_core::communication::MessagePairInterface']]], + ['_7epublisherhandler_4',['~PublisherHandler',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a9c2eafb61ee4d8e60a15e0af519be4d3',1,'modulo_core::communication::PublisherHandler']]], + ['_7epublisherinterface_5',['~PublisherInterface',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a1e670470b065bb1e7b1e5ef88eec5268',1,'modulo_core::communication::PublisherInterface']]], + ['_7esubscriptionhandler_6',['~SubscriptionHandler',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a3de45dc5da0ca5ae1de4a819851f4979',1,'modulo_core::communication::SubscriptionHandler']]], + ['_7esubscriptioninterface_7',['~SubscriptionInterface',['../classmodulo__core_1_1communication_1_1_subscription_interface.html#afd0d227d6533cafc7731f1fd52cb8d50',1,'modulo_core::communication::SubscriptionInterface']]] +]; diff --git a/versions/v3.0.0/search/all_2.js b/versions/v3.0.0/search/all_2.js new file mode 100644 index 00000000..05767a86 --- /dev/null +++ b/versions/v3.0.0/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['deactivate_0',['deactivate',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2570447d8280ab4f1bc47e8c020082f3',1,'modulo_core::communication::PublisherInterface']]], + ['declare_5finput_1',['declare_input',['../classmodulo__components_1_1_component_interface.html#a5764c4fb141d551d44d31858b9e0d84e',1,'modulo_components::ComponentInterface']]], + ['declare_5foutput_2',['declare_output',['../classmodulo__components_1_1_component_interface.html#ad2a113d2874d1ee0ca3b43f2892a22fc',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/all_3.js b/versions/v3.0.0/search/all_3.js new file mode 100644 index 00000000..1595aef8 --- /dev/null +++ b/versions/v3.0.0/search/all_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['encodedstate_0',['EncodedState',['../namespacemodulo__core.html#aa89356b8fb7ab13ff2514931d3b05fdc',1,'modulo_core']]], + ['evaluate_5fperiodic_5fcallbacks_1',['evaluate_periodic_callbacks',['../classmodulo__components_1_1_component_interface.html#a790030f12e036d9b589b41710d3580a4',1,'modulo_components::ComponentInterface']]], + ['execute_2',['execute',['../classmodulo__components_1_1_component.html#aeb496916cb46a1e8369412f06c440910',1,'modulo_components::Component']]] +]; diff --git a/versions/v3.0.0/search/all_4.js b/versions/v3.0.0/search/all_4.js new file mode 100644 index 00000000..f13f1b86 --- /dev/null +++ b/versions/v3.0.0/search/all_4.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['get_5fcallback_0',['get_callback',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a01f697561ba64f5d98ae0522f8c57cc6',1,'modulo_core::communication::SubscriptionHandler::get_callback()'],['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a60039333a4c81ea81c66ab2e88b6eaff',1,'modulo_core::communication::SubscriptionHandler::get_callback(const std::function< void()> &user_callback)']]], + ['get_5fdata_1',['get_data',['../classmodulo__core_1_1communication_1_1_message_pair.html#a951f34fcc216a1afdebefc665c5b80af',1,'modulo_core::communication::MessagePair']]], + ['get_5fhandler_2',['get_handler',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a725e0facd73564ae7ab9c75396e401b0',1,'modulo_core::communication::PublisherInterface::get_handler()'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a29ee546de88bc4ddd63ea0aa5eaf2399',1,'modulo_core::communication::SubscriptionInterface::get_handler()']]], + ['get_5fmessage_5fpair_3',['get_message_pair',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a284645c90efb812ecd3abd90125962fa',1,'modulo_core::communication::MessagePairInterface::get_message_pair()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a5c38ad0774ca2a51218fc473320c5b71',1,'modulo_core::communication::PublisherInterface::get_message_pair()'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#acc3d58b49cd9c3d61f1896aa9dda2acf',1,'modulo_core::communication::SubscriptionInterface::get_message_pair()']]], + ['get_5fparameter_4',['get_parameter',['../classmodulo__components_1_1_component_interface.html#abd6d97b9f4daf0f4dd2439de59b65aff',1,'modulo_components::ComponentInterface']]], + ['get_5fparameter_5fvalue_5',['get_parameter_value',['../classmodulo__components_1_1_component_interface.html#a1c4fce25923a6daba6fa4d956000e151',1,'modulo_components::ComponentInterface']]], + ['get_5fpredicate_6',['get_predicate',['../classmodulo__components_1_1_component_interface.html#a61da9d2635dbfa646ce74f72e332cc91',1,'modulo_components::ComponentInterface']]], + ['get_5fqos_7',['get_qos',['../classmodulo__components_1_1_component_interface.html#a857308be739a6f5222c875792973ddd0',1,'modulo_components::ComponentInterface']]], + ['get_5fros_5fparameter_5ftype_8',['get_ros_parameter_type',['../namespacemodulo__core_1_1translators.html#aea1df4ab0bfb038f7b297865993149e2',1,'modulo_core::translators']]], + ['get_5fsubscription_9',['get_subscription',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#aa9c9421c48dbbbc87dfd0d370f452b44',1,'modulo_core::communication::SubscriptionHandler']]], + ['get_5ftype_10',['get_type',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a578dda86f8b23d5aeb8c3d3854239e77',1,'modulo_core::communication::MessagePairInterface::get_type()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2f878eb3cd08e69b685b39c6c79c5ed0',1,'modulo_core::communication::PublisherInterface::get_type()']]] +]; diff --git a/versions/v3.0.0/search/all_5.js b/versions/v3.0.0/search/all_5.js new file mode 100644 index 00000000..30e45c29 --- /dev/null +++ b/versions/v3.0.0/search/all_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['inputs_5f_0',['inputs_',['../classmodulo__components_1_1_component_interface.html#af44d16a9ac209a3f7e0bcadd03a1d0e2',1,'modulo_components::ComponentInterface']]], + ['invalidpointercastexception_1',['InvalidPointerCastException',['../classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html',1,'modulo_core::exceptions']]], + ['invalidpointerexception_2',['InvalidPointerException',['../classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/all_6.js b/versions/v3.0.0/search/all_6.js new file mode 100644 index 00000000..98741a0d --- /dev/null +++ b/versions/v3.0.0/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['lifecyclecomponent_0',['LifecycleComponent',['../classmodulo__components_1_1_lifecycle_component.html#a81908c5428fea4a36262ffd82168dd06',1,'modulo_components::LifecycleComponent::LifecycleComponent()'],['../classmodulo__components_1_1_lifecycle_component.html',1,'modulo_components::LifecycleComponent']]], + ['lookup_5ftransform_1',['lookup_transform',['../classmodulo__components_1_1_component_interface.html#afc3883e3a3f022bd77e96c768ddd82cc',1,'modulo_components::ComponentInterface::lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)'],['../classmodulo__components_1_1_component_interface.html#aea2a0ce3f2fa6d8c4971e71483957029',1,'modulo_components::ComponentInterface::lookup_transform(const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))']]], + ['lookuptransformexception_2',['LookupTransformException',['../classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html',1,'modulo_components::exceptions']]] +]; diff --git a/versions/v3.0.0/search/all_7.js b/versions/v3.0.0/search/all_7.js new file mode 100644 index 00000000..2d36bfb0 --- /dev/null +++ b/versions/v3.0.0/search/all_7.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['communication_0',['communication',['../namespacemodulo__core_1_1communication.html',1,'modulo_core']]], + ['exceptions_1',['exceptions',['../namespacemodulo__components_1_1exceptions.html',1,'modulo_components::exceptions'],['../namespacemodulo__core_1_1exceptions.html',1,'modulo_core::exceptions']]], + ['messagepair_2',['MessagePair',['../classmodulo__core_1_1communication_1_1_message_pair.html#adeb7c57318156213f827ebdfc1eb05ff',1,'modulo_core::communication::MessagePair::MessagePair()'],['../classmodulo__core_1_1communication_1_1_message_pair.html',1,'modulo_core::communication::MessagePair< MsgT, DataT >']]], + ['messagepairinterface_3',['MessagePairInterface',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#ac6a7c97767464a21fc8a7b9f10475703',1,'modulo_core::communication::MessagePairInterface::MessagePairInterface(const MessagePairInterface &message_pair)=default'],['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a42c43740bf2d3e11b0f228d422c570c7',1,'modulo_core::communication::MessagePairInterface::MessagePairInterface(MessageType type)'],['../classmodulo__core_1_1communication_1_1_message_pair_interface.html',1,'modulo_core::communication::MessagePairInterface']]], + ['messagetranslationexception_4',['MessageTranslationException',['../classmodulo__core_1_1exceptions_1_1_message_translation_exception.html',1,'modulo_core::exceptions']]], + ['messagetype_5',['MessageType',['../namespacemodulo__core_1_1communication.html#a14a52364ccbc238876007a3f134977ab',1,'modulo_core::communication']]], + ['modulo_6',['Modulo',['../index.html',1,'']]], + ['modulo_20component_20interfaces_7',['Modulo Component Interfaces',['../md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html',1,'']]], + ['modulo_20components_8',['Modulo Components',['../md__github_workspace_source_modulo_components__r_e_a_d_m_e.html',1,'']]], + ['modulo_20core_9',['Modulo Core',['../md__github_workspace_source_modulo_core__r_e_a_d_m_e.html',1,'']]], + ['modulo_20utils_10',['Modulo Utils',['../md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html',1,'']]], + ['modulo_5fcomponents_11',['modulo_components',['../namespacemodulo__components.html',1,'']]], + ['modulo_5fcore_12',['modulo_core',['../namespacemodulo__core.html',1,'']]], + ['translators_13',['translators',['../namespacemodulo__core_1_1translators.html',1,'modulo_core']]], + ['utilities_14',['utilities',['../namespacemodulo__components_1_1utilities.html',1,'modulo_components']]] +]; diff --git a/versions/v3.0.0/search/all_8.js b/versions/v3.0.0/search/all_8.js new file mode 100644 index 00000000..15fa934b --- /dev/null +++ b/versions/v3.0.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nullpointerexception_0',['NullPointerException',['../classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/all_9.js b/versions/v3.0.0/search/all_9.js new file mode 100644 index 00000000..790705fd --- /dev/null +++ b/versions/v3.0.0/search/all_9.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['on_5factivate_0',['on_activate',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#aba41e8e6e8c06deeda4578b1807150c6',1,'modulo_core::communication::PublisherHandler']]], + ['on_5factivate_5fcallback_1',['on_activate_callback',['../classmodulo__components_1_1_lifecycle_component.html#a45e7a84d2ff32d6538b065e7d5d59db4',1,'modulo_components::LifecycleComponent']]], + ['on_5fcleanup_5fcallback_2',['on_cleanup_callback',['../classmodulo__components_1_1_lifecycle_component.html#a4dba41e6a556184546ae3244077d3eab',1,'modulo_components::LifecycleComponent']]], + ['on_5fconfigure_5fcallback_3',['on_configure_callback',['../classmodulo__components_1_1_lifecycle_component.html#ae2750d56c97758b231c5a41c81e94787',1,'modulo_components::LifecycleComponent']]], + ['on_5fdeactivate_4',['on_deactivate',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#aa6a36040bdb492150a85e58ed6c89f5e',1,'modulo_core::communication::PublisherHandler']]], + ['on_5fdeactivate_5fcallback_5',['on_deactivate_callback',['../classmodulo__components_1_1_lifecycle_component.html#a22b81a549cb93798e4c7801541125b70',1,'modulo_components::LifecycleComponent']]], + ['on_5ferror_5fcallback_6',['on_error_callback',['../classmodulo__components_1_1_lifecycle_component.html#aa06d7c56d3cd549f20e550958eeac6c6',1,'modulo_components::LifecycleComponent']]], + ['on_5fexecute_5fcallback_7',['on_execute_callback',['../classmodulo__components_1_1_component.html#aa91321e421f2f71a9c86f694996baeb1',1,'modulo_components::Component']]], + ['on_5fshutdown_5fcallback_8',['on_shutdown_callback',['../classmodulo__components_1_1_lifecycle_component.html#a05b5dfdf28ebf0d2a9f69cdad9d29eb3',1,'modulo_components::LifecycleComponent']]], + ['on_5fstep_5fcallback_9',['on_step_callback',['../classmodulo__components_1_1_lifecycle_component.html#a97b12c65867fd38310c86974722af49a',1,'modulo_components::LifecycleComponent']]], + ['on_5fvalidate_5fparameter_5fcallback_10',['on_validate_parameter_callback',['../classmodulo__components_1_1_component_interface.html#af4248c319c66c7fed112bd46e9506d23',1,'modulo_components::ComponentInterface']]], + ['outputs_5f_11',['outputs_',['../classmodulo__components_1_1_component_interface.html#a83c398521d2e7bab7f1da18f2bf074a4',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/all_a.js b/versions/v3.0.0/search/all_a.js new file mode 100644 index 00000000..4627af3b --- /dev/null +++ b/versions/v3.0.0/search/all_a.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['parametertranslationexception_0',['ParameterTranslationException',['../classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html',1,'modulo_core::exceptions']]], + ['periodic_5foutputs_5f_1',['periodic_outputs_',['../classmodulo__components_1_1_component_interface.html#ac3bf14549864c61871dae269589f3d1e',1,'modulo_components::ComponentInterface']]], + ['predicateslistener_2',['PredicatesListener',['../classmodulo__utils_1_1testutils_1_1_predicates_listener.html',1,'modulo_utils::testutils']]], + ['publish_3',['publish',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a864c43153af83707343920e33700043d',1,'modulo_core::communication::PublisherHandler::publish()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a3e4d5682dc38835d7e1f02a2e71503ed',1,'modulo_core::communication::PublisherInterface::publish()']]], + ['publish_5foutput_4',['publish_output',['../classmodulo__components_1_1_component_interface.html#a76988b2516adf6b44f823c4bb394a153',1,'modulo_components::ComponentInterface']]], + ['publish_5foutputs_5',['publish_outputs',['../classmodulo__components_1_1_component_interface.html#a436db9f126d78795626875c652c06d2e',1,'modulo_components::ComponentInterface']]], + ['publish_5fpredicate_6',['publish_predicate',['../classmodulo__components_1_1_component_interface.html#af98d231e3ebc34fd9ca26955f46f4be2',1,'modulo_components::ComponentInterface']]], + ['publish_5fpredicates_7',['publish_predicates',['../classmodulo__components_1_1_component_interface.html#a563c5c98faddb9eda5120bcd942b363a',1,'modulo_components::ComponentInterface']]], + ['publish_5ftransforms_8',['publish_transforms',['../classmodulo__components_1_1_component_interface.html#ad52d0a3413722ac49da32c421033efca',1,'modulo_components::ComponentInterface']]], + ['publisherhandler_9',['PublisherHandler',['../classmodulo__core_1_1communication_1_1_publisher_handler.html',1,'modulo_core::communication::PublisherHandler< PubT, MsgT >'],['../classmodulo__core_1_1communication_1_1_publisher_handler.html#abeb33dd415f1ab50bc86ca74f1aba9b1',1,'modulo_core::communication::PublisherHandler::PublisherHandler()']]], + ['publisherinterface_10',['PublisherInterface',['../classmodulo__core_1_1communication_1_1_publisher_interface.html',1,'modulo_core::communication::PublisherInterface'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a8825c1bbfbe13075bfc88213cc2f0feb',1,'modulo_core::communication::PublisherInterface::PublisherInterface(PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2881b0902f8b9c22c62c08c2106ea7be',1,'modulo_core::communication::PublisherInterface::PublisherInterface(const PublisherInterface &publisher)=default']]], + ['publishertype_11',['PublisherType',['../namespacemodulo__core_1_1communication.html#a11c26e7082f80b74fb35da3f901f9366',1,'modulo_core::communication']]] +]; diff --git a/versions/v3.0.0/search/all_b.js b/versions/v3.0.0/search/all_b.js new file mode 100644 index 00000000..e7ec1075 --- /dev/null +++ b/versions/v3.0.0/search/all_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qos_5f_0',['qos_',['../classmodulo__components_1_1_component_interface.html#a6d4c3baf25cb63597f5e2565d47120cd',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/all_c.js b/versions/v3.0.0/search/all_c.js new file mode 100644 index 00000000..e93b59c9 --- /dev/null +++ b/versions/v3.0.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['raise_5ferror_0',['raise_error',['../classmodulo__components_1_1_component_interface.html#a1cbb885ce633cabd610b41020c70d535',1,'modulo_components::ComponentInterface']]], + ['read_1',['read',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a8b81ae20f181f80df6d8e127a9719ede',1,'modulo_core::communication::MessagePairInterface']]], + ['read_5fmessage_2',['read_message',['../namespacemodulo__core_1_1translators.html#a9ea65818de625b6fa8ced760bc3c6c7d',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Wrench &message)'],['../namespacemodulo__core_1_1translators.html#ae3028daafe4e35d4cb3ed83172d8bcb0',1,'modulo_core::translators::read_message(T &state, const EncodedState &message)'],['../namespacemodulo__core_1_1translators.html#a3eab5bfefb68847b86699826fc206757',1,'modulo_core::translators::read_message(std::string &state, const std_msgs::msg::String &message)'],['../namespacemodulo__core_1_1translators.html#a61a15e12792070307871484cec3919bd',1,'modulo_core::translators::read_message(int &state, const std_msgs::msg::Int32 &message)'],['../namespacemodulo__core_1_1translators.html#a89f6c759d19c4680f9bd0dc6dfccf287',1,'modulo_core::translators::read_message(std::vector< double > &state, const std_msgs::msg::Float64MultiArray &message)'],['../namespacemodulo__core_1_1translators.html#a00a802c20071659785e4e5651af201a6',1,'modulo_core::translators::read_message(double &state, const std_msgs::msg::Float64 &message)'],['../namespacemodulo__core_1_1translators.html#a329c6bf4bcf7e44b283fb8aadc6d7c6f',1,'modulo_core::translators::read_message(bool &state, const std_msgs::msg::Bool &message)'],['../namespacemodulo__core_1_1translators.html#a2c16bbbdfb7e718fc716139399e549ad',1,'modulo_core::translators::read_message(state_representation::Parameter< T > &state, const U &message)'],['../namespacemodulo__core_1_1translators.html#a552fe7a279beb774b39819f60bed127a',1,'modulo_core::translators::read_message(state_representation::JointState &state, const sensor_msgs::msg::JointState &message)'],['../namespacemodulo__core_1_1translators.html#ab0d3919f19f876ecd246045c9d58c2be',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::WrenchStamped &message)'],['../namespacemodulo__core_1_1translators.html#a7f5eaa5ff35c583a37fda7e8b272a870',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::TwistStamped &message)'],['../namespacemodulo__core_1_1translators.html#a832274530f0275f7ef5cdfb4ea7fd2d9',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Twist &message)'],['../namespacemodulo__core_1_1translators.html#a7fb0ede2e2045b55a995ae71a3a1d8ad',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::TransformStamped &message)'],['../namespacemodulo__core_1_1translators.html#ad4836d631d145e89dfd47c4b394d174c',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Transform &message)'],['../namespacemodulo__core_1_1translators.html#a71af5ce246d3c9e1ff252f4c55d3817a',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::PoseStamped &message)'],['../namespacemodulo__core_1_1translators.html#a2aa635da759b460c5aad924c4f1dcedb',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Pose &message)'],['../namespacemodulo__core_1_1translators.html#afe26976826af1f5c0c381f0b7e428502',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::AccelStamped &message)'],['../namespacemodulo__core_1_1translators.html#af7b0fbec62bd9b885d289a7fb1ddba76',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)'],['../classmodulo__core_1_1communication_1_1_message_pair.html#ac014837301539405388428fe893366b1',1,'modulo_core::communication::MessagePair::read_message()']]], + ['read_5fparameter_3',['read_parameter',['../namespacemodulo__core_1_1translators.html#a1bb1765511842105ebf5ea295b5e9750',1,'modulo_core::translators::read_parameter(const rclcpp::Parameter &ros_parameter)'],['../namespacemodulo__core_1_1translators.html#adcc089559e331a621718f275603b2dec',1,'modulo_core::translators::read_parameter(const rclcpp::Parameter &ros_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)']]], + ['read_5fparameter_5fconst_4',['read_parameter_const',['../namespacemodulo__core_1_1translators.html#afa6da1171b524ca4b63f6119f1774f1b',1,'modulo_core::translators']]], + ['remove_5finput_5',['remove_input',['../classmodulo__components_1_1_component_interface.html#a94b1db642bd65a28ef32f91363ec73f2',1,'modulo_components::ComponentInterface']]], + ['remove_5foutput_6',['remove_output',['../classmodulo__components_1_1_component_interface.html#a4f618ce54cc514b62ce2bde9c0806890',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/all_d.js b/versions/v3.0.0/search/all_d.js new file mode 100644 index 00000000..9f8ee56c --- /dev/null +++ b/versions/v3.0.0/search/all_d.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['safe_5fdynamic_5fcast_0',['safe_dynamic_cast',['../namespacemodulo__core_1_1translators.html#a9b01bebfd4d9e35131e0d04620446c08',1,'modulo_core::translators']]], + ['safe_5fdynamic_5fpointer_5fcast_1',['safe_dynamic_pointer_cast',['../namespacemodulo__core_1_1translators.html#a6ef1c765b829bf82c25a6e4f409c618e',1,'modulo_core::translators']]], + ['safe_5fjoint_5fstate_5fconversion_2',['safe_joint_state_conversion',['../namespacemodulo__core_1_1translators.html#ad0f036bf1583f4542468ca69fd66ead0',1,'modulo_core::translators']]], + ['safe_5fspatial_5fstate_5fconversion_3',['safe_spatial_state_conversion',['../namespacemodulo__core_1_1translators.html#a04a6f2e996dbc7b5ce4dcda8d9d21548',1,'modulo_core::translators']]], + ['send_5fstatic_5ftransform_4',['send_static_transform',['../classmodulo__components_1_1_component_interface.html#ab78901d9ac3ef5882e8a149443ec50a4',1,'modulo_components::ComponentInterface']]], + ['send_5fstatic_5ftransforms_5',['send_static_transforms',['../classmodulo__components_1_1_component_interface.html#a361a6e5d39927d114fcb87704e8240b6',1,'modulo_components::ComponentInterface']]], + ['send_5ftransform_6',['send_transform',['../classmodulo__components_1_1_component_interface.html#a9365d3bcde8e5abf243606a7f532678d',1,'modulo_components::ComponentInterface']]], + ['send_5ftransforms_7',['send_transforms',['../classmodulo__components_1_1_component_interface.html#aa4ee34ba8755945f13c283790e76ca68',1,'modulo_components::ComponentInterface']]], + ['serviceclient_8',['ServiceClient',['../classmodulo__utils_1_1testutils_1_1_service_client.html',1,'modulo_utils::testutils']]], + ['set_5fdata_9',['set_data',['../classmodulo__core_1_1communication_1_1_message_pair.html#ae71ad28f6e4270b5a318ddbdbf620585',1,'modulo_core::communication::MessagePair']]], + ['set_5fmessage_5fpair_10',['set_message_pair',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#aa59ed6b199b838811db4c29bb19c5319',1,'modulo_core::communication::PublisherInterface::set_message_pair()'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a817997523c09e4c1d912d9a18427f3ef',1,'modulo_core::communication::SubscriptionInterface::set_message_pair()']]], + ['set_5fparameter_5fvalue_11',['set_parameter_value',['../classmodulo__components_1_1_component_interface.html#aca7af942b480f71ce57665aba6e206d7',1,'modulo_components::ComponentInterface']]], + ['set_5fpredicate_12',['set_predicate',['../classmodulo__components_1_1_component_interface.html#a996a495220e94a0e400202c9ba34fa85',1,'modulo_components::ComponentInterface::set_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)'],['../classmodulo__components_1_1_component_interface.html#a560c4071fb6a668a5c5c97c7f9209ef2',1,'modulo_components::ComponentInterface::set_predicate(const std::string &predicate_name, bool predicate_value)']]], + ['set_5fqos_13',['set_qos',['../classmodulo__components_1_1_component_interface.html#af186b997fea0fec1604b777b7b74a77d',1,'modulo_components::ComponentInterface']]], + ['set_5fsubscription_14',['set_subscription',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#ad6ce10b7ac797009a7c64ddf52361276',1,'modulo_core::communication::SubscriptionHandler']]], + ['set_5fuser_5fcallback_15',['set_user_callback',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#ae5ce0270138b061c709ce4f1c2f76f14',1,'modulo_core::communication::SubscriptionHandler']]], + ['step_16',['step',['../classmodulo__components_1_1_component_interface.html#a21de4a30b2a51e66574600c9b04f27cb',1,'modulo_components::ComponentInterface']]], + ['subscriptionhandler_17',['SubscriptionHandler',['../classmodulo__core_1_1communication_1_1_subscription_handler.html',1,'modulo_core::communication::SubscriptionHandler< MsgT >'],['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a1e8e5d41669f1c0f952b93a2b86dadae',1,'modulo_core::communication::SubscriptionHandler::SubscriptionHandler()']]], + ['subscriptioninterface_18',['SubscriptionInterface',['../classmodulo__core_1_1communication_1_1_subscription_interface.html',1,'modulo_core::communication::SubscriptionInterface'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a1d65d122da01edfcd28bdd049d2ad8e8',1,'modulo_core::communication::SubscriptionInterface::SubscriptionInterface(std::shared_ptr< MessagePairInterface > message_pair=nullptr)'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a00fca8a8317e59f37051b8a7b411143e',1,'modulo_core::communication::SubscriptionInterface::SubscriptionInterface(const SubscriptionInterface &subscription)=default']]] +]; diff --git a/versions/v3.0.0/search/all_e.js b/versions/v3.0.0/search/all_e.js new file mode 100644 index 00000000..7b83c972 --- /dev/null +++ b/versions/v3.0.0/search/all_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['trigger_0',['trigger',['../classmodulo__components_1_1_component_interface.html#a56a0acbb9050b73374ac6905aa88233a',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/all_f.js b/versions/v3.0.0/search/all_f.js new file mode 100644 index 00000000..3ef8856c --- /dev/null +++ b/versions/v3.0.0/search/all_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['write_0',['write',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a5cc486ee93eb7756636a851c07f10f35',1,'modulo_core::communication::MessagePairInterface']]], + ['write_5fmessage_1',['write_message',['../classmodulo__core_1_1communication_1_1_message_pair.html#aa50124b4eb3e5811562c567da1f03f00',1,'modulo_core::communication::MessagePair::write_message()'],['../namespacemodulo__core_1_1translators.html#a02fa2614128ce09ee39cc4fd9a5d2314',1,'modulo_core::translators::write_message(EncodedState &message, const T &state, const rclcpp::Time &)'],['../namespacemodulo__core_1_1translators.html#aa77091be4785272fd22cc5215d930ddd',1,'modulo_core::translators::write_message(std_msgs::msg::String &message, const std::string &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ab5e6c729316ce06f03deec6fe811b3f5',1,'modulo_core::translators::write_message(std_msgs::msg::Int32 &message, const int &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#af3b73148b5111ac49d9b65a03c2682f5',1,'modulo_core::translators::write_message(std_msgs::msg::Float64MultiArray &message, const std::vector< double > &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a014392d41b245b63d2303fdee9e66db7',1,'modulo_core::translators::write_message(std_msgs::msg::Float64 &message, const double &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a2648db7b6384ba6b10186ae5e98bea59',1,'modulo_core::translators::write_message(std_msgs::msg::Bool &message, const bool &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a60be80575b8fb3e3d48f37a8bda6d9ed',1,'modulo_core::translators::write_message(U &message, const state_representation::Parameter< T > &state, const rclcpp::Time &)'],['../namespacemodulo__core_1_1translators.html#acdb4e193bb38e69690de512f7b6ea457',1,'modulo_core::translators::write_message(tf2_msgs::msg::TFMessage &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ae2679cbc4106a9373296b6f00aaea34b',1,'modulo_core::translators::write_message(sensor_msgs::msg::JointState &message, const state_representation::JointState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a1fd40d767a0a9a3c8221eaabb12e8e77',1,'modulo_core::translators::write_message(geometry_msgs::msg::WrenchStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ae887c515823c26c71a1266355577d5e0',1,'modulo_core::translators::write_message(geometry_msgs::msg::Wrench &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a6960610fd4bf9bb981827e0146b04d05',1,'modulo_core::translators::write_message(geometry_msgs::msg::TwistStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a23c4f120bdc010eb6f5b61bfb21abec1',1,'modulo_core::translators::write_message(geometry_msgs::msg::Twist &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ade9e94aca963133615835e6724ada18b',1,'modulo_core::translators::write_message(geometry_msgs::msg::TransformStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a038c7d7431427a1b46d12a2eab8b9da7',1,'modulo_core::translators::write_message(geometry_msgs::msg::Transform &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ade7becbd0c04095260f1aad7dc4d5da0',1,'modulo_core::translators::write_message(geometry_msgs::msg::PoseStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a2ce2005274aa2509faa07e206f74202f',1,'modulo_core::translators::write_message(geometry_msgs::msg::Pose &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a0230b5afcd0bfca73a2a676a6e8706c3',1,'modulo_core::translators::write_message(geometry_msgs::msg::AccelStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a151198c871af003d2205cf0556115260',1,'modulo_core::translators::write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)']]], + ['write_5fparameter_2',['write_parameter',['../namespacemodulo__core_1_1translators.html#ab0ba0632a12496f0ad34f836c5001689',1,'modulo_core::translators']]] +]; diff --git a/versions/v3.0.0/search/classes_0.js b/versions/v3.0.0/search/classes_0.js new file mode 100644 index 00000000..e1901314 --- /dev/null +++ b/versions/v3.0.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['addserviceexception_0',['AddServiceException',['../classmodulo__components_1_1exceptions_1_1_add_service_exception.html',1,'modulo_components::exceptions']]], + ['addsignalexception_1',['AddSignalException',['../classmodulo__components_1_1exceptions_1_1_add_signal_exception.html',1,'modulo_components::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_1.js b/versions/v3.0.0/search/classes_1.js new file mode 100644 index 00000000..a1ef5da1 --- /dev/null +++ b/versions/v3.0.0/search/classes_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['component_0',['Component',['../classmodulo__components_1_1_component.html',1,'modulo_components']]], + ['componentexception_1',['ComponentException',['../classmodulo__components_1_1exceptions_1_1_component_exception.html',1,'modulo_components::exceptions']]], + ['componentinterface_2',['ComponentInterface',['../classmodulo__components_1_1_component_interface.html',1,'modulo_components']]], + ['componentinterface_3c_20rclcpp_3a_3anode_20_3e_3',['ComponentInterface< rclcpp::Node >',['../classmodulo__components_1_1_component_interface.html',1,'modulo_components']]], + ['componentinterface_3c_20rclcpp_5flifecycle_3a_3alifecyclenode_20_3e_4',['ComponentInterface< rclcpp_lifecycle::LifecycleNode >',['../classmodulo__components_1_1_component_interface.html',1,'modulo_components']]], + ['componentinterfacepublicinterface_5',['ComponentInterfacePublicInterface',['../classmodulo__components_1_1_component_interface_public_interface.html',1,'modulo_components']]], + ['componentparameterexception_6',['ComponentParameterException',['../classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html',1,'modulo_components::exceptions']]], + ['componentserviceresponse_7',['ComponentServiceResponse',['../structmodulo__components_1_1_component_service_response.html',1,'modulo_components']]], + ['coreexception_8',['CoreException',['../classmodulo__core_1_1exceptions_1_1_core_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_2.js b/versions/v3.0.0/search/classes_2.js new file mode 100644 index 00000000..8ad6f673 --- /dev/null +++ b/versions/v3.0.0/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['invalidpointercastexception_0',['InvalidPointerCastException',['../classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html',1,'modulo_core::exceptions']]], + ['invalidpointerexception_1',['InvalidPointerException',['../classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_3.js b/versions/v3.0.0/search/classes_3.js new file mode 100644 index 00000000..c4e68fc2 --- /dev/null +++ b/versions/v3.0.0/search/classes_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['lifecyclecomponent_0',['LifecycleComponent',['../classmodulo__components_1_1_lifecycle_component.html',1,'modulo_components']]], + ['lookuptransformexception_1',['LookupTransformException',['../classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html',1,'modulo_components::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_4.js b/versions/v3.0.0/search/classes_4.js new file mode 100644 index 00000000..95049afc --- /dev/null +++ b/versions/v3.0.0/search/classes_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['messagepair_0',['MessagePair',['../classmodulo__core_1_1communication_1_1_message_pair.html',1,'modulo_core::communication']]], + ['messagepairinterface_1',['MessagePairInterface',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html',1,'modulo_core::communication']]], + ['messagetranslationexception_2',['MessageTranslationException',['../classmodulo__core_1_1exceptions_1_1_message_translation_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_5.js b/versions/v3.0.0/search/classes_5.js new file mode 100644 index 00000000..15fa934b --- /dev/null +++ b/versions/v3.0.0/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nullpointerexception_0',['NullPointerException',['../classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html',1,'modulo_core::exceptions']]] +]; diff --git a/versions/v3.0.0/search/classes_6.js b/versions/v3.0.0/search/classes_6.js new file mode 100644 index 00000000..8abbf383 --- /dev/null +++ b/versions/v3.0.0/search/classes_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['parametertranslationexception_0',['ParameterTranslationException',['../classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html',1,'modulo_core::exceptions']]], + ['predicateslistener_1',['PredicatesListener',['../classmodulo__utils_1_1testutils_1_1_predicates_listener.html',1,'modulo_utils::testutils']]], + ['publisherhandler_2',['PublisherHandler',['../classmodulo__core_1_1communication_1_1_publisher_handler.html',1,'modulo_core::communication']]], + ['publisherinterface_3',['PublisherInterface',['../classmodulo__core_1_1communication_1_1_publisher_interface.html',1,'modulo_core::communication']]] +]; diff --git a/versions/v3.0.0/search/classes_7.js b/versions/v3.0.0/search/classes_7.js new file mode 100644 index 00000000..213288c4 --- /dev/null +++ b/versions/v3.0.0/search/classes_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['serviceclient_0',['ServiceClient',['../classmodulo__utils_1_1testutils_1_1_service_client.html',1,'modulo_utils::testutils']]], + ['subscriptionhandler_1',['SubscriptionHandler',['../classmodulo__core_1_1communication_1_1_subscription_handler.html',1,'modulo_core::communication']]], + ['subscriptioninterface_2',['SubscriptionInterface',['../classmodulo__core_1_1communication_1_1_subscription_interface.html',1,'modulo_core::communication']]] +]; diff --git a/versions/v3.0.0/search/close.svg b/versions/v3.0.0/search/close.svg new file mode 100644 index 00000000..a933eea1 --- /dev/null +++ b/versions/v3.0.0/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/versions/v3.0.0/search/enums_0.js b/versions/v3.0.0/search/enums_0.js new file mode 100644 index 00000000..b231b782 --- /dev/null +++ b/versions/v3.0.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messagetype_0',['MessageType',['../namespacemodulo__core_1_1communication.html#a14a52364ccbc238876007a3f134977ab',1,'modulo_core::communication']]] +]; diff --git a/versions/v3.0.0/search/enums_1.js b/versions/v3.0.0/search/enums_1.js new file mode 100644 index 00000000..0238300e --- /dev/null +++ b/versions/v3.0.0/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['publishertype_0',['PublisherType',['../namespacemodulo__core_1_1communication.html#a11c26e7082f80b74fb35da3f901f9366',1,'modulo_core::communication']]] +]; diff --git a/versions/v3.0.0/search/functions_0.js b/versions/v3.0.0/search/functions_0.js new file mode 100644 index 00000000..4096471b --- /dev/null +++ b/versions/v3.0.0/search/functions_0.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['activate_0',['activate',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#ad3cb237464da96e1dd2780b696bce139',1,'modulo_core::communication::PublisherInterface']]], + ['add_5finput_1',['add_input',['../classmodulo__components_1_1_component_interface.html#a7b7b874b7b1b96fd702a23295c85e008',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::string &default_topic="", bool fixed_topic=false)'],['../classmodulo__components_1_1_component_interface.html#a17bfd14f0cae2058dfe89db603e72af1',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::shared_ptr< DataT > &data, const std::function< void()> &callback, const std::string &default_topic="", bool fixed_topic=false)'],['../classmodulo__components_1_1_component_interface.html#a4d1bb20a73749a4702f7ba61b00950bc',1,'modulo_components::ComponentInterface::add_input(const std::string &signal_name, const std::function< void(const std::shared_ptr< MsgT >)> &callback, const std::string &default_topic="", bool fixed_topic=false)']]], + ['add_5foutput_2',['add_output',['../classmodulo__components_1_1_component.html#ab475ee0e8ea1b1f52c6f0720a0546e90',1,'modulo_components::Component::add_output()'],['../classmodulo__components_1_1_lifecycle_component.html#a22d31bd5f8a713b0ce757bea8622cbf3',1,'modulo_components::LifecycleComponent::add_output()']]], + ['add_5fparameter_3',['add_parameter',['../classmodulo__components_1_1_component_interface.html#a060729fbb4c67c3284d302e34662e26a',1,'modulo_components::ComponentInterface::add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)'],['../classmodulo__components_1_1_component_interface.html#ac232e7f3ebba4b686bf4724cfec51e44',1,'modulo_components::ComponentInterface::add_parameter(const std::string &name, const T &value, const std::string &description, bool read_only=false)']]], + ['add_5fperiodic_5fcallback_4',['add_periodic_callback',['../classmodulo__components_1_1_component_interface.html#a235805a50110892d8878035ef3606f8b',1,'modulo_components::ComponentInterface']]], + ['add_5fpredicate_5',['add_predicate',['../classmodulo__components_1_1_component_interface.html#a1e481802803014a22f7e2dd5c85a07f1',1,'modulo_components::ComponentInterface::add_predicate(const std::string &predicate_name, bool predicate_value)'],['../classmodulo__components_1_1_component_interface.html#a8ca709a0499ecd01bd35d3656799a2ab',1,'modulo_components::ComponentInterface::add_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)']]], + ['add_5fservice_6',['add_service',['../classmodulo__components_1_1_component_interface.html#a543fc375983c0c976f3c47bf8041dddc',1,'modulo_components::ComponentInterface::add_service(const std::string &service_name, const std::function< ComponentServiceResponse(void)> &callback)'],['../classmodulo__components_1_1_component_interface.html#a790d9a153b6660de8e528a925099854e',1,'modulo_components::ComponentInterface::add_service(const std::string &service_name, const std::function< ComponentServiceResponse(const std::string &string)> &callback)']]], + ['add_5fstatic_5ftf_5fbroadcaster_7',['add_static_tf_broadcaster',['../classmodulo__components_1_1_component_interface.html#aacafd3ac505f480acc6495f5bcf9f7cd',1,'modulo_components::ComponentInterface']]], + ['add_5ftf_5fbroadcaster_8',['add_tf_broadcaster',['../classmodulo__components_1_1_component_interface.html#a95061be71c39f63969cc0bdddc655555',1,'modulo_components::ComponentInterface']]], + ['add_5ftf_5flistener_9',['add_tf_listener',['../classmodulo__components_1_1_component_interface.html#abcc9679e8c32c9b702d00bf30d1c46cf',1,'modulo_components::ComponentInterface']]], + ['add_5ftrigger_10',['add_trigger',['../classmodulo__components_1_1_component_interface.html#a5698b2a6b162e283890ee4e119712156',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/functions_1.js b/versions/v3.0.0/search/functions_1.js new file mode 100644 index 00000000..816835c0 --- /dev/null +++ b/versions/v3.0.0/search/functions_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['component_0',['Component',['../classmodulo__components_1_1_component.html#ae19b0377e0b7fa7f43efff7adfae143b',1,'modulo_components::Component']]], + ['componentinterface_1',['ComponentInterface',['../classmodulo__components_1_1_component_interface.html#ab52d6592ffae45e8221d6b24a0142f0a',1,'modulo_components::ComponentInterface']]], + ['copy_5fparameter_5fvalue_2',['copy_parameter_value',['../namespacemodulo__core_1_1translators.html#af16d1185354f2f64f06698b0d1b3fc3f',1,'modulo_core::translators']]], + ['create_5foutput_3',['create_output',['../classmodulo__components_1_1_component_interface.html#a0f14ec870d465c291575c013bb1cedd4',1,'modulo_components::ComponentInterface']]], + ['create_5fpublisher_5finterface_4',['create_publisher_interface',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a95f0a5157539b3ffb1a936e4bbd60e23',1,'modulo_core::communication::PublisherHandler']]], + ['create_5fsubscription_5finterface_5',['create_subscription_interface',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a9adbe98500d927e5e76fb18c9f62e04b',1,'modulo_core::communication::SubscriptionHandler']]] +]; diff --git a/versions/v3.0.0/search/functions_2.js b/versions/v3.0.0/search/functions_2.js new file mode 100644 index 00000000..05767a86 --- /dev/null +++ b/versions/v3.0.0/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['deactivate_0',['deactivate',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2570447d8280ab4f1bc47e8c020082f3',1,'modulo_core::communication::PublisherInterface']]], + ['declare_5finput_1',['declare_input',['../classmodulo__components_1_1_component_interface.html#a5764c4fb141d551d44d31858b9e0d84e',1,'modulo_components::ComponentInterface']]], + ['declare_5foutput_2',['declare_output',['../classmodulo__components_1_1_component_interface.html#ad2a113d2874d1ee0ca3b43f2892a22fc',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/functions_3.js b/versions/v3.0.0/search/functions_3.js new file mode 100644 index 00000000..8634f072 --- /dev/null +++ b/versions/v3.0.0/search/functions_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['evaluate_5fperiodic_5fcallbacks_0',['evaluate_periodic_callbacks',['../classmodulo__components_1_1_component_interface.html#a790030f12e036d9b589b41710d3580a4',1,'modulo_components::ComponentInterface']]], + ['execute_1',['execute',['../classmodulo__components_1_1_component.html#aeb496916cb46a1e8369412f06c440910',1,'modulo_components::Component']]] +]; diff --git a/versions/v3.0.0/search/functions_4.js b/versions/v3.0.0/search/functions_4.js new file mode 100644 index 00000000..f13f1b86 --- /dev/null +++ b/versions/v3.0.0/search/functions_4.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['get_5fcallback_0',['get_callback',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a01f697561ba64f5d98ae0522f8c57cc6',1,'modulo_core::communication::SubscriptionHandler::get_callback()'],['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a60039333a4c81ea81c66ab2e88b6eaff',1,'modulo_core::communication::SubscriptionHandler::get_callback(const std::function< void()> &user_callback)']]], + ['get_5fdata_1',['get_data',['../classmodulo__core_1_1communication_1_1_message_pair.html#a951f34fcc216a1afdebefc665c5b80af',1,'modulo_core::communication::MessagePair']]], + ['get_5fhandler_2',['get_handler',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a725e0facd73564ae7ab9c75396e401b0',1,'modulo_core::communication::PublisherInterface::get_handler()'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a29ee546de88bc4ddd63ea0aa5eaf2399',1,'modulo_core::communication::SubscriptionInterface::get_handler()']]], + ['get_5fmessage_5fpair_3',['get_message_pair',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a284645c90efb812ecd3abd90125962fa',1,'modulo_core::communication::MessagePairInterface::get_message_pair()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a5c38ad0774ca2a51218fc473320c5b71',1,'modulo_core::communication::PublisherInterface::get_message_pair()'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#acc3d58b49cd9c3d61f1896aa9dda2acf',1,'modulo_core::communication::SubscriptionInterface::get_message_pair()']]], + ['get_5fparameter_4',['get_parameter',['../classmodulo__components_1_1_component_interface.html#abd6d97b9f4daf0f4dd2439de59b65aff',1,'modulo_components::ComponentInterface']]], + ['get_5fparameter_5fvalue_5',['get_parameter_value',['../classmodulo__components_1_1_component_interface.html#a1c4fce25923a6daba6fa4d956000e151',1,'modulo_components::ComponentInterface']]], + ['get_5fpredicate_6',['get_predicate',['../classmodulo__components_1_1_component_interface.html#a61da9d2635dbfa646ce74f72e332cc91',1,'modulo_components::ComponentInterface']]], + ['get_5fqos_7',['get_qos',['../classmodulo__components_1_1_component_interface.html#a857308be739a6f5222c875792973ddd0',1,'modulo_components::ComponentInterface']]], + ['get_5fros_5fparameter_5ftype_8',['get_ros_parameter_type',['../namespacemodulo__core_1_1translators.html#aea1df4ab0bfb038f7b297865993149e2',1,'modulo_core::translators']]], + ['get_5fsubscription_9',['get_subscription',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#aa9c9421c48dbbbc87dfd0d370f452b44',1,'modulo_core::communication::SubscriptionHandler']]], + ['get_5ftype_10',['get_type',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a578dda86f8b23d5aeb8c3d3854239e77',1,'modulo_core::communication::MessagePairInterface::get_type()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2f878eb3cd08e69b685b39c6c79c5ed0',1,'modulo_core::communication::PublisherInterface::get_type()']]] +]; diff --git a/versions/v3.0.0/search/functions_5.js b/versions/v3.0.0/search/functions_5.js new file mode 100644 index 00000000..1893ecce --- /dev/null +++ b/versions/v3.0.0/search/functions_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['lifecyclecomponent_0',['LifecycleComponent',['../classmodulo__components_1_1_lifecycle_component.html#a81908c5428fea4a36262ffd82168dd06',1,'modulo_components::LifecycleComponent']]], + ['lookup_5ftransform_1',['lookup_transform',['../classmodulo__components_1_1_component_interface.html#afc3883e3a3f022bd77e96c768ddd82cc',1,'modulo_components::ComponentInterface::lookup_transform(const std::string &frame, const std::string &reference_frame, const tf2::TimePoint &time_point, const tf2::Duration &duration)'],['../classmodulo__components_1_1_component_interface.html#aea2a0ce3f2fa6d8c4971e71483957029',1,'modulo_components::ComponentInterface::lookup_transform(const std::string &frame, const std::string &reference_frame="world", double validity_period=-1.0, const tf2::Duration &duration=tf2::Duration(std::chrono::microseconds(10)))']]] +]; diff --git a/versions/v3.0.0/search/functions_6.js b/versions/v3.0.0/search/functions_6.js new file mode 100644 index 00000000..e8e8ad4e --- /dev/null +++ b/versions/v3.0.0/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['messagepair_0',['MessagePair',['../classmodulo__core_1_1communication_1_1_message_pair.html#adeb7c57318156213f827ebdfc1eb05ff',1,'modulo_core::communication::MessagePair']]], + ['messagepairinterface_1',['MessagePairInterface',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a42c43740bf2d3e11b0f228d422c570c7',1,'modulo_core::communication::MessagePairInterface::MessagePairInterface(MessageType type)'],['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#ac6a7c97767464a21fc8a7b9f10475703',1,'modulo_core::communication::MessagePairInterface::MessagePairInterface(const MessagePairInterface &message_pair)=default']]] +]; diff --git a/versions/v3.0.0/search/functions_7.js b/versions/v3.0.0/search/functions_7.js new file mode 100644 index 00000000..ee022e09 --- /dev/null +++ b/versions/v3.0.0/search/functions_7.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['on_5factivate_0',['on_activate',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#aba41e8e6e8c06deeda4578b1807150c6',1,'modulo_core::communication::PublisherHandler']]], + ['on_5factivate_5fcallback_1',['on_activate_callback',['../classmodulo__components_1_1_lifecycle_component.html#a45e7a84d2ff32d6538b065e7d5d59db4',1,'modulo_components::LifecycleComponent']]], + ['on_5fcleanup_5fcallback_2',['on_cleanup_callback',['../classmodulo__components_1_1_lifecycle_component.html#a4dba41e6a556184546ae3244077d3eab',1,'modulo_components::LifecycleComponent']]], + ['on_5fconfigure_5fcallback_3',['on_configure_callback',['../classmodulo__components_1_1_lifecycle_component.html#ae2750d56c97758b231c5a41c81e94787',1,'modulo_components::LifecycleComponent']]], + ['on_5fdeactivate_4',['on_deactivate',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#aa6a36040bdb492150a85e58ed6c89f5e',1,'modulo_core::communication::PublisherHandler']]], + ['on_5fdeactivate_5fcallback_5',['on_deactivate_callback',['../classmodulo__components_1_1_lifecycle_component.html#a22b81a549cb93798e4c7801541125b70',1,'modulo_components::LifecycleComponent']]], + ['on_5ferror_5fcallback_6',['on_error_callback',['../classmodulo__components_1_1_lifecycle_component.html#aa06d7c56d3cd549f20e550958eeac6c6',1,'modulo_components::LifecycleComponent']]], + ['on_5fexecute_5fcallback_7',['on_execute_callback',['../classmodulo__components_1_1_component.html#aa91321e421f2f71a9c86f694996baeb1',1,'modulo_components::Component']]], + ['on_5fshutdown_5fcallback_8',['on_shutdown_callback',['../classmodulo__components_1_1_lifecycle_component.html#a05b5dfdf28ebf0d2a9f69cdad9d29eb3',1,'modulo_components::LifecycleComponent']]], + ['on_5fstep_5fcallback_9',['on_step_callback',['../classmodulo__components_1_1_lifecycle_component.html#a97b12c65867fd38310c86974722af49a',1,'modulo_components::LifecycleComponent']]], + ['on_5fvalidate_5fparameter_5fcallback_10',['on_validate_parameter_callback',['../classmodulo__components_1_1_component_interface.html#af4248c319c66c7fed112bd46e9506d23',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/functions_8.js b/versions/v3.0.0/search/functions_8.js new file mode 100644 index 00000000..df6972fe --- /dev/null +++ b/versions/v3.0.0/search/functions_8.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['publish_0',['publish',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a864c43153af83707343920e33700043d',1,'modulo_core::communication::PublisherHandler::publish()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a3e4d5682dc38835d7e1f02a2e71503ed',1,'modulo_core::communication::PublisherInterface::publish()']]], + ['publish_5foutput_1',['publish_output',['../classmodulo__components_1_1_component_interface.html#a76988b2516adf6b44f823c4bb394a153',1,'modulo_components::ComponentInterface']]], + ['publish_5foutputs_2',['publish_outputs',['../classmodulo__components_1_1_component_interface.html#a436db9f126d78795626875c652c06d2e',1,'modulo_components::ComponentInterface']]], + ['publish_5fpredicate_3',['publish_predicate',['../classmodulo__components_1_1_component_interface.html#af98d231e3ebc34fd9ca26955f46f4be2',1,'modulo_components::ComponentInterface']]], + ['publish_5fpredicates_4',['publish_predicates',['../classmodulo__components_1_1_component_interface.html#a563c5c98faddb9eda5120bcd942b363a',1,'modulo_components::ComponentInterface']]], + ['publish_5ftransforms_5',['publish_transforms',['../classmodulo__components_1_1_component_interface.html#ad52d0a3413722ac49da32c421033efca',1,'modulo_components::ComponentInterface']]], + ['publisherhandler_6',['PublisherHandler',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#abeb33dd415f1ab50bc86ca74f1aba9b1',1,'modulo_core::communication::PublisherHandler']]], + ['publisherinterface_7',['PublisherInterface',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a8825c1bbfbe13075bfc88213cc2f0feb',1,'modulo_core::communication::PublisherInterface::PublisherInterface(PublisherType type, std::shared_ptr< MessagePairInterface > message_pair=nullptr)'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a2881b0902f8b9c22c62c08c2106ea7be',1,'modulo_core::communication::PublisherInterface::PublisherInterface(const PublisherInterface &publisher)=default']]] +]; diff --git a/versions/v3.0.0/search/functions_9.js b/versions/v3.0.0/search/functions_9.js new file mode 100644 index 00000000..e93b59c9 --- /dev/null +++ b/versions/v3.0.0/search/functions_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['raise_5ferror_0',['raise_error',['../classmodulo__components_1_1_component_interface.html#a1cbb885ce633cabd610b41020c70d535',1,'modulo_components::ComponentInterface']]], + ['read_1',['read',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a8b81ae20f181f80df6d8e127a9719ede',1,'modulo_core::communication::MessagePairInterface']]], + ['read_5fmessage_2',['read_message',['../namespacemodulo__core_1_1translators.html#a9ea65818de625b6fa8ced760bc3c6c7d',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Wrench &message)'],['../namespacemodulo__core_1_1translators.html#ae3028daafe4e35d4cb3ed83172d8bcb0',1,'modulo_core::translators::read_message(T &state, const EncodedState &message)'],['../namespacemodulo__core_1_1translators.html#a3eab5bfefb68847b86699826fc206757',1,'modulo_core::translators::read_message(std::string &state, const std_msgs::msg::String &message)'],['../namespacemodulo__core_1_1translators.html#a61a15e12792070307871484cec3919bd',1,'modulo_core::translators::read_message(int &state, const std_msgs::msg::Int32 &message)'],['../namespacemodulo__core_1_1translators.html#a89f6c759d19c4680f9bd0dc6dfccf287',1,'modulo_core::translators::read_message(std::vector< double > &state, const std_msgs::msg::Float64MultiArray &message)'],['../namespacemodulo__core_1_1translators.html#a00a802c20071659785e4e5651af201a6',1,'modulo_core::translators::read_message(double &state, const std_msgs::msg::Float64 &message)'],['../namespacemodulo__core_1_1translators.html#a329c6bf4bcf7e44b283fb8aadc6d7c6f',1,'modulo_core::translators::read_message(bool &state, const std_msgs::msg::Bool &message)'],['../namespacemodulo__core_1_1translators.html#a2c16bbbdfb7e718fc716139399e549ad',1,'modulo_core::translators::read_message(state_representation::Parameter< T > &state, const U &message)'],['../namespacemodulo__core_1_1translators.html#a552fe7a279beb774b39819f60bed127a',1,'modulo_core::translators::read_message(state_representation::JointState &state, const sensor_msgs::msg::JointState &message)'],['../namespacemodulo__core_1_1translators.html#ab0d3919f19f876ecd246045c9d58c2be',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::WrenchStamped &message)'],['../namespacemodulo__core_1_1translators.html#a7f5eaa5ff35c583a37fda7e8b272a870',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::TwistStamped &message)'],['../namespacemodulo__core_1_1translators.html#a832274530f0275f7ef5cdfb4ea7fd2d9',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Twist &message)'],['../namespacemodulo__core_1_1translators.html#a7fb0ede2e2045b55a995ae71a3a1d8ad',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::TransformStamped &message)'],['../namespacemodulo__core_1_1translators.html#ad4836d631d145e89dfd47c4b394d174c',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Transform &message)'],['../namespacemodulo__core_1_1translators.html#a71af5ce246d3c9e1ff252f4c55d3817a',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::PoseStamped &message)'],['../namespacemodulo__core_1_1translators.html#a2aa635da759b460c5aad924c4f1dcedb',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Pose &message)'],['../namespacemodulo__core_1_1translators.html#afe26976826af1f5c0c381f0b7e428502',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::AccelStamped &message)'],['../namespacemodulo__core_1_1translators.html#af7b0fbec62bd9b885d289a7fb1ddba76',1,'modulo_core::translators::read_message(state_representation::CartesianState &state, const geometry_msgs::msg::Accel &message)'],['../classmodulo__core_1_1communication_1_1_message_pair.html#ac014837301539405388428fe893366b1',1,'modulo_core::communication::MessagePair::read_message()']]], + ['read_5fparameter_3',['read_parameter',['../namespacemodulo__core_1_1translators.html#a1bb1765511842105ebf5ea295b5e9750',1,'modulo_core::translators::read_parameter(const rclcpp::Parameter &ros_parameter)'],['../namespacemodulo__core_1_1translators.html#adcc089559e331a621718f275603b2dec',1,'modulo_core::translators::read_parameter(const rclcpp::Parameter &ros_parameter, const std::shared_ptr< state_representation::ParameterInterface > &parameter)']]], + ['read_5fparameter_5fconst_4',['read_parameter_const',['../namespacemodulo__core_1_1translators.html#afa6da1171b524ca4b63f6119f1774f1b',1,'modulo_core::translators']]], + ['remove_5finput_5',['remove_input',['../classmodulo__components_1_1_component_interface.html#a94b1db642bd65a28ef32f91363ec73f2',1,'modulo_components::ComponentInterface']]], + ['remove_5foutput_6',['remove_output',['../classmodulo__components_1_1_component_interface.html#a4f618ce54cc514b62ce2bde9c0806890',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/functions_a.js b/versions/v3.0.0/search/functions_a.js new file mode 100644 index 00000000..912dab9f --- /dev/null +++ b/versions/v3.0.0/search/functions_a.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['safe_5fdynamic_5fcast_0',['safe_dynamic_cast',['../namespacemodulo__core_1_1translators.html#a9b01bebfd4d9e35131e0d04620446c08',1,'modulo_core::translators']]], + ['safe_5fdynamic_5fpointer_5fcast_1',['safe_dynamic_pointer_cast',['../namespacemodulo__core_1_1translators.html#a6ef1c765b829bf82c25a6e4f409c618e',1,'modulo_core::translators']]], + ['safe_5fjoint_5fstate_5fconversion_2',['safe_joint_state_conversion',['../namespacemodulo__core_1_1translators.html#ad0f036bf1583f4542468ca69fd66ead0',1,'modulo_core::translators']]], + ['safe_5fspatial_5fstate_5fconversion_3',['safe_spatial_state_conversion',['../namespacemodulo__core_1_1translators.html#a04a6f2e996dbc7b5ce4dcda8d9d21548',1,'modulo_core::translators']]], + ['send_5fstatic_5ftransform_4',['send_static_transform',['../classmodulo__components_1_1_component_interface.html#ab78901d9ac3ef5882e8a149443ec50a4',1,'modulo_components::ComponentInterface']]], + ['send_5fstatic_5ftransforms_5',['send_static_transforms',['../classmodulo__components_1_1_component_interface.html#a361a6e5d39927d114fcb87704e8240b6',1,'modulo_components::ComponentInterface']]], + ['send_5ftransform_6',['send_transform',['../classmodulo__components_1_1_component_interface.html#a9365d3bcde8e5abf243606a7f532678d',1,'modulo_components::ComponentInterface']]], + ['send_5ftransforms_7',['send_transforms',['../classmodulo__components_1_1_component_interface.html#aa4ee34ba8755945f13c283790e76ca68',1,'modulo_components::ComponentInterface']]], + ['set_5fdata_8',['set_data',['../classmodulo__core_1_1communication_1_1_message_pair.html#ae71ad28f6e4270b5a318ddbdbf620585',1,'modulo_core::communication::MessagePair']]], + ['set_5fmessage_5fpair_9',['set_message_pair',['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a817997523c09e4c1d912d9a18427f3ef',1,'modulo_core::communication::SubscriptionInterface::set_message_pair()'],['../classmodulo__core_1_1communication_1_1_publisher_interface.html#aa59ed6b199b838811db4c29bb19c5319',1,'modulo_core::communication::PublisherInterface::set_message_pair()']]], + ['set_5fparameter_5fvalue_10',['set_parameter_value',['../classmodulo__components_1_1_component_interface.html#aca7af942b480f71ce57665aba6e206d7',1,'modulo_components::ComponentInterface']]], + ['set_5fpredicate_11',['set_predicate',['../classmodulo__components_1_1_component_interface.html#a560c4071fb6a668a5c5c97c7f9209ef2',1,'modulo_components::ComponentInterface::set_predicate(const std::string &predicate_name, bool predicate_value)'],['../classmodulo__components_1_1_component_interface.html#a996a495220e94a0e400202c9ba34fa85',1,'modulo_components::ComponentInterface::set_predicate(const std::string &predicate_name, const std::function< bool(void)> &predicate_function)']]], + ['set_5fqos_12',['set_qos',['../classmodulo__components_1_1_component_interface.html#af186b997fea0fec1604b777b7b74a77d',1,'modulo_components::ComponentInterface']]], + ['set_5fsubscription_13',['set_subscription',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#ad6ce10b7ac797009a7c64ddf52361276',1,'modulo_core::communication::SubscriptionHandler']]], + ['set_5fuser_5fcallback_14',['set_user_callback',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#ae5ce0270138b061c709ce4f1c2f76f14',1,'modulo_core::communication::SubscriptionHandler']]], + ['step_15',['step',['../classmodulo__components_1_1_component_interface.html#a21de4a30b2a51e66574600c9b04f27cb',1,'modulo_components::ComponentInterface']]], + ['subscriptionhandler_16',['SubscriptionHandler',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a1e8e5d41669f1c0f952b93a2b86dadae',1,'modulo_core::communication::SubscriptionHandler']]], + ['subscriptioninterface_17',['SubscriptionInterface',['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a1d65d122da01edfcd28bdd049d2ad8e8',1,'modulo_core::communication::SubscriptionInterface::SubscriptionInterface(std::shared_ptr< MessagePairInterface > message_pair=nullptr)'],['../classmodulo__core_1_1communication_1_1_subscription_interface.html#a00fca8a8317e59f37051b8a7b411143e',1,'modulo_core::communication::SubscriptionInterface::SubscriptionInterface(const SubscriptionInterface &subscription)=default']]] +]; diff --git a/versions/v3.0.0/search/functions_b.js b/versions/v3.0.0/search/functions_b.js new file mode 100644 index 00000000..7b83c972 --- /dev/null +++ b/versions/v3.0.0/search/functions_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['trigger_0',['trigger',['../classmodulo__components_1_1_component_interface.html#a56a0acbb9050b73374ac6905aa88233a',1,'modulo_components::ComponentInterface']]] +]; diff --git a/versions/v3.0.0/search/functions_c.js b/versions/v3.0.0/search/functions_c.js new file mode 100644 index 00000000..3ef8856c --- /dev/null +++ b/versions/v3.0.0/search/functions_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['write_0',['write',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a5cc486ee93eb7756636a851c07f10f35',1,'modulo_core::communication::MessagePairInterface']]], + ['write_5fmessage_1',['write_message',['../classmodulo__core_1_1communication_1_1_message_pair.html#aa50124b4eb3e5811562c567da1f03f00',1,'modulo_core::communication::MessagePair::write_message()'],['../namespacemodulo__core_1_1translators.html#a02fa2614128ce09ee39cc4fd9a5d2314',1,'modulo_core::translators::write_message(EncodedState &message, const T &state, const rclcpp::Time &)'],['../namespacemodulo__core_1_1translators.html#aa77091be4785272fd22cc5215d930ddd',1,'modulo_core::translators::write_message(std_msgs::msg::String &message, const std::string &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ab5e6c729316ce06f03deec6fe811b3f5',1,'modulo_core::translators::write_message(std_msgs::msg::Int32 &message, const int &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#af3b73148b5111ac49d9b65a03c2682f5',1,'modulo_core::translators::write_message(std_msgs::msg::Float64MultiArray &message, const std::vector< double > &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a014392d41b245b63d2303fdee9e66db7',1,'modulo_core::translators::write_message(std_msgs::msg::Float64 &message, const double &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a2648db7b6384ba6b10186ae5e98bea59',1,'modulo_core::translators::write_message(std_msgs::msg::Bool &message, const bool &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a60be80575b8fb3e3d48f37a8bda6d9ed',1,'modulo_core::translators::write_message(U &message, const state_representation::Parameter< T > &state, const rclcpp::Time &)'],['../namespacemodulo__core_1_1translators.html#acdb4e193bb38e69690de512f7b6ea457',1,'modulo_core::translators::write_message(tf2_msgs::msg::TFMessage &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ae2679cbc4106a9373296b6f00aaea34b',1,'modulo_core::translators::write_message(sensor_msgs::msg::JointState &message, const state_representation::JointState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a1fd40d767a0a9a3c8221eaabb12e8e77',1,'modulo_core::translators::write_message(geometry_msgs::msg::WrenchStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ae887c515823c26c71a1266355577d5e0',1,'modulo_core::translators::write_message(geometry_msgs::msg::Wrench &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a6960610fd4bf9bb981827e0146b04d05',1,'modulo_core::translators::write_message(geometry_msgs::msg::TwistStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a23c4f120bdc010eb6f5b61bfb21abec1',1,'modulo_core::translators::write_message(geometry_msgs::msg::Twist &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ade9e94aca963133615835e6724ada18b',1,'modulo_core::translators::write_message(geometry_msgs::msg::TransformStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a038c7d7431427a1b46d12a2eab8b9da7',1,'modulo_core::translators::write_message(geometry_msgs::msg::Transform &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#ade7becbd0c04095260f1aad7dc4d5da0',1,'modulo_core::translators::write_message(geometry_msgs::msg::PoseStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a2ce2005274aa2509faa07e206f74202f',1,'modulo_core::translators::write_message(geometry_msgs::msg::Pose &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a0230b5afcd0bfca73a2a676a6e8706c3',1,'modulo_core::translators::write_message(geometry_msgs::msg::AccelStamped &message, const state_representation::CartesianState &state, const rclcpp::Time &time)'],['../namespacemodulo__core_1_1translators.html#a151198c871af003d2205cf0556115260',1,'modulo_core::translators::write_message(geometry_msgs::msg::Accel &message, const state_representation::CartesianState &state, const rclcpp::Time &time)']]], + ['write_5fparameter_2',['write_parameter',['../namespacemodulo__core_1_1translators.html#ab0ba0632a12496f0ad34f836c5001689',1,'modulo_core::translators']]] +]; diff --git a/versions/v3.0.0/search/functions_d.js b/versions/v3.0.0/search/functions_d.js new file mode 100644 index 00000000..ced41b37 --- /dev/null +++ b/versions/v3.0.0/search/functions_d.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['_7ecomponent_0',['~Component',['../classmodulo__components_1_1_component.html#a3973cf9c0bb9df9e21fb11fae1f8898f',1,'modulo_components::Component']]], + ['_7ecomponentinterface_1',['~ComponentInterface',['../classmodulo__components_1_1_component_interface.html#adf2b4c82aaa0fdc02f0a719c59a79729',1,'modulo_components::ComponentInterface']]], + ['_7elifecyclecomponent_2',['~LifecycleComponent',['../classmodulo__components_1_1_lifecycle_component.html#a534d2620117f9b2420418d4d6ca48a12',1,'modulo_components::LifecycleComponent']]], + ['_7emessagepairinterface_3',['~MessagePairInterface',['../classmodulo__core_1_1communication_1_1_message_pair_interface.html#a1b0177982d2972d701692b3c89705aae',1,'modulo_core::communication::MessagePairInterface']]], + ['_7epublisherhandler_4',['~PublisherHandler',['../classmodulo__core_1_1communication_1_1_publisher_handler.html#a9c2eafb61ee4d8e60a15e0af519be4d3',1,'modulo_core::communication::PublisherHandler']]], + ['_7epublisherinterface_5',['~PublisherInterface',['../classmodulo__core_1_1communication_1_1_publisher_interface.html#a1e670470b065bb1e7b1e5ef88eec5268',1,'modulo_core::communication::PublisherInterface']]], + ['_7esubscriptionhandler_6',['~SubscriptionHandler',['../classmodulo__core_1_1communication_1_1_subscription_handler.html#a3de45dc5da0ca5ae1de4a819851f4979',1,'modulo_core::communication::SubscriptionHandler']]], + ['_7esubscriptioninterface_7',['~SubscriptionInterface',['../classmodulo__core_1_1communication_1_1_subscription_interface.html#afd0d227d6533cafc7731f1fd52cb8d50',1,'modulo_core::communication::SubscriptionInterface']]] +]; diff --git a/versions/v3.0.0/search/mag.svg b/versions/v3.0.0/search/mag.svg new file mode 100644 index 00000000..9f46b301 --- /dev/null +++ b/versions/v3.0.0/search/mag.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/versions/v3.0.0/search/mag_d.svg b/versions/v3.0.0/search/mag_d.svg new file mode 100644 index 00000000..b9a814c7 --- /dev/null +++ b/versions/v3.0.0/search/mag_d.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/versions/v3.0.0/search/mag_sel.svg b/versions/v3.0.0/search/mag_sel.svg new file mode 100644 index 00000000..03626f64 --- /dev/null +++ b/versions/v3.0.0/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/versions/v3.0.0/search/mag_seld.svg b/versions/v3.0.0/search/mag_seld.svg new file mode 100644 index 00000000..6e720dcc --- /dev/null +++ b/versions/v3.0.0/search/mag_seld.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/versions/v3.0.0/search/namespaces_0.js b/versions/v3.0.0/search/namespaces_0.js new file mode 100644 index 00000000..9a2935af --- /dev/null +++ b/versions/v3.0.0/search/namespaces_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['communication_0',['communication',['../namespacemodulo__core_1_1communication.html',1,'modulo_core']]], + ['exceptions_1',['exceptions',['../namespacemodulo__components_1_1exceptions.html',1,'modulo_components::exceptions'],['../namespacemodulo__core_1_1exceptions.html',1,'modulo_core::exceptions']]], + ['modulo_5fcomponents_2',['modulo_components',['../namespacemodulo__components.html',1,'']]], + ['modulo_5fcore_3',['modulo_core',['../namespacemodulo__core.html',1,'']]], + ['translators_4',['translators',['../namespacemodulo__core_1_1translators.html',1,'modulo_core']]], + ['utilities_5',['utilities',['../namespacemodulo__components_1_1utilities.html',1,'modulo_components']]] +]; diff --git a/versions/v3.0.0/search/pages_0.js b/versions/v3.0.0/search/pages_0.js new file mode 100644 index 00000000..9f3caad5 --- /dev/null +++ b/versions/v3.0.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['contributing_0',['Contributing',['../md__github_workspace_source_modulo_components__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] +]; diff --git a/versions/v3.0.0/search/pages_1.js b/versions/v3.0.0/search/pages_1.js new file mode 100644 index 00000000..56d8ce6c --- /dev/null +++ b/versions/v3.0.0/search/pages_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['modulo_0',['Modulo',['../index.html',1,'']]], + ['modulo_20component_20interfaces_1',['Modulo Component Interfaces',['../md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html',1,'']]], + ['modulo_20components_2',['Modulo Components',['../md__github_workspace_source_modulo_components__r_e_a_d_m_e.html',1,'']]], + ['modulo_20core_3',['Modulo Core',['../md__github_workspace_source_modulo_core__r_e_a_d_m_e.html',1,'']]], + ['modulo_20utils_4',['Modulo Utils',['../md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html',1,'']]] +]; diff --git a/versions/v3.0.0/search/search.css b/versions/v3.0.0/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/versions/v3.0.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/versions/v3.0.0/search/search.js b/versions/v3.0.0/search/search.js new file mode 100644 index 00000000..e103a262 --- /dev/null +++ b/versions/v3.0.0/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + searchResults.Search(searchValue); + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Modulo: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    modulo_components::ComponentServiceResponse Member List
    +
    + + + + + diff --git a/versions/v3.0.0/structmodulo__components_1_1_component_service_response.html b/versions/v3.0.0/structmodulo__components_1_1_component_service_response.html new file mode 100644 index 00000000..6479cdb3 --- /dev/null +++ b/versions/v3.0.0/structmodulo__components_1_1_component_service_response.html @@ -0,0 +1,142 @@ + + + + + + + +Modulo: modulo_components::ComponentServiceResponse Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    modulo_components::ComponentServiceResponse Struct Reference
    +
    +
    + +

    Response structure to be returned by component services. + More...

    + +

    #include <ComponentInterface.hpp>

    + + + + + + +

    +Public Attributes

    bool success
     
    std::string message
     
    +

    Detailed Description

    +

    Response structure to be returned by component services.

    +

    The structure contains a bool success field and a string message field. This information is used to provide feedback on the service outcome to the service client.

    + +

    Definition at line 51 of file ComponentInterface.hpp.

    +

    Member Data Documentation

    + +

    ◆ message

    + +
    +
    + + + + +
    std::string modulo_components::ComponentServiceResponse::message
    +
    + +

    Definition at line 53 of file ComponentInterface.hpp.

    + +
    +
    + +

    ◆ success

    + +
    +
    + + + + +
    bool modulo_components::ComponentServiceResponse::success
    +
    + +

    Definition at line 52 of file ComponentInterface.hpp.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/versions/v3.0.0/sync_off.png b/versions/v3.0.0/sync_off.png new file mode 100644 index 00000000..3b443fc6 Binary files /dev/null and b/versions/v3.0.0/sync_off.png differ diff --git a/versions/v3.0.0/sync_on.png b/versions/v3.0.0/sync_on.png new file mode 100644 index 00000000..e08320fb Binary files /dev/null and b/versions/v3.0.0/sync_on.png differ diff --git a/versions/v3.0.0/tab_a.png b/versions/v3.0.0/tab_a.png new file mode 100644 index 00000000..3b725c41 Binary files /dev/null and b/versions/v3.0.0/tab_a.png differ diff --git a/versions/v3.0.0/tab_ad.png b/versions/v3.0.0/tab_ad.png new file mode 100644 index 00000000..e34850ac Binary files /dev/null and b/versions/v3.0.0/tab_ad.png differ diff --git a/versions/v3.0.0/tab_b.png b/versions/v3.0.0/tab_b.png new file mode 100644 index 00000000..e2b4a863 Binary files /dev/null and b/versions/v3.0.0/tab_b.png differ diff --git a/versions/v3.0.0/tab_bd.png b/versions/v3.0.0/tab_bd.png new file mode 100644 index 00000000..91c25249 Binary files /dev/null and b/versions/v3.0.0/tab_bd.png differ diff --git a/versions/v3.0.0/tab_h.png b/versions/v3.0.0/tab_h.png new file mode 100644 index 00000000..fd5cb705 Binary files /dev/null and b/versions/v3.0.0/tab_h.png differ diff --git a/versions/v3.0.0/tab_hd.png b/versions/v3.0.0/tab_hd.png new file mode 100644 index 00000000..2489273d Binary files /dev/null and b/versions/v3.0.0/tab_hd.png differ diff --git a/versions/v3.0.0/tab_s.png b/versions/v3.0.0/tab_s.png new file mode 100644 index 00000000..ab478c95 Binary files /dev/null and b/versions/v3.0.0/tab_s.png differ diff --git a/versions/v3.0.0/tab_sd.png b/versions/v3.0.0/tab_sd.png new file mode 100644 index 00000000..757a565c Binary files /dev/null and b/versions/v3.0.0/tab_sd.png differ diff --git a/versions/v3.0.0/tabs.css b/versions/v3.0.0/tabs.css new file mode 100644 index 00000000..71c8a470 --- /dev/null +++ b/versions/v3.0.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/versions/v3.0.0/utilities_8hpp_source.html b/versions/v3.0.0/utilities_8hpp_source.html new file mode 100644 index 00000000..27df8264 --- /dev/null +++ b/versions/v3.0.0/utilities_8hpp_source.html @@ -0,0 +1,126 @@ + + + + + + + +Modulo: /github/workspace/source/modulo_components/include/modulo_components/utilities/utilities.hpp Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Modulo 3.0.0 +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    utilities.hpp
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <string>
    +
    4
    +
    5#include <rclcpp/rclcpp.hpp>
    +
    6
    + +
    12
    +
    20[[maybe_unused]] static std::string
    +
    21parse_string_argument(const std::vector<std::string>& args, const std::string& pattern, std::string& result) {
    +
    22 for (const auto& arg : args) {
    +
    23 std::string::size_type index = arg.find(pattern);
    +
    24 if (index != std::string::npos) {
    +
    25 result = arg;
    +
    26 result.erase(index, pattern.length());
    +
    27 break;
    +
    28 }
    +
    29 }
    +
    30 return result;
    +
    31}
    +
    32
    +
    39[[maybe_unused]] static std::string
    +
    40parse_node_name(const rclcpp::NodeOptions& options, const std::string& fallback = "") {
    +
    41 std::string node_name(fallback);
    +
    42 const std::string pattern("__node:=");
    +
    43 return parse_string_argument(options.arguments(), pattern, node_name);
    +
    44}
    +
    45
    +
    53[[maybe_unused]] static std::string parse_topic_name(const std::string& topic_name) {
    +
    54 std::string output;
    +
    55 for (char c : topic_name) {
    +
    56 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') {
    +
    57 if (!(c == '_' && output.empty())) {
    +
    58 output.insert(output.end(), std::tolower(c));
    +
    59 }
    +
    60 }
    +
    61 }
    +
    62 return output;
    +
    63}
    +
    64}// namespace modulo_components::utilities
    +
    Modulo component utilities.
    +
    + + + +