Skip to content

Commit 7d8efe9

Browse files
committed
add distributed interfaces to available list
1 parent 757c29d commit 7d8efe9

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

hardware_interface/src/resource_manager.cpp

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)