@@ -1197,3 +1197,84 @@ TEST_F(TestResourceManager, resource_availability_and_claiming_in_lifecycle)
11971197 std::bind (&hardware_interface::ResourceManager::state_interface_exists, &rm, _1), true );
11981198 }
11991199}
1200+
1201+ TEST_F (TestResourceManager, managing_controllers_reference_interfaces)
1202+ {
1203+ hardware_interface::ResourceManager rm (ros2_control_test_assets::minimal_robot_urdf);
1204+
1205+ std::vector<std::string> FULL_REFERENCE_INTERFACE_NAMES = {
1206+ " test_controller/input1" , " test_controller/input2" , " test_controller/input3" };
1207+
1208+ std::vector<hardware_interface::CommandInterface> reference_interfaces;
1209+ std::vector<double > reference_interface_values = {1.0 , 2.0 , 3.0 };
1210+ std::vector<std::string> reference_interface_names = {" input1" , " input2" , " input3" };
1211+
1212+ for (size_t i = 0 ; i < reference_interface_names.size (); ++i)
1213+ {
1214+ reference_interfaces.push_back (hardware_interface::CommandInterface (
1215+ " test_controller" , reference_interface_names[i], &(reference_interface_values[i])));
1216+ }
1217+
1218+ auto ref_itf_names = rm.import_controller_reference_interfaces (reference_interfaces);
1219+
1220+ ASSERT_THAT (ref_itf_names, testing::ElementsAreArray (FULL_REFERENCE_INTERFACE_NAMES));
1221+
1222+ // check that all interfaces are imported properly
1223+ for (const auto & interface : FULL_REFERENCE_INTERFACE_NAMES)
1224+ {
1225+ EXPECT_TRUE (rm.command_interface_exists (interface));
1226+ EXPECT_TRUE (rm.command_interface_is_available (interface));
1227+ EXPECT_FALSE (rm.command_interface_is_claimed (interface));
1228+ }
1229+
1230+ // claim interfaces in a scope that deletes them after
1231+ {
1232+ auto claimed_itf1 = rm.claim_command_interface (FULL_REFERENCE_INTERFACE_NAMES[0 ]);
1233+ auto claimed_itf3 = rm.claim_command_interface (FULL_REFERENCE_INTERFACE_NAMES[2 ]);
1234+
1235+ for (const auto & interface : FULL_REFERENCE_INTERFACE_NAMES)
1236+ {
1237+ EXPECT_TRUE (rm.command_interface_exists (interface));
1238+ EXPECT_TRUE (rm.command_interface_is_available (interface));
1239+ }
1240+ EXPECT_TRUE (rm.command_interface_is_claimed (FULL_REFERENCE_INTERFACE_NAMES[0 ]));
1241+ EXPECT_FALSE (rm.command_interface_is_claimed (FULL_REFERENCE_INTERFACE_NAMES[1 ]));
1242+ EXPECT_TRUE (rm.command_interface_is_claimed (FULL_REFERENCE_INTERFACE_NAMES[2 ]));
1243+
1244+ // access interface value
1245+ EXPECT_EQ (claimed_itf1.get_value (), 1.0 );
1246+ EXPECT_EQ (claimed_itf3.get_value (), 3.0 );
1247+
1248+ claimed_itf1.set_value (11.1 );
1249+ claimed_itf3.set_value (33.3 );
1250+ EXPECT_EQ (claimed_itf1.get_value (), 11.1 );
1251+ EXPECT_EQ (claimed_itf3.get_value (), 33.3 );
1252+
1253+ EXPECT_EQ (reference_interface_values[0 ], 11.1 );
1254+ EXPECT_EQ (reference_interface_values[1 ], 2.0 );
1255+ EXPECT_EQ (reference_interface_values[2 ], 33.3 );
1256+ }
1257+
1258+ // interfaces should be released now, but still managed by resource manager
1259+ for (const auto & interface : FULL_REFERENCE_INTERFACE_NAMES)
1260+ {
1261+ EXPECT_TRUE (rm.command_interface_exists (interface));
1262+ EXPECT_TRUE (rm.command_interface_is_available (interface));
1263+ EXPECT_FALSE (rm.command_interface_is_claimed (interface));
1264+ }
1265+
1266+ // Last written values should stay
1267+ EXPECT_EQ (reference_interface_values[0 ], 11.1 );
1268+ EXPECT_EQ (reference_interface_values[1 ], 2.0 );
1269+ EXPECT_EQ (reference_interface_values[2 ], 33.3 );
1270+
1271+ // remove reference interfaces from resource manager
1272+ rm.remove_controller_reference_interfaces (ref_itf_names);
1273+
1274+ // they should not exist in resource manager
1275+ for (const auto & interface : FULL_REFERENCE_INTERFACE_NAMES)
1276+ {
1277+ EXPECT_FALSE (rm.command_interface_exists (interface));
1278+ EXPECT_FALSE (rm.command_interface_is_available (interface));
1279+ }
1280+ }
0 commit comments