Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/viam/api/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ if (VIAMCPPSDK_USE_DYNAMIC_PROTOS)
${PROTO_GEN_DIR}/component/board/v1/board.grpc.pb.h
${PROTO_GEN_DIR}/component/board/v1/board.pb.cc
${PROTO_GEN_DIR}/component/board/v1/board.pb.h
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.cc
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.h
${PROTO_GEN_DIR}/component/button/v1/button.pb.cc
${PROTO_GEN_DIR}/component/button/v1/button.pb.h
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.cc
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.h
${PROTO_GEN_DIR}/component/camera/v1/camera.pb.cc
Expand Down Expand Up @@ -300,6 +304,8 @@ target_sources(viamapi
${PROTO_GEN_DIR}/component/base/v1/base.pb.cc
${PROTO_GEN_DIR}/component/board/v1/board.grpc.pb.cc
${PROTO_GEN_DIR}/component/board/v1/board.pb.cc
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.cc
${PROTO_GEN_DIR}/component/button/v1/button.pb.cc
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.cc
${PROTO_GEN_DIR}/component/camera/v1/camera.pb.cc
${PROTO_GEN_DIR}/component/encoder/v1/encoder.grpc.pb.cc
Expand Down Expand Up @@ -360,6 +366,8 @@ target_sources(viamapi
${PROTO_GEN_DIR}/../../viam/api/component/base/v1/base.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/board/v1/board.grpc.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/board/v1/board.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/button/v1/button.grpc.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/button/v1/button.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/camera/v1/camera.grpc.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/camera/v1/camera.pb.h
${PROTO_GEN_DIR}/../../viam/api/component/encoder/v1/encoder.grpc.pb.h
Expand Down
4 changes: 4 additions & 0 deletions src/viam/sdk/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ target_sources(viamsdk
components/arm.cpp
components/base.cpp
components/board.cpp
components/button.cpp
components/camera.cpp
components/component.cpp
components/encoder.cpp
Expand All @@ -78,6 +79,8 @@ target_sources(viamsdk
components/private/board_client.cpp
components/private/board_server.cpp
components/private/camera_client.cpp
components/private/button_client.cpp
components/private/button_server.cpp
components/private/camera_server.cpp
components/private/encoder.cpp
components/private/encoder_client.cpp
Expand Down Expand Up @@ -157,6 +160,7 @@ target_sources(viamsdk
../../viam/sdk/components/arm.hpp
../../viam/sdk/components/base.hpp
../../viam/sdk/components/board.hpp
../../viam/sdk/components/button.hpp
../../viam/sdk/components/camera.hpp
../../viam/sdk/components/component.hpp
../../viam/sdk/components/encoder.hpp
Expand Down
19 changes: 19 additions & 0 deletions src/viam/sdk/components/button.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <viam/sdk/components/button.hpp>

#include <viam/sdk/common/utils.hpp>

namespace viam {
namespace sdk {

API Button::api() const {
return API::get<Button>();
}

API API::traits<Button>::api() {
return {kRDK, kComponent, "button"};
}

Button::Button(std::string name) : Component(std::move(name)) {}

} // namespace sdk
} // namespace viam
51 changes: 51 additions & 0 deletions src/viam/sdk/components/button.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/// @file components/button.hpp
///
/// @brief Defines a `Button` component
#pragma once

#include <string>

#include <viam/sdk/common/proto_value.hpp>
#include <viam/sdk/components/component.hpp>
#include <viam/sdk/resource/resource_api.hpp>

namespace viam {
namespace sdk {

/// @defgroup Button Classes related to the Button component.

/// @class Button button.hpp "components/button.hpp"
/// @brief A `Button` represents a physical or virtual button.
/// @ingroup Button
///
/// This acts as an abstract parent class to be inherited from by any drivers representing
/// specific button implementations. This class cannot be used on its own.
class Button : public Component {
public:
/// @brief Push the button.
inline void push() {
return push({});
}

/// @brief Push the button.
/// @param extra Any additional arguments to the method.
virtual void push(const ProtoStruct& extra) = 0;

/// @brief Send/receive arbitrary commands to the resource.
/// @param Command the command to execute.
/// @return The result of the executed command.
virtual ProtoStruct do_command(const ProtoStruct& command) = 0;

API api() const override;

protected:
explicit Button(std::string name);
};

template <>
struct API::traits<Button> {
static API api();
};

} // namespace sdk
} // namespace viam
30 changes: 30 additions & 0 deletions src/viam/sdk/components/private/button_client.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#include <viam/sdk/components/private/button_client.hpp>

#include <viam/api/component/button/v1/button.grpc.pb.h>
#include <viam/api/component/button/v1/button.pb.h>

#include <viam/sdk/common/client_helper.hpp>
#include <viam/sdk/common/proto_value.hpp>

namespace viam {
namespace sdk {
namespace impl {

ButtonClient::ButtonClient(std::string name, std::shared_ptr<grpc::Channel> channel)
: Button(std::move(name)),
stub_(viam::component::button::v1::ButtonService::NewStub(channel)),
channel_(std::move(channel)) {}

void ButtonClient::push(const ProtoStruct& extra) {
return make_client_helper(this, *stub_, &StubType::Push).with(extra).invoke();
}

ProtoStruct ButtonClient::do_command(const ProtoStruct& command) {
return make_client_helper(this, *stub_, &StubType::DoCommand)
.with([&](auto& request) { *request.mutable_command() = to_proto(command); })
.invoke([](auto& response) { return from_proto(response.result()); });
}

} // namespace impl
} // namespace sdk
} // namespace viam
39 changes: 39 additions & 0 deletions src/viam/sdk/components/private/button_client.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/// @file components/private/button_client.hpp
///
/// @brief Implements a gRPC client for the `Button` component
#pragma once

#include <memory>

#include <grpcpp/channel.h>

#include <viam/api/component/button/v1/button.grpc.pb.h>

#include <viam/sdk/components/button.hpp>

namespace viam {
namespace sdk {
namespace impl {

/// @class ButtonClient
/// @brief gRPC client implementation of a `Button` component
/// @ingroup Button
class ButtonClient : public Button {
public:
using interface_type = Button;
ButtonClient(std::string name, std::shared_ptr<grpc::Channel> channel);

void push(const ProtoStruct& extra) override;
ProtoStruct do_command(const ProtoStruct& command) override;

using Button::push;

private:
using StubType = viam::component::button::v1::ButtonService::StubInterface;
std::unique_ptr<StubType> stub_;
std::shared_ptr<grpc::Channel> channel_;
};

} // namespace impl
} // namespace sdk
} // namespace viam
31 changes: 31 additions & 0 deletions src/viam/sdk/components/private/button_server.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <viam/sdk/components/private/button_server.hpp>

#include <viam/sdk/common/private/service_helper.hpp>

namespace viam {
namespace sdk {
namespace impl {

ButtonServer::ButtonServer(std::shared_ptr<ResourceManager> manager)
: ResourceServer(std::move(manager)) {}

::grpc::Status ButtonServer::Push(::grpc::ServerContext*,
const ::viam::component::button::v1::PushRequest* request,
::viam::component::button::v1::PushResponse*) noexcept {
return make_service_helper<Button>("ButtonServer::Push", this, request)(
[&](auto& helper, auto& button) { button->push(helper.getExtra()); });
}

::grpc::Status ButtonServer::DoCommand(::grpc::ServerContext*,
const ::viam::common::v1::DoCommandRequest* request,
::viam::common::v1::DoCommandResponse* response) noexcept {
return make_service_helper<Button>(
"ButtonServer::DoCommand", this, request)([&](auto&, auto& button) {
const ProtoStruct result = button->do_command(from_proto(request->command()));
*response->mutable_result() = to_proto(result);
});
}

} // namespace impl
} // namespace sdk
} // namespace viam
36 changes: 36 additions & 0 deletions src/viam/sdk/components/private/button_server.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/// @file components/private/button_server.hpp
///
/// @brief Implements a gRPC server for the `Button` component
#pragma once

#include <viam/api/component/button/v1/button.grpc.pb.h>
#include <viam/api/component/button/v1/button.pb.h>

#include <viam/sdk/components/button.hpp>
#include <viam/sdk/resource/resource_manager.hpp>
#include <viam/sdk/resource/resource_server_base.hpp>

namespace viam {
namespace sdk {
namespace impl {

class ButtonServer : public ResourceServer,
public viam::component::button::v1::ButtonService::Service {
public:
using interface_type = Button;
using service_type = component::button::v1::ButtonService;

explicit ButtonServer(std::shared_ptr<ResourceManager> manager);

::grpc::Status Push(::grpc::ServerContext* context,
const ::viam::component::button::v1::PushRequest* request,
::viam::component::button::v1::PushResponse* response) noexcept override;

::grpc::Status DoCommand(::grpc::ServerContext* context,
const ::viam::common::v1::DoCommandRequest* request,
::viam::common::v1::DoCommandResponse* response) noexcept override;
};

} // namespace impl
} // namespace sdk
} // namespace viam
3 changes: 3 additions & 0 deletions src/viam/sdk/registry/registry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#include <viam/sdk/components/private/base_server.hpp>
#include <viam/sdk/components/private/board_client.hpp>
#include <viam/sdk/components/private/board_server.hpp>
#include <viam/sdk/components/private/button_client.hpp>
#include <viam/sdk/components/private/button_server.hpp>
#include <viam/sdk/components/private/camera_client.hpp>
#include <viam/sdk/components/private/camera_server.hpp>
#include <viam/sdk/components/private/encoder_client.hpp>
Expand Down Expand Up @@ -200,6 +202,7 @@ void Registry::register_resources() {
register_resource<impl::ArmClient, impl::ArmServer>();
register_resource<impl::BaseClient, impl::BaseServer>();
register_resource<impl::BoardClient, impl::BoardServer>();
register_resource<impl::ButtonClient, impl::ButtonServer>();
register_resource<impl::CameraClient, impl::CameraServer>();
register_resource<impl::EncoderClient, impl::EncoderServer>();
register_resource<impl::GantryClient, impl::GantryServer>();
Expand Down
2 changes: 2 additions & 0 deletions src/viam/sdk/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ target_sources(viamsdk_test
mocks/mock_arm.cpp
mocks/mock_base.cpp
mocks/mock_board.cpp
mocks/mock_button.cpp
mocks/mock_encoder.cpp
mocks/mock_gantry.cpp
mocks/mock_gripper.cpp
Expand Down Expand Up @@ -55,6 +56,7 @@ viamcppsdk_link_viam_api(viamsdk_test PUBLIC)
viamcppsdk_add_boost_test(test_arm.cpp)
viamcppsdk_add_boost_test(test_base.cpp)
viamcppsdk_add_boost_test(test_board.cpp)
viamcppsdk_add_boost_test(test_button.cpp)
viamcppsdk_add_boost_test(test_camera.cpp)
viamcppsdk_add_boost_test(test_common.cpp)
viamcppsdk_add_boost_test(test_encoder.cpp)
Expand Down
25 changes: 25 additions & 0 deletions src/viam/sdk/tests/mocks/mock_button.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <viam/sdk/tests/mocks/mock_button.hpp>

#include <viam/sdk/tests/test_utils.hpp>

namespace viam {
namespace sdktests {
namespace button {

using namespace viam::sdk;

std::shared_ptr<MockButton> MockButton::get_mock_button() {
return std::make_shared<MockButton>("mock_button");
}

void MockButton::push(const ProtoStruct&) {
peek_push_called = true;
}

ProtoStruct MockButton::do_command(const ProtoStruct& command) {
return (peek_command = command);
}

} // namespace button
} // namespace sdktests
} // namespace viam
27 changes: 27 additions & 0 deletions src/viam/sdk/tests/mocks/mock_button.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once

#include <memory>
#include <string>

#include <viam/sdk/components/button.hpp>

namespace viam {
namespace sdktests {
namespace button {

class MockButton : public sdk::Button {
public:
MockButton(std::string name) : Button(std::move(name)) {}

static std::shared_ptr<MockButton> get_mock_button();

void push(const sdk::ProtoStruct& extra) override;
sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override;

bool peek_push_called{false};
sdk::ProtoStruct peek_command;
};

} // namespace button
} // namespace sdktests
} // namespace viam
Loading