@@ -1076,6 +1076,7 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
10761076 }
10771077
10781078 // Do not start conflicting controllers
1079+ // Passthrough controller requested to start
10791080 if (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
10801081 [this ](auto & item) { return (item == PASSTHROUGH_GPIO); }) &&
10811082 (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
@@ -1092,15 +1093,34 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
10921093 ret_val = hardware_interface::return_type::ERROR;
10931094 }
10941095
1096+ // Force mode requested to start
10951097 if (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
10961098 [this ](auto & item) { return (item == FORCE_MODE_GPIO); }) &&
10971099 (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
1098- [](auto & item) {
1099- return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION);
1100+ [this ](auto & item) {
1101+ return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1102+ item == FREEDRIVE_MODE_GPIO);
1103+ }) ||
1104+ std::any_of (control_modes[0 ].begin (), control_modes[0 ].end (), [this ](auto & item) {
1105+ return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1106+ item == FORCE_MODE_GPIO || item == FREEDRIVE_MODE_GPIO);
1107+ }))) {
1108+ RCLCPP_ERROR (get_logger (), " Attempting to start force mode control while there is either position or "
1109+ " velocity mode running." );
1110+ ret_val = hardware_interface::return_type::ERROR;
1111+ }
1112+
1113+ // Freedrive mode requested to start
1114+ if (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
1115+ [this ](auto & item) { return (item == FREEDRIVE_MODE_GPIO); }) &&
1116+ (std::any_of (start_modes_[0 ].begin (), start_modes_[0 ].end (),
1117+ [this ](auto & item) {
1118+ return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1119+ item == PASSTHROUGH_GPIO || item == FORCE_MODE_GPIO);
11001120 }) ||
11011121 std::any_of (control_modes[0 ].begin (), control_modes[0 ].end (), [this ](auto & item) {
11021122 return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1103- item == FORCE_MODE_GPIO);
1123+ item == PASSTHROUGH_GPIO || item == FORCE_MODE_GPIO);
11041124 }))) {
11051125 RCLCPP_ERROR (get_logger (), " Attempting to start force mode control while there is either position or "
11061126 " velocity mode running." );
0 commit comments