diff --git a/src/viam/sdk/components/gripper.hpp b/src/viam/sdk/components/gripper.hpp index c74095b2c..d76414eb0 100644 --- a/src/viam/sdk/components/gripper.hpp +++ b/src/viam/sdk/components/gripper.hpp @@ -5,6 +5,7 @@ #include +#include #include namespace viam { @@ -20,6 +21,13 @@ namespace sdk { /// specific gripper implementations. This class cannot be used on its own. class Gripper : public Component, public Stoppable { public: + /// @struct holding_status + /// @brief whether the gripper is holding something (along with other contextual info) + struct holding_status { + bool is_holding_something; + ProtoStruct meta; + }; + /// @brief Open the gripper. inline void open() { return open({}); @@ -40,6 +48,17 @@ class Gripper : public Component, public Stoppable { /// @return bool indicating if the gripper grabbed something. virtual bool grab(const ProtoStruct& extra) = 0; + /// @brief Reports whether the gripper is holding onto a object (alongside other information). + /// @return holding_status (see `holding_status` struct for more info). + inline holding_status is_holding_something() { + return holding_status({}); + } + + /// @brief Reports whether the gripper is holding onto a object (alongside other information). + /// @param extra Any additional arguments to the method. + /// @return holding_status (see `holding_status` struct for more info). + virtual holding_status is_holding_something(const ProtoStruct& extra) = 0; + /// @brief Reports if the gripper is in motion. virtual bool is_moving() = 0; diff --git a/src/viam/sdk/components/private/gripper_client.cpp b/src/viam/sdk/components/private/gripper_client.cpp index 439517bff..b7e3083c6 100644 --- a/src/viam/sdk/components/private/gripper_client.cpp +++ b/src/viam/sdk/components/private/gripper_client.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include namespace viam { @@ -26,6 +26,17 @@ bool GripperClient::grab(const ProtoStruct& extra) { }); } +Gripper::holding_status GripperClient::is_holding_something(const ProtoStruct& extra) { + return make_client_helper(this, *stub_, &StubType::IsHoldingSomething) + .with(extra) + .invoke([](auto& response) { + Gripper::holding_status holding_status; + holding_status.is_holding_something = response.is_holding_something(); + holding_status.meta = from_proto(response.meta()); + return holding_status; + }); +} + bool GripperClient::is_moving() { return make_client_helper(this, *stub_, &StubType::IsMoving).invoke([](auto& response) { return response.is_moving(); diff --git a/src/viam/sdk/components/private/gripper_client.hpp b/src/viam/sdk/components/private/gripper_client.hpp index 1d118eda9..68930003e 100644 --- a/src/viam/sdk/components/private/gripper_client.hpp +++ b/src/viam/sdk/components/private/gripper_client.hpp @@ -9,6 +9,8 @@ #include +#include + #include namespace viam { @@ -25,6 +27,7 @@ class GripperClient : public Gripper { void open(const ProtoStruct& extra) override; bool grab(const ProtoStruct& extra) override; + Gripper::holding_status is_holding_something(const ProtoStruct& extra) override; void stop(const ProtoStruct& extra) override; bool is_moving() override; ProtoStruct do_command(const ProtoStruct& command) override; diff --git a/src/viam/sdk/components/private/gripper_server.cpp b/src/viam/sdk/components/private/gripper_server.cpp index 9205d96fe..cd1320d98 100644 --- a/src/viam/sdk/components/private/gripper_server.cpp +++ b/src/viam/sdk/components/private/gripper_server.cpp @@ -26,6 +26,18 @@ ::grpc::Status GripperServer::Grab( }); } +::grpc::Status GripperServer::IsHoldingSomething( + ::grpc::ServerContext*, + const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request, + ::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept { + return make_service_helper( + "GripperServer::IsHoldingSomething", this, request)([&](auto& helper, auto& gripper) { + const Gripper::holding_status res = gripper->is_holding_something(helper.getExtra()); + response->set_is_holding_something(res.is_holding_something); + *(response->mutable_meta()) = to_proto(res.meta); + }); +} + ::grpc::Status GripperServer::Stop(::grpc::ServerContext*, const ::viam::component::gripper::v1::StopRequest* request, ::viam::component::gripper::v1::StopResponse*) noexcept { diff --git a/src/viam/sdk/components/private/gripper_server.hpp b/src/viam/sdk/components/private/gripper_server.hpp index bc58f17bb..33b51a0e1 100644 --- a/src/viam/sdk/components/private/gripper_server.hpp +++ b/src/viam/sdk/components/private/gripper_server.hpp @@ -34,6 +34,11 @@ class GripperServer : public ResourceServer, const ::viam::component::gripper::v1::StopRequest* request, ::viam::component::gripper::v1::StopResponse* response) noexcept override; + ::grpc::Status IsHoldingSomething( + ::grpc::ServerContext* context, + const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request, + ::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept override; + ::grpc::Status IsMoving( ::grpc::ServerContext* context, const ::viam::component::gripper::v1::IsMovingRequest* request, diff --git a/src/viam/sdk/tests/mocks/mock_gripper.cpp b/src/viam/sdk/tests/mocks/mock_gripper.cpp index 2df4a685b..c2b455885 100644 --- a/src/viam/sdk/tests/mocks/mock_gripper.cpp +++ b/src/viam/sdk/tests/mocks/mock_gripper.cpp @@ -28,6 +28,13 @@ bool MockGripper::is_moving() { return false; } +Gripper::holding_status MockGripper::is_holding_something(const ProtoStruct& extra) { + Gripper::holding_status res; + res.is_holding_something = false; + res.meta = extra; + return res; +} + ProtoStruct MockGripper::do_command(const ProtoStruct& command) { return (peek_command = command); } diff --git a/src/viam/sdk/tests/mocks/mock_gripper.hpp b/src/viam/sdk/tests/mocks/mock_gripper.hpp index 95662862e..46cc78283 100644 --- a/src/viam/sdk/tests/mocks/mock_gripper.hpp +++ b/src/viam/sdk/tests/mocks/mock_gripper.hpp @@ -17,6 +17,7 @@ class MockGripper : public sdk::Gripper { void open(const sdk::ProtoStruct& extra) override; bool grab(const sdk::ProtoStruct& extra) override; + Gripper::holding_status is_holding_something(const sdk::ProtoStruct& extra) override; void stop(const sdk::ProtoStruct& extra) override; bool is_moving() override; sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override; diff --git a/src/viam/sdk/tests/test_gripper.cpp b/src/viam/sdk/tests/test_gripper.cpp index ad7910e9a..3212aa03c 100644 --- a/src/viam/sdk/tests/test_gripper.cpp +++ b/src/viam/sdk/tests/test_gripper.cpp @@ -8,6 +8,8 @@ BOOST_TEST_DONT_PRINT_LOG_VALUE(std::vector) +BOOST_TEST_DONT_PRINT_LOG_VALUE(viam::sdk::ProtoValue) + namespace viam { namespace sdktests { @@ -38,6 +40,18 @@ BOOST_AUTO_TEST_CASE(test_grab) { client_to_mock_pipeline(mock, [](Gripper& client) { BOOST_CHECK(client.grab()); }); } +BOOST_AUTO_TEST_CASE(test_is_holding_something) { + std::shared_ptr mock = MockGripper::get_mock_gripper(); + client_to_mock_pipeline(mock, [](Gripper& client) { + const ProtoStruct extra = { + {"BEEP", "BOOP"}, + }; + Gripper::holding_status holding_status = client.is_holding_something(extra); + BOOST_CHECK_EQUAL(holding_status.is_holding_something, false); + BOOST_CHECK_EQUAL(holding_status.meta["BEEP"], ProtoValue("BOOP")); + }); +} + BOOST_AUTO_TEST_CASE(test_stop) { std::shared_ptr mock = MockGripper::get_mock_gripper(); client_to_mock_pipeline(mock, [&](Gripper& client) {