1 /* 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 19 #include <IVhalClient.h> 20 #include <aidl/android/hardware/automotive/remoteaccess/ApState.h> 21 #include <aidl/android/hardware/automotive/remoteaccess/BnRemoteAccess.h> 22 #include <aidl/android/hardware/automotive/remoteaccess/BnRemoteTaskCallback.h> 23 #include <aidl/android/hardware/automotive/remoteaccess/IRemoteTaskCallback.h> 24 #include <android-base/thread_annotations.h> 25 #include <android/binder_auto_utils.h> 26 #include <utils/SystemClock.h> 27 #include <wakeup_client.grpc.pb.h> 28 29 #include <string> 30 #include <thread> 31 32 namespace android { 33 namespace hardware { 34 namespace automotive { 35 namespace remoteaccess { 36 37 // A IRemoteTaskCallback implementation for debug purpose. 38 class DebugRemoteTaskCallback final 39 : public aidl::android::hardware::automotive::remoteaccess::BnRemoteTaskCallback { 40 public: DebugRemoteTaskCallback()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 58 class RemoteAccessService 59 : public aidl::android::hardware::automotive::remoteaccess::BnRemoteAccess { 60 public: 61 explicit RemoteAccessService(WakeupClient::StubInterface* grpcStub); 62 63 ~RemoteAccessService(); 64 65 ndk::ScopedAStatus getVehicleId(std::string* vehicleId) override; 66 67 ndk::ScopedAStatus getProcessorId(std::string* processorId) override; 68 69 ndk::ScopedAStatus getWakeupServiceName(std::string* wakeupServiceName) override; 70 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; 80 81 binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; 82 83 private: 84 // For testing. 85 friend class RemoteAccessServiceUnitTest; 86 87 static bool checkDumpPermission(); 88 89 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; 100 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 104 // Default wait time before retry connecting to remote access client is 10s. 105 size_t mRetryWaitInMs = 10'000; 106 std::shared_ptr<DebugRemoteTaskCallback> mDebugCallback; 107 108 std::thread mInjectDebugTaskThread; 109 110 void runTaskLoop(); 111 void maybeStartTaskLoop(); 112 void maybeStopTaskLoop(); 113 ndk::ScopedAStatus getVehicleIdWithClient( 114 android::frameworks::automotive::vhal::IVhalClient& client, std::string* vehicleId); 115 setRetryWaitInMs(size_t retryWaitInMs)116 void setRetryWaitInMs(size_t retryWaitInMs) { mRetryWaitInMs = retryWaitInMs; } 117 void dumpHelp(int fd); 118 void printCurrentStatus(int fd); 119 std::string clientIdToTaskCountToStringLocked() REQUIRES(mLock); 120 void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData); 121 void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData, 122 const char* latencyInSecStr); 123 void updateGrpcConnected(bool connected); 124 android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId, 125 std::string_view taskData); 126 }; 127 128 } // namespace remoteaccess 129 } // namespace automotive 130 } // namespace hardware 131 } // namespace android 132