diff --git a/versions/main/_add_service_exception_8hpp_source.html b/versions/main/_add_service_exception_8hpp_source.html index fb45b9354..b36e8e622 100644 --- a/versions/main/_add_service_exception_8hpp_source.html +++ b/versions/main/_add_service_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_add_signal_exception_8hpp_source.html b/versions/main/_add_signal_exception_8hpp_source.html index e56e06d8d..d8ed7ea3e 100644 --- a/versions/main/_add_signal_exception_8hpp_source.html +++ b/versions/main/_add_signal_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_component_8cpp_source.html b/versions/main/_component_8cpp_source.html index 966f594ff..627753981 100644 --- a/versions/main/_component_8cpp_source.html +++ b/versions/main/_component_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -131,13 +131,13 @@
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:24
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
-
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
-
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.
+
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
+
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/main/_component_8hpp_source.html b/versions/main/_component_8hpp_source.html index 4cfb62aaa..d5386bd8c 100644 --- a/versions/main/_component_8hpp_source.html +++ b/versions/main/_component_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -194,11 +194,11 @@
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:24
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.
+
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.
+
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...
diff --git a/versions/main/_component_exception_8hpp_source.html b/versions/main/_component_exception_8hpp_source.html index 91db8fb68..714950f8a 100644 --- a/versions/main/_component_exception_8hpp_source.html +++ b/versions/main/_component_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_component_interface_8hpp_source.html b/versions/main/_component_interface_8hpp_source.html index db58d7ef6..d85a4e578 100644 --- a/versions/main/_component_interface_8hpp_source.html +++ b/versions/main/_component_interface_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -325,824 +325,832 @@
592template<class NodeT>
593ComponentInterface<NodeT>::ComponentInterface(
594 const rclcpp::NodeOptions& options, modulo_core::communication::PublisherType publisher_type,
-
595 const std::string& fallback_name
-
596) :
-
597 NodeT(utilities::parse_node_name(options, fallback_name), options), publisher_type_(publisher_type) {
+
595 const std::string& fallback_name)
+
596 : NodeT(utilities::parse_node_name(options, fallback_name), utilities::modify_parameter_overrides(options)),
+
597 publisher_type_(publisher_type) {
598 // register the parameter change callback handler
599 parameter_cb_handle_ = NodeT::add_on_set_parameters_callback(
600 [this](const std::vector<rclcpp::Parameter>& parameters) -> rcl_interfaces::msg::SetParametersResult {
601 return this->on_set_parameters_callback(parameters);
602 });
-
603 this->add_parameter("period", 0.1, "The time interval in seconds for all periodic callbacks", true);
-
604
-
605 this->predicate_publisher_ =
-
606 rclcpp::create_publisher<modulo_component_interfaces::msg::Predicate>(*this, "/predicates", this->qos_);
-
607 this->add_predicate("in_error_state", false);
-
608
-
609 this->step_timer_ = this->create_wall_timer(
-
610 std::chrono::nanoseconds(static_cast<int64_t>(this->get_parameter_value<double>("period") * 1e9)),
-
611 [this] { this->step(); });
-
612}
-
613
-
614template<class NodeT>
- -
616
-
617template<class NodeT>
- -
619
-
620template<class NodeT>
-
621template<typename T>
- -
623 const std::string& name, const T& value, const std::string& description, bool read_only
-
624) {
-
625 if (name.empty()) {
-
626 RCLCPP_ERROR(this->get_logger(), "Failed to add parameter: Provide a non empty string as a name.");
-
627 return;
-
628 }
-
629 this->add_parameter(state_representation::make_shared_parameter(name, value), description, read_only);
-
630}
-
631
-
632template<class NodeT>
-
633template<typename T>
-
634inline T ComponentInterface<NodeT>::get_parameter_value(const std::string& name) const {
-
635 try {
-
636 return this->parameter_map_.template get_parameter_value<T>(name);
-
637 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
- -
639 "Failed to get parameter value of parameter '" + name + "': " + ex.what());
-
640 }
-
641}
-
642
-
643template<class NodeT>
- -
645 const std::shared_ptr<state_representation::ParameterInterface>& parameter, const std::string& description,
-
646 bool read_only
-
647) {
-
648 this->set_parameter_callback_called_ = false;
-
649 rclcpp::Parameter ros_param;
-
650 try {
-
651 ros_param = modulo_core::translators::write_parameter(parameter);
- -
653 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
-
654 }
-
655 if (!NodeT::has_parameter(parameter->get_name())) {
-
656 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding parameter '" << parameter->get_name() << "'.");
-
657 this->parameter_map_.set_parameter(parameter);
-
658 try {
-
659 rcl_interfaces::msg::ParameterDescriptor descriptor;
-
660 descriptor.description = description;
-
661 descriptor.read_only = read_only;
-
662 if (parameter->is_empty()) {
-
663 descriptor.dynamic_typing = true;
-
664 descriptor.type = modulo_core::translators::get_ros_parameter_type(parameter->get_parameter_type());
-
665 NodeT::declare_parameter(parameter->get_name(), rclcpp::ParameterValue{}, descriptor);
-
666 } else {
-
667 NodeT::declare_parameter(parameter->get_name(), ros_param.get_parameter_value(), descriptor);
-
668 }
-
669 if (!this->set_parameter_callback_called_) {
-
670 auto result = this->on_set_parameters_callback({NodeT::get_parameters({parameter->get_name()})});
-
671 if (!result.successful) {
-
672 NodeT::undeclare_parameter(parameter->get_name());
-
673 throw exceptions::ComponentParameterException(result.reason);
-
674 }
-
675 }
-
676 } catch (const std::exception& ex) {
-
677 this->parameter_map_.remove_parameter(parameter->get_name());
-
678 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
-
679 }
-
680 } else {
-
681 RCLCPP_DEBUG_STREAM(this->get_logger(), "Parameter '" << parameter->get_name() << "' already exists.");
-
682 }
-
683}
-
684
-
685template<class NodeT>
-
686inline std::shared_ptr<state_representation::ParameterInterface>
-
687ComponentInterface<NodeT>::get_parameter(const std::string& name) const {
-
688 try {
-
689 return this->parameter_map_.get_parameter(name);
-
690 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
-
691 throw exceptions::ComponentParameterException("Failed to get parameter '" + name + "': " + ex.what());
-
692 }
-
693}
-
694
-
695template<class NodeT>
-
696template<typename T>
-
697inline void ComponentInterface<NodeT>::set_parameter_value(const std::string& name, const T& value) {
-
698 try {
-
699 rcl_interfaces::msg::SetParametersResult result = NodeT::set_parameter(
-
700 modulo_core::translators::write_parameter(state_representation::make_shared_parameter(name, value)));
-
701 if (!result.successful) {
-
702 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
703 "Failed to set parameter value of parameter '" << name << "': " << result.reason);
-
704 }
-
705 } catch (const std::exception& ex) {
-
706 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
707 "Failed to set parameter value of parameter '" << name << "': " << ex.what());
-
708 }
-
709}
-
710
-
711template<class NodeT>
- -
713 const std::shared_ptr<state_representation::ParameterInterface>& parameter
-
714) {
-
715 if (parameter->get_name() == "period") {
-
716 auto value = parameter->get_parameter_value<double>();
-
717 if (value <= 0.0 || !std::isfinite(value)) {
-
718 RCLCPP_ERROR(this->get_logger(), "Value for parameter 'period' has to be a positive finite number.");
-
719 return false;
-
720 }
-
721 }
-
722 return this->on_validate_parameter_callback(parameter);
-
723}
-
724
-
725template<class NodeT>
- -
727 const std::shared_ptr<state_representation::ParameterInterface>&
-
728) {
-
729 return true;
-
730}
-
731
-
732template<class NodeT>
-
733inline rcl_interfaces::msg::SetParametersResult
-
734ComponentInterface<NodeT>::on_set_parameters_callback(const std::vector<rclcpp::Parameter>& parameters) {
-
735 rcl_interfaces::msg::SetParametersResult result;
-
736 result.successful = true;
-
737 for (const auto& ros_parameter : parameters) {
-
738 try {
-
739 if (ros_parameter.get_name().substr(0, 27) == "qos_overrides./tf.publisher") {
-
740 continue;
-
741 }
-
742 // get the associated parameter interface by name
-
743 auto parameter = parameter_map_.get_parameter(ros_parameter.get_name());
-
744
-
745 // convert the ROS parameter into a ParameterInterface without modifying the original
-
746 auto new_parameter = modulo_core::translators::read_parameter_const(ros_parameter, parameter);
-
747 if (!this->validate_parameter(new_parameter)) {
-
748 result.successful = false;
-
749 result.reason += "Validation of parameter '" + ros_parameter.get_name() + "' returned false!";
-
750 } else if (!new_parameter->is_empty()) {
-
751 // update the value of the parameter in the map
-
752 modulo_core::translators::copy_parameter_value(new_parameter, parameter);
-
753 }
-
754 } catch (const std::exception& ex) {
-
755 result.successful = false;
-
756 result.reason += ex.what();
-
757 }
-
758 }
-
759 this->set_parameter_callback_called_ = true;
-
760 return result;
-
761}
-
762
-
763template<class NodeT>
-
764inline void ComponentInterface<NodeT>::add_predicate(const std::string& name, bool predicate) {
-
765 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
-
766}
-
767
-
768template<class NodeT>
- -
770 const std::string& name, const std::function<bool(void)>& predicate
-
771) {
-
772 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
-
773}
-
774
-
775template<class NodeT>
- -
777 const std::string& name, const utilities::PredicateVariant& predicate
-
778) {
-
779 if (name.empty()) {
-
780 RCLCPP_ERROR(this->get_logger(), "Failed to add predicate: Provide a non empty string as a name.");
-
781 return;
-
782 }
-
783 if (this->predicates_.find(name) != this->predicates_.end()) {
-
784 RCLCPP_WARN_STREAM(this->get_logger(), "Predicate with name '" << name << "' already exists, overwriting.");
-
785 } else {
-
786 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding predicate '" << name << "'.");
-
787 }
-
788 this->predicates_.insert_or_assign(name, predicate);
-
789}
-
790
-
791template<class NodeT>
-
792inline bool ComponentInterface<NodeT>::get_predicate(const std::string& predicate_name) {
-
793 auto predicate_iterator = this->predicates_.find(predicate_name);
-
794 // if there is no predicate with that name simply return false with an error message
-
795 if (predicate_iterator == this->predicates_.end()) {
-
796 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
797 "Failed to get predicate '" << predicate_name
-
798 << "': Predicate does not exists, returning false.");
-
799 return false;
-
800 }
-
801 // try to get the value from the variant as a bool
-
802 auto* ptr_value = std::get_if<bool>(&predicate_iterator->second);
-
803 if (ptr_value) {
-
804 return *ptr_value;
-
805 }
-
806 // if previous check failed, it means the variant is actually a callback function
-
807 auto callback_function = std::get<std::function<bool(void)>>(predicate_iterator->second);
-
808 bool value = false;
-
809 try {
-
810 value = (callback_function)();
-
811 } catch (const std::exception& ex) {
-
812 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
813 "Failed to evaluate callback of predicate '" << predicate_name
-
814 << "', returning false: " << ex.what());
-
815 }
-
816 return value;
-
817}
-
818
-
819template<class NodeT>
-
820inline void ComponentInterface<NodeT>::add_trigger(const std::string& trigger_name) {
-
821 if (trigger_name.empty()) {
-
822 RCLCPP_ERROR(this->get_logger(), "Failed to add trigger: Provide a non empty string as a name.");
-
823 return;
-
824 }
-
825 if (this->triggers_.find(trigger_name) != this->triggers_.end()
-
826 || this->predicates_.find(trigger_name) != this->predicates_.end()) {
-
827 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add trigger: there is already a trigger or "
-
828 "predicate with name '" << trigger_name << "'.");
-
829 return;
-
830 }
-
831 this->triggers_.insert_or_assign(trigger_name, false);
-
832 this->add_predicate(
-
833 trigger_name, [this, trigger_name] {
-
834 auto value = this->triggers_.at(trigger_name);
-
835 this->triggers_.at(trigger_name) = false;
-
836 return value;
-
837 });
-
838}
-
839
-
840template<class NodeT>
-
841inline void ComponentInterface<NodeT>::trigger(const std::string& trigger_name) {
-
842 if (this->triggers_.find(trigger_name) == this->triggers_.end()) {
-
843 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to trigger: could not find trigger"
-
844 " with name '" << trigger_name << "'.");
-
845 return;
-
846 }
-
847 this->triggers_.at(trigger_name) = true;
-
848 publish_predicate(trigger_name);
-
849}
-
850
-
851template<class NodeT>
- -
853 const std::string& name, const utilities::PredicateVariant& predicate
-
854) {
-
855 auto predicate_iterator = this->predicates_.find(name);
-
856 if (predicate_iterator == this->predicates_.end()) {
-
857 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
858 "Failed to set predicate '" << name << "': Predicate does not exist.");
-
859 return;
-
860 }
-
861 predicate_iterator->second = predicate;
-
862 this->publish_predicate(name);
-
863}
-
864
-
865template<class NodeT>
-
866inline void ComponentInterface<NodeT>::set_predicate(const std::string& name, bool predicate) {
-
867 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
-
868}
-
869
-
870template<class NodeT>
- -
872 const std::string& name, const std::function<bool(void)>& predicate
-
873) {
-
874 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
-
875}
-
876
-
877template<class NodeT>
-
878template<typename T>
- -
880 const std::string& signal_name, std::map<std::string, std::shared_ptr<T>>& signal_map, bool skip_check
+
603 this->add_parameter("rate", 10, "The rate in Hertz for all periodic callbacks", true);
+
604 this->add_parameter("period", 0.1, "The time interval in seconds for all periodic callbacks", true);
+
605
+
606 this->predicate_publisher_ =
+
607 rclcpp::create_publisher<modulo_component_interfaces::msg::Predicate>(*this, "/predicates", this->qos_);
+
608 this->add_predicate("in_error_state", false);
+
609
+
610 this->step_timer_ = this->create_wall_timer(
+
611 std::chrono::nanoseconds(static_cast<int64_t>(this->get_parameter_value<double>("period") * 1e9)),
+
612 [this] { this->step(); });
+
613}
+
614
+
615template<class NodeT>
+ +
617
+
618template<class NodeT>
+ +
620
+
621template<class NodeT>
+
622template<typename T>
+ +
624 const std::string& name, const T& value, const std::string& description, bool read_only
+
625) {
+
626 if (name.empty()) {
+
627 RCLCPP_ERROR(this->get_logger(), "Failed to add parameter: Provide a non empty string as a name.");
+
628 return;
+
629 }
+
630 this->add_parameter(state_representation::make_shared_parameter(name, value), description, read_only);
+
631}
+
632
+
633template<class NodeT>
+
634template<typename T>
+
635inline T ComponentInterface<NodeT>::get_parameter_value(const std::string& name) const {
+
636 try {
+
637 return this->parameter_map_.template get_parameter_value<T>(name);
+
638 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
+ +
640 "Failed to get parameter value of parameter '" + name + "': " + ex.what());
+
641 }
+
642}
+
643
+
644template<class NodeT>
+ +
646 const std::shared_ptr<state_representation::ParameterInterface>& parameter, const std::string& description,
+
647 bool read_only
+
648) {
+
649 this->set_parameter_callback_called_ = false;
+
650 rclcpp::Parameter ros_param;
+
651 try {
+
652 ros_param = modulo_core::translators::write_parameter(parameter);
+ +
654 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
+
655 }
+
656 if (!NodeT::has_parameter(parameter->get_name())) {
+
657 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding parameter '" << parameter->get_name() << "'.");
+
658 this->parameter_map_.set_parameter(parameter);
+
659 try {
+
660 rcl_interfaces::msg::ParameterDescriptor descriptor;
+
661 descriptor.description = description;
+
662 descriptor.read_only = read_only;
+
663 if (parameter->is_empty()) {
+
664 descriptor.dynamic_typing = true;
+
665 descriptor.type = modulo_core::translators::get_ros_parameter_type(parameter->get_parameter_type());
+
666 NodeT::declare_parameter(parameter->get_name(), rclcpp::ParameterValue{}, descriptor);
+
667 } else {
+
668 NodeT::declare_parameter(parameter->get_name(), ros_param.get_parameter_value(), descriptor);
+
669 }
+
670 if (!this->set_parameter_callback_called_) {
+
671 auto result = this->on_set_parameters_callback({NodeT::get_parameters({parameter->get_name()})});
+
672 if (!result.successful) {
+
673 NodeT::undeclare_parameter(parameter->get_name());
+
674 throw exceptions::ComponentParameterException(result.reason);
+
675 }
+
676 }
+
677 } catch (const std::exception& ex) {
+
678 this->parameter_map_.remove_parameter(parameter->get_name());
+
679 throw exceptions::ComponentParameterException("Failed to add parameter: " + std::string(ex.what()));
+
680 }
+
681 } else {
+
682 RCLCPP_DEBUG_STREAM(this->get_logger(), "Parameter '" << parameter->get_name() << "' already exists.");
+
683 }
+
684}
+
685
+
686template<class NodeT>
+
687inline std::shared_ptr<state_representation::ParameterInterface>
+
688ComponentInterface<NodeT>::get_parameter(const std::string& name) const {
+
689 try {
+
690 return this->parameter_map_.get_parameter(name);
+
691 } catch (const state_representation::exceptions::InvalidParameterException& ex) {
+
692 throw exceptions::ComponentParameterException("Failed to get parameter '" + name + "': " + ex.what());
+
693 }
+
694}
+
695
+
696template<class NodeT>
+
697template<typename T>
+
698inline void ComponentInterface<NodeT>::set_parameter_value(const std::string& name, const T& value) {
+
699 try {
+
700 rcl_interfaces::msg::SetParametersResult result = NodeT::set_parameter(
+
701 modulo_core::translators::write_parameter(state_representation::make_shared_parameter(name, value)));
+
702 if (!result.successful) {
+
703 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
704 "Failed to set parameter value of parameter '" << name << "': " << result.reason);
+
705 }
+
706 } catch (const std::exception& ex) {
+
707 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
708 "Failed to set parameter value of parameter '" << name << "': " << ex.what());
+
709 }
+
710}
+
711
+
712template<class NodeT>
+ +
714 const std::shared_ptr<state_representation::ParameterInterface>& parameter
+
715) {
+
716 if (parameter->get_name() == "rate") {
+
717 auto value = parameter->get_parameter_value<int>();
+
718 if (value <= 0 || !std::isfinite(value)) {
+
719 RCLCPP_ERROR(this->get_logger(), "Value for parameter 'rate' has to be a positive finite number.");
+
720 return false;
+
721 }
+
722 }
+
723 if (parameter->get_name() == "period") {
+
724 auto value = parameter->get_parameter_value<double>();
+
725 if (value <= 0.0 || !std::isfinite(value)) {
+
726 RCLCPP_ERROR(this->get_logger(), "Value for parameter 'period' has to be a positive finite number.");
+
727 return false;
+
728 }
+
729 }
+
730 return this->on_validate_parameter_callback(parameter);
+
731}
+
732
+
733template<class NodeT>
+ +
735 const std::shared_ptr<state_representation::ParameterInterface>&
+
736) {
+
737 return true;
+
738}
+
739
+
740template<class NodeT>
+
741inline rcl_interfaces::msg::SetParametersResult
+
742ComponentInterface<NodeT>::on_set_parameters_callback(const std::vector<rclcpp::Parameter>& parameters) {
+
743 rcl_interfaces::msg::SetParametersResult result;
+
744 result.successful = true;
+
745 for (const auto& ros_parameter : parameters) {
+
746 try {
+
747 if (ros_parameter.get_name().substr(0, 27) == "qos_overrides./tf.publisher") {
+
748 continue;
+
749 }
+
750 // get the associated parameter interface by name
+
751 auto parameter = parameter_map_.get_parameter(ros_parameter.get_name());
+
752
+
753 // convert the ROS parameter into a ParameterInterface without modifying the original
+
754 auto new_parameter = modulo_core::translators::read_parameter_const(ros_parameter, parameter);
+
755 if (!this->validate_parameter(new_parameter)) {
+
756 result.successful = false;
+
757 result.reason += "Validation of parameter '" + ros_parameter.get_name() + "' returned false!";
+
758 } else if (!new_parameter->is_empty()) {
+
759 // update the value of the parameter in the map
+
760 modulo_core::translators::copy_parameter_value(new_parameter, parameter);
+
761 }
+
762 } catch (const std::exception& ex) {
+
763 result.successful = false;
+
764 result.reason += ex.what();
+
765 }
+
766 }
+
767 this->set_parameter_callback_called_ = true;
+
768 return result;
+
769}
+
770
+
771template<class NodeT>
+
772inline void ComponentInterface<NodeT>::add_predicate(const std::string& name, bool predicate) {
+
773 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
+
774}
+
775
+
776template<class NodeT>
+ +
778 const std::string& name, const std::function<bool(void)>& predicate
+
779) {
+
780 this->add_variant_predicate(name, utilities::PredicateVariant(predicate));
+
781}
+
782
+
783template<class NodeT>
+ +
785 const std::string& name, const utilities::PredicateVariant& predicate
+
786) {
+
787 if (name.empty()) {
+
788 RCLCPP_ERROR(this->get_logger(), "Failed to add predicate: Provide a non empty string as a name.");
+
789 return;
+
790 }
+
791 if (this->predicates_.find(name) != this->predicates_.end()) {
+
792 RCLCPP_WARN_STREAM(this->get_logger(), "Predicate with name '" << name << "' already exists, overwriting.");
+
793 } else {
+
794 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding predicate '" << name << "'.");
+
795 }
+
796 this->predicates_.insert_or_assign(name, predicate);
+
797}
+
798
+
799template<class NodeT>
+
800inline bool ComponentInterface<NodeT>::get_predicate(const std::string& predicate_name) {
+
801 auto predicate_iterator = this->predicates_.find(predicate_name);
+
802 // if there is no predicate with that name simply return false with an error message
+
803 if (predicate_iterator == this->predicates_.end()) {
+
804 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
805 "Failed to get predicate '" << predicate_name
+
806 << "': Predicate does not exists, returning false.");
+
807 return false;
+
808 }
+
809 // try to get the value from the variant as a bool
+
810 auto* ptr_value = std::get_if<bool>(&predicate_iterator->second);
+
811 if (ptr_value) {
+
812 return *ptr_value;
+
813 }
+
814 // if previous check failed, it means the variant is actually a callback function
+
815 auto callback_function = std::get<std::function<bool(void)>>(predicate_iterator->second);
+
816 bool value = false;
+
817 try {
+
818 value = (callback_function)();
+
819 } catch (const std::exception& ex) {
+
820 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
821 "Failed to evaluate callback of predicate '" << predicate_name
+
822 << "', returning false: " << ex.what());
+
823 }
+
824 return value;
+
825}
+
826
+
827template<class NodeT>
+
828inline void ComponentInterface<NodeT>::add_trigger(const std::string& trigger_name) {
+
829 if (trigger_name.empty()) {
+
830 RCLCPP_ERROR(this->get_logger(), "Failed to add trigger: Provide a non empty string as a name.");
+
831 return;
+
832 }
+
833 if (this->triggers_.find(trigger_name) != this->triggers_.end()
+
834 || this->predicates_.find(trigger_name) != this->predicates_.end()) {
+
835 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add trigger: there is already a trigger or "
+
836 "predicate with name '" << trigger_name << "'.");
+
837 return;
+
838 }
+
839 this->triggers_.insert_or_assign(trigger_name, false);
+
840 this->add_predicate(
+
841 trigger_name, [this, trigger_name] {
+
842 auto value = this->triggers_.at(trigger_name);
+
843 this->triggers_.at(trigger_name) = false;
+
844 return value;
+
845 });
+
846}
+
847
+
848template<class NodeT>
+
849inline void ComponentInterface<NodeT>::trigger(const std::string& trigger_name) {
+
850 if (this->triggers_.find(trigger_name) == this->triggers_.end()) {
+
851 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to trigger: could not find trigger"
+
852 " with name '" << trigger_name << "'.");
+
853 return;
+
854 }
+
855 this->triggers_.at(trigger_name) = true;
+
856 publish_predicate(trigger_name);
+
857}
+
858
+
859template<class NodeT>
+ +
861 const std::string& name, const utilities::PredicateVariant& predicate
+
862) {
+
863 auto predicate_iterator = this->predicates_.find(name);
+
864 if (predicate_iterator == this->predicates_.end()) {
+
865 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
866 "Failed to set predicate '" << name << "': Predicate does not exist.");
+
867 return;
+
868 }
+
869 predicate_iterator->second = predicate;
+
870 this->publish_predicate(name);
+
871}
+
872
+
873template<class NodeT>
+
874inline void ComponentInterface<NodeT>::set_predicate(const std::string& name, bool predicate) {
+
875 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
+
876}
+
877
+
878template<class NodeT>
+ +
880 const std::string& name, const std::function<bool(void)>& predicate
881) {
-
882 if (!skip_check && signal_map.find(signal_name) == signal_map.cend()) {
-
883 return false;
-
884 } else {
-
885 RCLCPP_DEBUG_STREAM(this->get_logger(), "Removing signal '" << signal_name << "'.");
-
886 signal_map.at(signal_name).reset();
-
887 return signal_map.erase(signal_name);
-
888 }
-
889}
-
890
-
891template<class NodeT>
-
892inline void ComponentInterface<NodeT>::remove_input(const std::string& signal_name) {
-
893 if (!this->template remove_signal(signal_name, this->inputs_)) {
-
894 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
-
895 if (!this->template remove_signal(parsed_signal_name, this->inputs_)) {
-
896 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
897 "Unknown input '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
-
898 }
-
899 }
-
900}
-
901
-
902template<class NodeT>
-
903inline void ComponentInterface<NodeT>::remove_output(const std::string& signal_name) {
-
904 if (!this->template remove_signal(signal_name, this->outputs_)) {
-
905 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
-
906 if (!this->template remove_signal(parsed_signal_name, this->outputs_)) {
-
907 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
908 "Unknown output '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
-
909 }
-
910 }
-
911}
-
912
-
913template<class NodeT>
- -
915 const std::string& signal_name, const std::string& type, const std::string& default_topic, bool fixed_topic
-
916) {
-
917 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
-
918 if (parsed_signal_name.empty()) {
- -
920 "The parsed signal name for " + type + " '" + signal_name
-
921 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
-
922 }
-
923 if (this->inputs_.find(parsed_signal_name) != this->inputs_.cend()) {
-
924 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as input.");
-
925 }
-
926 if (this->outputs_.find(parsed_signal_name) != this->outputs_.cend()) {
-
927 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as output.");
-
928 }
-
929 std::string topic_name = default_topic.empty() ? "~/" + parsed_signal_name : default_topic;
-
930 auto parameter_name = parsed_signal_name + "_topic";
-
931 if (NodeT::has_parameter(parameter_name) && this->get_parameter(parameter_name)->is_empty()) {
-
932 this->set_parameter_value<std::string>(parameter_name, topic_name);
-
933 } else {
-
934 this->add_parameter(
-
935 parameter_name, topic_name, "Signal topic name of " + type + " '" + parsed_signal_name + "'", fixed_topic);
+
882 this->set_variant_predicate(name, utilities::PredicateVariant(predicate));
+
883}
+
884
+
885template<class NodeT>
+
886template<typename T>
+ +
888 const std::string& signal_name, std::map<std::string, std::shared_ptr<T>>& signal_map, bool skip_check
+
889) {
+
890 if (!skip_check && signal_map.find(signal_name) == signal_map.cend()) {
+
891 return false;
+
892 } else {
+
893 RCLCPP_DEBUG_STREAM(this->get_logger(), "Removing signal '" << signal_name << "'.");
+
894 signal_map.at(signal_name).reset();
+
895 return signal_map.erase(signal_name);
+
896 }
+
897}
+
898
+
899template<class NodeT>
+
900inline void ComponentInterface<NodeT>::remove_input(const std::string& signal_name) {
+
901 if (!this->template remove_signal(signal_name, this->inputs_)) {
+
902 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
903 if (!this->template remove_signal(parsed_signal_name, this->inputs_)) {
+
904 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
905 "Unknown input '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
+
906 }
+
907 }
+
908}
+
909
+
910template<class NodeT>
+
911inline void ComponentInterface<NodeT>::remove_output(const std::string& signal_name) {
+
912 if (!this->template remove_signal(signal_name, this->outputs_)) {
+
913 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
914 if (!this->template remove_signal(parsed_signal_name, this->outputs_)) {
+
915 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
916 "Unknown output '" << signal_name << "' (parsed name was '" << parsed_signal_name << "').");
+
917 }
+
918 }
+
919}
+
920
+
921template<class NodeT>
+ +
923 const std::string& signal_name, const std::string& type, const std::string& default_topic, bool fixed_topic
+
924) {
+
925 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
926 if (parsed_signal_name.empty()) {
+ +
928 "The parsed signal name for " + type + " '" + signal_name
+
929 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
+
930 }
+
931 if (this->inputs_.find(parsed_signal_name) != this->inputs_.cend()) {
+
932 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as input.");
+
933 }
+
934 if (this->outputs_.find(parsed_signal_name) != this->outputs_.cend()) {
+
935 throw exceptions::AddSignalException("Signal with name '" + parsed_signal_name + "' already exists as output.");
936 }
-
937 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
938 "Declared signal '" << parsed_signal_name << "' and parameter '" << parameter_name
-
939 << "' with value '" << topic_name << "'.");
-
940}
-
941
-
942template<class NodeT>
- -
944 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
-
945) {
-
946 this->declare_signal(signal_name, "input", default_topic, fixed_topic);
-
947}
-
948
-
949template<class NodeT>
- -
951 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
-
952) {
-
953 this->declare_signal(signal_name, "output", default_topic, fixed_topic);
-
954}
-
955
-
956template<class NodeT>
-
957template<typename DataT>
- -
959 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
-
960 bool fixed_topic
-
961) {
-
962 this->add_input(signal_name, data, [] {}, default_topic, fixed_topic);
-
963}
-
964
-
965template<class NodeT>
-
966template<typename DataT>
- -
968 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::function<void()>& user_callback,
-
969 const std::string& default_topic, bool fixed_topic
-
970) {
-
971 using namespace modulo_core::communication;
-
972 try {
-
973 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
-
974 if (data == nullptr) {
- -
976 "Invalid data pointer for input '" + parsed_signal_name + "'.");
-
977 }
-
978 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
-
979 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
-
980 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
981 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
-
982 auto message_pair = make_shared_message_pair(data, this->get_clock());
-
983 std::shared_ptr<SubscriptionInterface> subscription_interface;
-
984 switch (message_pair->get_type()) {
-
985 case MessageType::BOOL: {
-
986 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Bool>>(message_pair);
-
987 auto subscription = NodeT::template create_subscription<std_msgs::msg::Bool>(
-
988 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
-
989 subscription_interface = subscription_handler->create_subscription_interface(subscription);
-
990 break;
-
991 }
-
992 case MessageType::FLOAT64: {
-
993 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Float64>>(message_pair);
-
994 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64>(
-
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::FLOAT64_MULTI_ARRAY: {
-
1000 auto subscription_handler =
-
1001 std::make_shared<SubscriptionHandler<std_msgs::msg::Float64MultiArray>>(message_pair);
-
1002 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64MultiArray>(
+
937 std::string topic_name = default_topic.empty() ? "~/" + parsed_signal_name : default_topic;
+
938 auto parameter_name = parsed_signal_name + "_topic";
+
939 if (NodeT::has_parameter(parameter_name) && this->get_parameter(parameter_name)->is_empty()) {
+
940 this->set_parameter_value<std::string>(parameter_name, topic_name);
+
941 } else {
+
942 this->add_parameter(
+
943 parameter_name, topic_name, "Signal topic name of " + type + " '" + parsed_signal_name + "'", fixed_topic);
+
944 }
+
945 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
946 "Declared signal '" << parsed_signal_name << "' and parameter '" << parameter_name
+
947 << "' with value '" << topic_name << "'.");
+
948}
+
949
+
950template<class NodeT>
+ +
952 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
+
953) {
+
954 this->declare_signal(signal_name, "input", default_topic, fixed_topic);
+
955}
+
956
+
957template<class NodeT>
+ +
959 const std::string& signal_name, const std::string& default_topic, bool fixed_topic
+
960) {
+
961 this->declare_signal(signal_name, "output", default_topic, fixed_topic);
+
962}
+
963
+
964template<class NodeT>
+
965template<typename DataT>
+ +
967 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
968 bool fixed_topic
+
969) {
+
970 this->add_input(signal_name, data, [] {}, default_topic, fixed_topic);
+
971}
+
972
+
973template<class NodeT>
+
974template<typename DataT>
+ +
976 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::function<void()>& user_callback,
+
977 const std::string& default_topic, bool fixed_topic
+
978) {
+
979 using namespace modulo_core::communication;
+
980 try {
+
981 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
982 if (data == nullptr) {
+ +
984 "Invalid data pointer for input '" + parsed_signal_name + "'.");
+
985 }
+
986 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
+
987 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
+
988 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
989 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
+
990 auto message_pair = make_shared_message_pair(data, this->get_clock());
+
991 std::shared_ptr<SubscriptionInterface> subscription_interface;
+
992 switch (message_pair->get_type()) {
+
993 case MessageType::BOOL: {
+
994 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Bool>>(message_pair);
+
995 auto subscription = NodeT::template create_subscription<std_msgs::msg::Bool>(
+
996 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
997 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
998 break;
+
999 }
+
1000 case MessageType::FLOAT64: {
+
1001 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Float64>>(message_pair);
+
1002 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64>(
1003 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
1004 subscription_interface = subscription_handler->create_subscription_interface(subscription);
1005 break;
1006 }
-
1007 case MessageType::INT32: {
-
1008 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Int32>>(message_pair);
-
1009 auto subscription = NodeT::template create_subscription<std_msgs::msg::Int32>(
-
1010 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
-
1011 subscription_interface = subscription_handler->create_subscription_interface(subscription);
-
1012 break;
-
1013 }
-
1014 case MessageType::STRING: {
-
1015 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::String>>(message_pair);
-
1016 auto subscription = NodeT::template create_subscription<std_msgs::msg::String>(
-
1017 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
-
1018 subscription_interface = subscription_handler->create_subscription_interface(subscription);
-
1019 break;
-
1020 }
-
1021 case MessageType::ENCODED_STATE: {
-
1022 auto subscription_handler = std::make_shared<SubscriptionHandler<modulo_core::EncodedState>>(message_pair);
-
1023 auto subscription = NodeT::template create_subscription<modulo_core::EncodedState>(
-
1024 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
-
1025 subscription_interface = subscription_handler->create_subscription_interface(subscription);
-
1026 break;
-
1027 }
-
1028 }
-
1029 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
-
1030 } catch (const std::exception& ex) {
-
1031 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
-
1032 }
-
1033}
-
1034
-
1035template<class NodeT>
-
1036template<typename MsgT>
- -
1038 const std::string& signal_name, const std::function<void(const std::shared_ptr<MsgT>)>& callback,
-
1039 const std::string& default_topic, bool fixed_topic
-
1040) {
-
1041 using namespace modulo_core::communication;
-
1042 try {
-
1043 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
-
1044 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
-
1045 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
-
1046 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
1047 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
-
1048 auto subscription = NodeT::template create_subscription<MsgT>(topic_name, this->qos_, callback);
-
1049 auto subscription_interface =
-
1050 std::make_shared<SubscriptionHandler<MsgT>>()->create_subscription_interface(subscription);
-
1051 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
-
1052 } catch (const std::exception& ex) {
-
1053 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
-
1054 }
-
1055}
-
1056
-
1057template<class NodeT>
-
1058inline std::string ComponentInterface<NodeT>::validate_service_name(const std::string& service_name) {
-
1059 std::string parsed_service_name = utilities::parse_topic_name(service_name);
-
1060 if (parsed_service_name.empty()) {
- -
1062 "The parsed service name for service '" + service_name
-
1063 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
-
1064 }
-
1065 if (this->empty_services_.find(parsed_service_name) != this->empty_services_.cend()
-
1066 || this->string_services_.find(parsed_service_name) != this->string_services_.cend()) {
-
1067 throw exceptions::AddServiceException("Service with name '" + parsed_service_name + "' already exists.");
-
1068 }
-
1069 return parsed_service_name;
-
1070}
-
1071
-
1072template<class NodeT>
- -
1074 const std::string& service_name, const std::function<ComponentServiceResponse(void)>& callback
-
1075) {
-
1076 try {
-
1077 std::string parsed_service_name = this->validate_service_name(service_name);
-
1078 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding empty service '" << parsed_service_name << "'.");
-
1079 auto service = NodeT::template create_service<modulo_component_interfaces::srv::EmptyTrigger>(
-
1080 "~/" + parsed_service_name, [callback](
-
1081 const std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Request>,
-
1082 std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Response> response
-
1083 ) {
-
1084 try {
-
1085 auto callback_response = callback();
-
1086 response->success = callback_response.success;
-
1087 response->message = callback_response.message;
-
1088 } catch (const std::exception& ex) {
-
1089 response->success = false;
-
1090 response->message = ex.what();
-
1091 }
-
1092 });
-
1093 this->empty_services_.insert_or_assign(parsed_service_name, service);
-
1094 } catch (const std::exception& ex) {
-
1095 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
-
1096 }
-
1097}
-
1098
-
1099template<class NodeT>
- -
1101 const std::string& service_name, const std::function<ComponentServiceResponse(const std::string& string)>& callback
-
1102) {
-
1103 try {
-
1104 std::string parsed_service_name = this->validate_service_name(service_name);
-
1105 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding string service '" << parsed_service_name << "'.");
-
1106 auto service = NodeT::template create_service<modulo_component_interfaces::srv::StringTrigger>(
-
1107 "~/" + parsed_service_name, [callback](
-
1108 const std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Request> request,
-
1109 std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Response> response
-
1110 ) {
-
1111 try {
-
1112 auto callback_response = callback(request->payload);
-
1113 response->success = callback_response.success;
-
1114 response->message = callback_response.message;
-
1115 } catch (const std::exception& ex) {
-
1116 response->success = false;
-
1117 response->message = ex.what();
-
1118 }
-
1119 });
-
1120 this->string_services_.insert_or_assign(parsed_service_name, service);
-
1121 } catch (const std::exception& ex) {
-
1122 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
-
1123 }
-
1124}
-
1125
-
1126template<class NodeT>
-
1127inline void
-
1128ComponentInterface<NodeT>::add_periodic_callback(const std::string& name, const std::function<void()>& callback) {
-
1129 if (name.empty()) {
-
1130 RCLCPP_ERROR(this->get_logger(), "Failed to add periodic function: Provide a non empty string as a name.");
-
1131 return;
-
1132 }
-
1133 if (this->periodic_callbacks_.find(name) != this->periodic_callbacks_.end()) {
-
1134 RCLCPP_WARN_STREAM(this->get_logger(), "Periodic function '" << name << "' already exists, overwriting.");
-
1135 } else {
-
1136 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding periodic function '" << name << "'.");
-
1137 }
-
1138 this->periodic_callbacks_.template insert_or_assign(name, callback);
-
1139}
-
1140
-
1141template<class NodeT>
- -
1143 if (this->tf_broadcaster_ == nullptr) {
-
1144 RCLCPP_DEBUG(this->get_logger(), "Adding TF broadcaster.");
-
1145 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
-
1146 this->tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(*this);
-
1147 } else {
-
1148 RCLCPP_DEBUG(this->get_logger(), "TF broadcaster already exists.");
-
1149 }
-
1150}
-
1151
-
1152template<class NodeT>
- -
1154 if (this->static_tf_broadcaster_ == nullptr) {
-
1155 RCLCPP_DEBUG(this->get_logger(), "Adding static TF broadcaster.");
-
1156 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
-
1157 tf2_ros::StaticBroadcasterQoS qos;
-
1158 rclcpp::PublisherOptionsWithAllocator<std::allocator<void>> options;
-
1159 this->static_tf_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(*this, qos, options);
-
1160 } else {
-
1161 RCLCPP_DEBUG(this->get_logger(), "Static TF broadcaster already exists.");
-
1162 }
-
1163}
-
1164
-
1165template<class NodeT>
- -
1167 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
-
1168 RCLCPP_DEBUG(this->get_logger(), "Adding TF buffer and listener.");
-
1169 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
-
1170 this->tf_buffer_ = std::make_shared<tf2_ros::Buffer>(this->get_clock());
-
1171 this->tf_listener_ = std::make_shared<tf2_ros::TransformListener>(*this->tf_buffer_);
-
1172 } else {
-
1173 RCLCPP_DEBUG(this->get_logger(), "TF buffer and listener already exist.");
-
1174 }
-
1175}
-
1176
-
1177template<class NodeT>
-
1178inline void ComponentInterface<NodeT>::send_transform(const state_representation::CartesianPose& transform) {
-
1179 this->send_transforms(std::vector<state_representation::CartesianPose>{transform});
-
1180}
-
1181
-
1182template<class NodeT>
-
1183inline void
-
1184ComponentInterface<NodeT>::send_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
-
1185 this->template publish_transforms(transforms, this->tf_broadcaster_);
-
1186}
-
1187
-
1188template<class NodeT>
-
1189inline void ComponentInterface<NodeT>::send_static_transform(const state_representation::CartesianPose& transform) {
-
1190 this->send_static_transforms(std::vector<state_representation::CartesianPose>{transform});
-
1191}
-
1192
-
1193template<class NodeT>
-
1194inline void
-
1195ComponentInterface<NodeT>::send_static_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
-
1196 this->template publish_transforms(transforms, this->static_tf_broadcaster_, true);
-
1197}
-
1198
-
1199template<class NodeT>
-
1200template<typename T>
- -
1202 const std::vector<state_representation::CartesianPose>& transforms, const std::shared_ptr<T>& tf_broadcaster,
-
1203 bool is_static
-
1204) {
-
1205 std::string modifier = is_static ? "static " : "";
-
1206 if (tf_broadcaster == nullptr) {
-
1207 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
1208 "Failed to send " << modifier << "transform: No " << modifier
-
1209 << "TF broadcaster configured.");
-
1210 return;
-
1211 }
-
1212 try {
-
1213 std::vector<geometry_msgs::msg::TransformStamped> transform_messages;
-
1214 transform_messages.reserve(transforms.size());
-
1215 for (const auto& tf : transforms) {
-
1216 geometry_msgs::msg::TransformStamped transform_message;
-
1217 modulo_core::translators::write_message(transform_message, tf, this->get_clock()->now());
-
1218 transform_messages.emplace_back(transform_message);
-
1219 }
-
1220 tf_broadcaster->sendTransform(transform_messages);
-
1221 } catch (const std::exception& ex) {
-
1222 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
1223 "Failed to send " << modifier << "transform: " << ex.what());
-
1224 }
-
1225}
-
1226
-
1227template<class NodeT>
-
1228inline geometry_msgs::msg::TransformStamped ComponentInterface<NodeT>::lookup_ros_transform(
-
1229 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
-
1230 const tf2::Duration& duration
-
1231) {
-
1232 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
-
1233 throw exceptions::LookupTransformException("Failed to lookup transform: To TF buffer / listener configured.");
-
1234 }
-
1235 try {
-
1236 return this->tf_buffer_->lookupTransform(reference_frame, frame, time_point, duration);;
-
1237 } catch (const tf2::TransformException& ex) {
-
1238 throw exceptions::LookupTransformException(std::string("Failed to lookup transform: ").append(ex.what()));
-
1239 }
-
1240}
-
1241
-
1242template<class NodeT>
-
1243inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
-
1244 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
-
1245 const tf2::Duration& duration
-
1246) {
-
1247 auto transform = this->lookup_ros_transform(frame, reference_frame, time_point, duration);
-
1248 state_representation::CartesianPose result(frame, reference_frame);
-
1249 modulo_core::translators::read_message(result, transform);
-
1250 return result;
-
1251}
-
1252
-
1253template<class NodeT>
-
1254inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
-
1255 const std::string& frame, const std::string& reference_frame, double validity_period, const tf2::Duration& duration
-
1256) {
-
1257 auto transform =
-
1258 this->lookup_ros_transform(frame, reference_frame, tf2::TimePoint(std::chrono::microseconds(0)), duration);
-
1259 if (validity_period > 0.0 && (this->get_clock()->now() - transform.header.stamp).seconds() > validity_period) {
-
1260 throw exceptions::LookupTransformException("Failed to lookup transform: Latest transform is too old!");
-
1261 }
-
1262 state_representation::CartesianPose result(frame, reference_frame);
-
1263 modulo_core::translators::read_message(result, transform);
-
1264 return result;
-
1265}
-
1266
-
1267template<class NodeT>
-
1268inline void ComponentInterface<NodeT>::publish_predicate(const std::string& name) {
-
1269 modulo_component_interfaces::msg::Predicate message;
-
1270 message.component = this->get_node_base_interface()->get_fully_qualified_name();
-
1271 message.predicate = name;
-
1272 message.value = this->get_predicate(name);
-
1273 this->predicate_publisher_->publish(message);
-
1274}
-
1275
-
1276template<class NodeT>
- -
1278 for (const auto& predicate : this->predicates_) {
-
1279 this->publish_predicate(predicate.first);
-
1280 }
-
1281}
-
1282
-
1283template<class NodeT>
-
1284inline void ComponentInterface<NodeT>::publish_output(const std::string& signal_name) {
-
1285 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
-
1286 if (this->outputs_.find(parsed_signal_name) == this->outputs_.cend()) {
-
1287 throw exceptions::ComponentException("Output with name '" + signal_name + "' doesn't exist.");
+
1007 case MessageType::FLOAT64_MULTI_ARRAY: {
+
1008 auto subscription_handler =
+
1009 std::make_shared<SubscriptionHandler<std_msgs::msg::Float64MultiArray>>(message_pair);
+
1010 auto subscription = NodeT::template create_subscription<std_msgs::msg::Float64MultiArray>(
+
1011 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1012 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1013 break;
+
1014 }
+
1015 case MessageType::INT32: {
+
1016 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::Int32>>(message_pair);
+
1017 auto subscription = NodeT::template create_subscription<std_msgs::msg::Int32>(
+
1018 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1019 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1020 break;
+
1021 }
+
1022 case MessageType::STRING: {
+
1023 auto subscription_handler = std::make_shared<SubscriptionHandler<std_msgs::msg::String>>(message_pair);
+
1024 auto subscription = NodeT::template create_subscription<std_msgs::msg::String>(
+
1025 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1026 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1027 break;
+
1028 }
+
1029 case MessageType::ENCODED_STATE: {
+
1030 auto subscription_handler = std::make_shared<SubscriptionHandler<modulo_core::EncodedState>>(message_pair);
+
1031 auto subscription = NodeT::template create_subscription<modulo_core::EncodedState>(
+
1032 topic_name, this->qos_, subscription_handler->get_callback(user_callback));
+
1033 subscription_interface = subscription_handler->create_subscription_interface(subscription);
+
1034 break;
+
1035 }
+
1036 }
+
1037 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
+
1038 } catch (const std::exception& ex) {
+
1039 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
+
1040 }
+
1041}
+
1042
+
1043template<class NodeT>
+
1044template<typename MsgT>
+ +
1046 const std::string& signal_name, const std::function<void(const std::shared_ptr<MsgT>)>& callback,
+
1047 const std::string& default_topic, bool fixed_topic
+
1048) {
+
1049 using namespace modulo_core::communication;
+
1050 try {
+
1051 std::string parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1052 this->declare_input(parsed_signal_name, default_topic, fixed_topic);
+
1053 auto topic_name = this->get_parameter_value<std::string>(parsed_signal_name + "_topic");
+
1054 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
1055 "Adding input '" << parsed_signal_name << "' with topic name '" << topic_name << "'.");
+
1056 auto subscription = NodeT::template create_subscription<MsgT>(topic_name, this->qos_, callback);
+
1057 auto subscription_interface =
+
1058 std::make_shared<SubscriptionHandler<MsgT>>()->create_subscription_interface(subscription);
+
1059 this->inputs_.insert_or_assign(parsed_signal_name, subscription_interface);
+
1060 } catch (const std::exception& ex) {
+
1061 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add input '" << signal_name << "': " << ex.what());
+
1062 }
+
1063}
+
1064
+
1065template<class NodeT>
+
1066inline std::string ComponentInterface<NodeT>::validate_service_name(const std::string& service_name) {
+
1067 std::string parsed_service_name = utilities::parse_topic_name(service_name);
+
1068 if (parsed_service_name.empty()) {
+ +
1070 "The parsed service name for service '" + service_name
+
1071 + "' is empty. Provide a string with valid characters for the signal name ([a-zA-Z0-9_]).");
+
1072 }
+
1073 if (this->empty_services_.find(parsed_service_name) != this->empty_services_.cend()
+
1074 || this->string_services_.find(parsed_service_name) != this->string_services_.cend()) {
+
1075 throw exceptions::AddServiceException("Service with name '" + parsed_service_name + "' already exists.");
+
1076 }
+
1077 return parsed_service_name;
+
1078}
+
1079
+
1080template<class NodeT>
+ +
1082 const std::string& service_name, const std::function<ComponentServiceResponse(void)>& callback
+
1083) {
+
1084 try {
+
1085 std::string parsed_service_name = this->validate_service_name(service_name);
+
1086 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding empty service '" << parsed_service_name << "'.");
+
1087 auto service = NodeT::template create_service<modulo_component_interfaces::srv::EmptyTrigger>(
+
1088 "~/" + parsed_service_name, [callback](
+
1089 const std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Request>,
+
1090 std::shared_ptr<modulo_component_interfaces::srv::EmptyTrigger::Response> response
+
1091 ) {
+
1092 try {
+
1093 auto callback_response = callback();
+
1094 response->success = callback_response.success;
+
1095 response->message = callback_response.message;
+
1096 } catch (const std::exception& ex) {
+
1097 response->success = false;
+
1098 response->message = ex.what();
+
1099 }
+
1100 });
+
1101 this->empty_services_.insert_or_assign(parsed_service_name, service);
+
1102 } catch (const std::exception& ex) {
+
1103 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
+
1104 }
+
1105}
+
1106
+
1107template<class NodeT>
+ +
1109 const std::string& service_name, const std::function<ComponentServiceResponse(const std::string& string)>& callback
+
1110) {
+
1111 try {
+
1112 std::string parsed_service_name = this->validate_service_name(service_name);
+
1113 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding string service '" << parsed_service_name << "'.");
+
1114 auto service = NodeT::template create_service<modulo_component_interfaces::srv::StringTrigger>(
+
1115 "~/" + parsed_service_name, [callback](
+
1116 const std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Request> request,
+
1117 std::shared_ptr<modulo_component_interfaces::srv::StringTrigger::Response> response
+
1118 ) {
+
1119 try {
+
1120 auto callback_response = callback(request->payload);
+
1121 response->success = callback_response.success;
+
1122 response->message = callback_response.message;
+
1123 } catch (const std::exception& ex) {
+
1124 response->success = false;
+
1125 response->message = ex.what();
+
1126 }
+
1127 });
+
1128 this->string_services_.insert_or_assign(parsed_service_name, service);
+
1129 } catch (const std::exception& ex) {
+
1130 RCLCPP_ERROR_STREAM(this->get_logger(), "Failed to add service '" << service_name << "': " << ex.what());
+
1131 }
+
1132}
+
1133
+
1134template<class NodeT>
+
1135inline void
+
1136ComponentInterface<NodeT>::add_periodic_callback(const std::string& name, const std::function<void()>& callback) {
+
1137 if (name.empty()) {
+
1138 RCLCPP_ERROR(this->get_logger(), "Failed to add periodic function: Provide a non empty string as a name.");
+
1139 return;
+
1140 }
+
1141 if (this->periodic_callbacks_.find(name) != this->periodic_callbacks_.end()) {
+
1142 RCLCPP_WARN_STREAM(this->get_logger(), "Periodic function '" << name << "' already exists, overwriting.");
+
1143 } else {
+
1144 RCLCPP_DEBUG_STREAM(this->get_logger(), "Adding periodic function '" << name << "'.");
+
1145 }
+
1146 this->periodic_callbacks_.template insert_or_assign(name, callback);
+
1147}
+
1148
+
1149template<class NodeT>
+ +
1151 if (this->tf_broadcaster_ == nullptr) {
+
1152 RCLCPP_DEBUG(this->get_logger(), "Adding TF broadcaster.");
+
1153 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1154 this->tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(*this);
+
1155 } else {
+
1156 RCLCPP_DEBUG(this->get_logger(), "TF broadcaster already exists.");
+
1157 }
+
1158}
+
1159
+
1160template<class NodeT>
+ +
1162 if (this->static_tf_broadcaster_ == nullptr) {
+
1163 RCLCPP_DEBUG(this->get_logger(), "Adding static TF broadcaster.");
+
1164 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1165 tf2_ros::StaticBroadcasterQoS qos;
+
1166 rclcpp::PublisherOptionsWithAllocator<std::allocator<void>> options;
+
1167 this->static_tf_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(*this, qos, options);
+
1168 } else {
+
1169 RCLCPP_DEBUG(this->get_logger(), "Static TF broadcaster already exists.");
+
1170 }
+
1171}
+
1172
+
1173template<class NodeT>
+ +
1175 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
+
1176 RCLCPP_DEBUG(this->get_logger(), "Adding TF buffer and listener.");
+
1177 console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_NONE);
+
1178 this->tf_buffer_ = std::make_shared<tf2_ros::Buffer>(this->get_clock());
+
1179 this->tf_listener_ = std::make_shared<tf2_ros::TransformListener>(*this->tf_buffer_);
+
1180 } else {
+
1181 RCLCPP_DEBUG(this->get_logger(), "TF buffer and listener already exist.");
+
1182 }
+
1183}
+
1184
+
1185template<class NodeT>
+
1186inline void ComponentInterface<NodeT>::send_transform(const state_representation::CartesianPose& transform) {
+
1187 this->send_transforms(std::vector<state_representation::CartesianPose>{transform});
+
1188}
+
1189
+
1190template<class NodeT>
+
1191inline void
+
1192ComponentInterface<NodeT>::send_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
+
1193 this->template publish_transforms(transforms, this->tf_broadcaster_);
+
1194}
+
1195
+
1196template<class NodeT>
+
1197inline void ComponentInterface<NodeT>::send_static_transform(const state_representation::CartesianPose& transform) {
+
1198 this->send_static_transforms(std::vector<state_representation::CartesianPose>{transform});
+
1199}
+
1200
+
1201template<class NodeT>
+
1202inline void
+
1203ComponentInterface<NodeT>::send_static_transforms(const std::vector<state_representation::CartesianPose>& transforms) {
+
1204 this->template publish_transforms(transforms, this->static_tf_broadcaster_, true);
+
1205}
+
1206
+
1207template<class NodeT>
+
1208template<typename T>
+ +
1210 const std::vector<state_representation::CartesianPose>& transforms, const std::shared_ptr<T>& tf_broadcaster,
+
1211 bool is_static
+
1212) {
+
1213 std::string modifier = is_static ? "static " : "";
+
1214 if (tf_broadcaster == nullptr) {
+
1215 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1216 "Failed to send " << modifier << "transform: No " << modifier
+
1217 << "TF broadcaster configured.");
+
1218 return;
+
1219 }
+
1220 try {
+
1221 std::vector<geometry_msgs::msg::TransformStamped> transform_messages;
+
1222 transform_messages.reserve(transforms.size());
+
1223 for (const auto& tf : transforms) {
+
1224 geometry_msgs::msg::TransformStamped transform_message;
+
1225 modulo_core::translators::write_message(transform_message, tf, this->get_clock()->now());
+
1226 transform_messages.emplace_back(transform_message);
+
1227 }
+
1228 tf_broadcaster->sendTransform(transform_messages);
+
1229 } catch (const std::exception& ex) {
+
1230 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1231 "Failed to send " << modifier << "transform: " << ex.what());
+
1232 }
+
1233}
+
1234
+
1235template<class NodeT>
+
1236inline geometry_msgs::msg::TransformStamped ComponentInterface<NodeT>::lookup_ros_transform(
+
1237 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
1238 const tf2::Duration& duration
+
1239) {
+
1240 if (this->tf_buffer_ == nullptr || this->tf_listener_ == nullptr) {
+
1241 throw exceptions::LookupTransformException("Failed to lookup transform: To TF buffer / listener configured.");
+
1242 }
+
1243 try {
+
1244 return this->tf_buffer_->lookupTransform(reference_frame, frame, time_point, duration);;
+
1245 } catch (const tf2::TransformException& ex) {
+
1246 throw exceptions::LookupTransformException(std::string("Failed to lookup transform: ").append(ex.what()));
+
1247 }
+
1248}
+
1249
+
1250template<class NodeT>
+
1251inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
+
1252 const std::string& frame, const std::string& reference_frame, const tf2::TimePoint& time_point,
+
1253 const tf2::Duration& duration
+
1254) {
+
1255 auto transform = this->lookup_ros_transform(frame, reference_frame, time_point, duration);
+
1256 state_representation::CartesianPose result(frame, reference_frame);
+
1257 modulo_core::translators::read_message(result, transform);
+
1258 return result;
+
1259}
+
1260
+
1261template<class NodeT>
+
1262inline state_representation::CartesianPose ComponentInterface<NodeT>::lookup_transform(
+
1263 const std::string& frame, const std::string& reference_frame, double validity_period, const tf2::Duration& duration
+
1264) {
+
1265 auto transform =
+
1266 this->lookup_ros_transform(frame, reference_frame, tf2::TimePoint(std::chrono::microseconds(0)), duration);
+
1267 if (validity_period > 0.0 && (this->get_clock()->now() - transform.header.stamp).seconds() > validity_period) {
+
1268 throw exceptions::LookupTransformException("Failed to lookup transform: Latest transform is too old!");
+
1269 }
+
1270 state_representation::CartesianPose result(frame, reference_frame);
+
1271 modulo_core::translators::read_message(result, transform);
+
1272 return result;
+
1273}
+
1274
+
1275template<class NodeT>
+
1276inline void ComponentInterface<NodeT>::publish_predicate(const std::string& name) {
+
1277 modulo_component_interfaces::msg::Predicate message;
+
1278 message.component = this->get_node_base_interface()->get_fully_qualified_name();
+
1279 message.predicate = name;
+
1280 message.value = this->get_predicate(name);
+
1281 this->predicate_publisher_->publish(message);
+
1282}
+
1283
+
1284template<class NodeT>
+ +
1286 for (const auto& predicate : this->predicates_) {
+
1287 this->publish_predicate(predicate.first);
1288 }
-
1289 if (this->periodic_outputs_.at(parsed_signal_name)) {
-
1290 throw exceptions::ComponentException("An output that is published periodically cannot be triggered manually.");
-
1291 }
-
1292 try {
-
1293 this->outputs_.at(parsed_signal_name)->publish();
-
1294 } catch (const modulo_core::exceptions::CoreException& ex) {
-
1295 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
1296 "Failed to publish output '" << parsed_signal_name << "': " << ex.what());
-
1297 }
-
1298}
-
1299
-
1300template<class NodeT>
- -
1302 for (const auto& [signal, publisher] : this->outputs_) {
-
1303 try {
-
1304 if (this->periodic_outputs_.at(signal)) {
-
1305 publisher->publish();
-
1306 }
-
1307 } catch (const modulo_core::exceptions::CoreException& ex) {
-
1308 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
1309 "Failed to publish output '" << signal << "': " << ex.what());
-
1310 }
-
1311 }
-
1312}
-
1313
-
1314template<class NodeT>
- -
1316 for (const auto& [name, callback] : this->periodic_callbacks_) {
-
1317 try {
-
1318 callback();
-
1319 } catch (const std::exception& ex) {
-
1320 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
-
1321 "Failed to evaluate periodic function callback '" << name << "': " << ex.what());
-
1322 }
-
1323 }
-
1324}
-
1325
-
1326template<class NodeT>
-
1327template<typename DataT>
- -
1329 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
-
1330 bool fixed_topic, bool publish_on_step
-
1331) {
-
1332 using namespace modulo_core::communication;
-
1333 try {
-
1334 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
-
1335 if (data == nullptr) {
- -
1337 "Invalid data pointer for output '" + parsed_signal_name + "'.");
-
1338 }
-
1339 this->declare_output(parsed_signal_name, default_topic, fixed_topic);
-
1340 RCLCPP_DEBUG_STREAM(this->get_logger(),
-
1341 "Creating output '" << parsed_signal_name << "' (provided signal name was '" << signal_name
-
1342 << "').");
-
1343 auto message_pair = make_shared_message_pair(data, this->get_clock());
-
1344 this->outputs_.insert_or_assign(
-
1345 parsed_signal_name, std::make_shared<PublisherInterface>(this->publisher_type_, message_pair));
-
1346 this->periodic_outputs_.insert_or_assign(parsed_signal_name, publish_on_step);
-
1347 return parsed_signal_name;
-
1348 } catch (const exceptions::AddSignalException&) {
-
1349 throw;
-
1350 } catch (const std::exception& ex) {
-
1351 throw exceptions::AddSignalException(ex.what());
-
1352 }
-
1353}
-
1354
-
1355template<class NodeT>
- -
1357 RCLCPP_DEBUG(this->get_logger(), "raise_error called: Setting predicate 'in_error_state' to true.");
-
1358 this->set_predicate("in_error_state", true);
-
1359}
-
1360
-
1361template<class NodeT>
-
1362inline rclcpp::QoS ComponentInterface<NodeT>::get_qos() const {
-
1363 return this->qos_;
-
1364}
-
1365
-
1366template<class NodeT>
-
1367inline void ComponentInterface<NodeT>::set_qos(const rclcpp::QoS& qos) {
-
1368 this->qos_ = qos;
-
1369}
-
1370}// namespace modulo_components
+
1289}
+
1290
+
1291template<class NodeT>
+
1292inline void ComponentInterface<NodeT>::publish_output(const std::string& signal_name) {
+
1293 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1294 if (this->outputs_.find(parsed_signal_name) == this->outputs_.cend()) {
+
1295 throw exceptions::ComponentException("Output with name '" + signal_name + "' doesn't exist.");
+
1296 }
+
1297 if (this->periodic_outputs_.at(parsed_signal_name)) {
+
1298 throw exceptions::ComponentException("An output that is published periodically cannot be triggered manually.");
+
1299 }
+
1300 try {
+
1301 this->outputs_.at(parsed_signal_name)->publish();
+
1302 } catch (const modulo_core::exceptions::CoreException& ex) {
+
1303 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1304 "Failed to publish output '" << parsed_signal_name << "': " << ex.what());
+
1305 }
+
1306}
+
1307
+
1308template<class NodeT>
+ +
1310 for (const auto& [signal, publisher] : this->outputs_) {
+
1311 try {
+
1312 if (this->periodic_outputs_.at(signal)) {
+
1313 publisher->publish();
+
1314 }
+
1315 } catch (const modulo_core::exceptions::CoreException& ex) {
+
1316 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1317 "Failed to publish output '" << signal << "': " << ex.what());
+
1318 }
+
1319 }
+
1320}
+
1321
+
1322template<class NodeT>
+ +
1324 for (const auto& [name, callback] : this->periodic_callbacks_) {
+
1325 try {
+
1326 callback();
+
1327 } catch (const std::exception& ex) {
+
1328 RCLCPP_ERROR_STREAM_THROTTLE(this->get_logger(), *this->get_clock(), 1000,
+
1329 "Failed to evaluate periodic function callback '" << name << "': " << ex.what());
+
1330 }
+
1331 }
+
1332}
+
1333
+
1334template<class NodeT>
+
1335template<typename DataT>
+ +
1337 const std::string& signal_name, const std::shared_ptr<DataT>& data, const std::string& default_topic,
+
1338 bool fixed_topic, bool publish_on_step
+
1339) {
+
1340 using namespace modulo_core::communication;
+
1341 try {
+
1342 auto parsed_signal_name = utilities::parse_topic_name(signal_name);
+
1343 if (data == nullptr) {
+ +
1345 "Invalid data pointer for output '" + parsed_signal_name + "'.");
+
1346 }
+
1347 this->declare_output(parsed_signal_name, default_topic, fixed_topic);
+
1348 RCLCPP_DEBUG_STREAM(this->get_logger(),
+
1349 "Creating output '" << parsed_signal_name << "' (provided signal name was '" << signal_name
+
1350 << "').");
+
1351 auto message_pair = make_shared_message_pair(data, this->get_clock());
+
1352 this->outputs_.insert_or_assign(
+
1353 parsed_signal_name, std::make_shared<PublisherInterface>(this->publisher_type_, message_pair));
+
1354 this->periodic_outputs_.insert_or_assign(parsed_signal_name, publish_on_step);
+
1355 return parsed_signal_name;
+
1356 } catch (const exceptions::AddSignalException&) {
+
1357 throw;
+
1358 } catch (const std::exception& ex) {
+
1359 throw exceptions::AddSignalException(ex.what());
+
1360 }
+
1361}
+
1362
+
1363template<class NodeT>
+ +
1365 RCLCPP_DEBUG(this->get_logger(), "raise_error called: Setting predicate 'in_error_state' to true.");
+
1366 this->set_predicate("in_error_state", true);
+
1367}
+
1368
+
1369template<class NodeT>
+
1370inline rclcpp::QoS ComponentInterface<NodeT>::get_qos() const {
+
1371 return this->qos_;
+
1372}
+
1373
+
1374template<class NodeT>
+
1375inline void ComponentInterface<NodeT>::set_qos(const rclcpp::QoS& qos) {
+
1376 this->qos_ = qos;
+
1377}
+
1378}// 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.
-
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
-
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.
+
void add_parameter(const std::shared_ptr< state_representation::ParameterInterface > &parameter, const std::string &description, bool read_only=false)
Add a parameter.
+
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
+
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.
+
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.
+
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.
+
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.
+
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.
diff --git a/versions/main/_component_parameter_exception_8hpp_source.html b/versions/main/_component_parameter_exception_8hpp_source.html index c3fadcc38..537f68ac0 100644 --- a/versions/main/_component_parameter_exception_8hpp_source.html +++ b/versions/main/_component_parameter_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_core_exception_8hpp_source.html b/versions/main/_core_exception_8hpp_source.html index 82ea368f5..042ace923 100644 --- a/versions/main/_core_exception_8hpp_source.html +++ b/versions/main/_core_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_encoded_state_8hpp_source.html b/versions/main/_encoded_state_8hpp_source.html index 44b7edbcb..6aab9d295 100644 --- a/versions/main/_encoded_state_8hpp_source.html +++ b/versions/main/_encoded_state_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_invalid_pointer_cast_exception_8hpp_source.html b/versions/main/_invalid_pointer_cast_exception_8hpp_source.html index 77e5941f1..2a795ad95 100644 --- a/versions/main/_invalid_pointer_cast_exception_8hpp_source.html +++ b/versions/main/_invalid_pointer_cast_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_invalid_pointer_exception_8hpp_source.html b/versions/main/_invalid_pointer_exception_8hpp_source.html index b819cf91a..1ae37b393 100644 --- a/versions/main/_invalid_pointer_exception_8hpp_source.html +++ b/versions/main/_invalid_pointer_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_lifecycle_component_8cpp_source.html b/versions/main/_lifecycle_component_8cpp_source.html index bf43fca3a..9cb947399 100644 --- a/versions/main/_lifecycle_component_8cpp_source.html +++ b/versions/main/_lifecycle_component_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -402,14 +402,14 @@
324}
325}// namespace modulo_components
Base interface class for modulo components to wrap a ROS Node with custom behaviour.
-
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
-
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.
+
virtual void on_step_callback()
Steps to execute periodically. To be redefined by derived Component classes.
+
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.
+
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.
diff --git a/versions/main/_lifecycle_component_8hpp_source.html b/versions/main/_lifecycle_component_8hpp_source.html index 2784924ea..1e5b79848 100644 --- a/versions/main/_lifecycle_component_8hpp_source.html +++ b/versions/main/_lifecycle_component_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -189,11 +189,11 @@
289// call callback function that this service calls
290}// 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.
- +
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.
+
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...
diff --git a/versions/main/_lookup_transform_exception_8hpp_source.html b/versions/main/_lookup_transform_exception_8hpp_source.html index df63ba56d..25f88b1f4 100644 --- a/versions/main/_lookup_transform_exception_8hpp_source.html +++ b/versions/main/_lookup_transform_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_pair_8cpp_source.html b/versions/main/_message_pair_8cpp_source.html index c4c9f1176..ea7f86e26 100644 --- a/versions/main/_message_pair_8cpp_source.html +++ b/versions/main/_message_pair_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_pair_8hpp_source.html b/versions/main/_message_pair_8hpp_source.html index 454db6aed..6f44435a8 100644 --- a/versions/main/_message_pair_8hpp_source.html +++ b/versions/main/_message_pair_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_pair_interface_8cpp_source.html b/versions/main/_message_pair_interface_8cpp_source.html index d6950ed1a..009a206ef 100644 --- a/versions/main/_message_pair_interface_8cpp_source.html +++ b/versions/main/_message_pair_interface_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_pair_interface_8hpp_source.html b/versions/main/_message_pair_interface_8hpp_source.html index ceb9a288f..41604d737 100644 --- a/versions/main/_message_pair_interface_8hpp_source.html +++ b/versions/main/_message_pair_interface_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_translation_exception_8hpp_source.html b/versions/main/_message_translation_exception_8hpp_source.html index ae1535bcf..1198002b3 100644 --- a/versions/main/_message_translation_exception_8hpp_source.html +++ b/versions/main/_message_translation_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_message_type_8hpp_source.html b/versions/main/_message_type_8hpp_source.html index 51241abf3..e319e8879 100644 --- a/versions/main/_message_type_8hpp_source.html +++ b/versions/main/_message_type_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_null_pointer_exception_8hpp_source.html b/versions/main/_null_pointer_exception_8hpp_source.html index 1c27357ae..e5adfb93e 100644 --- a/versions/main/_null_pointer_exception_8hpp_source.html +++ b/versions/main/_null_pointer_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_parameter_translation_exception_8hpp_source.html b/versions/main/_parameter_translation_exception_8hpp_source.html index 81a982e41..cbca3db53 100644 --- a/versions/main/_parameter_translation_exception_8hpp_source.html +++ b/versions/main/_parameter_translation_exception_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_predicates_listener_8cpp_source.html b/versions/main/_predicates_listener_8cpp_source.html index 290952254..f40fba7ef 100644 --- a/versions/main/_predicates_listener_8cpp_source.html +++ b/versions/main/_predicates_listener_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_predicates_listener_8hpp_source.html b/versions/main/_predicates_listener_8hpp_source.html index 59b1856ad..cbe3f0107 100644 --- a/versions/main/_predicates_listener_8hpp_source.html +++ b/versions/main/_predicates_listener_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_publisher_handler_8hpp_source.html b/versions/main/_publisher_handler_8hpp_source.html index c5b4f4935..a8905ef51 100644 --- a/versions/main/_publisher_handler_8hpp_source.html +++ b/versions/main/_publisher_handler_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_publisher_interface_8cpp_source.html b/versions/main/_publisher_interface_8cpp_source.html index 7a2d37c49..ce599afe1 100644 --- a/versions/main/_publisher_interface_8cpp_source.html +++ b/versions/main/_publisher_interface_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_publisher_interface_8hpp_source.html b/versions/main/_publisher_interface_8hpp_source.html index bbda77454..1b69ee393 100644 --- a/versions/main/_publisher_interface_8hpp_source.html +++ b/versions/main/_publisher_interface_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_publisher_type_8hpp_source.html b/versions/main/_publisher_type_8hpp_source.html index 74e49e5a8..307eae573 100644 --- a/versions/main/_publisher_type_8hpp_source.html +++ b/versions/main/_publisher_type_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_service_client_8hpp_source.html b/versions/main/_service_client_8hpp_source.html index 883584f90..32090fda4 100644 --- a/versions/main/_service_client_8hpp_source.html +++ b/versions/main/_service_client_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_subscription_handler_8cpp_source.html b/versions/main/_subscription_handler_8cpp_source.html index bcea49b3d..173ed6183 100644 --- a/versions/main/_subscription_handler_8cpp_source.html +++ b/versions/main/_subscription_handler_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_subscription_handler_8hpp_source.html b/versions/main/_subscription_handler_8hpp_source.html index 0ea085a21..a62480a42 100644 --- a/versions/main/_subscription_handler_8hpp_source.html +++ b/versions/main/_subscription_handler_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_subscription_interface_8cpp_source.html b/versions/main/_subscription_interface_8cpp_source.html index 5dc95676e..8c4532184 100644 --- a/versions/main/_subscription_interface_8cpp_source.html +++ b/versions/main/_subscription_interface_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/_subscription_interface_8hpp_source.html b/versions/main/_subscription_interface_8hpp_source.html index 2808ff334..735b176d7 100644 --- a/versions/main/_subscription_interface_8hpp_source.html +++ b/versions/main/_subscription_interface_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/annotated.html b/versions/main/annotated.html index cd9358ecb..80fc3d7e8 100644 --- a/versions/main/annotated.html +++ b/versions/main/annotated.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classes.html b/versions/main/classes.html index d17ec5b13..40ebe6b15 100644 --- a/versions/main/classes.html +++ b/versions/main/classes.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_component-members.html b/versions/main/classmodulo__components_1_1_component-members.html index a86235647..358092f65 100644 --- a/versions/main/classmodulo__components_1_1_component-members.html +++ b/versions/main/classmodulo__components_1_1_component-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_component.html b/versions/main/classmodulo__components_1_1_component.html index f81399bac..39dd381c6 100644 --- a/versions/main/classmodulo__components_1_1_component.html +++ b/versions/main/classmodulo__components_1_1_component.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_component_interface-members.html b/versions/main/classmodulo__components_1_1_component_interface-members.html index 745799e8e..4729b951a 100644 --- a/versions/main/classmodulo__components_1_1_component_interface-members.html +++ b/versions/main/classmodulo__components_1_1_component_interface-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_component_interface.html b/versions/main/classmodulo__components_1_1_component_interface.html index 74e7334df..bc8a2dcf0 100644 --- a/versions/main/classmodulo__components_1_1_component_interface.html +++ b/versions/main/classmodulo__components_1_1_component_interface.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -406,7 +406,7 @@

Definition at line 1037 of file ComponentInterface.hpp.

+

Definition at line 1045 of file ComponentInterface.hpp.

@@ -484,7 +484,7 @@

Definition at line 967 of file ComponentInterface.hpp.

+

Definition at line 975 of file ComponentInterface.hpp.

@@ -555,7 +555,7 @@

Definition at line 958 of file ComponentInterface.hpp.

+

Definition at line 966 of file ComponentInterface.hpp.

@@ -611,7 +611,7 @@

Definition at line 644 of file ComponentInterface.hpp.

+

Definition at line 645 of file ComponentInterface.hpp.

@@ -682,7 +682,7 @@

Definition at line 622 of file ComponentInterface.hpp.

+

Definition at line 623 of file ComponentInterface.hpp.

@@ -731,7 +731,7 @@

Definition at line 1128 of file ComponentInterface.hpp.

+

Definition at line 1136 of file ComponentInterface.hpp.

@@ -780,7 +780,7 @@

Definition at line 764 of file ComponentInterface.hpp.

+

Definition at line 772 of file ComponentInterface.hpp.

@@ -829,7 +829,7 @@

Definition at line 769 of file ComponentInterface.hpp.

+

Definition at line 777 of file ComponentInterface.hpp.

@@ -878,7 +878,7 @@

Definition at line 1100 of file ComponentInterface.hpp.

+

Definition at line 1108 of file ComponentInterface.hpp.

@@ -927,7 +927,7 @@

Definition at line 1073 of file ComponentInterface.hpp.

+

Definition at line 1081 of file ComponentInterface.hpp.

@@ -955,7 +955,7 @@

Definition at line 1153 of file ComponentInterface.hpp.

+

Definition at line 1161 of file ComponentInterface.hpp.

@@ -983,7 +983,7 @@

Definition at line 1142 of file ComponentInterface.hpp.

+

Definition at line 1150 of file ComponentInterface.hpp.

@@ -1011,7 +1011,7 @@

Definition at line 1166 of file ComponentInterface.hpp.

+

Definition at line 1174 of file ComponentInterface.hpp.

@@ -1049,7 +1049,7 @@

Definition at line 820 of file ComponentInterface.hpp.

+

Definition at line 828 of file ComponentInterface.hpp.

@@ -1134,7 +1134,7 @@

Returns
The parsed signal name
-

Definition at line 1328 of file ComponentInterface.hpp.

+

Definition at line 1336 of file ComponentInterface.hpp.

@@ -1196,7 +1196,7 @@

Definition at line 943 of file ComponentInterface.hpp.

+

Definition at line 951 of file ComponentInterface.hpp.

@@ -1258,7 +1258,7 @@

Definition at line 950 of file ComponentInterface.hpp.

+

Definition at line 958 of file ComponentInterface.hpp.

@@ -1286,7 +1286,7 @@

Definition at line 1315 of file ComponentInterface.hpp.

+

Definition at line 1323 of file ComponentInterface.hpp.

@@ -1331,7 +1331,7 @@

Returns
The ParameterInterface pointer to a Parameter instance
-

Definition at line 687 of file ComponentInterface.hpp.

+

Definition at line 688 of file ComponentInterface.hpp.

@@ -1384,7 +1384,7 @@

Returns
The value of the parameter
-

Definition at line 634 of file ComponentInterface.hpp.

+

Definition at line 635 of file ComponentInterface.hpp.

@@ -1423,7 +1423,7 @@

Returns
the value of the predicate as a boolean
-

Definition at line 792 of file ComponentInterface.hpp.

+

Definition at line 800 of file ComponentInterface.hpp.

@@ -1452,7 +1452,7 @@

Returns
The Quality of Service attribute
-

Definition at line 1362 of file ComponentInterface.hpp.

+

Definition at line 1370 of file ComponentInterface.hpp.

@@ -1522,7 +1522,7 @@

Returns
If it exists, the requested transform
-

Definition at line 1243 of file ComponentInterface.hpp.

+

Definition at line 1251 of file ComponentInterface.hpp.

@@ -1592,7 +1592,7 @@

Returns
If it exists and is still valid, the requested transform
-

Definition at line 1254 of file ComponentInterface.hpp.

+

Definition at line 1262 of file ComponentInterface.hpp.

@@ -1620,7 +1620,7 @@

Component classes.

-

Definition at line 618 of file ComponentInterface.hpp.

+

Definition at line 619 of file ComponentInterface.hpp.

@@ -1659,7 +1659,7 @@

Returns
The validation result
-

Definition at line 726 of file ComponentInterface.hpp.

+

Definition at line 734 of file ComponentInterface.hpp.

@@ -1703,7 +1703,7 @@

Definition at line 1284 of file ComponentInterface.hpp.

+

Definition at line 1292 of file ComponentInterface.hpp.

@@ -1731,7 +1731,7 @@

Definition at line 1301 of file ComponentInterface.hpp.

+

Definition at line 1309 of file ComponentInterface.hpp.

@@ -1769,7 +1769,7 @@

Definition at line 1268 of file ComponentInterface.hpp.

+

Definition at line 1276 of file ComponentInterface.hpp.

@@ -1797,7 +1797,7 @@

Definition at line 1277 of file ComponentInterface.hpp.

+

Definition at line 1285 of file ComponentInterface.hpp.

@@ -1861,7 +1861,7 @@

Definition at line 1201 of file ComponentInterface.hpp.

+

Definition at line 1209 of file ComponentInterface.hpp.

@@ -1889,7 +1889,7 @@

Definition at line 1356 of file ComponentInterface.hpp.

+

Definition at line 1364 of file ComponentInterface.hpp.

@@ -1927,7 +1927,7 @@

Definition at line 892 of file ComponentInterface.hpp.

+

Definition at line 900 of file ComponentInterface.hpp.

@@ -1965,7 +1965,7 @@

Definition at line 903 of file ComponentInterface.hpp.

+

Definition at line 911 of file ComponentInterface.hpp.

@@ -2003,7 +2003,7 @@

Definition at line 1189 of file ComponentInterface.hpp.

+

Definition at line 1197 of file ComponentInterface.hpp.

@@ -2041,7 +2041,7 @@

Definition at line 1195 of file ComponentInterface.hpp.

+

Definition at line 1203 of file ComponentInterface.hpp.

@@ -2079,7 +2079,7 @@

Definition at line 1178 of file ComponentInterface.hpp.

+

Definition at line 1186 of file ComponentInterface.hpp.

@@ -2117,7 +2117,7 @@

Definition at line 1184 of file ComponentInterface.hpp.

+

Definition at line 1192 of file ComponentInterface.hpp.

@@ -2174,7 +2174,7 @@

Returns
The value of the parameter
-

Definition at line 697 of file ComponentInterface.hpp.

+

Definition at line 698 of file ComponentInterface.hpp.

@@ -2223,7 +2223,7 @@

Definition at line 866 of file ComponentInterface.hpp.

+

Definition at line 874 of file ComponentInterface.hpp.

@@ -2272,7 +2272,7 @@

Definition at line 871 of file ComponentInterface.hpp.

+

Definition at line 879 of file ComponentInterface.hpp.

@@ -2310,7 +2310,7 @@

Definition at line 1367 of file ComponentInterface.hpp.

+

Definition at line 1375 of file ComponentInterface.hpp.

@@ -2338,7 +2338,7 @@

Definition at line 615 of file ComponentInterface.hpp.

+

Definition at line 616 of file ComponentInterface.hpp.

@@ -2376,7 +2376,7 @@

Definition at line 841 of file ComponentInterface.hpp.

+

Definition at line 849 of file ComponentInterface.hpp.

diff --git a/versions/main/classmodulo__components_1_1_component_interface_public_interface.html b/versions/main/classmodulo__components_1_1_component_interface_public_interface.html index 278bb876d..aa961f402 100644 --- a/versions/main/classmodulo__components_1_1_component_interface_public_interface.html +++ b/versions/main/classmodulo__components_1_1_component_interface_public_interface.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_lifecycle_component-members.html b/versions/main/classmodulo__components_1_1_lifecycle_component-members.html index 0dc28be76..3b375feaa 100644 --- a/versions/main/classmodulo__components_1_1_lifecycle_component-members.html +++ b/versions/main/classmodulo__components_1_1_lifecycle_component-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1_lifecycle_component.html b/versions/main/classmodulo__components_1_1_lifecycle_component.html index 15f16a993..cf9bba7da 100644 --- a/versions/main/classmodulo__components_1_1_lifecycle_component.html +++ b/versions/main/classmodulo__components_1_1_lifecycle_component.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html b/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html index 204abb1c7..96af79023 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception.html b/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception.html index b9f0814a4..7ead8eb00 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_add_service_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html b/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html index a865cfbca..d9953e744 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html b/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html index 1dba345ec..e5c58b8d6 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_add_signal_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception-members.html b/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception-members.html index e3a7599a1..f768be2a0 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception-members.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception.html b/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception.html index 991941d1d..2f6cff874 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_component_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html b/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html index 1f6d3b98a..9149637d0 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html b/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html index 8399950e2..81e2e12c7 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_component_parameter_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html b/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html index 2013c6a35..bfc76407c 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html b/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html index 71fd4b1b4..e7f11022c 100644 --- a/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html +++ b/versions/main/classmodulo__components_1_1exceptions_1_1_lookup_transform_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_message_pair-members.html b/versions/main/classmodulo__core_1_1communication_1_1_message_pair-members.html index 3063b03e4..ac75c6543 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_message_pair-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_message_pair-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_message_pair.html b/versions/main/classmodulo__core_1_1communication_1_1_message_pair.html index f63dbbe2f..2a4807eef 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_message_pair.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_message_pair.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html b/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html index 4057de58c..98d9b5693 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface.html b/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface.html index e68b655c4..6c145204e 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_message_pair_interface.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler-members.html b/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler-members.html index 92509ba41..7507a0269 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler.html b/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler.html index 9f068a9c7..2a33181ab 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_publisher_handler.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface-members.html b/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface-members.html index 13bd8a148..2132ca415 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface.html b/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface.html index 71788a7b2..ab9196181 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_publisher_interface.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler-members.html b/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler-members.html index b2d93dbbe..f5230bcbc 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler.html b/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler.html index c196a5290..6db053ae1 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_subscription_handler.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface-members.html b/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface-members.html index 57b804d7d..f0d656721 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface-members.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface.html b/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface.html index d5669fbd2..e0764ff94 100644 --- a/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface.html +++ b/versions/main/classmodulo__core_1_1communication_1_1_subscription_interface.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception-members.html index 2f1c94fd9..0bada746e 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception.html index cec8d1a43..d7fc820ca 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_core_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html index 7d5633c2b..8ff348deb 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html index 5e782e08c..82d9e66f6 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_cast_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html index 2cde98677..c2bea7d9b 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html index 7866b9220..c19d685e2 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_invalid_pointer_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html index de47ea112..997975854 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html index c6f7223a3..a0d32d21d 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_message_translation_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html index 490111ced..303b33908 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html index 90022147d..1b0463e6c 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_null_pointer_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html b/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html index 43bfe541b..33c389adf 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html b/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html index 6d230e7d6..b99248ab6 100644 --- a/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html +++ b/versions/main/classmodulo__core_1_1exceptions_1_1_parameter_translation_exception.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html b/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html index 160c243f1..3e09f5790 100644 --- a/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html +++ b/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener.html b/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener.html index 962bbb714..c8ca49974 100644 --- a/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener.html +++ b/versions/main/classmodulo__utils_1_1testutils_1_1_predicates_listener.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__utils_1_1testutils_1_1_service_client-members.html b/versions/main/classmodulo__utils_1_1testutils_1_1_service_client-members.html index ba931e4d9..fe62477b3 100644 --- a/versions/main/classmodulo__utils_1_1testutils_1_1_service_client-members.html +++ b/versions/main/classmodulo__utils_1_1testutils_1_1_service_client-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/classmodulo__utils_1_1testutils_1_1_service_client.html b/versions/main/classmodulo__utils_1_1testutils_1_1_service_client.html index b0b2d9fe8..dbf7d29ed 100644 --- a/versions/main/classmodulo__utils_1_1testutils_1_1_service_client.html +++ b/versions/main/classmodulo__utils_1_1testutils_1_1_service_client.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_005db6f82a7eca80f4e3827434b589b4.html b/versions/main/dir_005db6f82a7eca80f4e3827434b589b4.html index 8cd66b4f4..cd9df5bb2 100644 --- a/versions/main/dir_005db6f82a7eca80f4e3827434b589b4.html +++ b/versions/main/dir_005db6f82a7eca80f4e3827434b589b4.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_049f97fddacb7dc6e4c718ac904130b4.html b/versions/main/dir_049f97fddacb7dc6e4c718ac904130b4.html index 94e349ff7..88bc55af5 100644 --- a/versions/main/dir_049f97fddacb7dc6e4c718ac904130b4.html +++ b/versions/main/dir_049f97fddacb7dc6e4c718ac904130b4.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_05a91d83eeac941ff7d1774756f408e0.html b/versions/main/dir_05a91d83eeac941ff7d1774756f408e0.html index 6f0357940..0a66fa152 100644 --- a/versions/main/dir_05a91d83eeac941ff7d1774756f408e0.html +++ b/versions/main/dir_05a91d83eeac941ff7d1774756f408e0.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_2397dea4246cf971150250488a69dca4.html b/versions/main/dir_2397dea4246cf971150250488a69dca4.html index 634605c1a..38d23bcc6 100644 --- a/versions/main/dir_2397dea4246cf971150250488a69dca4.html +++ b/versions/main/dir_2397dea4246cf971150250488a69dca4.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_30c9960b1e12cf048409514a1d0c5545.html b/versions/main/dir_30c9960b1e12cf048409514a1d0c5545.html index a8318b1fb..3c54d8fda 100644 --- a/versions/main/dir_30c9960b1e12cf048409514a1d0c5545.html +++ b/versions/main/dir_30c9960b1e12cf048409514a1d0c5545.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_349657725b3f4f657efe86018f81caee.html b/versions/main/dir_349657725b3f4f657efe86018f81caee.html index c4283a0c9..6efa9728c 100644 --- a/versions/main/dir_349657725b3f4f657efe86018f81caee.html +++ b/versions/main/dir_349657725b3f4f657efe86018f81caee.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_3e8f83d5963dbe4a7be4947f2eff491b.html b/versions/main/dir_3e8f83d5963dbe4a7be4947f2eff491b.html index de141d03f..8b1a75e3c 100644 --- a/versions/main/dir_3e8f83d5963dbe4a7be4947f2eff491b.html +++ b/versions/main/dir_3e8f83d5963dbe4a7be4947f2eff491b.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_5442966453c41df6861b650ae85469b6.html b/versions/main/dir_5442966453c41df6861b650ae85469b6.html index 64c41898a..40531ceb0 100644 --- a/versions/main/dir_5442966453c41df6861b650ae85469b6.html +++ b/versions/main/dir_5442966453c41df6861b650ae85469b6.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html b/versions/main/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html index 8f87bcb80..d1a8aa41c 100644 --- a/versions/main/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html +++ b/versions/main/dir_5b0a4e6091157a5e3a1c0d77b65afe7a.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_6df23892ff328103ad3e309d3548417b.html b/versions/main/dir_6df23892ff328103ad3e309d3548417b.html index 29f02083b..1499943d8 100644 --- a/versions/main/dir_6df23892ff328103ad3e309d3548417b.html +++ b/versions/main/dir_6df23892ff328103ad3e309d3548417b.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_727f33ea6496bb66c2db4f7101f40bd7.html b/versions/main/dir_727f33ea6496bb66c2db4f7101f40bd7.html index c69b45879..d55ca836d 100644 --- a/versions/main/dir_727f33ea6496bb66c2db4f7101f40bd7.html +++ b/versions/main/dir_727f33ea6496bb66c2db4f7101f40bd7.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html b/versions/main/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html index ee8a15f59..6e1d83016 100644 --- a/versions/main/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html +++ b/versions/main/dir_97c9a08c8a0ff5d05b217f6e73862a8f.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_9d27c852c776d117417a91cf72db7998.html b/versions/main/dir_9d27c852c776d117417a91cf72db7998.html index 0003991b2..d7fbbec80 100644 --- a/versions/main/dir_9d27c852c776d117417a91cf72db7998.html +++ b/versions/main/dir_9d27c852c776d117417a91cf72db7998.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_a02cdc010ded81c7c2ac77993f10de2b.html b/versions/main/dir_a02cdc010ded81c7c2ac77993f10de2b.html index cf1ce9508..4c236339d 100644 --- a/versions/main/dir_a02cdc010ded81c7c2ac77993f10de2b.html +++ b/versions/main/dir_a02cdc010ded81c7c2ac77993f10de2b.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html b/versions/main/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html index 2034fcf4e..ec16a4f13 100644 --- a/versions/main/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html +++ b/versions/main/dir_a6c74a7b9b9addb9dd4654e424e31fd8.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_ad135c18ceef0560346390faedbedc87.html b/versions/main/dir_ad135c18ceef0560346390faedbedc87.html index 843e44e43..8ad18d748 100644 --- a/versions/main/dir_ad135c18ceef0560346390faedbedc87.html +++ b/versions/main/dir_ad135c18ceef0560346390faedbedc87.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html b/versions/main/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html index dc2490729..202fc37a4 100644 --- a/versions/main/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html +++ b/versions/main/dir_b0672ca90b2cc70fcfe3af0eed4bd360.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html b/versions/main/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html index e909fd20d..d4b8a8b98 100644 --- a/versions/main/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html +++ b/versions/main/dir_b2f33c71d4aa5e7af42a1ca61ff5af1b.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_b6467040e22f64a215d0cd51303d2b49.html b/versions/main/dir_b6467040e22f64a215d0cd51303d2b49.html index 92a0679df..a5321aed1 100644 --- a/versions/main/dir_b6467040e22f64a215d0cd51303d2b49.html +++ b/versions/main/dir_b6467040e22f64a215d0cd51303d2b49.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_bc830b16dafc1f86e0bebd2067294caf.html b/versions/main/dir_bc830b16dafc1f86e0bebd2067294caf.html index 4d89c9311..34988d0e6 100644 --- a/versions/main/dir_bc830b16dafc1f86e0bebd2067294caf.html +++ b/versions/main/dir_bc830b16dafc1f86e0bebd2067294caf.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_f43720a52722f25f1201bb3ff6bb7f0f.html b/versions/main/dir_f43720a52722f25f1201bb3ff6bb7f0f.html index 6d0f2ec45..327e19e6e 100644 --- a/versions/main/dir_f43720a52722f25f1201bb3ff6bb7f0f.html +++ b/versions/main/dir_f43720a52722f25f1201bb3ff6bb7f0f.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_fc328347369410c3380b696ba11ab788.html b/versions/main/dir_fc328347369410c3380b696ba11ab788.html index 638daa8b2..2614d87bf 100644 --- a/versions/main/dir_fc328347369410c3380b696ba11ab788.html +++ b/versions/main/dir_fc328347369410c3380b696ba11ab788.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html b/versions/main/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html index 15322119f..3f8dee27d 100644 --- a/versions/main/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html +++ b/versions/main/dir_fe0b512c3e8d43ae6faf41ba22286ee8.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/files.html b/versions/main/files.html index e75feac76..661331924 100644 --- a/versions/main/files.html +++ b/versions/main/files.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/functions.html b/versions/main/functions.html index d57d71925..14e9a3fd9 100644 --- a/versions/main/functions.html +++ b/versions/main/functions.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/functions_func.html b/versions/main/functions_func.html index 52d6c6f89..949195b7f 100644 --- a/versions/main/functions_func.html +++ b/versions/main/functions_func.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/functions_vars.html b/versions/main/functions_vars.html index 7cdc982e6..7196a8e39 100644 --- a/versions/main/functions_vars.html +++ b/versions/main/functions_vars.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/hierarchy.html b/versions/main/hierarchy.html index c11f9abd6..34633d342 100644 --- a/versions/main/hierarchy.html +++ b/versions/main/hierarchy.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/index.html b/versions/main/index.html index 6e8be68ba..daf7be227 100644 --- a/versions/main/index.html +++ b/versions/main/index.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html b/versions/main/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html index ac6a09d61..b930bea7c 100644 --- a/versions/main/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html +++ b/versions/main/md__github_workspace_source_modulo_component_interfaces__r_e_a_d_m_e.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html b/versions/main/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html index 234fbf62c..1647691b7 100644 --- a/versions/main/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html +++ b/versions/main/md__github_workspace_source_modulo_components__r_e_a_d_m_e.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html b/versions/main/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html index f96c99ff2..cec3120ac 100644 --- a/versions/main/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html +++ b/versions/main/md__github_workspace_source_modulo_core__r_e_a_d_m_e.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html b/versions/main/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html index be89d6238..0fa1bc067 100644 --- a/versions/main/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html +++ b/versions/main/md__github_workspace_source_modulo_utils__r_e_a_d_m_e.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/message__readers_8cpp_source.html b/versions/main/message__readers_8cpp_source.html index abf2cca0b..c7aec6e28 100644 --- a/versions/main/message__readers_8cpp_source.html +++ b/versions/main/message__readers_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/message__readers_8hpp_source.html b/versions/main/message__readers_8hpp_source.html index d88f90037..17b5cd21a 100644 --- a/versions/main/message__readers_8hpp_source.html +++ b/versions/main/message__readers_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/message__writers_8cpp_source.html b/versions/main/message__writers_8cpp_source.html index 7b2c633c1..fdc775694 100644 --- a/versions/main/message__writers_8cpp_source.html +++ b/versions/main/message__writers_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/message__writers_8hpp_source.html b/versions/main/message__writers_8hpp_source.html index cc2b7342f..5b8a37875 100644 --- a/versions/main/message__writers_8hpp_source.html +++ b/versions/main/message__writers_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemembers.html b/versions/main/namespacemembers.html index 5a3d85f3d..80fb990d6 100644 --- a/versions/main/namespacemembers.html +++ b/versions/main/namespacemembers.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemembers_enum.html b/versions/main/namespacemembers_enum.html index 56953379e..c5d7a6161 100644 --- a/versions/main/namespacemembers_enum.html +++ b/versions/main/namespacemembers_enum.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemembers_func.html b/versions/main/namespacemembers_func.html index 5d38fb309..d4e42ae70 100644 --- a/versions/main/namespacemembers_func.html +++ b/versions/main/namespacemembers_func.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemembers_type.html b/versions/main/namespacemembers_type.html index 15355aa95..ef80eb340 100644 --- a/versions/main/namespacemembers_type.html +++ b/versions/main/namespacemembers_type.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__components.html b/versions/main/namespacemodulo__components.html index ea7013ab2..d14031bd6 100644 --- a/versions/main/namespacemodulo__components.html +++ b/versions/main/namespacemodulo__components.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__components_1_1exceptions.html b/versions/main/namespacemodulo__components_1_1exceptions.html index c416531ba..4f3c0f0a2 100644 --- a/versions/main/namespacemodulo__components_1_1exceptions.html +++ b/versions/main/namespacemodulo__components_1_1exceptions.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__components_1_1utilities.html b/versions/main/namespacemodulo__components_1_1utilities.html index 9a2513e82..7b1f0061f 100644 --- a/versions/main/namespacemodulo__components_1_1utilities.html +++ b/versions/main/namespacemodulo__components_1_1utilities.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__core.html b/versions/main/namespacemodulo__core.html index 32caaebf4..fe4ffc605 100644 --- a/versions/main/namespacemodulo__core.html +++ b/versions/main/namespacemodulo__core.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__core_1_1communication.html b/versions/main/namespacemodulo__core_1_1communication.html index 5bc309b8b..14d6396ad 100644 --- a/versions/main/namespacemodulo__core_1_1communication.html +++ b/versions/main/namespacemodulo__core_1_1communication.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__core_1_1exceptions.html b/versions/main/namespacemodulo__core_1_1exceptions.html index 086c5f745..30421118a 100644 --- a/versions/main/namespacemodulo__core_1_1exceptions.html +++ b/versions/main/namespacemodulo__core_1_1exceptions.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespacemodulo__core_1_1translators.html b/versions/main/namespacemodulo__core_1_1translators.html index b379f82af..b5625778a 100644 --- a/versions/main/namespacemodulo__core_1_1translators.html +++ b/versions/main/namespacemodulo__core_1_1translators.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/namespaces.html b/versions/main/namespaces.html index f06d2c6ab..7ebeb2cb9 100644 --- a/versions/main/namespaces.html +++ b/versions/main/namespaces.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/pages.html b/versions/main/pages.html index e9a141847..39127bc5f 100644 --- a/versions/main/pages.html +++ b/versions/main/pages.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/parameter__translators_8cpp_source.html b/versions/main/parameter__translators_8cpp_source.html index 2ef9a2a54..edab727cd 100644 --- a/versions/main/parameter__translators_8cpp_source.html +++ b/versions/main/parameter__translators_8cpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/parameter__translators_8hpp_source.html b/versions/main/parameter__translators_8hpp_source.html index 0618f8d8b..a5f3c6ab1 100644 --- a/versions/main/parameter__translators_8hpp_source.html +++ b/versions/main/parameter__translators_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/predicate__variant_8hpp_source.html b/versions/main/predicate__variant_8hpp_source.html index 8a7c9b0c6..7ec1f3cb3 100644 --- a/versions/main/predicate__variant_8hpp_source.html +++ b/versions/main/predicate__variant_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/structmodulo__components_1_1_component_service_response-members.html b/versions/main/structmodulo__components_1_1_component_service_response-members.html index 11053350d..2c196b3aa 100644 --- a/versions/main/structmodulo__components_1_1_component_service_response-members.html +++ b/versions/main/structmodulo__components_1_1_component_service_response-members.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/structmodulo__components_1_1_component_service_response.html b/versions/main/structmodulo__components_1_1_component_service_response.html index aead96033..13e58b10c 100644 --- a/versions/main/structmodulo__components_1_1_component_service_response.html +++ b/versions/main/structmodulo__components_1_1_component_service_response.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
diff --git a/versions/main/utilities_8hpp_source.html b/versions/main/utilities_8hpp_source.html index e24bd8d51..cb20727a4 100644 --- a/versions/main/utilities_8hpp_source.html +++ b/versions/main/utilities_8hpp_source.html @@ -21,7 +21,7 @@ -
Modulo 3.1.0 +
Modulo 3.2.0
@@ -115,7 +115,35 @@
61 }
62 return output;
63}
-
64}// namespace modulo_components::utilities
+
64
+
73[[maybe_unused]] static rclcpp::NodeOptions modify_parameter_overrides(const rclcpp::NodeOptions& options) {
+
74 auto modified = options;
+
75 rclcpp::Parameter rate;
+
76 rclcpp::Parameter period;
+
77 std::vector<rclcpp::Parameter> parameters;
+
78 for (const auto& parameter : options.parameter_overrides()) {
+
79 if (parameter.get_name() == "rate") {
+
80 rate = parameter;
+
81 } else if (parameter.get_name() == "period") {
+
82 period = parameter;
+
83 } else {
+
84 parameters.push_back(parameter);
+
85 }
+
86 }
+
87 if (rate.get_type() != rclcpp::ParameterType::PARAMETER_NOT_SET) {
+
88 period = rclcpp::Parameter("period", 1.0 / rate.as_int());
+
89 } else if (period.get_type() != rclcpp::ParameterType::PARAMETER_NOT_SET) {
+
90 rate = rclcpp::Parameter("rate", static_cast<int>(1.0 / period.as_double()));
+
91 } else {
+
92 modified.parameter_overrides() = parameters;
+
93 return modified;
+
94 }
+
95 parameters.push_back(rate);
+
96 parameters.push_back(period);
+
97 modified.parameter_overrides() = parameters;
+
98 return modified;
+
99}
+
100}// namespace modulo_components::utilities
Modulo component utilities.