@@ -97,6 +97,8 @@ controller_interface::InterfaceConfiguration GPIOController::command_interface_c
9797 config.names .emplace_back (tf_prefix + " hand_back_control/hand_back_control_cmd" );
9898 config.names .emplace_back (tf_prefix + " hand_back_control/hand_back_control_async_success" );
9999
100+ config.names .emplace_back (tf_prefix + " gpio/analog_output_domain_cmd" );
101+
100102 return config;
101103}
102104
@@ -293,6 +295,9 @@ ur_controllers::GPIOController::on_activate(const rclcpp_lifecycle::State& /*pre
293295 program_state_pub_ = get_node ()->create_publisher <std_msgs::msg::Bool>(" ~/robot_program_running" , qos_latched);
294296 set_io_srv_ = get_node ()->create_service <ur_msgs::srv::SetIO>(
295297 " ~/set_io" , std::bind (&GPIOController::setIO, this , std::placeholders::_1, std::placeholders::_2));
298+ set_analog_output_srv_ = get_node ()->create_service <ur_msgs::srv::SetAnalogOutput>(
299+ " ~/set_analog_output" ,
300+ std::bind (&GPIOController::setAnalogOutput, this , std::placeholders::_1, std::placeholders::_2));
296301
297302 set_speed_slider_srv_ = get_node ()->create_service <ur_msgs::srv::SetSpeedSliderFraction>(
298303 " ~/set_speed_slider" ,
@@ -357,7 +362,7 @@ bool GPIOController::setIO(ur_msgs::srv::SetIO::Request::SharedPtr req, ur_msgs:
357362 command_interfaces_[CommandInterfaces::IO_ASYNC_SUCCESS].set_value (ASYNC_WAITING);
358363 command_interfaces_[CommandInterfaces::ANALOG_OUTPUTS_CMD + req->pin ].set_value (static_cast <double >(req->state ));
359364
360- RCLCPP_INFO (get_node ()->get_logger (), " Setting analog output '%d' to state: '%1.0f '." , req->pin , req->state );
365+ RCLCPP_INFO (get_node ()->get_logger (), " Setting analog output '%d' to state: '%f '." , req->pin , req->state );
361366
362367 if (!waitForAsyncCommand ([&]() { return command_interfaces_[CommandInterfaces::IO_ASYNC_SUCCESS].get_value (); })) {
363368 RCLCPP_WARN (get_node ()->get_logger (), " Could not verify that io was set. (This might happen when using the "
@@ -385,6 +390,46 @@ bool GPIOController::setIO(ur_msgs::srv::SetIO::Request::SharedPtr req, ur_msgs:
385390 }
386391}
387392
393+ bool GPIOController::setAnalogOutput (ur_msgs::srv::SetAnalogOutput::Request::SharedPtr req,
394+ ur_msgs::srv::SetAnalogOutput::Response::SharedPtr resp)
395+ {
396+ std::string domain_string = " UNKNOWN" ;
397+ switch (req->data .domain ) {
398+ case ur_msgs::msg::Analog::CURRENT:
399+ domain_string = " CURRENT" ;
400+ break ;
401+ case ur_msgs::msg::Analog::VOLTAGE:
402+ domain_string = " VOLTAGE" ;
403+ break ;
404+ default :
405+ RCLCPP_ERROR (get_node ()->get_logger (), " Domain must be either 0 (CURRENT) or 1 (VOLTAGE)" );
406+ resp->success = false ;
407+ return false ;
408+ }
409+
410+ if (req->data .pin < 0 || req->data .pin > 1 ) {
411+ RCLCPP_ERROR (get_node ()->get_logger (), " Invalid pin selected. Only pins 0 and 1 are allowed." );
412+ resp->success = false ;
413+ return false ;
414+ }
415+
416+ command_interfaces_[CommandInterfaces::IO_ASYNC_SUCCESS].set_value (ASYNC_WAITING);
417+ command_interfaces_[CommandInterfaces::ANALOG_OUTPUTS_CMD + req->data .pin ].set_value (
418+ static_cast <float >(req->data .state ));
419+ command_interfaces_[CommandInterfaces::ANALOG_OUTPUTS_DOMAIN].set_value (static_cast <double >(req->data .domain ));
420+
421+ RCLCPP_INFO (get_node ()->get_logger (), " Setting analog output '%d' to state: '%f' in domain %s." , req->data .pin ,
422+ req->data .state , domain_string.c_str ());
423+
424+ if (!waitForAsyncCommand ([&]() { return command_interfaces_[CommandInterfaces::IO_ASYNC_SUCCESS].get_value (); })) {
425+ RCLCPP_WARN (get_node ()->get_logger (), " Could not verify that io was set. (This might happen when using the "
426+ " mocked interface)" );
427+ }
428+
429+ resp->success = static_cast <bool >(command_interfaces_[IO_ASYNC_SUCCESS].get_value ());
430+ return resp->success ;
431+ }
432+
388433bool GPIOController::setSpeedSlider (ur_msgs::srv::SetSpeedSliderFraction::Request::SharedPtr req,
389434 ur_msgs::srv::SetSpeedSliderFraction::Response::SharedPtr resp)
390435{
0 commit comments