blob: b18986adace26606b80009d29d9dae6aa3d422b4 [file] [log] [blame]
Yu Shan562c0f82022-08-04 17:10:38 -07001/*
2 * Copyright (C) 2022 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
Yu Shanbc2ed2a2022-09-15 19:01:52 -070019#include <IVhalClient.h>
Yu Shan562c0f82022-08-04 17:10:38 -070020#include <aidl/android/hardware/automotive/remoteaccess/ApState.h>
21#include <aidl/android/hardware/automotive/remoteaccess/BnRemoteAccess.h>
Yu Shandc54b8c2022-09-14 17:48:15 -070022#include <aidl/android/hardware/automotive/remoteaccess/BnRemoteTaskCallback.h>
Yu Shan562c0f82022-08-04 17:10:38 -070023#include <aidl/android/hardware/automotive/remoteaccess/IRemoteTaskCallback.h>
Yu Shanb138c422022-09-06 19:11:23 -070024#include <android-base/thread_annotations.h>
Yu Shandc54b8c2022-09-14 17:48:15 -070025#include <android/binder_auto_utils.h>
26#include <utils/SystemClock.h>
Yu Shane2974562022-08-10 18:37:03 -070027#include <wakeup_client.grpc.pb.h>
Yu Shan562c0f82022-08-04 17:10:38 -070028
29#include <string>
Yu Shane2974562022-08-10 18:37:03 -070030#include <thread>
Yu Shan562c0f82022-08-04 17:10:38 -070031
32namespace android {
33namespace hardware {
34namespace automotive {
35namespace remoteaccess {
36
Yu Shandc54b8c2022-09-14 17:48:15 -070037// A IRemoteTaskCallback implementation for debug purpose.
38class DebugRemoteTaskCallback final
39 : public aidl::android::hardware::automotive::remoteaccess::BnRemoteTaskCallback {
40 public:
41 DebugRemoteTaskCallback() { mStartTimeMillis = android::uptimeMillis(); };
42
43 ndk::ScopedAStatus onRemoteTaskRequested(const std::string& clientId,
44 const std::vector<uint8_t>& data) override;
45 std::string printTasks();
46
47 private:
48 struct TaskData {
49 std::string clientId;
50 std::vector<uint8_t> data;
51 };
52
53 std::mutex mLock;
54 int64_t mStartTimeMillis;
55 std::vector<TaskData> mTasks;
56};
57
Yu Shan562c0f82022-08-04 17:10:38 -070058class RemoteAccessService
59 : public aidl::android::hardware::automotive::remoteaccess::BnRemoteAccess {
60 public:
Yu Shanb138c422022-09-06 19:11:23 -070061 explicit RemoteAccessService(WakeupClient::StubInterface* grpcStub);
62
63 ~RemoteAccessService();
Yu Shane2974562022-08-10 18:37:03 -070064
Eric Jeong6c3a1d82023-03-16 00:45:40 -070065 ndk::ScopedAStatus getVehicleId(std::string* vehicleId) override;
66
67 ndk::ScopedAStatus getProcessorId(std::string* processorId) override;
Yu Shan562c0f82022-08-04 17:10:38 -070068
Yu Shane2974562022-08-10 18:37:03 -070069 ndk::ScopedAStatus getWakeupServiceName(std::string* wakeupServiceName) override;
Yu Shan562c0f82022-08-04 17:10:38 -070070
71 ndk::ScopedAStatus setRemoteTaskCallback(
72 const std::shared_ptr<
73 aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>&
74 callback) override;
75
76 ndk::ScopedAStatus clearRemoteTaskCallback() override;
77
78 ndk::ScopedAStatus notifyApStateChange(
79 const aidl::android::hardware::automotive::remoteaccess::ApState& newState) override;
Yu Shane2974562022-08-10 18:37:03 -070080
Yu Shandc54b8c2022-09-14 17:48:15 -070081 binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
82
Yu Shane2974562022-08-10 18:37:03 -070083 private:
Yu Shanb138c422022-09-06 19:11:23 -070084 // For testing.
85 friend class RemoteAccessServiceUnitTest;
Yu Shane2974562022-08-10 18:37:03 -070086
Yu Shandc54b8c2022-09-14 17:48:15 -070087 static bool checkDumpPermission();
88
Yu Shanb138c422022-09-06 19:11:23 -070089 WakeupClient::StubInterface* mGrpcStub;
90 std::thread mThread;
91 std::mutex mLock;
92 std::condition_variable mCv;
93 std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>
94 mRemoteTaskCallback GUARDED_BY(mLock);
95 std::unique_ptr<grpc::ClientContext> mGetRemoteTasksContext GUARDED_BY(mLock);
96 // Associated with mCv to notify the task loop to stop waiting and exit.
97 bool mTaskWaitStopped GUARDED_BY(mLock);
98 // A mutex to make sure startTaskLoop does not overlap with stopTaskLoop.
99 std::mutex mStartStopTaskLoopLock;
Yu Shan95493682023-03-21 18:00:17 -0700100 bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock) = false;
101 bool mGrpcConnected GUARDED_BY(mLock) = false;
102 std::unordered_map<std::string, size_t> mClientIdToTaskCount GUARDED_BY(mLock);
103
Yu Shanb138c422022-09-06 19:11:23 -0700104 // Default wait time before retry connecting to remote access client is 10s.
105 size_t mRetryWaitInMs = 10'000;
Yu Shandc54b8c2022-09-14 17:48:15 -0700106 std::shared_ptr<DebugRemoteTaskCallback> mDebugCallback;
Yu Shanb138c422022-09-06 19:11:23 -0700107
Yu Shan194757d2023-04-19 11:44:35 -0700108 std::thread mInjectDebugTaskThread;
109
Yu Shanb138c422022-09-06 19:11:23 -0700110 void runTaskLoop();
111 void maybeStartTaskLoop();
112 void maybeStopTaskLoop();
Eric Jeong6c3a1d82023-03-16 00:45:40 -0700113 ndk::ScopedAStatus getVehicleIdWithClient(
114 android::frameworks::automotive::vhal::IVhalClient& client, std::string* vehicleId);
Yu Shanb138c422022-09-06 19:11:23 -0700115
116 void setRetryWaitInMs(size_t retryWaitInMs) { mRetryWaitInMs = retryWaitInMs; }
Yu Shandc54b8c2022-09-14 17:48:15 -0700117 void dumpHelp(int fd);
Yu Shan95493682023-03-21 18:00:17 -0700118 void printCurrentStatus(int fd);
119 std::string clientIdToTaskCountToStringLocked() REQUIRES(mLock);
120 void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData);
Yu Shan194757d2023-04-19 11:44:35 -0700121 void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData,
122 const char* latencyInSecStr);
Yu Shan95493682023-03-21 18:00:17 -0700123 void updateGrpcConnected(bool connected);
124 android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId,
125 std::string_view taskData);
Yu Shan562c0f82022-08-04 17:10:38 -0700126};
127
128} // namespace remoteaccess
129} // namespace automotive
130} // namespace hardware
131} // namespace android