diff --git a/src/viam/examples/modules/complex/base/impl.hpp b/src/viam/examples/modules/complex/base/impl.hpp index 7b390e0d8..0e371a79d 100644 --- a/src/viam/examples/modules/complex/base/impl.hpp +++ b/src/viam/examples/modules/complex/base/impl.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include using namespace viam::sdk; @@ -11,7 +12,7 @@ using namespace viam::sdk; // `MyBase` inherits from the `Base` class defined in the viam C++ SDK and // implements some of the relevant methods along with `reconfigure`. It also // specifies a static `validate` method that checks config validity. -class MyBase : public Base { +class MyBase : public Base, public Reconfigurable { public: MyBase(const Dependencies& deps, const ResourceConfig& cfg) : Base(cfg.name()) { this->reconfigure(deps, cfg); diff --git a/src/viam/examples/modules/complex/gizmo/impl.hpp b/src/viam/examples/modules/complex/gizmo/impl.hpp index b284deb1b..f05c0db14 100644 --- a/src/viam/examples/modules/complex/gizmo/impl.hpp +++ b/src/viam/examples/modules/complex/gizmo/impl.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "api.hpp" @@ -11,7 +12,7 @@ using namespace viam::sdk; // MyGizmo inherits from the `Gizmo` class defined in `api.hpp` and implements // all relevant methods along with `reconfigure`. It also specifies a static // `validate` method that checks config validity. -class MyGizmo : public Gizmo { +class MyGizmo : public Gizmo, public Reconfigurable { public: MyGizmo(std::string name, std::string arg1) : Gizmo(std::move(name)), arg1_(std::move(arg1)){}; MyGizmo(const Dependencies& deps, const ResourceConfig& cfg) : Gizmo(cfg.name()) { diff --git a/src/viam/examples/modules/complex/summation/impl.hpp b/src/viam/examples/modules/complex/summation/impl.hpp index 00d4bfba1..448eb1be6 100644 --- a/src/viam/examples/modules/complex/summation/impl.hpp +++ b/src/viam/examples/modules/complex/summation/impl.hpp @@ -2,13 +2,15 @@ #include +#include + #include "api.hpp" using namespace viam::sdk; // MySummation inherits from the `Summation` class defined in `api.hpp` and // implements all relevant methods along with `reconfigure`. -class MySummation : public Summation { +class MySummation : public Summation, public Reconfigurable { public: MySummation(std::string name, bool subtract) : Summation(std::move(name)), subtract_(subtract){}; diff --git a/src/viam/examples/modules/simple/main.cpp b/src/viam/examples/modules/simple/main.cpp index 4b1bcf52d..2e2c0a587 100644 --- a/src/viam/examples/modules/simple/main.cpp +++ b/src/viam/examples/modules/simple/main.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include @@ -15,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -26,9 +26,9 @@ using namespace viam::sdk; // Printer is a modular resource that can print a to_print value to STDOUT when // a DoCommand request is received or when reconfiguring. The to_print value // must be provided as an attribute in the config. -class Printer : public GenericService { +class Printer : public GenericService, public Reconfigurable { public: - void reconfigure(Dependencies deps, ResourceConfig cfg) { + void reconfigure(const Dependencies& deps, const ResourceConfig& cfg) { std::cout << "Printer " << Resource::name() << " is reconfiguring" << std::endl; for (auto& dep : deps) { std::cout << "dependency: " << dep.first.to_string() << std::endl; diff --git a/src/viam/examples/modules/tflite/main.cpp b/src/viam/examples/modules/tflite/main.cpp index d7adacb48..4ac408e05 100644 --- a/src/viam/examples/modules/tflite/main.cpp +++ b/src/viam/examples/modules/tflite/main.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -58,7 +59,9 @@ constexpr char service_name[] = "example_mlmodelservice_tflite"; // with the model. // // Any additional configuration fields are ignored. -class MLModelServiceTFLite : public vsdk::MLModelService, public vsdk::Stoppable { +class MLModelServiceTFLite : public vsdk::MLModelService, + public vsdk::Stoppable, + public vsdk::Reconfigurable { class write_to_tflite_tensor_visitor_; public: diff --git a/src/viam/sdk/CMakeLists.txt b/src/viam/sdk/CMakeLists.txt index 4805e1c07..f5eb7b7cd 100644 --- a/src/viam/sdk/CMakeLists.txt +++ b/src/viam/sdk/CMakeLists.txt @@ -82,6 +82,7 @@ target_sources(viamsdk module/signal_manager.cpp referenceframe/frame.cpp registry/registry.cpp + resource/reconfigurable.cpp resource/resource.cpp resource/resource_api.cpp resource/resource_manager.cpp @@ -155,6 +156,7 @@ target_sources(viamsdk ../../viam/sdk/module/signal_manager.hpp ../../viam/sdk/referenceframe/frame.hpp ../../viam/sdk/registry/registry.hpp + ../../viam/sdk/resource/reconfigurable.hpp ../../viam/sdk/resource/resource.hpp ../../viam/sdk/resource/resource_api.hpp ../../viam/sdk/resource/resource_manager.hpp diff --git a/src/viam/sdk/module/service.cpp b/src/viam/sdk/module/service.cpp index c5241e274..843d16664 100644 --- a/src/viam/sdk/module/service.cpp +++ b/src/viam/sdk/module/service.cpp @@ -1,11 +1,8 @@ #include #include -#include -#include #include #include -#include #include #include #include @@ -33,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -121,7 +119,7 @@ ::grpc::Status ModuleService::ReconfigureResource( " as it doesn't exist."); } try { - res->reconfigure(deps, cfg); + Reconfigurable::reconfigure_if_reconfigurable(res, deps, cfg); return grpc::Status(); } catch (const std::exception& exc) { return grpc::Status(::grpc::INTERNAL, exc.what()); diff --git a/src/viam/sdk/resource/reconfigurable.cpp b/src/viam/sdk/resource/reconfigurable.cpp new file mode 100644 index 000000000..3f65ba516 --- /dev/null +++ b/src/viam/sdk/resource/reconfigurable.cpp @@ -0,0 +1,21 @@ +#include + +#include + +namespace viam { +namespace sdk { + +Reconfigurable::~Reconfigurable() = default; +Reconfigurable::Reconfigurable() = default; + +void Reconfigurable::reconfigure_if_reconfigurable(const std::shared_ptr& resource, + const Dependencies& deps, + const ResourceConfig& cfg) { + auto reconfigurable_res = std::dynamic_pointer_cast(resource); + if (reconfigurable_res) { + reconfigurable_res->reconfigure(deps, cfg); + } +} + +} // namespace sdk +} // namespace viam diff --git a/src/viam/sdk/resource/reconfigurable.hpp b/src/viam/sdk/resource/reconfigurable.hpp new file mode 100644 index 000000000..013bf10e1 --- /dev/null +++ b/src/viam/sdk/resource/reconfigurable.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace viam { +namespace sdk { + +class Reconfigurable { + public: + virtual ~Reconfigurable(); + + /// @brief Reconfigures a resource. + /// @param deps Dependencies of the resource. + /// @param cfg The resource's config. + virtual void reconfigure(const Dependencies& deps, const ResourceConfig& cfg) = 0; + + /// @brief Reconfigures a resource if it is Reconfigurable. + /// @param resource the Resource to reconfigure. + /// @param deps Dependencies of the resource. + /// @param cfg The resource's config. + static void reconfigure_if_reconfigurable(const std::shared_ptr& resource, + const Dependencies& deps, + const ResourceConfig& cfg); + + protected: + explicit Reconfigurable(); +}; + +} // namespace sdk +} // namespace viam diff --git a/src/viam/sdk/resource/resource.cpp b/src/viam/sdk/resource/resource.cpp index 8e09d773a..876f0a4f5 100644 --- a/src/viam/sdk/resource/resource.cpp +++ b/src/viam/sdk/resource/resource.cpp @@ -1,8 +1,5 @@ #include -#include -#include - #include #include @@ -21,8 +18,6 @@ std::string Resource::name() const { return name_; } -void Resource::reconfigure(const Dependencies& deps, const ResourceConfig& cfg){}; - ResourceName Resource::get_resource_name(std::string name) const { ResourceName r; *r.mutable_namespace_() = kRDK; diff --git a/src/viam/sdk/resource/resource.hpp b/src/viam/sdk/resource/resource.hpp index 0a3456f43..fbb194029 100644 --- a/src/viam/sdk/resource/resource.hpp +++ b/src/viam/sdk/resource/resource.hpp @@ -25,11 +25,6 @@ class Resource { /// @brief Returns a `ResourceName` for a particular resource name. virtual viam::common::v1::ResourceName get_resource_name(std::string name) const; - /// @brief Reconfigures a resource. - /// @param deps Dependencies of the resource. - /// @param cfg The resource's config. - virtual void reconfigure(const Dependencies& deps, const ResourceConfig& cfg); - /// @brief Return the resource's name. virtual std::string name() const;