@@ -682,16 +682,50 @@ class ResourceStorage
682682 {
683683 std::vector<std::shared_ptr<DistributedReadOnlyHandle>> distributed_state_interfaces;
684684 distributed_state_interfaces.reserve (sub_controller_manager->get_state_publisher_count ());
685+ std::vector<std::string> interface_names;
686+ interface_names.reserve (sub_controller_manager->get_state_publisher_count ());
685687
686688 for (const auto & state_publisher_description :
687689 sub_controller_manager->get_state_publisher_descriptions ())
688690 {
689691 // create StateInterface from the Description and store in ResourceStorage.
690692 auto state_interface =
691693 std::make_shared<DistributedReadOnlyHandle>(state_publisher_description);
694+
692695 add_state_interface (state_interface);
693696 // add to return vector, node needs to added to executor.
694697 distributed_state_interfaces.push_back (state_interface);
698+ interface_names.push_back (state_interface->get_name ());
699+ }
700+ // TODO(Manuel) this should be handled at one point DRY (adding, hardware_info_map, make available...), key should be made explicit
701+ hardware_info_map_[sub_controller_manager->get_name ()].state_interfaces = interface_names;
702+ available_state_interfaces_.reserve (
703+ available_state_interfaces_.capacity () + interface_names.size ());
704+
705+ for (const auto & interface :
706+ hardware_info_map_[sub_controller_manager->get_name ()].state_interfaces )
707+ {
708+ // add all state interfaces to available list
709+ auto found_it = std::find (
710+ available_state_interfaces_.begin (), available_state_interfaces_.end (), interface);
711+
712+ if (found_it == available_state_interfaces_.end ())
713+ {
714+ available_state_interfaces_.emplace_back (interface);
715+ RCUTILS_LOG_DEBUG_NAMED (
716+ " resource_manager" , " (hardware '%s'): '%s' state interface added into available list" ,
717+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
718+ }
719+ else
720+ {
721+ // TODO(destogl): do here error management if interfaces are only partially added into
722+ // "available" list - this should never be the case!
723+ RCUTILS_LOG_WARN_NAMED (
724+ " resource_manager" ,
725+ " (hardware '%s'): '%s' state interface already in available list."
726+ " This can happen due to multiple calls to 'configure'" ,
727+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
728+ }
695729 }
696730 return distributed_state_interfaces;
697731 }
@@ -701,17 +735,53 @@ class ResourceStorage
701735 {
702736 std::vector<std::shared_ptr<DistributedReadWriteHandle>> distributed_command_interfaces;
703737 distributed_command_interfaces.reserve (sub_controller_manager->get_command_forwarder_count ());
738+ std::vector<std::string> interface_names;
739+ interface_names.reserve (sub_controller_manager->get_command_forwarder_count ());
704740
705741 for (const auto & command_forwarder_description :
706742 sub_controller_manager->get_command_forwarder_descriptions ())
707743 {
708744 // create StateInterface from the Description and store in ResourceStorage.
709745 auto command_interface =
710746 std::make_shared<DistributedReadWriteHandle>(command_forwarder_description);
711- // add_command_interface(command_interface);
747+ add_command_interface (command_interface);
712748 // add to return vector, node needs to added to executor.
713749 distributed_command_interfaces.push_back (command_interface);
750+ // TODO(Manuel) this should be handled at one point DRY (adding, claimed ....), key should be made explicit
751+ claimed_command_interface_map_.emplace (std::make_pair (command_interface->get_name (), false ));
752+ interface_names.push_back (command_interface->get_name ());
753+ }
754+ // TODO(Manuel) this should be handled at one point DRY(adding, claimed,make available....), key should be made explicit
755+ available_command_interfaces_.reserve (
756+ available_command_interfaces_.capacity () + interface_names.size ());
757+ hardware_info_map_[sub_controller_manager->get_name ()].command_interfaces = interface_names;
758+
759+ for (const auto & interface :
760+ hardware_info_map_[sub_controller_manager->get_name ()].command_interfaces )
761+ {
762+ // TODO(destogl): check if interface should be available on configure
763+ auto found_it = std::find (
764+ available_command_interfaces_.begin (), available_command_interfaces_.end (), interface);
765+
766+ if (found_it == available_command_interfaces_.end ())
767+ {
768+ available_command_interfaces_.emplace_back (interface);
769+ RCUTILS_LOG_DEBUG_NAMED (
770+ " resource_manager" , " (hardware '%s'): '%s' command interface added into available list" ,
771+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
772+ }
773+ else
774+ {
775+ // TODO(destogl): do here error management if interfaces are only partially added into
776+ // "available" list - this should never be the case!
777+ RCUTILS_LOG_WARN_NAMED (
778+ " resource_manager" ,
779+ " (hardware '%s'): '%s' command interface already in available list."
780+ " This can happen due to multiple calls to 'configure'" ,
781+ sub_controller_manager->get_name ().c_str (), interface.c_str ());
782+ }
714783 }
784+
715785 return distributed_command_interfaces;
716786 }
717787
0 commit comments