@@ -2640,6 +2640,8 @@ void ControllerManager::read(const rclcpp::Time & time, const rclcpp::Duration &
2640
2640
rt_buffer_.get_concatenated_string (rt_buffer_.deactivate_controllers_list ).c_str ());
2641
2641
std::vector<ControllerSpec> & rt_controller_list =
2642
2642
rt_controllers_wrapper_.update_and_get_used_by_rt_list ();
2643
+ perform_hardware_command_mode_change (
2644
+ rt_controller_list, {}, rt_buffer_.deactivate_controllers_list , " read" );
2643
2645
deactivate_controllers (rt_controller_list, rt_buffer_.deactivate_controllers_list );
2644
2646
// TODO(destogl): do auto-start of broadcasters
2645
2647
}
@@ -2858,26 +2860,9 @@ controller_interface::return_type ControllerManager::update(
2858
2860
{ add_element_to_list (rt_buffer_.deactivate_controllers_list , controller); });
2859
2861
2860
2862
// Retrieve the interfaces to start and stop from the hardware end
2861
- rt_buffer_.interfaces_to_start .clear ();
2862
- rt_buffer_.interfaces_to_stop .clear ();
2863
- get_controller_list_command_interfaces (
2864
- rt_buffer_.deactivate_controllers_list , rt_controller_list, resource_manager_,
2865
- rt_buffer_.interfaces_to_stop );
2866
- get_controller_list_command_interfaces (
2867
- rt_buffer_.fallback_controllers_list , rt_controller_list, resource_manager_,
2868
- rt_buffer_.interfaces_to_start );
2869
- if (!rt_buffer_.interfaces_to_stop .empty () || !rt_buffer_.interfaces_to_start .empty ())
2870
- {
2871
- if (!(resource_manager_->prepare_command_mode_switch (
2872
- rt_buffer_.interfaces_to_start , rt_buffer_.interfaces_to_stop ) &&
2873
- resource_manager_->perform_command_mode_switch (
2874
- rt_buffer_.interfaces_to_start , rt_buffer_.interfaces_to_stop )))
2875
- {
2876
- RCLCPP_ERROR (
2877
- get_logger (),
2878
- " Error while attempting mode switch when deactivating controllers in update cycle!" );
2879
- }
2880
- }
2863
+ perform_hardware_command_mode_change (
2864
+ rt_controller_list, rt_buffer_.fallback_controllers_list ,
2865
+ rt_buffer_.deactivate_controllers_list , " update" );
2881
2866
deactivate_controllers (rt_controller_list, rt_buffer_.deactivate_controllers_list );
2882
2867
if (!rt_buffer_.fallback_controllers_list .empty ())
2883
2868
{
@@ -2925,6 +2910,9 @@ void ControllerManager::write(const rclcpp::Time & time, const rclcpp::Duration
2925
2910
rt_buffer_.get_concatenated_string (rt_buffer_.deactivate_controllers_list ).c_str ());
2926
2911
std::vector<ControllerSpec> & rt_controller_list =
2927
2912
rt_controllers_wrapper_.update_and_get_used_by_rt_list ();
2913
+
2914
+ perform_hardware_command_mode_change (
2915
+ rt_controller_list, {}, rt_buffer_.deactivate_controllers_list , " write" );
2928
2916
deactivate_controllers (rt_controller_list, rt_buffer_.deactivate_controllers_list );
2929
2917
// TODO(destogl): do auto-start of broadcasters
2930
2918
}
@@ -3019,6 +3007,34 @@ unsigned int ControllerManager::get_update_rate() const { return update_rate_; }
3019
3007
3020
3008
rclcpp::Clock::SharedPtr ControllerManager::get_trigger_clock () const { return trigger_clock_; }
3021
3009
3010
+ void ControllerManager::perform_hardware_command_mode_change (
3011
+ const std::vector<ControllerSpec> & rt_controller_list,
3012
+ const std::vector<std::string> & activate_controllers_list,
3013
+ const std::vector<std::string> & deactivate_controllers_list, const std::string & rt_cycle_name)
3014
+ {
3015
+ rt_buffer_.interfaces_to_start .clear ();
3016
+ rt_buffer_.interfaces_to_stop .clear ();
3017
+ get_controller_list_command_interfaces (
3018
+ deactivate_controllers_list, rt_controller_list, resource_manager_,
3019
+ rt_buffer_.interfaces_to_stop );
3020
+ get_controller_list_command_interfaces (
3021
+ activate_controllers_list, rt_controller_list, resource_manager_,
3022
+ rt_buffer_.interfaces_to_start );
3023
+ if (!rt_buffer_.interfaces_to_stop .empty () || !rt_buffer_.interfaces_to_start .empty ())
3024
+ {
3025
+ if (!(resource_manager_->prepare_command_mode_switch (
3026
+ rt_buffer_.interfaces_to_start , rt_buffer_.interfaces_to_stop ) &&
3027
+ resource_manager_->perform_command_mode_switch (
3028
+ rt_buffer_.interfaces_to_start , rt_buffer_.interfaces_to_stop )))
3029
+ {
3030
+ RCLCPP_ERROR (
3031
+ get_logger (),
3032
+ " Error while attempting mode switch when deactivating controllers in %s cycle!" ,
3033
+ rt_cycle_name.c_str ());
3034
+ }
3035
+ }
3036
+ }
3037
+
3022
3038
void ControllerManager::propagate_deactivation_of_chained_mode (
3023
3039
const std::vector<ControllerSpec> & controllers)
3024
3040
{
0 commit comments