@@ -680,16 +680,50 @@ class ResourceStorage
680680 {
681681 std::vector<std::shared_ptr<DistributedReadOnlyHandle>> distributed_state_interfaces;
682682 distributed_state_interfaces.reserve (sub_controller_manager->get_state_publisher_count ());
683+ std::vector<std::string> interface_names;
684+ interface_names.reserve (sub_controller_manager->get_state_publisher_count ());
683685
684686 for (const auto & state_publisher_description :
685687 sub_controller_manager->get_state_publisher_descriptions ())
686688 {
687689 // create StateInterface from the Description and store in ResourceStorage.
688690 auto state_interface =
689691 std::make_shared<DistributedReadOnlyHandle>(state_publisher_description);
692+
690693 add_state_interface (state_interface);
691694 // add to return vector, node needs to added to executor.
692695 distributed_state_interfaces.push_back (state_interface);
696+ interface_names.push_back (state_interface->get_name ());
697+ }
698+ // TODO(Manuel) this should be handled at one point DRY (adding, hardware_info_map, make available...), key should be made explicit
699+ hardware_info_map_[sub_controller_manager->get_name ()].state_interfaces = interface_names;
700+ available_state_interfaces_.reserve (
701+ available_state_interfaces_.capacity () + interface_names.size ());
702+
703+ for (const auto & interface :
704+ hardware_info_map_[sub_controller_manager->get_name ()].state_interfaces )
705+ {
706+ // add all state interfaces to available list
707+ auto found_it = std::find (
708+ available_state_interfaces_.begin (), available_state_interfaces_.end (), interface);
709+
710+ if (found_it == available_state_interfaces_.end ())
711+ {
712+ available_state_interfaces_.emplace_back (interface);
713+ RCUTILS_LOG_DEBUG_NAMED (
714+ " resource_manager" , " (hardware '%s'): '%s' state interface added into available list" ,
715+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
716+ }
717+ else
718+ {
719+ // TODO(destogl): do here error management if interfaces are only partially added into
720+ // "available" list - this should never be the case!
721+ RCUTILS_LOG_WARN_NAMED (
722+ " resource_manager" ,
723+ " (hardware '%s'): '%s' state interface already in available list."
724+ " This can happen due to multiple calls to 'configure'" ,
725+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
726+ }
693727 }
694728 return distributed_state_interfaces;
695729 }
@@ -699,17 +733,53 @@ class ResourceStorage
699733 {
700734 std::vector<std::shared_ptr<DistributedReadWriteHandle>> distributed_command_interfaces;
701735 distributed_command_interfaces.reserve (sub_controller_manager->get_command_forwarder_count ());
736+ std::vector<std::string> interface_names;
737+ interface_names.reserve (sub_controller_manager->get_command_forwarder_count ());
702738
703739 for (const auto & command_forwarder_description :
704740 sub_controller_manager->get_command_forwarder_descriptions ())
705741 {
706742 // create StateInterface from the Description and store in ResourceStorage.
707743 auto command_interface =
708744 std::make_shared<DistributedReadWriteHandle>(command_forwarder_description);
709- // add_command_interface(command_interface);
745+ add_command_interface (command_interface);
710746 // add to return vector, node needs to added to executor.
711747 distributed_command_interfaces.push_back (command_interface);
748+ // TODO(Manuel) this should be handled at one point DRY (adding, claimed ....), key should be made explicit
749+ claimed_command_interface_map_.emplace (std::make_pair (command_interface->get_name (), false ));
750+ interface_names.push_back (command_interface->get_name ());
751+ }
752+ // TODO(Manuel) this should be handled at one point DRY(adding, claimed,make available....), key should be made explicit
753+ available_command_interfaces_.reserve (
754+ available_command_interfaces_.capacity () + interface_names.size ());
755+ hardware_info_map_[sub_controller_manager->get_name ()].command_interfaces = interface_names;
756+
757+ for (const auto & interface :
758+ hardware_info_map_[sub_controller_manager->get_name ()].command_interfaces )
759+ {
760+ // TODO(destogl): check if interface should be available on configure
761+ auto found_it = std::find (
762+ available_command_interfaces_.begin (), available_command_interfaces_.end (), interface);
763+
764+ if (found_it == available_command_interfaces_.end ())
765+ {
766+ available_command_interfaces_.emplace_back (interface);
767+ RCUTILS_LOG_DEBUG_NAMED (
768+ " resource_manager" , " (hardware '%s'): '%s' command interface added into available list" ,
769+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
770+ }
771+ else
772+ {
773+ // TODO(destogl): do here error management if interfaces are only partially added into
774+ // "available" list - this should never be the case!
775+ RCUTILS_LOG_WARN_NAMED (
776+ " resource_manager" ,
777+ " (hardware '%s'): '%s' command interface already in available list."
778+ " This can happen due to multiple calls to 'configure'" ,
779+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
780+ }
712781 }
782+
713783 return distributed_command_interfaces;
714784 }
715785
0 commit comments