blob: 3596354539f98fa526af1a8a429ffa194cf08558 [file] [log] [blame]
Hao Chen32d46702023-04-10 15:59:50 -07001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "IVehicleHardware.h"
20
21#include "VehicleServer.grpc.pb.h"
22#include "VehicleServer.pb.h"
23
24#include <grpc++/grpc++.h>
25
26#include <atomic>
27#include <chrono>
28#include <cstdint>
29#include <functional>
30#include <memory>
31#include <shared_mutex>
32#include <string>
33#include <utility>
34
35namespace android::hardware::automotive::vehicle::virtualization {
36
37namespace aidlvhal = ::aidl::android::hardware::automotive::vehicle;
38
39// Connect other GRPC vehicle hardware(s) to the underlying vehicle hardware.
40class GrpcVehicleProxyServer : public proto::VehicleServer::Service {
41 public:
42 GrpcVehicleProxyServer(std::string serverAddr, std::unique_ptr<IVehicleHardware>&& hardware);
43
44 ::grpc::Status GetAllPropertyConfig(
45 ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
46 ::grpc::ServerWriter<proto::VehiclePropConfig>* stream) override;
47
48 ::grpc::Status SetValues(::grpc::ServerContext* context,
49 const proto::VehiclePropValueRequests* requests,
50 proto::SetValueResults* results) override;
51
52 ::grpc::Status GetValues(::grpc::ServerContext* context,
53 const proto::VehiclePropValueRequests* requests,
54 proto::GetValueResults* results) override;
55
Hao Chena810fb22023-04-11 15:27:44 -070056 ::grpc::Status UpdateSampleRate(::grpc::ServerContext* context,
57 const proto::UpdateSampleRateRequest* request,
58 proto::VehicleHalCallStatus* status) override;
59
60 ::grpc::Status CheckHealth(::grpc::ServerContext* context, const ::google::protobuf::Empty*,
61 proto::VehicleHalCallStatus* status) override;
62
63 ::grpc::Status Dump(::grpc::ServerContext* context, const proto::DumpOptions* options,
64 proto::DumpResult* result) override;
65
Hao Chen32d46702023-04-10 15:59:50 -070066 ::grpc::Status StartPropertyValuesStream(
67 ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
68 ::grpc::ServerWriter<proto::VehiclePropValues>* stream) override;
69
70 GrpcVehicleProxyServer& Start();
71
72 GrpcVehicleProxyServer& Shutdown();
73
74 void Wait();
75
76 private:
77 void OnVehiclePropChange(const std::vector<aidlvhal::VehiclePropValue>& values);
78
79 // We keep long-lasting connection for streaming the prop values.
80 struct ConnectionDescriptor {
81 explicit ConnectionDescriptor(::grpc::ServerWriter<proto::VehiclePropValues>* stream)
82 : mStream(stream),
83 mConnectionID(connection_id_counter_.fetch_add(1) + 1),
84 mMtx(std::make_unique<std::mutex>()),
85 mCV(std::make_unique<std::condition_variable>()) {}
86
87 ConnectionDescriptor(const ConnectionDescriptor&) = delete;
88 ConnectionDescriptor(ConnectionDescriptor&& cd) = default;
89 ConnectionDescriptor& operator=(const ConnectionDescriptor&) = delete;
90 ConnectionDescriptor& operator=(ConnectionDescriptor&& cd) = default;
91
92 ~ConnectionDescriptor();
93
94 uint64_t ID() const { return mConnectionID; }
95
96 bool Write(const proto::VehiclePropValues& values);
97
98 void Wait();
99
100 void Shutdown();
101
102 private:
103 ::grpc::ServerWriter<proto::VehiclePropValues>* mStream;
104 uint64_t mConnectionID{0};
105 std::unique_ptr<std::mutex> mMtx;
106 std::unique_ptr<std::condition_variable> mCV;
107 bool mShutdownFlag{false};
108
109 static std::atomic<uint64_t> connection_id_counter_;
110 };
111
112 std::string mServiceAddr;
113 std::unique_ptr<::grpc::Server> mServer{nullptr};
114 std::unique_ptr<IVehicleHardware> mHardware;
115
116 std::shared_mutex mConnectionMutex;
117 std::vector<std::shared_ptr<ConnectionDescriptor>> mValueStreamingConnections;
118
119 static constexpr auto kHardwareOpTimeout = std::chrono::seconds(1);
120};
121
122} // namespace android::hardware::automotive::vehicle::virtualization