34 static_assert(std::is_base_of<ModeBase, ModeT>::value,
35 "Template type ModeT must be derived from px4_ros2::ModeBase");
38 explicit NodeWithMode(std::string node_name,
bool enable_debug_output =
false) : Node(node_name)
40 if (enable_debug_output) {
42 rcutils_logging_set_logger_level(get_logger().get_name(), RCUTILS_LOG_SEVERITY_DEBUG);
44 if (ret != RCUTILS_RET_OK) {
45 RCLCPP_ERROR(get_logger(),
"Error setting severity: %s", rcutils_get_error_string().str);
46 rcutils_reset_error();
50 _mode = std::make_unique<ModeT>(*
this);
52 if (!_mode->doRegister()) {
57 ModeT& getMode()
const {
return *_mode; }
60 std::unique_ptr<ModeT> _mode;
89 static_assert(std::is_base_of_v<ModeExecutorBase, ModeExecutorT>,
90 "Template type ModeExecutorT must be derived from px4_ros2::ModeExecutorBase");
92 (std::is_base_of_v<ModeBase, OwnedModeT> && ... && std::is_base_of_v<ModeBase, OtherModesT>),
93 "Template types OwnedModeT and OtherModesT must be derived from px4_ros2::ModeBase");
99 if (enable_debug_output) {
101 rcutils_logging_set_logger_level(get_logger().get_name(), RCUTILS_LOG_SEVERITY_DEBUG);
103 if (ret != RCUTILS_RET_OK) {
104 RCLCPP_ERROR(get_logger(),
"Error setting severity: %s", rcutils_get_error_string().str);
105 rcutils_reset_error();
109 _owned_mode = std::make_unique<OwnedModeT>(*
this);
110 _other_modes = std::make_tuple(std::make_unique<OtherModesT>(*this)...);
111 _mode_executor = createModeExecutor(std::index_sequence_for<OtherModesT...>{});
113 if (!_mode_executor->doRegister() || !std::apply(
114 [](
const auto&... mode) {
116 return (mode->doRegister() && ...);
124 template <
typename ModeT = OwnedModeT>
125 ModeT& getMode()
const
127 if constexpr (std::is_same_v<ModeT, OwnedModeT>) {
130 return *std::get<ModeT>(_other_modes);
135 template <std::size_t... Idx>
136 auto createModeExecutor(std::index_sequence<Idx...>)
138 if constexpr (
sizeof...(Idx) == 0) {
139 return std::make_unique<ModeExecutorT>(*_owned_mode);
141 return std::make_unique<ModeExecutorT>(*_owned_mode, *std::get<Idx>(_other_modes)...);
145 std::unique_ptr<ModeExecutorT> _mode_executor;
146 std::unique_ptr<OwnedModeT> _owned_mode;
147 std::tuple<std::unique_ptr<OtherModesT>...> _other_modes;