@@ -927,6 +927,9 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
927927 if (passthrough_trajectory_controller_running_) {
928928 control_modes[i] = PASSTHROUGH_GPIO;
929929 }
930+ if (freedrive_mode_controller_running_) {
931+ control_modes[i] = FREEDRIVE_MODE;
932+ }
930933 }
931934
932935 if (!std::all_of (start_modes_.begin () + 1 , start_modes_.end (),
@@ -955,9 +958,11 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
955958 return hardware_interface::return_type::ERROR;
956959 }
957960 start_modes_[i] = PASSTHROUGH_GPIO;
958- }
959- if (key == tf_prefix + FREEDRIVE_MODE + " /async_success" ) {
960- start_modes_.push_back (FREEDRIVE_MODE);
961+ } else if (key == tf_prefix + FREEDRIVE_MODE + " /async_success" ) {
962+ if (start_modes_[i] != " UNDEFINED" ) {
963+ return hardware_interface::return_type::ERROR;
964+ }
965+ start_modes_[i] = FREEDRIVE_MODE;
961966 }
962967 }
963968 }
@@ -984,6 +989,12 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
984989 control_modes[i] = " UNDEFINED" ;
985990 }
986991 }
992+ if (key == tf_prefix + FREEDRIVE_MODE + " /async_success" ) {
993+ stop_modes_.push_back (StoppingInterface::STOP_FREEDRIVE);
994+ if (control_modes[i] == FREEDRIVE_MODE) {
995+ control_modes[i] = " UNDEFINED" ;
996+ }
997+ }
987998 }
988999 }
9891000
@@ -1000,6 +1011,18 @@ hardware_interface::return_type URPositionHardwareInterface::prepare_command_mod
10001011 }))) {
10011012 ret_val = hardware_interface::return_type::ERROR;
10021013 }
1014+ if (std::any_of (start_modes_.begin (), start_modes_.end (),
1015+ [this ](auto & item) { return (item == FREEDRIVE_MODE); }) &&
1016+ (std::any_of (start_modes_.begin (), start_modes_.end (),
1017+ [this ](auto & item) {
1018+ return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION || item == PASSTHROUGH_GPIO);
1019+ }) ||
1020+ std::any_of (control_modes.begin (), control_modes.end (), [this ](auto & item) {
1021+ return (item == hardware_interface::HW_IF_VELOCITY || item == hardware_interface::HW_IF_POSITION ||
1022+ item == PASSTHROUGH_GPIO || item == FREEDRIVE_MODE);
1023+ }))) {
1024+ ret_val = hardware_interface::return_type::ERROR;
1025+ }
10031026 if (std::any_of (start_modes_.begin (), start_modes_.end (),
10041027 [](auto & item) { return (item == hardware_interface::HW_IF_POSITION); }) &&
10051028 (std::any_of (
0 commit comments