Skip to content

Commit 167e8dc

Browse files
committed
add distributed interfaces to available list
1 parent 49347d1 commit 167e8dc

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
@@ -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

Comments
 (0)