Skip to content

Commit f726daf

Browse files
committed
[RSDK-10923] Add IsHoldingSomething to Gripper API
1 parent 345e1a3 commit f726daf

File tree

7 files changed

+58
-0
lines changed

7 files changed

+58
-0
lines changed

src/viam/sdk/components/gripper.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <string>
77

88
#include <viam/sdk/resource/stoppable.hpp>
9+
#include <viam/sdk/common/proto_convert.hpp>
910

1011
namespace viam {
1112
namespace sdk {
@@ -20,6 +21,14 @@ namespace sdk {
2021
/// specific gripper implementations. This class cannot be used on its own.
2122
class Gripper : public Component, public Stoppable {
2223
public:
24+
25+
/// @struct holding_status
26+
/// @brief whether the gripper is holding something (along with other contextual info)
27+
struct holding_status {
28+
bool is_holding_something;
29+
ProtoStruct meta;
30+
};
31+
2332
/// @brief Open the gripper.
2433
inline void open() {
2534
return open({});
@@ -40,6 +49,17 @@ class Gripper : public Component, public Stoppable {
4049
/// @return bool indicating if the gripper grabbed something.
4150
virtual bool grab(const ProtoStruct& extra) = 0;
4251

52+
/// @brief Reports whether the gripper is holding onto a object (alongside other information).
53+
/// @return holding_status (see `holding_status` struct for more info).
54+
inline holding_status is_holding_something() {
55+
return holding_status({});
56+
}
57+
58+
/// @brief Reports whether the gripper is holding onto a object (alongside other information).
59+
/// @param extra Any additional arguments to the method.
60+
/// @return holding_status (see `holding_status` struct for more info).
61+
virtual holding_status is_holding_something(const ProtoStruct& extra) = 0;
62+
4363
/// @brief Reports if the gripper is in motion.
4464
virtual bool is_moving() = 0;
4565

src/viam/sdk/components/private/gripper_client.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ bool GripperClient::grab(const ProtoStruct& extra) {
2626
});
2727
}
2828

29+
Gripper::holding_status GripperClient::is_holding_something(const ProtoStruct& extra) {
30+
return make_client_helper(this, *stub_, &StubType::IsHoldingSomething).with(extra).invoke([](auto& response) {
31+
Gripper::holding_status holding_status;
32+
holding_status.is_holding_something = response.is_holding_something();
33+
if response.has_meta() {
34+
holding_status.meta = from_proto(response.meta());
35+
} else {
36+
holding_status.meta = {};
37+
}
38+
return holding_status;
39+
});
40+
}
41+
2942
bool GripperClient::is_moving() {
3043
return make_client_helper(this, *stub_, &StubType::IsMoving).invoke([](auto& response) {
3144
return response.is_moving();

src/viam/sdk/components/private/gripper_client.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class GripperClient : public Gripper {
2525

2626
void open(const ProtoStruct& extra) override;
2727
bool grab(const ProtoStruct& extra) override;
28+
Gripper::holding_status is_holding_something(const ProtoStruct& extra) override;
2829
void stop(const ProtoStruct& extra) override;
2930
bool is_moving() override;
3031
ProtoStruct do_command(const ProtoStruct& command) override;

src/viam/sdk/components/private/gripper_server.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ ::grpc::Status GripperServer::Grab(
2626
});
2727
}
2828

29+
::grpc::Status GripperServer::IsHoldingSomething(
30+
::grpc::ServerContext*,
31+
const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request,
32+
::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept {
33+
return make_service_helper<Gripper>(
34+
"GripperServer::IsHoldingSomething", this, request)([&](auto& helper, auto& gripper) {
35+
Gripper::holding_status res = gripper->is_holding_something(helper.getExtra());
36+
response->set_is_holding_something(res.is_holding_something);
37+
*(response->mutable_meta()) = to_proto(res.meta);
38+
});
39+
}
40+
2941
::grpc::Status GripperServer::Stop(::grpc::ServerContext*,
3042
const ::viam::component::gripper::v1::StopRequest* request,
3143
::viam::component::gripper::v1::StopResponse*) noexcept {

src/viam/sdk/components/private/gripper_server.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class GripperServer : public ResourceServer,
3333
::grpc::Status Stop(::grpc::ServerContext* context,
3434
const ::viam::component::gripper::v1::StopRequest* request,
3535
::viam::component::gripper::v1::StopResponse* response) noexcept override;
36+
37+
::grpc::Status IsHoldingSomething(::grpc::ServerContext* context,
38+
const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request,
39+
::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept override;
3640

3741
::grpc::Status IsMoving(
3842
::grpc::ServerContext* context,

src/viam/sdk/tests/mocks/mock_gripper.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ bool MockGripper::is_moving() {
2828
return false;
2929
}
3030

31+
Gripper::holding_status MockGripper::is_holding_something(const ProtoStruct&) {
32+
Gripper::holding_status res;
33+
res.is_holding_something = false;
34+
res.meta = {};
35+
return res;
36+
}
37+
3138
ProtoStruct MockGripper::do_command(const ProtoStruct& command) {
3239
return (peek_command = command);
3340
}

src/viam/sdk/tests/mocks/mock_gripper.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class MockGripper : public sdk::Gripper {
1717

1818
void open(const sdk::ProtoStruct& extra) override;
1919
bool grab(const sdk::ProtoStruct& extra) override;
20+
Gripper::holding_status MockGripper::is_holding_something(const sdk::ProtoStruct& extra) override;
2021
void stop(const sdk::ProtoStruct& extra) override;
2122
bool is_moving() override;
2223
sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override;

0 commit comments

Comments
 (0)