diff --git a/libuavcan/include/uavcan/node/global_data_type_registry.hpp b/libuavcan/include/uavcan/node/global_data_type_registry.hpp index ed173e600a..60bd5263af 100644 --- a/libuavcan/include/uavcan/node/global_data_type_registry.hpp +++ b/libuavcan/include/uavcan/node/global_data_type_registry.hpp @@ -98,6 +98,7 @@ public: bool isFrozen() const { return frozen_; } const DataTypeDescriptor* find(DataTypeKind kind, const char* name) const; + const DataTypeDescriptor* find(DataTypeKind kind, DataTypeID dtid) const; DataTypeSignature computeAggregateSignature(DataTypeKind kind, DataTypeIDMask& inout_id_mask) const; diff --git a/libuavcan/src/node/global_data_type_registry.cpp b/libuavcan/src/node/global_data_type_registry.cpp index 13288da683..3d41c08ede 100644 --- a/libuavcan/src/node/global_data_type_registry.cpp +++ b/libuavcan/src/node/global_data_type_registry.cpp @@ -140,6 +140,24 @@ const DataTypeDescriptor* GlobalDataTypeRegistry::find(DataTypeKind kind, const return NULL; } +const DataTypeDescriptor* GlobalDataTypeRegistry::find(DataTypeKind kind, DataTypeID dtid) const +{ + const List* list = selectList(kind); + if (!list) + { + assert(0); + return NULL; + } + Entry* p = list->get(); + while (p) + { + if (p->descriptor.match(kind, dtid)) + return &p->descriptor; + p = p->getNextListNode(); + } + return NULL; +} + DataTypeSignature GlobalDataTypeRegistry::computeAggregateSignature(DataTypeKind kind, DataTypeIDMask& inout_id_mask) const { diff --git a/libuavcan/test/node/global_data_type_registry.cpp b/libuavcan/test/node/global_data_type_registry.cpp index 84d1dcd181..b0cc5e640f 100644 --- a/libuavcan/test/node/global_data_type_registry.cpp +++ b/libuavcan/test/node/global_data_type_registry.cpp @@ -166,17 +166,25 @@ TEST(GlobalDataTypeRegistry, Basic) */ const uavcan::DataTypeDescriptor* pdtd = NULL; ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "Nonexistent")); + ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, 987)); // Asking for service, but this is a message: ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, "my_namespace.DataTypeB")); + ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, 42)); ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "my_namespace.DataTypeB"))); ASSERT_EQ(extractDescriptor(741), *pdtd); + ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, 741))); + ASSERT_EQ(extractDescriptor(741), *pdtd); ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "my_namespace.DataTypeA"))); ASSERT_EQ(extractDescriptor(), *pdtd); + ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, uavcan::DataTypeID(0)))); + ASSERT_EQ(extractDescriptor(), *pdtd); ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, "my_namespace.DataTypeA"))); ASSERT_EQ(extractDescriptor(147), *pdtd); + ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, 147))); + ASSERT_EQ(extractDescriptor(147), *pdtd); }