Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
19 changes: 19 additions & 0 deletions src/viam/sdk/components/gripper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <string>

#include <viam/sdk/common/proto_convert.hpp>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can probably just include proto_value.hpp here.

#include <viam/sdk/resource/stoppable.hpp>

namespace viam {
Expand All @@ -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({});
Expand All @@ -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;

Expand Down
17 changes: 17 additions & 0 deletions src/viam/sdk/components/private/gripper_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,23 @@ 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();
if response
.has_meta() {
holding_status.meta = from_proto(response.meta());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file can include the proto_convert.hpp header.

}
else {
holding_status.meta = {};
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you actually need this else?

return holding_status;
});
}

bool GripperClient::is_moving() {
return make_client_helper(this, *stub_, &StubType::IsMoving).invoke([](auto& response) {
return response.is_moving();
Expand Down
1 change: 1 addition & 0 deletions src/viam/sdk/components/private/gripper_client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,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;
Expand Down
12 changes: 12 additions & 0 deletions src/viam/sdk/components/private/gripper_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Gripper>(
"GripperServer::IsHoldingSomething", this, request)([&](auto& helper, auto& gripper) {
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 {
Expand Down
5 changes: 5 additions & 0 deletions src/viam/sdk/components/private/gripper_server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 7 additions & 0 deletions src/viam/sdk/tests/mocks/mock_gripper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ bool MockGripper::is_moving() {
return false;
}

Gripper::holding_status MockGripper::is_holding_something(const ProtoStruct&) {
Gripper::holding_status res;
res.is_holding_something = false;
res.meta = {};
return res;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we set res.meta to the protoStruct that's passed into the function, and then write a test of this method in test_gripper?

ProtoStruct MockGripper::do_command(const ProtoStruct& command) {
return (peek_command = command);
}
Expand Down
2 changes: 2 additions & 0 deletions src/viam/sdk/tests/mocks/mock_gripper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ class MockGripper : public sdk::Gripper {

void open(const sdk::ProtoStruct& extra) override;
bool grab(const sdk::ProtoStruct& extra) override;
Gripper::holding_status MockGripper::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;
Expand Down
Loading