diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 756a86481..3961ea70c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,10 +17,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - + - name: install Doxygen uses: ssciwr/doxygen-install@v1 - + - name: create path run: mkdir -p etc/docs/api/current diff --git a/src/viam/examples/modules/complex/client.cpp b/src/viam/examples/modules/complex/client.cpp index a24530edc..ba9d53a64 100644 --- a/src/viam/examples/modules/complex/client.cpp +++ b/src/viam/examples/modules/complex/client.cpp @@ -37,10 +37,10 @@ int main() { std::string address(uri); Options options(1, opts); - // Register custom gizmo and summation API so robot client can access resources + // Register custom gizmo and summation clients so robot client can access resources // of that type from the server. - Registry::register_resource(API::get(), Gizmo::resource_registration()); - Registry::register_resource(API::get(), Summation::resource_registration()); + Registry::register_resource_client(); + Registry::register_resource_client(); // Connect to robot. std::shared_ptr robot = RobotClient::at_address(address, options); diff --git a/src/viam/examples/modules/complex/gizmo/api.cpp b/src/viam/examples/modules/complex/gizmo/api.cpp index 1a061b6d1..4059c9034 100644 --- a/src/viam/examples/modules/complex/gizmo/api.cpp +++ b/src/viam/examples/modules/complex/gizmo/api.cpp @@ -16,35 +16,6 @@ using namespace viam::sdk; using namespace viam::component::gizmo::v1; -/* GizmoRegistration methods */ - -GizmoRegistration::GizmoRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr GizmoRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto gs = std::make_shared(std::move(manager)); - server.register_service(gs.get()); - return gs; -}; - -std::shared_ptr GizmoRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -/* Gizmo methods */ - -std::shared_ptr Gizmo::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(GizmoService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the gizmo service"); - } - return std::make_shared(sd); -} - API Gizmo::api() const { return API::get(); } @@ -68,7 +39,7 @@ grpc::Status GizmoServer::DoOne(grpc::ServerContext* context, "Called [Gizmo::DoOne] without a request"); }; - auto rg = ResourceServer::resource_manager()->resource(request->name()); + auto rg = resource_manager()->resource(request->name()); if (!rg) { return grpc::Status(grpc::UNKNOWN, "resource not found: " + request->name()); } diff --git a/src/viam/examples/modules/complex/gizmo/api.hpp b/src/viam/examples/modules/complex/gizmo/api.hpp index da4f9649b..fa5cc44ba 100644 --- a/src/viam/examples/modules/complex/gizmo/api.hpp +++ b/src/viam/examples/modules/complex/gizmo/api.hpp @@ -15,22 +15,9 @@ using namespace viam::sdk; using namespace viam::component::gizmo::v1; -// `GizmoRegistration` Defines a `ResourceRegistration` for the `Gizmo` -// component. -class GizmoRegistration : public ResourceRegistration { - public: - explicit GizmoRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - // `Gizmo` is a custom modular component. class Gizmo : public Component { public: - // methods shared across all components - static std::shared_ptr resource_registration(); API api() const override; virtual bool do_one(std::string arg1) = 0; @@ -53,6 +40,7 @@ struct API::traits { // `GizmoClient` is the gRPC client implementation of a `Gizmo` component. class GizmoClient : public Gizmo { public: + using interface_type = Gizmo; GizmoClient(std::string name, std::shared_ptr channel); bool do_one(std::string arg1) override; @@ -70,6 +58,8 @@ class GizmoClient : public Gizmo { // `GizmoServer` is the gRPC server implementation of a `Gizmo` component. class GizmoServer : public ResourceServer, public GizmoService::Service { public: + using interface_type = Gizmo; + using service_type = GizmoService; explicit GizmoServer(std::shared_ptr manager); grpc::Status DoOne(grpc::ServerContext* context, diff --git a/src/viam/examples/modules/complex/main.cpp b/src/viam/examples/modules/complex/main.cpp index 4ab7cb662..c8f447224 100644 --- a/src/viam/examples/modules/complex/main.cpp +++ b/src/viam/examples/modules/complex/main.cpp @@ -28,36 +28,29 @@ using namespace viam::sdk; int main(int argc, char** argv) { - API base_api = API::get(); Model mybase_model("viam", "base", "mybase"); + // Make sure to explicity register resources with custom APIs. + Registry::register_resource_server(); + Registry::register_resource_server(); + std::shared_ptr mybase_mr = std::make_shared( - base_api, + API::get(), mybase_model, [](Dependencies deps, ResourceConfig cfg) { return std::make_unique(deps, cfg); }, MyBase::validate); - API gizmo_api = API::get(); Model mygizmo_model("viam", "gizmo", "mygizmo"); - // Make sure to explicity register resources with custom APIs. Note that - // this must be done in `main` and not in resource implementation files due - // to order of static initialization. - Registry::register_resource(gizmo_api, Gizmo::resource_registration()); std::shared_ptr mygizmo_mr = std::make_shared( - gizmo_api, + API::get(), mygizmo_model, [](Dependencies deps, ResourceConfig cfg) { return std::make_unique(deps, cfg); }, MyGizmo::validate); - API summation_api = API::get(); Model mysummation_model("viam", "summation", "mysummation"); - // Make sure to explicity register resources with custom APIs. Note that - // this must be done in `main` and not in resource implementation files due - // to order of static initialization. - Registry::register_resource(summation_api, Summation::resource_registration()); std::shared_ptr mysummation_mr = std::make_shared( - summation_api, mysummation_model, [](Dependencies deps, ResourceConfig cfg) { + API::get(), mysummation_model, [](Dependencies deps, ResourceConfig cfg) { return std::make_unique(deps, cfg); }); diff --git a/src/viam/examples/modules/complex/proto/buf.lock b/src/viam/examples/modules/complex/proto/buf.lock index 4144ecf50..b46be1102 100644 --- a/src/viam/examples/modules/complex/proto/buf.lock +++ b/src/viam/examples/modules/complex/proto/buf.lock @@ -4,5 +4,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: a86849a25cc04f4dbe9b15ddddfbc488 - digest: shake256:e19143328f8cbfe13fc226aeee5e63773ca494693a72740a7560664270039a380d94a1344234b88c7691311460df9a9b1c2982190d0a2612eae80368718e1943 + commit: 7e6f6e774e29406da95bd61cdcdbc8bc + digest: shake256:fe43dd2265ea0c07d76bd925eeba612667cf4c948d2ce53d6e367e1b4b3cb5fa69a51e6acb1a6a50d32f894f054a35e6c0406f6808a483f2752e10c866ffbf73 diff --git a/src/viam/examples/modules/complex/summation/api.cpp b/src/viam/examples/modules/complex/summation/api.cpp index bebf810a6..cab868ad8 100644 --- a/src/viam/examples/modules/complex/summation/api.cpp +++ b/src/viam/examples/modules/complex/summation/api.cpp @@ -16,36 +16,6 @@ using namespace viam::sdk; using namespace viam::service::summation::v1; -/* SummationRegistration methods */ - -SummationRegistration::SummationRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr SummationRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto ss = std::make_shared(std::move(manager)); - server.register_service(ss.get()); - return ss; -}; - -std::shared_ptr SummationRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -/* Summation methods */ - -std::shared_ptr Summation::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(SummationService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the summation service"); - } - return std::make_shared(sd); -} - API Summation::api() const { return API::get(); } diff --git a/src/viam/examples/modules/complex/summation/api.hpp b/src/viam/examples/modules/complex/summation/api.hpp index dc166da31..923b75a5a 100644 --- a/src/viam/examples/modules/complex/summation/api.hpp +++ b/src/viam/examples/modules/complex/summation/api.hpp @@ -17,22 +17,10 @@ using namespace viam::sdk; using namespace viam::service::summation::v1; -// `SummationRegistration` defines a `ResourceRegistration` for the `Summation` -// service. -class SummationRegistration : public ResourceRegistration { - public: - explicit SummationRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - // A `Summation` is a custom modular service. class Summation : public Service { public: // methods shared across all services - static std::shared_ptr resource_registration(); API api() const override; virtual double sum(std::vector numbers) = 0; @@ -52,6 +40,7 @@ struct API::traits { // service. class SummationClient : public Summation { public: + using interface_type = Summation; SummationClient(std::string name, std::shared_ptr channel); double sum(std::vector numbers) override; @@ -66,6 +55,8 @@ class SummationClient : public Summation { // service. class SummationServer : public ResourceServer, public SummationService::Service { public: + using interface_type = Summation; + using service_type = SummationService; explicit SummationServer(std::shared_ptr manager); grpc::Status Sum(grpc::ServerContext* context, diff --git a/src/viam/examples/modules/complex/test_complex_module.cpp b/src/viam/examples/modules/complex/test_complex_module.cpp index 7bd3b037f..840b42411 100644 --- a/src/viam/examples/modules/complex/test_complex_module.cpp +++ b/src/viam/examples/modules/complex/test_complex_module.cpp @@ -26,8 +26,8 @@ using namespace viam::sdktests; struct RegisterGizmoAndSummationFixture { RegisterGizmoAndSummationFixture() { - Registry::register_resource(API::get(), Gizmo::resource_registration()); - Registry::register_resource(API::get(), Summation::resource_registration()); + Registry::register_resource(); + Registry::register_resource(); } // Test teardown is a noop; diff --git a/src/viam/sdk/CMakeLists.txt b/src/viam/sdk/CMakeLists.txt index 5a5cda6c8..8b5990d55 100644 --- a/src/viam/sdk/CMakeLists.txt +++ b/src/viam/sdk/CMakeLists.txt @@ -36,13 +36,6 @@ endif() target_sources(viamsdk PRIVATE - # TODO(RSDK-1742): we have to put `registry` up top here because we need the - # registry types to be defined first, before anything tries to init them. - # this obviously isn't great. it breaks up stylistic ordering and is brittle - # when we need to add updates. we should refactor to make this unnecessary. - # consider making all necessary runtime values a single `context` that has to - # be initialized within main before anything else happens? - registry/registry.cpp common/client_helper.cpp common/linear_algebra.cpp common/pose.cpp @@ -87,6 +80,7 @@ target_sources(viamsdk module/service.cpp module/signal_manager.cpp referenceframe/frame.cpp + registry/registry.cpp resource/resource.cpp resource/resource_api.cpp resource/resource_manager.cpp diff --git a/src/viam/sdk/common/utils.cpp b/src/viam/sdk/common/utils.cpp index 53eaac254..a554eda65 100644 --- a/src/viam/sdk/common/utils.cpp +++ b/src/viam/sdk/common/utils.cpp @@ -28,8 +28,8 @@ std::vector resource_names_for_resource(const std::shared_ptr resource_names; - for (auto& kv : Registry::registered_models()) { - const std::shared_ptr reg = kv.second; + for (const auto& kv : Registry::registered_models()) { + const std::shared_ptr reg = kv.second; if (reg->api().to_string() == resource->api().to_string()) { resource_type = reg->api().resource_type(); resource_subtype = reg->api().resource_subtype(); diff --git a/src/viam/sdk/components/base/base.cpp b/src/viam/sdk/components/base/base.cpp index 9a6630168..d2740fdb9 100644 --- a/src/viam/sdk/components/base/base.cpp +++ b/src/viam/sdk/components/base/base.cpp @@ -6,39 +6,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -BaseRegistration::BaseRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr BaseRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto bs = std::make_shared(manager); - server.register_service(bs.get()); - return bs; -}; - -std::shared_ptr BaseRegistration::create_rpc_client(std::string name, - std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -std::shared_ptr Base::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::base::v1::BaseService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the base service"); - } - return std::make_shared(sd); -} - API Base::api() const { return API::get(); } @@ -68,15 +40,5 @@ bool operator==(const Base::properties& lhs, const Base::properties& rhs) { Base::Base(std::string name) : Component(std::move(name)){}; -namespace { -bool init() { - Registry::register_resource(API::get(), Base::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/base/base.hpp b/src/viam/sdk/components/base/base.hpp index e4120b017..168802d99 100644 --- a/src/viam/sdk/components/base/base.hpp +++ b/src/viam/sdk/components/base/base.hpp @@ -11,8 +11,6 @@ #include #include #include -#include -#include #include namespace viam { @@ -20,18 +18,6 @@ namespace sdk { /// @defgroup Base Classes related to the Base component. -/// @class BaseRegistration -/// @brief Defines a `ResourceRegistration` for the `Base` component. -/// @ingroup Base -class BaseRegistration : public ResourceRegistration { - public: - explicit BaseRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Base base.hpp "components/base/base.hpp" /// @brief A `Base` is the platform that the other parts of a mobile robot attach to. /// @ingroup Base @@ -52,9 +38,6 @@ class Base : public Component, public Stoppable { friend std::ostream& operator<<(std::ostream& os, const properties& v); friend bool operator==(const properties& lhs, const properties& rhs); - // functions shared across all components - static std::shared_ptr resource_registration(); - /// @brief Move a robot's base in a straight line by a given distance. This method blocks /// until completed or cancelled /// @param distance_mm Desired travel distance in millimeters diff --git a/src/viam/sdk/components/base/client.hpp b/src/viam/sdk/components/base/client.hpp index 8aec85262..ffcf62ac3 100644 --- a/src/viam/sdk/components/base/client.hpp +++ b/src/viam/sdk/components/base/client.hpp @@ -22,6 +22,7 @@ namespace sdk { /// @ingroup Base class BaseClient : public Base { public: + using interface_type = Base; BaseClient(std::string name, std::shared_ptr channel); void move_straight(int64_t distance_mm, double mm_per_sec, const AttributeMap& extra) override; void spin(double angle_deg, double degs_per_sec, const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/base/server.hpp b/src/viam/sdk/components/base/server.hpp index 6755979ec..c1046c27a 100644 --- a/src/viam/sdk/components/base/server.hpp +++ b/src/viam/sdk/components/base/server.hpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { /// @ingroup Base class BaseServer : public ResourceServer, public viam::component::base::v1::BaseService::Service { public: + using interface_type = Base; + using service_type = component::base::v1::BaseService; explicit BaseServer(std::shared_ptr manager); ::grpc::Status MoveStraight( diff --git a/src/viam/sdk/components/board/board.cpp b/src/viam/sdk/components/board/board.cpp index 56e69456a..e15d72c2e 100644 --- a/src/viam/sdk/components/board/board.cpp +++ b/src/viam/sdk/components/board/board.cpp @@ -6,39 +6,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -BoardRegistration::BoardRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor) {} - -std::shared_ptr BoardRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto bs = std::make_shared(manager); - server.register_service(bs.get()); - return bs; -} - -std::shared_ptr BoardRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -} - -std::shared_ptr Board::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::board::v1::BoardService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the board service"); - } - return std::make_shared(sd); -} - API Board::api() const { return API::get(); } @@ -153,15 +125,5 @@ bool operator==(const Board::status& lhs, const Board::status& rhs) { lhs.digital_interrupt_values == rhs.digital_interrupt_values); } -namespace { -bool init() { - Registry::register_resource(API::get(), Board::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE(cert-err58-cpp) -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/board/board.hpp b/src/viam/sdk/components/board/board.hpp index d5af2a830..aeea261d9 100644 --- a/src/viam/sdk/components/board/board.hpp +++ b/src/viam/sdk/components/board/board.hpp @@ -11,26 +11,10 @@ #include #include #include -#include -#include namespace viam { namespace sdk { -/// @defgroup Board Classes related to the Board component. - -/// @class BoardRegistration -/// @brief Defines a `ResourceRegistration` for the `Board` component. -/// @ingroup Board -class BoardRegistration : public ResourceRegistration { - public: - explicit BoardRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Board board.hpp "components/board/board.hpp" /// @brief Represents a physical board with gpio pins, digital interrupts, and analog voltage /// reading @@ -65,8 +49,6 @@ class Board : public Component { /// The effect of these power modes depends on your physical board enum class power_mode : uint8_t { normal = 0, offline_deep = 1 }; - // functions shared across all components - static std::shared_ptr resource_registration(); API api() const override; /// @brief Creates a `status` struct from its proto representation. diff --git a/src/viam/sdk/components/board/client.hpp b/src/viam/sdk/components/board/client.hpp index 4a7e0d058..b754beb2e 100644 --- a/src/viam/sdk/components/board/client.hpp +++ b/src/viam/sdk/components/board/client.hpp @@ -20,6 +20,7 @@ namespace sdk { /// @ingroup Board class BoardClient : public Board { public: + using interface_type = Board; BoardClient(std::string name, std::shared_ptr channel); AttributeMap do_command(const AttributeMap& command) override; status get_status(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/board/server.hpp b/src/viam/sdk/components/board/server.hpp index 8bf5a6c39..4ad282243 100644 --- a/src/viam/sdk/components/board/server.hpp +++ b/src/viam/sdk/components/board/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class BoardServer : public ResourceServer, public viam::component::board::v1::BoardService::Service { public: + using service_type = component::board::v1::BoardService; + using interface_type = Board; explicit BoardServer(std::shared_ptr manager); ::grpc::Status Status(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/camera/camera.cpp b/src/viam/sdk/components/camera/camera.cpp index ca41b9e09..b4bc4ac57 100644 --- a/src/viam/sdk/components/camera/camera.cpp +++ b/src/viam/sdk/components/camera/camera.cpp @@ -8,40 +8,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -CameraRegistration::CameraRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr CameraRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto cs = std::make_shared(manager); - server.register_service(cs.get()); - return cs; -}; - -std::shared_ptr CameraRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -std::shared_ptr Camera::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::camera::v1::CameraService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the camera service"); - } - return std::make_shared(sd); -} - // NOLINTNEXTLINE const std::string Camera::lazy_suffix = "+lazy"; @@ -223,15 +194,5 @@ bool operator==(const Camera::properties& lhs, const Camera::properties& rhs) { lhs.distortion_parameters == rhs.distortion_parameters; } -namespace { -bool init() { - Registry::register_resource(API::get(), Camera::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/camera/camera.hpp b/src/viam/sdk/components/camera/camera.hpp index da9f46428..6dd4eb5e3 100644 --- a/src/viam/sdk/components/camera/camera.hpp +++ b/src/viam/sdk/components/camera/camera.hpp @@ -14,27 +14,11 @@ #include #include #include -#include #include -#include namespace viam { namespace sdk { -/// @defgroup Camera Classes related to the Camera component. - -/// @class CameraRegistration -/// @brief Defines a `ResourceRegistration` for the `Camera` component. -/// @ingroup Camera -class CameraRegistration : public ResourceRegistration { - public: - explicit CameraRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Camera camera.hpp "components/camera/camera.hpp" /// @brief A `Camera` represents any physical hardware that can capture frames. /// @ingroup Camera @@ -99,9 +83,6 @@ class Camera : public Component { response_metadata metadata; }; - /// @brief Creates a `ResourceRegistration` for the `Camera` component. - static std::shared_ptr resource_registration(); - /// @brief remove any extra suffix's from the mime type string. static std::string normalize_mime_type(const std::string& str); diff --git a/src/viam/sdk/components/camera/client.hpp b/src/viam/sdk/components/camera/client.hpp index 1e6772dfa..d05c4866e 100644 --- a/src/viam/sdk/components/camera/client.hpp +++ b/src/viam/sdk/components/camera/client.hpp @@ -21,6 +21,7 @@ namespace sdk { /// @ingroup Camera class CameraClient : public Camera { public: + using interface_type = Camera; CameraClient(std::string name, std::shared_ptr channel); AttributeMap do_command(AttributeMap command) override; raw_image get_image(std::string mime_type, const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/camera/server.hpp b/src/viam/sdk/components/camera/server.hpp index a7ffdd3b2..c042b75c5 100644 --- a/src/viam/sdk/components/camera/server.hpp +++ b/src/viam/sdk/components/camera/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class CameraServer : public ResourceServer, public viam::component::camera::v1::CameraService::Service { public: + using interface_type = Camera; + using service_type = component::camera::v1::CameraService; explicit CameraServer(std::shared_ptr manager); ::grpc::Status DoCommand(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/component.cpp b/src/viam/sdk/components/component.cpp index 23d17d5a6..c44bd91e9 100644 --- a/src/viam/sdk/components/component.cpp +++ b/src/viam/sdk/components/component.cpp @@ -18,7 +18,7 @@ Component::Component() : Resource("component"){}; Component::Component(std::string name) : Resource(std::move(name)){}; -ResourceName Component::get_resource_name(std::string name) { +ResourceName Component::get_resource_name(std::string name) const { auto r = this->Resource::get_resource_name(name); *r.mutable_type() = kComponent; return r; diff --git a/src/viam/sdk/components/component.hpp b/src/viam/sdk/components/component.hpp index 26b982f93..83830d2e4 100644 --- a/src/viam/sdk/components/component.hpp +++ b/src/viam/sdk/components/component.hpp @@ -14,7 +14,7 @@ namespace sdk { class Component : public Resource { public: Component(); - viam::common::v1::ResourceName get_resource_name(std::string name) override; + viam::common::v1::ResourceName get_resource_name(std::string name) const override; protected: explicit Component(std::string name); diff --git a/src/viam/sdk/components/encoder/client.hpp b/src/viam/sdk/components/encoder/client.hpp index 3b7611394..786cf1b33 100644 --- a/src/viam/sdk/components/encoder/client.hpp +++ b/src/viam/sdk/components/encoder/client.hpp @@ -20,6 +20,7 @@ namespace sdk { /// @ingroup Encoder class EncoderClient : public Encoder { public: + using interface_type = Encoder; EncoderClient(std::string name, std::shared_ptr channel); position get_position(const AttributeMap& extra, position_type position_type) override; void reset_position(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/encoder/encoder.cpp b/src/viam/sdk/components/encoder/encoder.cpp index cca647768..52a2505c7 100644 --- a/src/viam/sdk/components/encoder/encoder.cpp +++ b/src/viam/sdk/components/encoder/encoder.cpp @@ -6,40 +6,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -EncoderRegistration::EncoderRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr EncoderRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto es = std::make_shared(manager); - server.register_service(es.get()); - return es; -}; - -std::shared_ptr EncoderRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -std::shared_ptr Encoder::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::encoder::v1::EncoderService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the encoder service"); - } - return std::make_shared(sd); -} - API Encoder::api() const { return API::get(); } @@ -125,15 +96,5 @@ bool operator==(const Encoder::properties& lhs, const Encoder::properties& rhs) lhs.angle_degrees_supported == rhs.angle_degrees_supported); } -namespace { -bool init() { - Registry::register_resource(API::get(), Encoder::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/encoder/encoder.hpp b/src/viam/sdk/components/encoder/encoder.hpp index 66eed0ffe..85ed6c450 100644 --- a/src/viam/sdk/components/encoder/encoder.hpp +++ b/src/viam/sdk/components/encoder/encoder.hpp @@ -10,26 +10,10 @@ #include #include #include -#include -#include namespace viam { namespace sdk { -/// @defgroup Encoder Classes related to the Encoder component. - -/// @class EncoderRegistration -/// @brief Defines a `ResourceRegistration` for the `Encoder` component. -/// @ingroup Encoder -class EncoderRegistration : public ResourceRegistration { - public: - explicit EncoderRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Encoder encoder.hpp "components/encoder/encoder.hpp" /// @brief An encoder is a device that is hooked up to motors to report a position /// @ingroup Encoder @@ -62,9 +46,6 @@ class Encoder : public Component { bool angle_degrees_supported; }; - // functions shared across all components - static std::shared_ptr resource_registration(); - /// @brief Creates a `position_type` struct from its proto representation. static position_type from_proto(viam::component::encoder::v1::PositionType proto); diff --git a/src/viam/sdk/components/encoder/server.hpp b/src/viam/sdk/components/encoder/server.hpp index c67c59e43..131a871c7 100644 --- a/src/viam/sdk/components/encoder/server.hpp +++ b/src/viam/sdk/components/encoder/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class EncoderServer : public ResourceServer, public viam::component::encoder::v1::EncoderService::Service { public: + using interface_type = Encoder; + using service_type = component::encoder::v1::EncoderService; explicit EncoderServer(std::shared_ptr manager); ::grpc::Status GetPosition( diff --git a/src/viam/sdk/components/generic/client.hpp b/src/viam/sdk/components/generic/client.hpp index 97a4b0168..8e24a3b03 100644 --- a/src/viam/sdk/components/generic/client.hpp +++ b/src/viam/sdk/components/generic/client.hpp @@ -18,6 +18,7 @@ namespace sdk { /// @ingroup GenericComponent class GenericComponentClient : public GenericComponent { public: + using interface_type = GenericComponent; GenericComponentClient(std::string name, std::shared_ptr channel); AttributeMap do_command(AttributeMap command) override; std::vector get_geometries(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/generic/generic.cpp b/src/viam/sdk/components/generic/generic.cpp index 4e8ebefe4..1e9929d6a 100644 --- a/src/viam/sdk/components/generic/generic.cpp +++ b/src/viam/sdk/components/generic/generic.cpp @@ -7,41 +7,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -GenericComponentRegistration::GenericComponentRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr GenericComponentRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto gs = std::make_shared(std::move(manager)); - server.register_service(gs.get()); - return gs; -}; - -std::shared_ptr GenericComponentRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -std::shared_ptr GenericComponent::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::generic::v1::GenericService::service_full_name()); - if (!sd) { - throw std::runtime_error( - "Unable to get service descriptor for the generic component service"); - } - return std::make_shared(sd); -} - API GenericComponent::api() const { return API::get(); } @@ -52,16 +22,5 @@ API API::traits::api() { GenericComponent::GenericComponent(std::string name) : Component(std::move(name)){}; -namespace { -bool init() { - Registry::register_resource(API::get(), - GenericComponent::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/generic/generic.hpp b/src/viam/sdk/components/generic/generic.hpp index 6e0a08fb7..da471227c 100644 --- a/src/viam/sdk/components/generic/generic.hpp +++ b/src/viam/sdk/components/generic/generic.hpp @@ -9,28 +9,10 @@ #include #include #include -#include -#include namespace viam { namespace sdk { -// TODO(RSDK-3030): one class per header -/// @defgroup GenericComponent Classes related to the generic component. - -/// @class GenericComponentRegistration -/// @brief Defines a `ResourceRegistration` for the generic component. -/// @ingroup GenericComponent -class GenericComponentRegistration : public ResourceRegistration { - public: - explicit GenericComponentRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class GenericComponent generic.hpp "components/generic/generic.hpp" /// @brief A `GenericComponent` represents any component that can execute arbitrary commands. /// @ingroup GenericComponent @@ -39,9 +21,6 @@ class GenericComponentRegistration : public ResourceRegistration { /// specific generic implementations. This class cannot be used on its own. class GenericComponent : public Component { public: - /// @brief Creates a `ResourceRegistration` for `GenericComponent`. - static std::shared_ptr resource_registration(); - /// @brief Send/receive arbitrary commands to the resource. /// @param command the command to execute. /// @return The result of the executed command. diff --git a/src/viam/sdk/components/generic/server.hpp b/src/viam/sdk/components/generic/server.hpp index d1061b9c0..bd59e7715 100644 --- a/src/viam/sdk/components/generic/server.hpp +++ b/src/viam/sdk/components/generic/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class GenericComponentServer : public ResourceServer, public viam::component::generic::v1::GenericService::Service { public: + using interface_type = GenericComponent; + using service_type = component::generic::v1::GenericService; explicit GenericComponentServer(std::shared_ptr manager); ::grpc::Status DoCommand(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/motor/client.hpp b/src/viam/sdk/components/motor/client.hpp index 54be57cc6..fc9769b4d 100644 --- a/src/viam/sdk/components/motor/client.hpp +++ b/src/viam/sdk/components/motor/client.hpp @@ -10,7 +10,6 @@ #include #include #include -#include namespace viam { namespace sdk { @@ -20,6 +19,7 @@ namespace sdk { /// @ingroup Motor class MotorClient : public Motor { public: + using interface_type = Motor; MotorClient(std::string name, std::shared_ptr channel); void set_power(double power_pct, const AttributeMap& extra) override; void go_for(double rpm, double revolutions, const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/motor/motor.cpp b/src/viam/sdk/components/motor/motor.cpp index 6b79b57e9..7e87cc25b 100644 --- a/src/viam/sdk/components/motor/motor.cpp +++ b/src/viam/sdk/components/motor/motor.cpp @@ -6,38 +6,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -std::shared_ptr MotorRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto ms = std::make_shared(std::move(manager)); - server.register_service(ms.get()); - return ms; -}; - -std::shared_ptr MotorRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; -MotorRegistration::MotorRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr Motor::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::motor::v1::MotorService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the motor service"); - } - return std::make_shared(sd); -} - Motor::position Motor::from_proto(viam::component::motor::v1::GetPositionResponse proto) { return proto.position(); } @@ -93,15 +66,5 @@ bool operator==(const Motor::properties& lhs, const Motor::properties& rhs) { return (lhs.position_reporting == rhs.position_reporting); } -namespace { -bool init() { - Registry::register_resource(API::get(), Motor::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/motor/motor.hpp b/src/viam/sdk/components/motor/motor.hpp index 65d9b64d4..173cd69e3 100644 --- a/src/viam/sdk/components/motor/motor.hpp +++ b/src/viam/sdk/components/motor/motor.hpp @@ -10,27 +10,11 @@ #include #include #include -#include -#include #include namespace viam { namespace sdk { -/// @defgroup Motor Classes related to the Motor component. - -/// @class MotorRegistration -/// @brief Defines a `ResourceRegistration` for the `Motor` component. -/// @ingroup Motor -class MotorRegistration : public ResourceRegistration { - public: - explicit MotorRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Motor motor.hpp "components/motor/motor.hpp" /// @brief A `Motor` represents physical hardware that controls the rotation of an axle /// @ingroup Motor @@ -61,9 +45,6 @@ class Motor : public Component, public Stoppable { bool position_reporting; }; - // functions shared across all components - static std::shared_ptr resource_registration(); - /// @brief Creates a `position` struct from its proto representation. static position from_proto(viam::component::motor::v1::GetPositionResponse proto); diff --git a/src/viam/sdk/components/motor/server.hpp b/src/viam/sdk/components/motor/server.hpp index 7e2a22c94..eb4c4db05 100644 --- a/src/viam/sdk/components/motor/server.hpp +++ b/src/viam/sdk/components/motor/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class MotorServer : public ResourceServer, public viam::component::motor::v1::MotorService::Service { public: + using interface_type = Motor; + using service_type = component::motor::v1::MotorService; explicit MotorServer(std::shared_ptr manager); ::grpc::Status SetPower( diff --git a/src/viam/sdk/components/movement_sensor/client.hpp b/src/viam/sdk/components/movement_sensor/client.hpp index e17f33f47..5f23e2117 100644 --- a/src/viam/sdk/components/movement_sensor/client.hpp +++ b/src/viam/sdk/components/movement_sensor/client.hpp @@ -21,6 +21,7 @@ namespace sdk { /// @ingroup MovementSensor class MovementSensorClient : public MovementSensor { public: + using interface_type = MovementSensor; MovementSensorClient(std::string name, std::shared_ptr channel); Vector3 get_linear_velocity(const AttributeMap& extra) override; Vector3 get_angular_velocity(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/movement_sensor/movement_sensor.cpp b/src/viam/sdk/components/movement_sensor/movement_sensor.cpp index a04105866..f8e5655a1 100644 --- a/src/viam/sdk/components/movement_sensor/movement_sensor.cpp +++ b/src/viam/sdk/components/movement_sensor/movement_sensor.cpp @@ -6,9 +6,6 @@ #include #include -#include -#include -#include #include namespace viam { @@ -104,25 +101,5 @@ bool operator==(const MovementSensor::properties& lhs, const MovementSensor::pro lhs.linear_acceleration_supported == rhs.linear_acceleration_supported); } -namespace { -class MovementSensorRegistration final - : public ResourceRegistration2 { - public: - using ResourceRegistration2::ResourceRegistration2; -}; - -bool init() { - Registry::register_resource(API::get(), - MovementSensorRegistration::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE(cert-err58-cpp) -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/movement_sensor/movement_sensor.hpp b/src/viam/sdk/components/movement_sensor/movement_sensor.hpp index 240e334e1..bd22c2ab1 100644 --- a/src/viam/sdk/components/movement_sensor/movement_sensor.hpp +++ b/src/viam/sdk/components/movement_sensor/movement_sensor.hpp @@ -10,10 +10,7 @@ #include #include #include -#include #include -#include -#include #include namespace viam { diff --git a/src/viam/sdk/components/movement_sensor/server.hpp b/src/viam/sdk/components/movement_sensor/server.hpp index c0ad7e690..023954c3e 100644 --- a/src/viam/sdk/components/movement_sensor/server.hpp +++ b/src/viam/sdk/components/movement_sensor/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -19,6 +20,8 @@ class MovementSensorServer : public ResourceServer, public viam::component::movementsensor::v1::MovementSensorService::Service { public: + using interface_type = MovementSensor; + using service_type = component::movementsensor::v1::MovementSensorService; explicit MovementSensorServer(std::shared_ptr manager); ::grpc::Status GetLinearVelocity( diff --git a/src/viam/sdk/components/power_sensor/client.hpp b/src/viam/sdk/components/power_sensor/client.hpp index c710936cd..3d638f1cc 100644 --- a/src/viam/sdk/components/power_sensor/client.hpp +++ b/src/viam/sdk/components/power_sensor/client.hpp @@ -20,6 +20,7 @@ namespace sdk { /// @ingroup PowerSensor class PowerSensorClient : public PowerSensor { public: + using interface_type = PowerSensor; PowerSensorClient(std::string name, std::shared_ptr channel); voltage get_voltage(const AttributeMap& extra) override; current get_current(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/power_sensor/power_sensor.cpp b/src/viam/sdk/components/power_sensor/power_sensor.cpp index c052e9127..137c9a7e2 100644 --- a/src/viam/sdk/components/power_sensor/power_sensor.cpp +++ b/src/viam/sdk/components/power_sensor/power_sensor.cpp @@ -4,9 +4,6 @@ #include #include -#include -#include -#include #include using namespace viam::component::powersensor::v1; @@ -58,25 +55,5 @@ bool operator==(const PowerSensor::current& lhs, const PowerSensor::current& rhs return (lhs.amperes == rhs.amperes && lhs.is_ac == rhs.is_ac); } -namespace { -class PowerSensorRegistration final - : public ResourceRegistration2 { - public: - using ResourceRegistration2::ResourceRegistration2; -}; - -bool init() { - Registry::register_resource(API::get(), - PowerSensorRegistration::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE(cert-err58-cpp) -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/power_sensor/power_sensor.hpp b/src/viam/sdk/components/power_sensor/power_sensor.hpp index 402107fec..b2052b7af 100644 --- a/src/viam/sdk/components/power_sensor/power_sensor.hpp +++ b/src/viam/sdk/components/power_sensor/power_sensor.hpp @@ -9,10 +9,7 @@ #include #include -#include #include -#include -#include using namespace viam::component::powersensor::v1; diff --git a/src/viam/sdk/components/power_sensor/server.hpp b/src/viam/sdk/components/power_sensor/server.hpp index ac6035612..0ae682916 100644 --- a/src/viam/sdk/components/power_sensor/server.hpp +++ b/src/viam/sdk/components/power_sensor/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -19,6 +20,8 @@ namespace sdk { /// @ingroup PowerSensor class PowerSensorServer : public ResourceServer, public PowerSensorService::Service { public: + using interface_type = PowerSensor; + using service_type = PowerSensorService; explicit PowerSensorServer(std::shared_ptr manager); ::grpc::Status GetVoltage(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/sensor/client.hpp b/src/viam/sdk/components/sensor/client.hpp index 0d2f5eb28..aca78a2d0 100644 --- a/src/viam/sdk/components/sensor/client.hpp +++ b/src/viam/sdk/components/sensor/client.hpp @@ -19,6 +19,7 @@ namespace sdk { /// @ingroup Sensor class SensorClient : public Sensor { public: + using interface_type = Sensor; SensorClient(std::string name, std::shared_ptr channel); AttributeMap get_readings(const AttributeMap& extra) override; AttributeMap do_command(const AttributeMap& command) override; diff --git a/src/viam/sdk/components/sensor/sensor.cpp b/src/viam/sdk/components/sensor/sensor.cpp index 35e4886bd..ad171d2b6 100644 --- a/src/viam/sdk/components/sensor/sensor.cpp +++ b/src/viam/sdk/components/sensor/sensor.cpp @@ -3,9 +3,6 @@ #include #include -#include -#include -#include #include namespace viam { @@ -19,24 +16,5 @@ API API::traits::api() { return {kRDK, kComponent, "sensor"}; } -namespace { -class SensorRegistration final - : public ResourceRegistration2 { - public: - using ResourceRegistration2::ResourceRegistration2; -}; - -bool init() { - Registry::register_resource(API::get(), SensorRegistration::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE(cert-err58-cpp) -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/sensor/sensor.hpp b/src/viam/sdk/components/sensor/sensor.hpp index d9a6d914b..a3af337f6 100644 --- a/src/viam/sdk/components/sensor/sensor.hpp +++ b/src/viam/sdk/components/sensor/sensor.hpp @@ -9,10 +9,7 @@ #include #include -#include #include -#include -#include namespace viam { namespace sdk { diff --git a/src/viam/sdk/components/sensor/server.hpp b/src/viam/sdk/components/sensor/server.hpp index 41baafbc9..c581e4e4f 100644 --- a/src/viam/sdk/components/sensor/server.hpp +++ b/src/viam/sdk/components/sensor/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -20,6 +21,8 @@ namespace sdk { class SensorServer : public ResourceServer, public viam::component::sensor::v1::SensorService::Service { public: + using interface_type = Sensor; + using service_type = component::sensor::v1::SensorService; explicit SensorServer(std::shared_ptr manager); ::grpc::Status GetReadings(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/servo/client.hpp b/src/viam/sdk/components/servo/client.hpp index fa5f2c10b..df7d1f238 100644 --- a/src/viam/sdk/components/servo/client.hpp +++ b/src/viam/sdk/components/servo/client.hpp @@ -20,6 +20,7 @@ namespace sdk { /// @ingroup Servo class ServoClient : public Servo { public: + using interface_type = Servo; ServoClient(std::string name, std::shared_ptr channel); void move(uint32_t angle_deg, const AttributeMap& extra) override; position get_position(const AttributeMap& extra) override; diff --git a/src/viam/sdk/components/servo/server.hpp b/src/viam/sdk/components/servo/server.hpp index e8ed6ff34..4556ce311 100644 --- a/src/viam/sdk/components/servo/server.hpp +++ b/src/viam/sdk/components/servo/server.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ namespace sdk { class ServoServer : public ResourceServer, public viam::component::servo::v1::ServoService::Service { public: + using interface_type = Servo; + using service_type = component::servo::v1::ServoService; explicit ServoServer(std::shared_ptr manager); ::grpc::Status Move(::grpc::ServerContext* context, diff --git a/src/viam/sdk/components/servo/servo.cpp b/src/viam/sdk/components/servo/servo.cpp index 07b779501..2b6b558b9 100644 --- a/src/viam/sdk/components/servo/servo.cpp +++ b/src/viam/sdk/components/servo/servo.cpp @@ -4,38 +4,11 @@ #include #include -#include -#include -#include #include namespace viam { namespace sdk { -std::shared_ptr ServoRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto ss = std::make_shared(std::move(manager)); - server.register_service(ss.get()); - return ss; -}; - -std::shared_ptr ServoRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; -ServoRegistration::ServoRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr Servo::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::servo::v1::ServoService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the servo service"); - } - return std::make_shared(sd); -} - API Servo::api() const { return API::get(); } @@ -48,15 +21,5 @@ Servo::position Servo::from_proto(viam::component::servo::v1::GetPositionRespons return proto.position_deg(); } -namespace { -bool init() { - Registry::register_resource(API::get(), Servo::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/components/servo/servo.hpp b/src/viam/sdk/components/servo/servo.hpp index f94a7a421..d9012b66f 100644 --- a/src/viam/sdk/components/servo/servo.hpp +++ b/src/viam/sdk/components/servo/servo.hpp @@ -8,8 +8,6 @@ #include #include #include -#include -#include #include namespace viam { @@ -17,18 +15,6 @@ namespace sdk { /// @defgroup Servo Classes related to the Servo component. -/// @class ServoRegistration -/// @brief Defines a `ResourceRegistration` for the `Servo` component. -/// @ingroup Servo -class ServoRegistration : public ResourceRegistration { - public: - explicit ServoRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class Servo servo.hpp "components/servo/servo.hpp" /// @ingroup Servo /// @@ -40,7 +26,6 @@ class Servo : public Component, public Stoppable { /// @brief Current position of the servo relative to its home typedef uint32_t position; - static std::shared_ptr resource_registration(); API api() const override; /// @brief Creates a `position` struct from its proto representation. diff --git a/src/viam/sdk/module/module.cpp b/src/viam/sdk/module/module.cpp index 5ba81bfee..87a3ee908 100644 --- a/src/viam/sdk/module/module.cpp +++ b/src/viam/sdk/module/module.cpp @@ -34,18 +34,6 @@ HandlerMap_& Module::mutable_handles() { const std::shared_ptr& Module::channel() const { return channel_; }; -const std::unordered_map>& Module::services() const { - return services_; -}; -std::unordered_map>& Module::mutable_services() { - return services_; -}; -const std::vector>& Module::servers() const { - return servers_; -}; -std::vector>& Module::mutable_servers() { - return servers_; -}; } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/module/module.hpp b/src/viam/sdk/module/module.hpp index 440cd8c2b..18c7a0b82 100644 --- a/src/viam/sdk/module/module.hpp +++ b/src/viam/sdk/module/module.hpp @@ -19,10 +19,6 @@ class Module { const HandlerMap_& handles() const; HandlerMap_& mutable_handles(); const std::shared_ptr& channel() const; - const std::unordered_map>& services() const; - std::unordered_map>& mutable_services(); - const std::vector>& servers() const; - std::vector>& mutable_servers(); private: std::string name_; @@ -30,8 +26,6 @@ class Module { bool ready_; HandlerMap_ handles_; std::shared_ptr channel_; - std::unordered_map> services_; - std::vector> servers_; }; } // namespace sdk diff --git a/src/viam/sdk/module/service.cpp b/src/viam/sdk/module/service.cpp index 257e411c2..90217bbb9 100644 --- a/src/viam/sdk/module/service.cpp +++ b/src/viam/sdk/module/service.cpp @@ -69,16 +69,18 @@ std::shared_ptr ModuleService::get_parent_resource_(Name name) { return parent_->resource_by_name(name.to_proto()); } +// TODO(RSDK-6528) - to the extent possible, switch to using `server_helper` ::grpc::Status ModuleService::AddResource(::grpc::ServerContext* context, const ::viam::module::v1::AddResourceRequest* request, ::viam::module::v1::AddResourceResponse* response) { const viam::app::v1::ComponentConfig& proto = request->config(); - ResourceConfig cfg = ResourceConfig::from_proto(proto); + const ResourceConfig cfg = ResourceConfig::from_proto(proto); const std::lock_guard lock(lock_); std::shared_ptr res; const Dependencies deps = get_dependencies_(request->dependencies(), cfg.name()); - const std::shared_ptr reg = Registry::lookup_model(cfg.api(), cfg.model()); + const std::shared_ptr reg = + Registry::lookup_model(cfg.api(), cfg.model()); if (reg) { try { res = reg->construct_resource(deps, cfg); @@ -86,14 +88,12 @@ ::grpc::Status ModuleService::AddResource(::grpc::ServerContext* context, return grpc::Status(::grpc::INTERNAL, exc.what()); } }; - const std::unordered_map>& services = module_->services(); - if (services.find(cfg.api()) == services.end()) { - return grpc::Status(grpc::UNKNOWN, "module cannot service api " + cfg.api().to_string()); + try { + server_->add_resource(res); + } catch (const std::exception& exc) { + return grpc::Status(::grpc::INTERNAL, exc.what()); } - const std::shared_ptr manager = services.at(cfg.api()); - manager->add(cfg.resource_name(), res); - return grpc::Status(); }; @@ -106,11 +106,11 @@ ::grpc::Status ModuleService::ReconfigureResource( const Dependencies deps = get_dependencies_(request->dependencies(), cfg.name()); - const std::unordered_map>& services = module_->services(); - if (services.find(cfg.api()) == services.end()) { + auto resource_server = server_->lookup_resource_server(cfg.api()); + if (!resource_server) { return grpc::Status(grpc::UNKNOWN, "no rpc service for config: " + cfg.api().to_string()); } - const std::shared_ptr manager = services.at(cfg.api()); + auto manager = resource_server->resource_manager(); // see if our resource is reconfigurable. if it is, reconfigure const std::shared_ptr res = manager->resource(cfg.resource_name().name()); @@ -133,7 +133,7 @@ ::grpc::Status ModuleService::ReconfigureResource( BOOST_LOG_TRIVIAL(error) << "unable to stop resource: " << err.what(); } - const std::shared_ptr reg = Registry::lookup_model(cfg.name()); + const std::shared_ptr reg = Registry::lookup_model(cfg.name()); if (reg) { try { const std::shared_ptr res = reg->construct_resource(deps, cfg); @@ -153,7 +153,8 @@ ::grpc::Status ModuleService::ValidateConfig( const viam::app::v1::ComponentConfig& proto = request->config(); ResourceConfig cfg = ResourceConfig::from_proto(proto); - const std::shared_ptr reg = Registry::lookup_model(cfg.api(), cfg.model()); + const std::shared_ptr reg = + Registry::lookup_model(cfg.api(), cfg.model()); if (!reg) { return grpc::Status(grpc::UNKNOWN, "unable to validate resource " + cfg.resource_name().name() + @@ -176,11 +177,11 @@ ::grpc::Status ModuleService::RemoveResource( const ::viam::module::v1::RemoveResourceRequest* request, ::viam::module::v1::RemoveResourceResponse* response) { auto name = Name::from_string(request->name()); - const std::unordered_map>& services = module_->services(); - if (services.find(name.api()) == services.end()) { + auto resource_server = server_->lookup_resource_server(name.api()); + if (!resource_server) { return grpc::Status(grpc::UNKNOWN, "no grpc service for " + name.api().to_string()); } - const std::shared_ptr manager = services.at(name.api()); + const std::shared_ptr manager = resource_server->resource_manager(); const std::shared_ptr res = manager->resource(name.name()); if (!res) { return grpc::Status( @@ -243,7 +244,7 @@ void ModuleService::serve() { server_->start(); BOOST_LOG_TRIVIAL(info) << "Module listening on " << module_->addr(); - BOOST_LOG_TRIVIAL(info) << "Module handles the following API/model pairs: " << std::endl + BOOST_LOG_TRIVIAL(info) << "Module handles the following API/model pairs:\n" << module_->handles(); signal_manager_.wait(); @@ -263,29 +264,11 @@ ModuleService::~ModuleService() { } } -void ModuleService::add_api_from_registry_inlock_(API api, const std::lock_guard&) { - const std::unordered_map>& services = module_->services(); - if (services.find(api) != services.end()) { - return; - } - auto new_manager = std::make_shared(); - - const std::shared_ptr rs = Registry::lookup_resource(api); - const std::shared_ptr resource_server = - rs->create_resource_server(new_manager, *server_); - module_->mutable_services().emplace(api, new_manager); - module_->mutable_servers().push_back(resource_server); -} - void ModuleService::add_model_from_registry_inlock_(API api, Model model, const std::lock_guard& lock) { - const std::unordered_map>& services = module_->services(); - if (services.find(api) == services.end()) { - add_api_from_registry_inlock_(api, lock); - } - - const std::shared_ptr creator = Registry::lookup_resource(api); + const std::shared_ptr creator = + Registry::lookup_resource_server(api); std::string name; const google::protobuf::ServiceDescriptor* sd = nullptr; if (creator && creator->service_descriptor()) { @@ -296,11 +279,6 @@ void ModuleService::add_model_from_registry_inlock_(API api, module_->mutable_handles().add_model(model, rpc_subtype); }; -void ModuleService::add_api_from_registry(API api) { - const std::lock_guard lock(lock_); - return add_api_from_registry_inlock_(api, lock); -} - void ModuleService::add_model_from_registry(API api, Model model) { const std::lock_guard lock(lock_); return add_model_from_registry_inlock_(api, model, lock); diff --git a/src/viam/sdk/module/service.hpp b/src/viam/sdk/module/service.hpp index 5b2b74511..077bb4616 100644 --- a/src/viam/sdk/module/service.hpp +++ b/src/viam/sdk/module/service.hpp @@ -42,10 +42,6 @@ class ModuleService : viam::module::v1::ModuleService::Service { /// (this happens when the RDK shuts down). void serve(); - /// @brief Adds an API to the module that has already been registered. - /// @param api The API to add. - void add_api_from_registry(API api); - /// @brief Adds an API/model pair to the module; both the API and model should have /// already been registered. If the ModuleService was constructed with a vector /// of ModelRegistration, the passed in models will already be registered and added. @@ -76,7 +72,6 @@ class ModuleService : viam::module::v1::ModuleService::Service { ::viam::module::v1::ValidateConfigResponse* response) override; void add_model_from_registry_inlock_(API api, Model model, const std::lock_guard&); - void add_api_from_registry_inlock_(API api, const std::lock_guard& lock); Dependencies get_dependencies_(google::protobuf::RepeatedPtrField const& proto, std::string const& resource_name); std::shared_ptr get_parent_resource_(Name name); diff --git a/src/viam/sdk/registry/registry.cpp b/src/viam/sdk/registry/registry.cpp index 2203105e5..292401c53 100644 --- a/src/viam/sdk/registry/registry.cpp +++ b/src/viam/sdk/registry/registry.cpp @@ -9,13 +9,36 @@ #include #include #include - -#include - -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include #include namespace viam { @@ -23,7 +46,8 @@ namespace sdk { using viam::robot::v1::Status; -ResourceRegistration::~ResourceRegistration() = default; +ResourceServerRegistration::~ResourceServerRegistration() = default; +ResourceClientRegistration::~ResourceClientRegistration() = default; const API& ModelRegistration::api() const { return api_; @@ -32,26 +56,36 @@ const Model& ModelRegistration::model() const { return model_; }; -void Registry::register_model(std::shared_ptr resource) { +void Registry::register_model(std::shared_ptr resource) { const std::string reg_key = resource->api().to_string() + "/" + resource->model().to_string(); if (resources_.find(reg_key) != resources_.end()) { const std::string err = "Cannot add resource with name " + reg_key + "as it already exists"; throw std::runtime_error(err); } - resources_.emplace(reg_key, resource); + resources_.emplace(std::move(reg_key), std::move(resource)); +} + +void Registry::register_resource_server_( + API api, std::shared_ptr resource_registration) { + if (server_apis_.find(api) != server_apis_.end()) { + throw std::runtime_error("Cannot add api " + api.to_string() + " as it already exists"); + } + + server_apis_.emplace(std::move(api), std::move(resource_registration)); } -void Registry::register_resource(API api, - std::shared_ptr resource_registration) { - if (apis_.find(api) != apis_.end()) { +void Registry::register_resource_client_( + API api, std::shared_ptr resource_registration) { + if (client_apis_.find(api) != client_apis_.end()) { throw std::runtime_error("Cannot add api " + api.to_string() + " as it already exists"); } - apis_.emplace(std::move(api), std::move(resource_registration)); + client_apis_.emplace(std::move(api), std::move(resource_registration)); } -std::shared_ptr Registry::lookup_model(std::string name) { +std::shared_ptr Registry::lookup_model_inlock_( + const std::string& name, const std::lock_guard&) { if (resources_.find(name) == resources_.end()) { return nullptr; } @@ -59,41 +93,104 @@ std::shared_ptr Registry::lookup_model(std::string name) { return resources_.at(name); } -std::shared_ptr Registry::lookup_model(API api, Model model) { +std::shared_ptr Registry::lookup_model(const std::string& name) { + const std::lock_guard lock(lock_); + return lookup_model_inlock_(name, std::move(lock)); +} + +std::shared_ptr Registry::lookup_model(const API& api, + const Model& model) { + const std::lock_guard lock(lock_); const std::string name = api.to_string() + "/" + model.to_string(); - return lookup_model(name); + return lookup_model_inlock_(std::move(name), std::move(lock)); } -std::shared_ptr Registry::lookup_resource(API api) { - if (apis_.find(api) == apis_.end()) { +std::shared_ptr Registry::lookup_resource_server(const API& api) { + const std::lock_guard lock(lock_); + if (server_apis_.find(api) == server_apis_.end()) { return nullptr; } - return apis_.at(api); + return server_apis_.at(api); } -std::unordered_map> Registry::registered_models() { - std::unordered_map> registry; - for (auto& resource : resources_) { - registry.emplace(resource.first, resource.second); +std::shared_ptr Registry::lookup_resource_client(const API& api) { + const std::lock_guard lock(lock_); + if (client_apis_.find(api) == client_apis_.end()) { + return nullptr; } - return registry; + + return client_apis_.at(api); +} + +const google::protobuf::ServiceDescriptor* Registry::get_service_descriptor_( + const char* service_full_name) { + const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); + const google::protobuf::ServiceDescriptor* sd = p->FindServiceByName(service_full_name); + if (!sd) { + throw std::runtime_error("Unable to get service descriptor"); + } + return sd; +} + +const std::unordered_map>& +Registry::registered_resource_servers() { + return server_apis_; +} + +const std::unordered_map>& +Registry::registered_models() { + return resources_; } // NOLINTNEXTLINE(readability-convert-member-functions-to-static) -Status ModelRegistration::create_status(std::shared_ptr resource) { +Status ModelRegistration::create_status(const std::shared_ptr& resource) const { Status status; *status.mutable_name() = resource->get_resource_name(resource->name()); *status.mutable_status() = google::protobuf::Struct(); return status; } -const google::protobuf::ServiceDescriptor* ResourceRegistration::service_descriptor() { +const google::protobuf::ServiceDescriptor* ResourceServerRegistration::service_descriptor() const { return service_descriptor_; } -std::unordered_map> Registry::resources_; -std::unordered_map> Registry::apis_; +void register_resources() { + // Register all components + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); + + // Register all services + Registry::register_resource(); + Registry::register_resource(); + Registry::register_resource(); +} + +void Registry::initialize() { + const std::lock_guard lock(lock_); + if (initialized_) { + BOOST_LOG_TRIVIAL(warning) + << "Attempted to initialize the Registry but it was already initialized."; + return; + } + initialized_ = true; + register_resources(); + grpc::reflection::InitProtoReflectionServerBuilderPlugin(); +} + +std::unordered_map> Registry::resources_; +std::unordered_map> Registry::client_apis_; +std::unordered_map> Registry::server_apis_; +std::mutex Registry::lock_; +bool Registry::initialized_{false}; } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/registry/registry.hpp b/src/viam/sdk/registry/registry.hpp index 969900215..89b4ff931 100644 --- a/src/viam/sdk/registry/registry.hpp +++ b/src/viam/sdk/registry/registry.hpp @@ -11,86 +11,56 @@ #include #include -#include - #include #include #include #include #include +#include namespace viam { namespace sdk { -// TODO(RSDK-3030): instead of std::functions, consider making these functions -// virtual -// TODO(RSDK-3030): one class per header -/// @class ResourceRegistration registry.hpp "registry/registry.hpp" -/// @brief Defines registered `Resource` creation functionality. -class ResourceRegistration { +// TODO(RSDK-6617): one class per header +class ResourceServerRegistration { public: - virtual ~ResourceRegistration(); - - /// @brief Add `Reconfigure` functionality to a resource. - std::function(std::shared_ptr, Name)> create_reconfigurable; + virtual ~ResourceServerRegistration(); /// @brief Create a resource's gRPC server. /// @param manager The server's `ResourceManager`. /// @param server The Server with which to register the relevant gRPC service. /// @return a `shared_ptr` to the gRPC server. virtual std::shared_ptr create_resource_server( - std::shared_ptr manager, Server& server) = 0; - - /// @brief Returns a reference to the `ResourceRegistration`'s service descriptor. - const google::protobuf::ServiceDescriptor* service_descriptor(); + std::shared_ptr manager, Server& server) const = 0; - /// @brief Create gRPC client to a resource. - /// @param name The name of the resource. - /// @param channel A channel connected to the client. - /// @return A `shared_ptr` to the resource client. - virtual std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr channel) = 0; + /// @brief Returns a reference to the `ResourceServerRegistration`'s service descriptor. + const google::protobuf::ServiceDescriptor* service_descriptor() const; - ResourceRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) + ResourceServerRegistration(const google::protobuf::ServiceDescriptor* service_descriptor) : service_descriptor_(service_descriptor){}; private: const google::protobuf::ServiceDescriptor* service_descriptor_; }; -// TODO(RSDK-3030): Potentially make ResourceRegistration2 the one and only -// form of resource registration. -template -class ResourceRegistration2 : public ResourceRegistration { +/// @class ResourceClientRegistration registry.hpp "registry/registry.hpp" +/// @brief Defines registered `Resource` client creation functionality. +class ResourceClientRegistration { public: - using ResourceRegistration::ResourceRegistration; - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override { - auto rs = std::make_shared(manager); - server.register_service(rs.get()); - return rs; - } + virtual ~ResourceClientRegistration(); - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override { - return std::make_shared(std::move(name), std::move(chan)); - } + /// @brief Create gRPC client to a resource. + /// @param name The name of the resource. + /// @param channel A channel connected to the client. + /// @return A `shared_ptr` to the resource client. + virtual std::shared_ptr create_rpc_client( + std::string name, std::shared_ptr channel) const = 0; - static std::shared_ptr resource_registration() { - const google::protobuf::DescriptorPool* p = - google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(ProtoServiceT::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor"); - } - return std::make_shared(sd); - } + ResourceClientRegistration() = default; }; +// TODO(RSDK-6616): instead of std::functions, consider making these functions +// virtual /// @class ModelRegistration /// @brief Information about a registered model, including a constructor and config validator. class ModelRegistration { @@ -126,14 +96,14 @@ class ModelRegistration { std::function(ResourceConfig)> validate; /// @brief Creates a `Status` object for a given resource. - viam::robot::v1::Status create_status(std::shared_ptr resource); + viam::robot::v1::Status create_status(const std::shared_ptr& resource) const; private: // default_validator is the default validator for all models if no validator // is provided in construction. No dependencies are returned. Model model_; API api_; - static const std::vector default_validator(ResourceConfig cfg) { + static std::vector default_validator(ResourceConfig cfg) { return {}; }; }; @@ -145,37 +115,105 @@ class Registry { /// @brief Registers a resource with the Registry. /// @param resource An object containing resource registration information. /// @throws `std::runtime_error` if the resource has already been registered. - static void register_model(std::shared_ptr resource); + static void register_model(std::shared_ptr resource); /// @brief Lookup a given registered resource. /// @param name The name of the resource to lookup. /// @return a `shared_ptr` to the resource's registration data. - static std::shared_ptr lookup_model(std::string name); + static std::shared_ptr lookup_model(const std::string& name); /// @brief Lookup a given registered resource. /// @param api The api of the resource to lookup. /// @param model The model of the resource to lookup. /// @return a `shared_ptr` to the resource's registration data. - static std::shared_ptr lookup_model(API api, Model model); + static std::shared_ptr lookup_model(const API& api, + const Model& model); + + /// @brief Register a resource client constructor + template + static void register_resource_client() { + class ResourceClientRegistration2 final : public ResourceClientRegistration { + public: + using ResourceClientRegistration::ResourceClientRegistration; + + std::shared_ptr create_rpc_client( + std::string name, std::shared_ptr chan) const override { + return std::make_shared(std::move(name), std::move(chan)); + } + }; + + Registry::register_resource_client_(API::get(), + std::make_shared()); + } + + /// @brief Register a resource server constructor. + template + static void register_resource_server() { + class ResourceServerRegistration2 final : public ResourceServerRegistration { + public: + using ResourceServerRegistration::ResourceServerRegistration; + std::shared_ptr create_resource_server( + std::shared_ptr manager, Server& server) const override { + auto rs = std::make_shared(manager); + server.register_service(rs.get()); + return rs; + } + }; + + const google::protobuf::ServiceDescriptor* sd = + get_service_descriptor_(ResourceServerT::service_type::service_full_name()); + Registry::register_resource_server_(API::get(), + std::make_shared(sd)); + } - /// @brief Register an api. - /// @param api The api to be registered. - /// @param resource_registration `ResourceRegistration` with resource functionality. - static void register_resource(API api, - std::shared_ptr resource_registration); + /// @brief Register resource client and server constructors + template + static void register_resource() { + register_resource_client(); + register_resource_server(); + } - /// @brief Lookup a registered api. + /// @brief Lookup a registered server api. /// @param api The api to lookup. - /// @return A `shared_ptr` to the registered api's `ResourceRegistration`. - static std::shared_ptr lookup_resource(API api); + /// @return A `shared_ptr` to the registered api's `ResourceServerRegistration`. + static std::shared_ptr lookup_resource_server(const API& api); - /// @brief Provide information on registered resources. - /// @return A map from name to `ModelRegistration` of all registered resources. - static std::unordered_map> registered_models(); + /// @brief Lookup a registered client api. + /// @param api The api to lookup. + /// @return A `shared_ptr` to the registered api's `ResourceClientRegistration`. + static std::shared_ptr lookup_resource_client(const API& api); + + /// @brief Provide information on registered resource models. + /// @return A map from name to `ModelRegistration` of all registered resource models. + static const std::unordered_map>& + registered_models(); + + /// @brief Provide access to registered resources. + /// @return A map from `API` to `ResourceServerRegistration` of all registered resources. + static const std::unordered_map>& + registered_resource_servers(); + + /// @brief Initialized the Viam registry. No-op if it has already been called. + static void initialize(); private: - static std::unordered_map> resources_; - static std::unordered_map> apis_; + static std::mutex lock_; + static bool initialized_; + static std::unordered_map> resources_; + static std::unordered_map> client_apis_; + static std::unordered_map> server_apis_; + + static void register_resource_server_( + API api, std::shared_ptr resource_registration); + + static void register_resource_client_( + API api, std::shared_ptr resource_registration); + + static const google::protobuf::ServiceDescriptor* get_service_descriptor_( + const char* service_full_name); + + static std::shared_ptr lookup_model_inlock_( + const std::string& name, const std::lock_guard&); }; } // namespace sdk diff --git a/src/viam/sdk/resource/resource.cpp b/src/viam/sdk/resource/resource.cpp index b548a0922..adbd6019f 100644 --- a/src/viam/sdk/resource/resource.cpp +++ b/src/viam/sdk/resource/resource.cpp @@ -21,7 +21,7 @@ std::string Resource::name() const { void Resource::reconfigure(Dependencies deps, ResourceConfig cfg){}; -ResourceName Resource::get_resource_name(std::string name) { +ResourceName Resource::get_resource_name(std::string name) const { ResourceName r; *r.mutable_namespace_() = kRDK; *r.mutable_type() = kResource; diff --git a/src/viam/sdk/resource/resource.hpp b/src/viam/sdk/resource/resource.hpp index 8bb9d808d..eacfd2126 100644 --- a/src/viam/sdk/resource/resource.hpp +++ b/src/viam/sdk/resource/resource.hpp @@ -23,7 +23,7 @@ class Resource { virtual API api() const = 0; /// @brief Returns a `ResourceName` for a particular resource name. - virtual viam::common::v1::ResourceName get_resource_name(std::string name); + virtual viam::common::v1::ResourceName get_resource_name(std::string name) const; /// @brief Reconfigures a resource. /// @param deps Dependencies of the resource. diff --git a/src/viam/sdk/resource/resource_server_base.hpp b/src/viam/sdk/resource/resource_server_base.hpp index 44e73ff81..a7a954090 100644 --- a/src/viam/sdk/resource/resource_server_base.hpp +++ b/src/viam/sdk/resource/resource_server_base.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include namespace viam { namespace sdk { diff --git a/src/viam/sdk/robot/client.cpp b/src/viam/sdk/robot/client.cpp index a5e2165f9..23534f140 100644 --- a/src/viam/sdk/robot/client.cpp +++ b/src/viam/sdk/robot/client.cpp @@ -178,8 +178,8 @@ void RobotClient::refresh() { // TODO(RSDK-2066): as we create wrappers, make sure components in wrappers // are being properly registered from name.subtype(), or update what we're // using for lookup - const std::shared_ptr rs = - Registry::lookup_resource({name.namespace_(), name.type(), name.subtype()}); + const std::shared_ptr rs = + Registry::lookup_resource_client({name.namespace_(), name.type(), name.subtype()}); if (rs) { try { const std::shared_ptr rpc_client = diff --git a/src/viam/sdk/robot/client.hpp b/src/viam/sdk/robot/client.hpp index cf2a3c84c..2597f4b01 100644 --- a/src/viam/sdk/robot/client.hpp +++ b/src/viam/sdk/robot/client.hpp @@ -1,4 +1,4 @@ -/// @file robot/client.cpp +/// @file robot/client.hpp /// /// @brief gRPC client implementation for a `robot`. #pragma once @@ -32,7 +32,7 @@ using viam::robot::v1::Status; // TODO(RSDK-1742) replace all `ResourceName` references in API with `Name` /// @defgroup Robot Classes related to a Robot representation. -/// @class RobotClient client.h "robot/client.h" +/// @class RobotClient client.hpp "robot/client.hpp" /// @brief gRPC client for a robot, to be used for all interactions with a robot. /// There are two ways to instantiate a robot: /// - `RobotClient::at_address(...)` diff --git a/src/viam/sdk/robot/service.cpp b/src/viam/sdk/robot/service.cpp index 83b25c81c..fc2dac40e 100644 --- a/src/viam/sdk/robot/service.cpp +++ b/src/viam/sdk/robot/service.cpp @@ -31,8 +31,12 @@ using viam::common::v1::ResourceName; using viam::robot::v1::Status; RobotService_::RobotService_(std::shared_ptr manager, Server& server) - : ResourceServer(std::move(manager)) { + : ResourceServer(manager) { server.register_service(this); + // register all managed resources with the appropriate resource servers. + for (const auto& resource : manager->resources()) { + server.add_resource(resource.second); + } } std::vector RobotService_::generate_metadata() { @@ -50,7 +54,7 @@ std::vector RobotService_::generate_status(RepeatedPtrFieldresources()) { const std::shared_ptr resource = cmp.second; for (const auto& kv : Registry::registered_models()) { - const std::shared_ptr registration = kv.second; + const std::shared_ptr registration = kv.second; if (registration->api().resource_subtype() == resource->api().resource_subtype()) { bool resource_present = false; const ResourceName name = resource->get_resource_name(resource->name()); diff --git a/src/viam/sdk/rpc/server.cpp b/src/viam/sdk/rpc/server.cpp index 60954bf2d..7988520c4 100644 --- a/src/viam/sdk/rpc/server.cpp +++ b/src/viam/sdk/rpc/server.cpp @@ -1,31 +1,61 @@ #include -#include +#include + +#include #include +#include + namespace viam { namespace sdk { -Server::Server() : builder_(std::make_unique()) {} +Server::Server() : builder_(std::make_unique()) { + Registry::initialize(); + for (const auto& rr : Registry::registered_resource_servers()) { + auto new_manager = std::make_shared(); + auto server = rr.second->create_resource_server(new_manager, *this); + managed_servers_.emplace(rr.first, std::move(server)); + } +} Server::~Server() { shutdown(); } +std::shared_ptr Server::lookup_resource_server(const API& api) { + if (managed_servers_.find(api) == managed_servers_.end()) { + return nullptr; + } + + return managed_servers_.at(api); +} + void Server::register_service(grpc::Service* service) { if (!builder_) { - throw "Cannot register a new service after the server has started"; + throw std::runtime_error("Cannot register a new service after the server has started"); } builder_->RegisterService(service); } +void Server::add_resource(std::shared_ptr resource) { + auto api = resource->api(); + if (managed_servers_.find(api) == managed_servers_.end()) { + std::ostringstream buffer; + buffer << "Attempted to add resource with API: " << api + << " but no matching resource server as found"; + throw std::runtime_error(buffer.str()); + } + auto resource_server = managed_servers_.at(std::move(api)); + resource_server->resource_manager()->add(resource->name(), std::move(resource)); +} + void Server::start() { if (server_) { throw std::runtime_error("Attempted to start server that was already running"); } - grpc::reflection::InitProtoReflectionServerBuilderPlugin(); server_ = builder_->BuildAndStart(); builder_ = nullptr; } @@ -33,7 +63,7 @@ void Server::start() { void Server::add_listening_port(std::string address, std::shared_ptr creds) { if (!builder_) { - throw "Cannot add a listening port after server has started"; + throw std::runtime_error("Cannot add a listening port after server has started"); } if (!creds) { diff --git a/src/viam/sdk/rpc/server.hpp b/src/viam/sdk/rpc/server.hpp index 28c32c281..5e1a12f03 100644 --- a/src/viam/sdk/rpc/server.hpp +++ b/src/viam/sdk/rpc/server.hpp @@ -7,6 +7,10 @@ #include #include +#include +#include +#include + namespace viam { // needed for later `friend` declaration. @@ -28,13 +32,21 @@ class Server { /// repeated calls. void start(); - // TODO: make `register_service` take one of our types as an arg rather than a - // grpc service type, and convert under the hood /// @brief Registers a gRPC service. /// @param service The gRPC service to be registered. /// @throws `std::runtime_error` if called after the server has been `start`ed. void register_service(grpc::Service* service); + /// @brief Returns reference to managed resource server. + /// @param api The api of the managed resource server. + /// @returns The requested resource server, or nullptr if it doesn't exist. + std::shared_ptr lookup_resource_server(const API& api); + + /// @brief Adds a specific managed resource to the associated resource server + /// @param resource The resource to add + /// @throws `std::runtime_error` if a matching `ResourceServer` doesn't exist in the server. + void add_resource(std::shared_ptr resource); + /// @brief Adds a listening port to the server. /// @param address The address to listen at. /// @param creds The server credentials; defaults to a insecure server credentials. @@ -52,6 +64,7 @@ class Server { friend class ::viam::sdktests::TestServer; private: + std::unordered_map> managed_servers_; std::unique_ptr builder_; std::unique_ptr server_; }; diff --git a/src/viam/sdk/services/generic/client.hpp b/src/viam/sdk/services/generic/client.hpp index 4a8bf8e30..256d230be 100644 --- a/src/viam/sdk/services/generic/client.hpp +++ b/src/viam/sdk/services/generic/client.hpp @@ -18,6 +18,7 @@ namespace sdk { /// @ingroup GenericService class GenericServiceClient : public GenericService { public: + using interface_type = GenericService; GenericServiceClient(std::string name, std::shared_ptr channel); AttributeMap do_command(AttributeMap command) override; diff --git a/src/viam/sdk/services/generic/generic.cpp b/src/viam/sdk/services/generic/generic.cpp index 2423ee84e..4fe7f446a 100644 --- a/src/viam/sdk/services/generic/generic.cpp +++ b/src/viam/sdk/services/generic/generic.cpp @@ -7,40 +7,11 @@ #include #include -#include #include -#include -#include namespace viam { namespace sdk { -GenericServiceRegistration::GenericServiceRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr GenericServiceRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto gs = std::make_shared(std::move(manager)); - server.register_service(gs.get()); - return gs; -}; - -std::shared_ptr GenericServiceRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - -std::shared_ptr GenericService::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::component::generic::v1::GenericService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the generic service"); - } - return std::make_shared(sd); -} - API GenericService::api() const { return API::get(); } @@ -51,16 +22,5 @@ API API::traits::api() { GenericService::GenericService(std::string name) : Service(std::move(name)){}; -namespace { -bool init() { - Registry::register_resource(API::get(), - GenericService::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/services/generic/generic.hpp b/src/viam/sdk/services/generic/generic.hpp index f6ab0218e..4d0568038 100644 --- a/src/viam/sdk/services/generic/generic.hpp +++ b/src/viam/sdk/services/generic/generic.hpp @@ -9,29 +9,11 @@ #include #include #include -#include -#include #include namespace viam { namespace sdk { -// TODO(RSDK-3030): one class per header -/// @defgroup GenericService Classes related to the generic service. - -/// @class GenericServiceRegistration -/// @brief Defines a `ResourceRegistration` for the `GenericService`. -/// @ingroup GenericService -class GenericServiceRegistration : public ResourceRegistration { - public: - explicit GenericServiceRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @class GenericService generic.hpp "services/generic/generic.hpp" /// @brief A `GenericService` represents any service that can execute arbitrary commands. /// @ingroup GenericService @@ -40,9 +22,6 @@ class GenericServiceRegistration : public ResourceRegistration { /// specific generic service implementations. This class cannot be used on its own. class GenericService : public Service { public: - /// @brief Creates a `ResourceRegistration` for the `GenericService`. - static std::shared_ptr resource_registration(); - /// @brief Send/receive arbitrary commands to the resource. /// @param command the command to execute. /// @return The result of the executed command. diff --git a/src/viam/sdk/services/generic/server.hpp b/src/viam/sdk/services/generic/server.hpp index f72ab2b94..0ce6f3149 100644 --- a/src/viam/sdk/services/generic/server.hpp +++ b/src/viam/sdk/services/generic/server.hpp @@ -8,6 +8,7 @@ #include #include +#include namespace viam { namespace sdk { @@ -18,6 +19,8 @@ namespace sdk { class GenericServiceServer : public ResourceServer, public viam::service::generic::v1::GenericService::Service { public: + using interface_type = GenericService; + using service_type = service::generic::v1::GenericService; explicit GenericServiceServer(std::shared_ptr manager); ::grpc::Status DoCommand(::grpc::ServerContext* context, diff --git a/src/viam/sdk/services/mlmodel/client.hpp b/src/viam/sdk/services/mlmodel/client.hpp index 83b42bb86..dd38f446f 100644 --- a/src/viam/sdk/services/mlmodel/client.hpp +++ b/src/viam/sdk/services/mlmodel/client.hpp @@ -16,6 +16,8 @@ #include +#include + #include namespace viam { @@ -28,6 +30,7 @@ namespace sdk { /// class MLModelServiceClient : public MLModelService { public: + using interface_type = MLModelService; using service_type = viam::service::mlmodel::v1::MLModelService; MLModelServiceClient(std::string name, std::shared_ptr channel); diff --git a/src/viam/sdk/services/mlmodel/mlmodel.cpp b/src/viam/sdk/services/mlmodel/mlmodel.cpp index 8cad6272d..bee188919 100644 --- a/src/viam/sdk/services/mlmodel/mlmodel.cpp +++ b/src/viam/sdk/services/mlmodel/mlmodel.cpp @@ -15,39 +15,10 @@ #include #include -#include -#include namespace viam { namespace sdk { -MLModelServiceRegistration::MLModelServiceRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor) {} - -std::shared_ptr MLModelServiceRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto mlms = std::make_shared(std::move(manager)); - server.register_service(mlms.get()); - return mlms; -}; - -std::shared_ptr MLModelServiceRegistration::create_rpc_client( - std::string name, std::shared_ptr channel) { - return std::make_shared(std::move(name), std::move(channel)); -}; - -std::shared_ptr MLModelService::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(viam::service::mlmodel::v1::MLModelService::service_full_name()); - if (!sd) { - // TODO: Throw viam exception once PR #100 merges. - throw std::runtime_error("Unable to get service descriptor for the camera service"); - } - return std::make_shared(sd); -} - API MLModelService::api() const { return API::get(); } @@ -178,16 +149,5 @@ MLModelService::tensor_info::data_types MLModelService::tensor_info::tensor_view MLModelService::MLModelService(std::string name) : Service(std::move(name)) {} -namespace { -bool init() { - Registry::register_resource(API::get(), - MLModelService::resource_registration()); - return true; -}; - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/services/mlmodel/mlmodel.hpp b/src/viam/sdk/services/mlmodel/mlmodel.hpp index e3976845f..6d24eda1b 100644 --- a/src/viam/sdk/services/mlmodel/mlmodel.hpp +++ b/src/viam/sdk/services/mlmodel/mlmodel.hpp @@ -23,25 +23,11 @@ #include #include -#include -#include #include namespace viam { namespace sdk { -class MLModelServiceRegistration : public ResourceRegistration { - public: - explicit MLModelServiceRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor); - - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr channel) override; -}; - /// @class MLModelService mlmodel.hpp "services/mlmodel/mlmodel.hpp" /// @brief Represents a machine trained learning model instance /// @@ -63,7 +49,6 @@ class MLModelService : public Service { }; public: - static std::shared_ptr resource_registration(); API api() const override; template diff --git a/src/viam/sdk/services/mlmodel/server.hpp b/src/viam/sdk/services/mlmodel/server.hpp index e4ac1f8b8..108f65684 100644 --- a/src/viam/sdk/services/mlmodel/server.hpp +++ b/src/viam/sdk/services/mlmodel/server.hpp @@ -18,6 +18,7 @@ #include #include +#include namespace viam { namespace sdk { @@ -29,6 +30,8 @@ namespace sdk { class MLModelServiceServer : public ResourceServer, public ::viam::service::mlmodel::v1::MLModelService::Service { public: + using interface_type = MLModelService; + using service_type = service::mlmodel::v1::MLModelService; explicit MLModelServiceServer(std::shared_ptr manager); ::grpc::Status Infer(::grpc::ServerContext* context, diff --git a/src/viam/sdk/services/motion/client.hpp b/src/viam/sdk/services/motion/client.hpp index 631e2762d..11acd1ce0 100644 --- a/src/viam/sdk/services/motion/client.hpp +++ b/src/viam/sdk/services/motion/client.hpp @@ -3,6 +3,8 @@ /// @brief Implements a gRPC client for the `Motion` service. #pragma once +#include + #include #include @@ -15,6 +17,7 @@ namespace sdk { /// @ingroup Motion class MotionClient : public Motion { public: + using interface_type = Motion; MotionClient(std::string name, std::shared_ptr channel); bool move(const pose_in_frame& destination, const Name& component_name, diff --git a/src/viam/sdk/services/motion/motion.cpp b/src/viam/sdk/services/motion/motion.cpp index 51d52e354..e31a1ab4a 100644 --- a/src/viam/sdk/services/motion/motion.cpp +++ b/src/viam/sdk/services/motion/motion.cpp @@ -7,28 +7,10 @@ #include #include -#include -#include namespace viam { namespace sdk { -MotionRegistration::MotionRegistration( - const google::protobuf::ServiceDescriptor* service_descriptor) - : ResourceRegistration(service_descriptor){}; - -std::shared_ptr MotionRegistration::create_resource_server( - std::shared_ptr manager, Server& server) { - auto ms = std::make_shared(manager); - server.register_service(ms.get()); - return ms; -}; - -std::shared_ptr MotionRegistration::create_rpc_client( - std::string name, std::shared_ptr chan) { - return std::make_shared(std::move(name), std::move(chan)); -}; - Motion::Motion(std::string name) : Service(std::move(name)){}; service::motion::v1::Constraints Motion::constraints::to_proto() const { @@ -106,16 +88,6 @@ API API::traits::api() { return {kRDK, kService, "motion"}; } -std::shared_ptr Motion::resource_registration() { - const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool(); - const google::protobuf::ServiceDescriptor* sd = - p->FindServiceByName(service::motion::v1::MotionService::service_full_name()); - if (!sd) { - throw std::runtime_error("Unable to get service descriptor for the motion service"); - } - return std::make_shared(sd); -} - service::motion::v1::ObstacleDetector obstacle_detector::to_proto() const { service::motion::v1::ObstacleDetector proto; *proto.mutable_vision_service() = vision_service.to_proto(); @@ -435,15 +407,5 @@ service::motion::v1::PlanStatusWithID Motion::plan_status_with_id::to_proto() co return proto; } -namespace { -bool init() { - Registry::register_resource(API::get(), Motion::resource_registration()); - return true; -} - -// NOLINTNEXTLINE -const bool inited = init(); -} // namespace - } // namespace sdk } // namespace viam diff --git a/src/viam/sdk/services/motion/motion.hpp b/src/viam/sdk/services/motion/motion.hpp index cd37d76bf..9dd352f5f 100644 --- a/src/viam/sdk/services/motion/motion.hpp +++ b/src/viam/sdk/services/motion/motion.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -19,20 +18,6 @@ namespace viam { namespace sdk { -/// @defgroup Motion Classes related to the Motion service. - -/// @class MotionRegistration -/// @brief Defines a `ResourceRegistration` for the `Motion` service. -/// @ingroup Motion -class MotionRegistration : public ResourceRegistration { - public: - explicit MotionRegistration(const google::protobuf::ServiceDescriptor* service_descriptor); - std::shared_ptr create_resource_server(std::shared_ptr manager, - Server& server) override; - std::shared_ptr create_rpc_client(std::string name, - std::shared_ptr chan) override; -}; - /// @struct obstacle_detector_name /// @brief Defines configuration for obstacle detectors by pairing a vision service name and a /// camera name. @@ -242,9 +227,6 @@ class Motion : public Service { API api() const override; - /// @brief Creates a `ResourceRegistration` for the `Motion` service. - static std::shared_ptr resource_registration(); - /// @brief Moves any compononent on the robot to a specified destination. /// @param destination Where to move the component to. /// @param name Name of the component to be moved. diff --git a/src/viam/sdk/services/motion/server.hpp b/src/viam/sdk/services/motion/server.hpp index cc145f4fe..2796a1ecc 100644 --- a/src/viam/sdk/services/motion/server.hpp +++ b/src/viam/sdk/services/motion/server.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace viam { namespace sdk { @@ -20,6 +21,8 @@ namespace sdk { class MotionServer : public ResourceServer, public viam::service::motion::v1::MotionService::Service { public: + using interface_type = Motion; + using service_type = service::motion::v1::MotionService; explicit MotionServer(std::shared_ptr manager); ::grpc::Status Move(::grpc::ServerContext* context, diff --git a/src/viam/sdk/services/service.cpp b/src/viam/sdk/services/service.cpp index 34976461a..29f6a429d 100644 --- a/src/viam/sdk/services/service.cpp +++ b/src/viam/sdk/services/service.cpp @@ -10,7 +10,7 @@ namespace viam { namespace sdk { -ResourceName Service::get_resource_name(std::string name) { +ResourceName Service::get_resource_name(std::string name) const { auto r = this->Resource::get_resource_name(name); *r.mutable_type() = kService; return r; diff --git a/src/viam/sdk/services/service.hpp b/src/viam/sdk/services/service.hpp index 101839666..817304867 100644 --- a/src/viam/sdk/services/service.hpp +++ b/src/viam/sdk/services/service.hpp @@ -11,7 +11,7 @@ namespace sdk { class Service : public Resource { public: - viam::common::v1::ResourceName get_resource_name(std::string name) override; + viam::common::v1::ResourceName get_resource_name(std::string name) const override; Service(); protected: diff --git a/src/viam/sdk/tests/mocks/mock_robot.cpp b/src/viam/sdk/tests/mocks/mock_robot.cpp index dfe6477d8..4c8f4055d 100644 --- a/src/viam/sdk/tests/mocks/mock_robot.cpp +++ b/src/viam/sdk/tests/mocks/mock_robot.cpp @@ -1,4 +1,3 @@ -#include "viam/sdk/common/proto_type.hpp" #include #include diff --git a/src/viam/sdk/tests/test_robot.cpp b/src/viam/sdk/tests/test_robot.cpp index 836a91cbc..2f047acae 100644 --- a/src/viam/sdk/tests/test_robot.cpp +++ b/src/viam/sdk/tests/test_robot.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -219,6 +220,10 @@ BOOST_AUTO_TEST_CASE(test_get_resource) { [](std::shared_ptr client, MockRobotService& service) -> void { auto mock_motor = client->resource_by_name("mock_motor"); BOOST_CHECK(mock_motor); + + // test not just that we can get the motor, but that the motor service has been + // appropriately registered such that we can actually use it. + BOOST_CHECK(!mock_motor->is_moving()); }); } diff --git a/src/viam/sdk/tests/test_utils.hpp b/src/viam/sdk/tests/test_utils.hpp index f605ab704..a6b04fc3f 100644 --- a/src/viam/sdk/tests/test_utils.hpp +++ b/src/viam/sdk/tests/test_utils.hpp @@ -1,7 +1,5 @@ #pragma once -#include - #include #include @@ -51,18 +49,11 @@ class TestServer { // The passed in test_case function will have access to the created ResourceClient. template void client_to_mock_pipeline(std::shared_ptr mock, F&& test_case) { - // Create a ResourceManager. Add the mock resource to the ResourceManager. - // Create a Server. Use the mock's API to create a resource-specific - // server (like MotorServer) from the ResourceManager and Server. Start the - // Server. - auto rm = std::make_shared(); - rm->add(mock->name(), mock); auto server = std::make_shared(); - auto rs = sdk::Registry::lookup_resource(mock->api()); - // resource_server is unused; we call create_resource_server to call - // register_service and associate the Server with the resource-specific - // server (like MotorServer). - auto resource_server = rs->create_resource_server(rm, *server); + + // normally the high level server service (either robot or module) handles adding managed + // resources, but in this case we must do it ourselves. + server->add_resource(mock); server->start(); // Create a resource-specific client to the mock over an established