Skip to content

Commit d10a337

Browse files
authored
RSDK-10311: Button component (#389)
1 parent e969bfc commit d10a337

File tree

13 files changed

+324
-0
lines changed

13 files changed

+324
-0
lines changed

src/viam/api/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ if (VIAMCPPSDK_USE_DYNAMIC_PROTOS)
153153
${PROTO_GEN_DIR}/component/board/v1/board.grpc.pb.h
154154
${PROTO_GEN_DIR}/component/board/v1/board.pb.cc
155155
${PROTO_GEN_DIR}/component/board/v1/board.pb.h
156+
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.cc
157+
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.h
158+
${PROTO_GEN_DIR}/component/button/v1/button.pb.cc
159+
${PROTO_GEN_DIR}/component/button/v1/button.pb.h
156160
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.cc
157161
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.h
158162
${PROTO_GEN_DIR}/component/camera/v1/camera.pb.cc
@@ -300,6 +304,8 @@ target_sources(viamapi
300304
${PROTO_GEN_DIR}/component/base/v1/base.pb.cc
301305
${PROTO_GEN_DIR}/component/board/v1/board.grpc.pb.cc
302306
${PROTO_GEN_DIR}/component/board/v1/board.pb.cc
307+
${PROTO_GEN_DIR}/component/button/v1/button.grpc.pb.cc
308+
${PROTO_GEN_DIR}/component/button/v1/button.pb.cc
303309
${PROTO_GEN_DIR}/component/camera/v1/camera.grpc.pb.cc
304310
${PROTO_GEN_DIR}/component/camera/v1/camera.pb.cc
305311
${PROTO_GEN_DIR}/component/encoder/v1/encoder.grpc.pb.cc
@@ -360,6 +366,8 @@ target_sources(viamapi
360366
${PROTO_GEN_DIR}/../../viam/api/component/base/v1/base.pb.h
361367
${PROTO_GEN_DIR}/../../viam/api/component/board/v1/board.grpc.pb.h
362368
${PROTO_GEN_DIR}/../../viam/api/component/board/v1/board.pb.h
369+
${PROTO_GEN_DIR}/../../viam/api/component/button/v1/button.grpc.pb.h
370+
${PROTO_GEN_DIR}/../../viam/api/component/button/v1/button.pb.h
363371
${PROTO_GEN_DIR}/../../viam/api/component/camera/v1/camera.grpc.pb.h
364372
${PROTO_GEN_DIR}/../../viam/api/component/camera/v1/camera.pb.h
365373
${PROTO_GEN_DIR}/../../viam/api/component/encoder/v1/encoder.grpc.pb.h

src/viam/sdk/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ target_sources(viamsdk
6161
components/arm.cpp
6262
components/base.cpp
6363
components/board.cpp
64+
components/button.cpp
6465
components/camera.cpp
6566
components/component.cpp
6667
components/encoder.cpp
@@ -78,6 +79,8 @@ target_sources(viamsdk
7879
components/private/board_client.cpp
7980
components/private/board_server.cpp
8081
components/private/camera_client.cpp
82+
components/private/button_client.cpp
83+
components/private/button_server.cpp
8184
components/private/camera_server.cpp
8285
components/private/encoder.cpp
8386
components/private/encoder_client.cpp
@@ -157,6 +160,7 @@ target_sources(viamsdk
157160
../../viam/sdk/components/arm.hpp
158161
../../viam/sdk/components/base.hpp
159162
../../viam/sdk/components/board.hpp
163+
../../viam/sdk/components/button.hpp
160164
../../viam/sdk/components/camera.hpp
161165
../../viam/sdk/components/component.hpp
162166
../../viam/sdk/components/encoder.hpp

src/viam/sdk/components/button.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <viam/sdk/components/button.hpp>
2+
3+
#include <viam/sdk/common/utils.hpp>
4+
5+
namespace viam {
6+
namespace sdk {
7+
8+
API Button::api() const {
9+
return API::get<Button>();
10+
}
11+
12+
API API::traits<Button>::api() {
13+
return {kRDK, kComponent, "button"};
14+
}
15+
16+
Button::Button(std::string name) : Component(std::move(name)) {}
17+
18+
} // namespace sdk
19+
} // namespace viam

src/viam/sdk/components/button.hpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/// @file components/button.hpp
2+
///
3+
/// @brief Defines a `Button` component
4+
#pragma once
5+
6+
#include <string>
7+
8+
#include <viam/sdk/common/proto_value.hpp>
9+
#include <viam/sdk/components/component.hpp>
10+
#include <viam/sdk/resource/resource_api.hpp>
11+
12+
namespace viam {
13+
namespace sdk {
14+
15+
/// @defgroup Button Classes related to the Button component.
16+
17+
/// @class Button button.hpp "components/button.hpp"
18+
/// @brief A `Button` represents a physical or virtual button.
19+
/// @ingroup Button
20+
///
21+
/// This acts as an abstract parent class to be inherited from by any drivers representing
22+
/// specific button implementations. This class cannot be used on its own.
23+
class Button : public Component {
24+
public:
25+
/// @brief Push the button.
26+
inline void push() {
27+
return push({});
28+
}
29+
30+
/// @brief Push the button.
31+
/// @param extra Any additional arguments to the method.
32+
virtual void push(const ProtoStruct& extra) = 0;
33+
34+
/// @brief Send/receive arbitrary commands to the resource.
35+
/// @param Command the command to execute.
36+
/// @return The result of the executed command.
37+
virtual ProtoStruct do_command(const ProtoStruct& command) = 0;
38+
39+
API api() const override;
40+
41+
protected:
42+
explicit Button(std::string name);
43+
};
44+
45+
template <>
46+
struct API::traits<Button> {
47+
static API api();
48+
};
49+
50+
} // namespace sdk
51+
} // namespace viam
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <viam/sdk/components/private/button_client.hpp>
2+
3+
#include <viam/api/component/button/v1/button.grpc.pb.h>
4+
#include <viam/api/component/button/v1/button.pb.h>
5+
6+
#include <viam/sdk/common/client_helper.hpp>
7+
#include <viam/sdk/common/proto_value.hpp>
8+
9+
namespace viam {
10+
namespace sdk {
11+
namespace impl {
12+
13+
ButtonClient::ButtonClient(std::string name, std::shared_ptr<grpc::Channel> channel)
14+
: Button(std::move(name)),
15+
stub_(viam::component::button::v1::ButtonService::NewStub(channel)),
16+
channel_(std::move(channel)) {}
17+
18+
void ButtonClient::push(const ProtoStruct& extra) {
19+
return make_client_helper(this, *stub_, &StubType::Push).with(extra).invoke();
20+
}
21+
22+
ProtoStruct ButtonClient::do_command(const ProtoStruct& command) {
23+
return make_client_helper(this, *stub_, &StubType::DoCommand)
24+
.with([&](auto& request) { *request.mutable_command() = to_proto(command); })
25+
.invoke([](auto& response) { return from_proto(response.result()); });
26+
}
27+
28+
} // namespace impl
29+
} // namespace sdk
30+
} // namespace viam
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/// @file components/private/button_client.hpp
2+
///
3+
/// @brief Implements a gRPC client for the `Button` component
4+
#pragma once
5+
6+
#include <memory>
7+
8+
#include <grpcpp/channel.h>
9+
10+
#include <viam/api/component/button/v1/button.grpc.pb.h>
11+
12+
#include <viam/sdk/components/button.hpp>
13+
14+
namespace viam {
15+
namespace sdk {
16+
namespace impl {
17+
18+
/// @class ButtonClient
19+
/// @brief gRPC client implementation of a `Button` component
20+
/// @ingroup Button
21+
class ButtonClient : public Button {
22+
public:
23+
using interface_type = Button;
24+
ButtonClient(std::string name, std::shared_ptr<grpc::Channel> channel);
25+
26+
void push(const ProtoStruct& extra) override;
27+
ProtoStruct do_command(const ProtoStruct& command) override;
28+
29+
using Button::push;
30+
31+
private:
32+
using StubType = viam::component::button::v1::ButtonService::StubInterface;
33+
std::unique_ptr<StubType> stub_;
34+
std::shared_ptr<grpc::Channel> channel_;
35+
};
36+
37+
} // namespace impl
38+
} // namespace sdk
39+
} // namespace viam
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <viam/sdk/components/private/button_server.hpp>
2+
3+
#include <viam/sdk/common/private/service_helper.hpp>
4+
5+
namespace viam {
6+
namespace sdk {
7+
namespace impl {
8+
9+
ButtonServer::ButtonServer(std::shared_ptr<ResourceManager> manager)
10+
: ResourceServer(std::move(manager)) {}
11+
12+
::grpc::Status ButtonServer::Push(::grpc::ServerContext*,
13+
const ::viam::component::button::v1::PushRequest* request,
14+
::viam::component::button::v1::PushResponse*) noexcept {
15+
return make_service_helper<Button>("ButtonServer::Push", this, request)(
16+
[&](auto& helper, auto& button) { button->push(helper.getExtra()); });
17+
}
18+
19+
::grpc::Status ButtonServer::DoCommand(::grpc::ServerContext*,
20+
const ::viam::common::v1::DoCommandRequest* request,
21+
::viam::common::v1::DoCommandResponse* response) noexcept {
22+
return make_service_helper<Button>(
23+
"ButtonServer::DoCommand", this, request)([&](auto&, auto& button) {
24+
const ProtoStruct result = button->do_command(from_proto(request->command()));
25+
*response->mutable_result() = to_proto(result);
26+
});
27+
}
28+
29+
} // namespace impl
30+
} // namespace sdk
31+
} // namespace viam
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/// @file components/private/button_server.hpp
2+
///
3+
/// @brief Implements a gRPC server for the `Button` component
4+
#pragma once
5+
6+
#include <viam/api/component/button/v1/button.grpc.pb.h>
7+
#include <viam/api/component/button/v1/button.pb.h>
8+
9+
#include <viam/sdk/components/button.hpp>
10+
#include <viam/sdk/resource/resource_manager.hpp>
11+
#include <viam/sdk/resource/resource_server_base.hpp>
12+
13+
namespace viam {
14+
namespace sdk {
15+
namespace impl {
16+
17+
class ButtonServer : public ResourceServer,
18+
public viam::component::button::v1::ButtonService::Service {
19+
public:
20+
using interface_type = Button;
21+
using service_type = component::button::v1::ButtonService;
22+
23+
explicit ButtonServer(std::shared_ptr<ResourceManager> manager);
24+
25+
::grpc::Status Push(::grpc::ServerContext* context,
26+
const ::viam::component::button::v1::PushRequest* request,
27+
::viam::component::button::v1::PushResponse* response) noexcept override;
28+
29+
::grpc::Status DoCommand(::grpc::ServerContext* context,
30+
const ::viam::common::v1::DoCommandRequest* request,
31+
::viam::common::v1::DoCommandResponse* response) noexcept override;
32+
};
33+
34+
} // namespace impl
35+
} // namespace sdk
36+
} // namespace viam

src/viam/sdk/registry/registry.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <viam/sdk/components/private/base_server.hpp>
2020
#include <viam/sdk/components/private/board_client.hpp>
2121
#include <viam/sdk/components/private/board_server.hpp>
22+
#include <viam/sdk/components/private/button_client.hpp>
23+
#include <viam/sdk/components/private/button_server.hpp>
2224
#include <viam/sdk/components/private/camera_client.hpp>
2325
#include <viam/sdk/components/private/camera_server.hpp>
2426
#include <viam/sdk/components/private/encoder_client.hpp>
@@ -200,6 +202,7 @@ void Registry::register_resources() {
200202
register_resource<impl::ArmClient, impl::ArmServer>();
201203
register_resource<impl::BaseClient, impl::BaseServer>();
202204
register_resource<impl::BoardClient, impl::BoardServer>();
205+
register_resource<impl::ButtonClient, impl::ButtonServer>();
203206
register_resource<impl::CameraClient, impl::CameraServer>();
204207
register_resource<impl::EncoderClient, impl::EncoderServer>();
205208
register_resource<impl::GantryClient, impl::GantryServer>();

src/viam/sdk/tests/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ target_sources(viamsdk_test
2424
mocks/mock_arm.cpp
2525
mocks/mock_base.cpp
2626
mocks/mock_board.cpp
27+
mocks/mock_button.cpp
2728
mocks/mock_encoder.cpp
2829
mocks/mock_gantry.cpp
2930
mocks/mock_gripper.cpp
@@ -55,6 +56,7 @@ viamcppsdk_link_viam_api(viamsdk_test PUBLIC)
5556
viamcppsdk_add_boost_test(test_arm.cpp)
5657
viamcppsdk_add_boost_test(test_base.cpp)
5758
viamcppsdk_add_boost_test(test_board.cpp)
59+
viamcppsdk_add_boost_test(test_button.cpp)
5860
viamcppsdk_add_boost_test(test_camera.cpp)
5961
viamcppsdk_add_boost_test(test_common.cpp)
6062
viamcppsdk_add_boost_test(test_encoder.cpp)

0 commit comments

Comments
 (0)