Complete VHAL GRPC Interfaces

Add missing operations from IVehicleHardware.h

Bug: 266001013
Test: `atest GRPCVehicleHardwareUnitTest GRPCVehicleProxyServerUnitTest`

Change-Id: Ida3533dedce49c49c4762b2f9a43997317f5d2c4
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
index 015157d..0742283 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
@@ -152,21 +152,49 @@
     mOnSetErr = std::move(callback);
 }
 
-DumpResult GRPCVehicleHardware::dump(const std::vector<std::string>& /* options */) {
-    // TODO(chenhaosjtuacm): To be implemented.
-    return {};
+DumpResult GRPCVehicleHardware::dump(const std::vector<std::string>& options) {
+    ::grpc::ClientContext context;
+    proto::DumpOptions protoDumpOptions;
+    proto::DumpResult protoDumpResult;
+    for (const auto& option : options) {
+        protoDumpOptions.add_options(option);
+    }
+    auto grpc_status = mGrpcStub->Dump(&context, protoDumpOptions, &protoDumpResult);
+    if (!grpc_status.ok()) {
+        LOG(ERROR) << __func__ << ": GRPC Dump Failed: " << grpc_status.error_message();
+        return {};
+    }
+    return {
+            .callerShouldDumpState = protoDumpResult.caller_should_dump_state(),
+            .buffer = protoDumpResult.buffer(),
+    };
 }
 
 aidlvhal::StatusCode GRPCVehicleHardware::checkHealth() {
-    // TODO(chenhaosjtuacm): To be implemented.
-    return aidlvhal::StatusCode::OK;
+    ::grpc::ClientContext context;
+    proto::VehicleHalCallStatus protoStatus;
+    auto grpc_status = mGrpcStub->CheckHealth(&context, ::google::protobuf::Empty(), &protoStatus);
+    if (!grpc_status.ok()) {
+        LOG(ERROR) << __func__ << ": GRPC CheckHealth Failed: " << grpc_status.error_message();
+        return aidlvhal::StatusCode::INTERNAL_ERROR;
+    }
+    return static_cast<aidlvhal::StatusCode>(protoStatus.status_code());
 }
 
-aidlvhal::StatusCode GRPCVehicleHardware::updateSampleRate(int32_t /* propId */,
-                                                           int32_t /* areaId */,
-                                                           float /* sampleRate */) {
-    // TODO(chenhaosjtuacm): To be implemented.
-    return aidlvhal::StatusCode::OK;
+aidlvhal::StatusCode GRPCVehicleHardware::updateSampleRate(int32_t propId, int32_t areaId,
+                                                           float sampleRate) {
+    ::grpc::ClientContext context;
+    proto::UpdateSampleRateRequest request;
+    proto::VehicleHalCallStatus protoStatus;
+    request.set_prop(propId);
+    request.set_area_id(areaId);
+    request.set_sample_rate(sampleRate);
+    auto grpc_status = mGrpcStub->UpdateSampleRate(&context, request, &protoStatus);
+    if (!grpc_status.ok()) {
+        LOG(ERROR) << __func__ << ": GRPC UpdateSampleRate Failed: " << grpc_status.error_message();
+        return aidlvhal::StatusCode::INTERNAL_ERROR;
+    }
+    return static_cast<aidlvhal::StatusCode>(protoStatus.status_code());
 }
 
 bool GRPCVehicleHardware::waitForConnected(std::chrono::milliseconds waitTime) {
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
index e2fe97b..af3dd59 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
@@ -155,6 +155,33 @@
     return ::grpc::Status::OK;
 }
 
+::grpc::Status GrpcVehicleProxyServer::UpdateSampleRate(
+        ::grpc::ServerContext* context, const proto::UpdateSampleRateRequest* request,
+        proto::VehicleHalCallStatus* status) {
+    const auto status_code = mHardware->updateSampleRate(request->prop(), request->area_id(),
+                                                         request->sample_rate());
+    status->set_status_code(static_cast<proto::StatusCode>(status_code));
+    return ::grpc::Status::OK;
+}
+
+::grpc::Status GrpcVehicleProxyServer::CheckHealth(::grpc::ServerContext* context,
+                                                   const ::google::protobuf::Empty*,
+                                                   proto::VehicleHalCallStatus* status) {
+    status->set_status_code(static_cast<proto::StatusCode>(mHardware->checkHealth()));
+    return ::grpc::Status::OK;
+}
+
+::grpc::Status GrpcVehicleProxyServer::Dump(::grpc::ServerContext* context,
+                                            const proto::DumpOptions* options,
+                                            proto::DumpResult* result) {
+    std::vector<std::string> dumpOptionStrings(options->options().begin(),
+                                               options->options().end());
+    auto dumpResult = mHardware->dump(dumpOptionStrings);
+    result->set_caller_should_dump_state(dumpResult.callerShouldDumpState);
+    result->set_buffer(dumpResult.buffer);
+    return ::grpc::Status::OK;
+}
+
 ::grpc::Status GrpcVehicleProxyServer::StartPropertyValuesStream(
         ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
         ::grpc::ServerWriter<proto::VehiclePropValues>* stream) {
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
index 01beec3..3596354 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
@@ -53,6 +53,16 @@
                              const proto::VehiclePropValueRequests* requests,
                              proto::GetValueResults* results) override;
 
+    ::grpc::Status UpdateSampleRate(::grpc::ServerContext* context,
+                                    const proto::UpdateSampleRateRequest* request,
+                                    proto::VehicleHalCallStatus* status) override;
+
+    ::grpc::Status CheckHealth(::grpc::ServerContext* context, const ::google::protobuf::Empty*,
+                               proto::VehicleHalCallStatus* status) override;
+
+    ::grpc::Status Dump(::grpc::ServerContext* context, const proto::DumpOptions* options,
+                        proto::DumpResult* result) override;
+
     ::grpc::Status StartPropertyValuesStream(
             ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
             ::grpc::ServerWriter<proto::VehiclePropValues>* stream) override;
diff --git a/automotive/vehicle/aidl/impl/grpc/proto/VehicleServer.proto b/automotive/vehicle/aidl/impl/grpc/proto/VehicleServer.proto
index 3490195..22b11d8 100644
--- a/automotive/vehicle/aidl/impl/grpc/proto/VehicleServer.proto
+++ b/automotive/vehicle/aidl/impl/grpc/proto/VehicleServer.proto
@@ -18,20 +18,14 @@
 
 package android.hardware.automotive.vehicle.proto;
 
+import "android/hardware/automotive/vehicle/DumpOptions.proto";
+import "android/hardware/automotive/vehicle/DumpResult.proto";
 import "android/hardware/automotive/vehicle/StatusCode.proto";
 import "android/hardware/automotive/vehicle/VehiclePropConfig.proto";
 import "android/hardware/automotive/vehicle/VehiclePropValue.proto";
 import "android/hardware/automotive/vehicle/VehiclePropValueRequest.proto";
 import "google/protobuf/empty.proto";
 
-message VehicleHalCallStatus {
-    StatusCode status_code = 1;
-}
-
-message VehiclePropValues {
-    repeated VehiclePropValue values = 1;
-}
-
 service VehicleServer {
     rpc GetAllPropertyConfig(google.protobuf.Empty) returns (stream VehiclePropConfig) {}
 
@@ -39,5 +33,11 @@
 
     rpc GetValues(VehiclePropValueRequests) returns (GetValueResults) {}
 
+    rpc UpdateSampleRate(UpdateSampleRateRequest) returns (VehicleHalCallStatus) {}
+
+    rpc CheckHealth(google.protobuf.Empty) returns (VehicleHalCallStatus) {}
+
+    rpc Dump(DumpOptions) returns (DumpResult) {}
+
     rpc StartPropertyValuesStream(google.protobuf.Empty) returns (stream VehiclePropValues) {}
 }