Skip to content

Commit 117de35

Browse files
randhidlia-viam
andauthored
[RSDK-9624] Add discovery service (#372)
Co-authored-by: lia <[email protected]>
1 parent c5f1002 commit 117de35

19 files changed

+392
-2
lines changed

bin/run-clang-format.sh

+7
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,11 @@
1414
# See the License for the specific language governing permissions and
1515
# limitations under the License.
1616

17+
# Check if clang-format is installed
18+
if ! command -v clang-format >/dev/null 2>&1; then
19+
echo "Error: clang-format is not installed"
20+
echo "Please install it using: brew install clang-format"
21+
exit 1
22+
fi
23+
1724
find ./src -not -path "./src/viam/api" -type f \( -name \*.cpp -o -name \*.hpp \) | xargs clang-format -style=file -i -fallback-style=none "$@"

src/viam/api/CMakeLists.txt

+8
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ if (VIAMCPPSDK_USE_DYNAMIC_PROTOS)
213213
${PROTO_GEN_DIR}/robot/v1/robot.grpc.pb.h
214214
${PROTO_GEN_DIR}/robot/v1/robot.pb.cc
215215
${PROTO_GEN_DIR}/robot/v1/robot.pb.h
216+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.grpc.pb.cc
217+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.grpc.pb.h
218+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.pb.cc
219+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.pb.h
216220
${PROTO_GEN_DIR}/service/generic/v1/generic.grpc.pb.cc
217221
${PROTO_GEN_DIR}/service/generic/v1/generic.grpc.pb.h
218222
${PROTO_GEN_DIR}/service/generic/v1/generic.pb.cc
@@ -326,6 +330,8 @@ target_sources(viamapi
326330
${PROTO_GEN_DIR}/module/v1/module.pb.cc
327331
${PROTO_GEN_DIR}/robot/v1/robot.grpc.pb.cc
328332
${PROTO_GEN_DIR}/robot/v1/robot.pb.cc
333+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.grpc.pb.cc
334+
${PROTO_GEN_DIR}/service/discovery/v1/discovery.pb.cc
329335
${PROTO_GEN_DIR}/service/generic/v1/generic.grpc.pb.cc
330336
${PROTO_GEN_DIR}/service/generic/v1/generic.pb.cc
331337
${PROTO_GEN_DIR}/service/mlmodel/v1/mlmodel.grpc.pb.cc
@@ -385,6 +391,8 @@ target_sources(viamapi
385391
${PROTO_GEN_DIR}/../../viam/api/robot/v1/robot.grpc.pb.h
386392
${PROTO_GEN_DIR}/../../viam/api/robot/v1/robot.pb.h
387393
${PROTO_GEN_DIR}/../../viam/api/tagger/v1/tagger.grpc.pb.h
394+
${PROTO_GEN_DIR}/../../viam/api/service/discovery/v1/discovery.grpc.pb.h
395+
${PROTO_GEN_DIR}/../../viam/api/service/discovery/v1/discovery.pb.h
388396
${PROTO_GEN_DIR}/../../viam/api/service/generic/v1/generic.grpc.pb.h
389397
${PROTO_GEN_DIR}/../../viam/api/service/generic/v1/generic.pb.h
390398
${PROTO_GEN_DIR}/../../viam/api/service/mlmodel/v1/mlmodel.grpc.pb.h

src/viam/examples/modules/complex/proto/buf.lock

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ deps:
44
- remote: buf.build
55
owner: googleapis
66
repository: googleapis
7-
commit: e93e34f48be043dab55be31b4b47f458
8-
digest: shake256:93dbe51c27606999eef918360df509485a4d272e79aaed6d0016940379a9b06d316fc5228b7b50cca94bb310f34c5fc5955ce7474f655f0d0a224c4121dda3c1
7+
commit: 546238c53f7340c6a2a6099fb863bc1b
8+
digest: shake256:8d75c12f391e392b24c076d05117b47aeddb090add99c70247a8f4389b906a65f61a933c68e54ed8b73a050b967b6b712ba194348b67c3ab3ee26cc2cb25852c

src/viam/sdk/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,13 @@ target_sources(viamsdk
118118
rpc/dial.cpp
119119
rpc/server.cpp
120120
rpc/private/viam_grpc_channel.cpp
121+
services/discovery.cpp
121122
services/generic.cpp
122123
services/mlmodel.cpp
123124
services/motion.cpp
124125
services/navigation.cpp
126+
services/private/discovery_client.cpp
127+
services/private/discovery_server.cpp
125128
services/private/generic_client.cpp
126129
services/private/generic_server.cpp
127130
services/private/mlmodel.cpp
@@ -181,6 +184,7 @@ target_sources(viamsdk
181184
../../viam/sdk/rpc/dial.hpp
182185
../../viam/sdk/rpc/message_sizes.hpp
183186
../../viam/sdk/rpc/server.hpp
187+
../../viam/sdk/services/discovery.hpp
184188
../../viam/sdk/services/generic.hpp
185189
../../viam/sdk/services/mlmodel.hpp
186190
../../viam/sdk/services/motion.hpp

src/viam/sdk/config/resource.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <viam/api/app/v1/robot.pb.h>
1010
#include <viam/api/robot/v1/robot.pb.h>
11+
#include <viam/api/service/discovery/v1/discovery.pb.h>
1112

1213
#include <viam/sdk/common/exception.hpp>
1314
#include <viam/sdk/common/private/repeated_ptr_convert.hpp>
@@ -156,6 +157,12 @@ ResourceConfig from_proto_impl<app::v1::ComponentConfig>::operator()(
156157
proto->has_frame() ? from_proto(proto->frame()) : LinkConfig{});
157158
}
158159

160+
std::vector<ResourceConfig>
161+
from_proto_impl<service::discovery::v1::DiscoverResourcesResponse>::operator()(
162+
const service::discovery::v1::DiscoverResourcesResponse* proto) const {
163+
return impl::from_repeated_field(proto->discoveries());
164+
}
165+
159166
} // namespace proto_convert_details
160167
} // namespace sdk
161168
} // namespace viam

src/viam/sdk/config/resource.hpp

+15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ class ResourceLevelServiceConfig;
1717

1818
} // namespace v1
1919
} // namespace app
20+
21+
namespace service {
22+
namespace discovery {
23+
namespace v1 {
24+
25+
class DiscoverResourcesResponse;
26+
}
27+
} // namespace discovery
28+
} // namespace service
2029
} // namespace viam
2130

2231
namespace viam {
@@ -83,6 +92,12 @@ struct from_proto_impl<app::v1::ComponentConfig> {
8392
ResourceConfig operator()(const app::v1::ComponentConfig*) const;
8493
};
8594

95+
template <>
96+
struct from_proto_impl<service::discovery::v1::DiscoverResourcesResponse> {
97+
std::vector<ResourceConfig> operator()(
98+
const service::discovery::v1::DiscoverResourcesResponse*) const;
99+
};
100+
86101
} // namespace proto_convert_details
87102

88103
} // namespace sdk

src/viam/sdk/registry/registry.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include <viam/sdk/components/private/servo_server.hpp>
4343
#include <viam/sdk/resource/resource.hpp>
4444
#include <viam/sdk/resource/resource_api.hpp>
45+
#include <viam/sdk/services/private/discovery_client.hpp>
46+
#include <viam/sdk/services/private/discovery_server.hpp>
4547
#include <viam/sdk/services/private/generic_client.hpp>
4648
#include <viam/sdk/services/private/generic_server.hpp>
4749
#include <viam/sdk/services/private/mlmodel_client.hpp>
@@ -202,6 +204,7 @@ void register_resources() {
202204
Registry::register_resource<impl::ServoClient, impl::ServoServer>();
203205

204206
// Register all services
207+
Registry::register_resource<impl::DiscoveryClient, impl::DiscoveryServer>();
205208
Registry::register_resource<impl::GenericServiceClient, impl::GenericServiceServer>();
206209
Registry::register_resource<impl::MLModelServiceClient, impl::MLModelServiceServer>();
207210
Registry::register_resource<impl::MotionClient, impl::MotionServer>();

src/viam/sdk/services/discovery.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <viam/sdk/services/discovery.hpp>
2+
3+
#include <viam/sdk/common/utils.hpp>
4+
5+
namespace viam {
6+
namespace sdk {
7+
8+
Discovery::Discovery(std::string name) : Service(std::move(name)) {}
9+
10+
API Discovery::api() const {
11+
return API::get<Discovery>();
12+
}
13+
14+
API API::traits<Discovery>::api() {
15+
return {kRDK, kService, "discovery"};
16+
}
17+
18+
} // namespace sdk
19+
} // namespace viam

src/viam/sdk/services/discovery.hpp

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/// @file services/discovery.hpp
2+
///
3+
/// @brief Defines a `Discovery` service.
4+
5+
#pragma once
6+
7+
#include <string>
8+
9+
#include <viam/sdk/common/utils.hpp>
10+
#include <viam/sdk/config/resource.hpp>
11+
#include <viam/sdk/services/service.hpp>
12+
13+
namespace viam {
14+
namespace sdk {
15+
16+
/// @defgroup Discovery Classes related to the Discovery service.
17+
18+
/// @class Discovery discovery.hpp "services/discovery.hpp"
19+
/// @brief A `Discovery` service is used to discover resources that are physically connected to
20+
/// your machine.
21+
/// @ingroup Discovery
22+
///
23+
/// This acts as an abstract parent class to be inherited from by any drivers representing
24+
/// specific discovery implementations. This class cannot be used on its own.
25+
class Discovery : public Service {
26+
public:
27+
/// @brief Discover valid viam configuration of resources that are physically
28+
/// connected to your machine.
29+
/// @return array of potential viam configurations for hardware physically
30+
/// connected to your viam server
31+
inline std::vector<ResourceConfig> discover_resources() {
32+
return discover_resources({});
33+
}
34+
35+
/// @brief Discover valid viam configuration of resources that are physically
36+
/// connected to your machine.
37+
/// @param extra Any additional arguments to the method.
38+
/// @return array of potential viam configurations for hardware physically
39+
// connected to your viam server
40+
virtual std::vector<ResourceConfig> discover_resources(const ProtoStruct& extra) = 0;
41+
42+
/// @brief Do an arbitrary command.
43+
/// @param command Freeform fields that are service-specific.
44+
/// @return Freeform result of the command.
45+
virtual ProtoStruct do_command(const ProtoStruct& command) = 0;
46+
47+
API api() const override;
48+
49+
protected:
50+
explicit Discovery(std::string name);
51+
};
52+
53+
template <>
54+
struct API::traits<Discovery> {
55+
static API api();
56+
};
57+
58+
} // namespace sdk
59+
} // namespace viam
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <viam/sdk/services/private/discovery_client.hpp>
2+
3+
#include <viam/api/service/discovery/v1/discovery.grpc.pb.h>
4+
#include <viam/api/service/discovery/v1/discovery.pb.h>
5+
6+
#include <viam/sdk/common/client_helper.hpp>
7+
#include <viam/sdk/common/private/repeated_ptr_convert.hpp>
8+
#include <viam/sdk/common/proto_value.hpp>
9+
#include <viam/sdk/common/utils.hpp>
10+
#include <viam/sdk/services/discovery.hpp>
11+
12+
namespace viam {
13+
namespace sdk {
14+
namespace impl {
15+
16+
DiscoveryClient::DiscoveryClient(std::string name, std::shared_ptr<grpc::Channel> channel)
17+
: Discovery(std::move(name)),
18+
stub_(viam::service::discovery::v1::DiscoveryService::NewStub(channel)),
19+
channel_(std::move(channel)) {}
20+
21+
std::vector<ResourceConfig> DiscoveryClient::discover_resources(const ProtoStruct& extra) {
22+
return make_client_helper(this, *stub_, &StubType::DiscoverResources)
23+
.with(extra)
24+
.invoke([](auto& response) { return from_proto(response); });
25+
}
26+
27+
ProtoStruct DiscoveryClient::do_command(const ProtoStruct& command) {
28+
return make_client_helper(this, *stub_, &StubType::DoCommand)
29+
.with([&](auto& request) { *request.mutable_command() = to_proto(command); })
30+
.invoke([](auto& response) { return from_proto(response.result()); });
31+
}
32+
33+
} // namespace impl
34+
} // namespace sdk
35+
} // namespace viam
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/// @file services/private/discovery_client.hpp
2+
///
3+
/// @brief Implements a gRPC client for the `Discovery` service
4+
#pragma once
5+
6+
#include <grpcpp/channel.h>
7+
8+
#include <viam/api/service/discovery/v1/discovery.grpc.pb.h>
9+
10+
#include <viam/sdk/services/discovery.hpp>
11+
12+
namespace viam {
13+
namespace sdk {
14+
namespace impl {
15+
16+
/// @class DiscoveryClient
17+
/// @brief gRPC client implementation of a `Discovery` service.
18+
/// @ingroup Discovery
19+
class DiscoveryClient : public Discovery {
20+
public:
21+
using interface_type = Discovery;
22+
DiscoveryClient(std::string name, std::shared_ptr<grpc::Channel> channel);
23+
24+
std::vector<ResourceConfig> discover_resources(const ProtoStruct& extra) override;
25+
ProtoStruct do_command(const ProtoStruct& command) override;
26+
27+
private:
28+
using StubType = viam::service::discovery::v1::DiscoveryService::StubInterface;
29+
std::unique_ptr<StubType> stub_;
30+
std::shared_ptr<grpc::Channel> channel_;
31+
};
32+
33+
} // namespace impl
34+
} // namespace sdk
35+
} // namespace viam
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include <viam/sdk/services/private/discovery_client.hpp>
2+
3+
#include <viam/sdk/common/private/repeated_ptr_convert.hpp>
4+
#include <viam/sdk/common/private/service_helper.hpp>
5+
#include <viam/sdk/common/proto_value.hpp>
6+
#include <viam/sdk/common/utils.hpp>
7+
#include <viam/sdk/services/private/discovery_server.hpp>
8+
9+
namespace viam {
10+
namespace sdk {
11+
namespace impl {
12+
13+
using namespace service::discovery::v1;
14+
15+
::grpc::Status DiscoveryServer::DiscoverResources(
16+
::grpc::ServerContext*,
17+
const ::viam::service::discovery::v1::DiscoverResourcesRequest* request,
18+
::viam::service::discovery::v1::DiscoverResourcesResponse* response) noexcept {
19+
return make_service_helper<Discovery>(
20+
"DiscoveryServer::DiscoverResources", this, request)([&](auto& helper, auto& discovery) {
21+
const std::vector<ResourceConfig> resources =
22+
discovery->discover_resources(helper.getExtra());
23+
for (const auto& resource : resources) {
24+
*response->mutable_discoveries()->Add() = to_proto(resource);
25+
}
26+
});
27+
}
28+
29+
::grpc::Status DiscoveryServer::DoCommand(
30+
::grpc::ServerContext*,
31+
const ::viam::common::v1::DoCommandRequest* request,
32+
::viam::common::v1::DoCommandResponse* response) noexcept {
33+
return make_service_helper<Discovery>(
34+
"DiscoveryServer::DoCommand", this, request)([&](auto&, auto& discovery) {
35+
const ProtoStruct result = discovery->do_command(from_proto(request->command()));
36+
*response->mutable_result() = to_proto(result);
37+
});
38+
}
39+
40+
} // namespace impl
41+
} // namespace sdk
42+
} // namespace viam
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/// @file services/private/discovery_server.hpp
2+
///
3+
/// @brief Implements a gRPC server for the `Discovery` service
4+
#pragma once
5+
6+
#include <viam/api/service/discovery/v1/discovery.grpc.pb.h>
7+
#include <viam/api/service/discovery/v1/discovery.pb.h>
8+
9+
#include <viam/sdk/resource/resource_manager.hpp>
10+
#include <viam/sdk/resource/resource_server_base.hpp>
11+
#include <viam/sdk/services/discovery.hpp>
12+
13+
namespace viam {
14+
namespace sdk {
15+
namespace impl {
16+
17+
/// @class DiscoveryServer
18+
/// @brief gRPC server implementation of a `Discovery` service.
19+
/// @ingroup Discovery
20+
class DiscoveryServer : public ResourceServer,
21+
public viam::service::discovery::v1::DiscoveryService::Service {
22+
public:
23+
using interface_type = Discovery;
24+
using service_type = service::discovery::v1::DiscoveryService;
25+
explicit DiscoveryServer(std::shared_ptr<ResourceManager> manager)
26+
: ResourceServer(std::move(manager)) {}
27+
28+
::grpc::Status DiscoverResources(
29+
::grpc::ServerContext* context,
30+
const ::viam::service::discovery::v1::DiscoverResourcesRequest* request,
31+
::viam::service::discovery::v1::DiscoverResourcesResponse* response) noexcept override;
32+
::grpc::Status DoCommand(::grpc::ServerContext* context,
33+
const ::viam::common::v1::DoCommandRequest* request,
34+
::viam::common::v1::DoCommandResponse* response) noexcept override;
35+
};
36+
37+
} // namespace impl
38+
} // namespace sdk
39+
} // namespace viam

src/viam/sdk/tests/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ target_sources(viamsdk_test
3030
mocks/mock_motor.cpp
3131
mocks/mock_motion.cpp
3232
mocks/mock_movement_sensor.cpp
33+
mocks/mock_discovery.cpp
3334
mocks/mock_navigation.cpp
3435
mocks/mock_pose_tracker.cpp
3536
mocks/mock_power_sensor.cpp
@@ -56,6 +57,7 @@ viamcppsdk_add_boost_test(test_board.cpp)
5657
viamcppsdk_add_boost_test(test_camera.cpp)
5758
viamcppsdk_add_boost_test(test_common.cpp)
5859
viamcppsdk_add_boost_test(test_encoder.cpp)
60+
viamcppsdk_add_boost_test(test_discovery.cpp)
5961
viamcppsdk_add_boost_test(test_gantry.cpp)
6062
viamcppsdk_add_boost_test(test_gripper.cpp)
6163
viamcppsdk_add_boost_test(test_generics.cpp)

0 commit comments

Comments
 (0)