From 8729d6a2d652403de9226dc67978eda8a7a2722b Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sun, 24 May 2015 15:59:32 +0300 Subject: [PATCH] ServiceClient<>::getCallIDByIndex() --- libuavcan/include/uavcan/node/service_client.hpp | 13 +++++++++++++ libuavcan/test/node/service_client.cpp | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/libuavcan/include/uavcan/node/service_client.hpp b/libuavcan/include/uavcan/node/service_client.hpp index b5a84715fa..b8467c4694 100644 --- a/libuavcan/include/uavcan/node/service_client.hpp +++ b/libuavcan/include/uavcan/node/service_client.hpp @@ -341,6 +341,12 @@ public: */ bool hasPendingCallToServer(NodeID server_node_id) const; + /** + * This method allows to traverse pending calls. If the index is out of range, an invalid call ID will be returned. + * Warning: average complexity is O(index); worst case complexity is O(size). + */ + ServiceCallID getCallIDByIndex(unsigned index) const; + /** * Service response callback must be set prior service call. */ @@ -556,6 +562,13 @@ bool ServiceClient::hasPendingCallToServe return NULL != call_registry_.find(ServerSearchPredicate(server_node_id)); } +template +ServiceCallID ServiceClient::getCallIDByIndex(unsigned index) const +{ + const CallState* const id = call_registry_.getByIndex(index); + return (id == NULL) ? ServiceCallID() : id->getCallID(); +} + } #endif // UAVCAN_NODE_SERVICE_CLIENT_HPP_INCLUDED diff --git a/libuavcan/test/node/service_client.cpp b/libuavcan/test/node/service_client.cpp index 8b24848a30..82d99a66ac 100644 --- a/libuavcan/test/node/service_client.cpp +++ b/libuavcan/test/node/service_client.cpp @@ -147,6 +147,9 @@ TEST(ServiceClient, Basic) ASSERT_EQ(1, client2.getNumPendingCalls()); ASSERT_EQ(2, client3.getNumPendingCalls()); + ASSERT_EQ(uavcan::NodeID(1), client2.getCallIDByIndex(0).server_node_id); + ASSERT_EQ(uavcan::NodeID(), client2.getCallIDByIndex(1).server_node_id); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(20)); std::cout << "!!! Spin finished!" << std::endl; @@ -216,6 +219,9 @@ TEST(ServiceClient, Rejection) ASSERT_LT(0, client1.call(1, request)); + ASSERT_EQ(uavcan::NodeID(1), client1.getCallIDByIndex(0).server_node_id); + ASSERT_EQ(uavcan::NodeID(), client1.getCallIDByIndex(1).server_node_id); + ASSERT_EQ(1, nodes.b.getDispatcher().getNumServiceResponseListeners()); ASSERT_TRUE(client1.hasPendingCalls()); ASSERT_TRUE(client1.hasPendingCallToServer(1));