Loading automotive/remoteaccess/hal/default/Android.bp +3 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,9 @@ cc_binary { vintf_fragments: ["remoteaccess-default-service.xml"], init_rc: ["remoteaccess-default-service.rc"], cflags: [ "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"", // Uncomment this if running on emulator and connecting to a local grpc server // running on host 127.0.0.1:50051 (TestWakeupClientServerHost) // "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"", ], } Loading automotive/remoteaccess/hal/default/include/RemoteAccessService.h +5 −2 Original line number Diff line number Diff line Loading @@ -111,6 +111,8 @@ class RemoteAccessService WakeupClient::StubInterface* mGrpcStub; std::thread mThread; // Whether the GRPC server exists. Only checked and set during init. bool mGrpcServerExist = false; std::mutex mLock; std::condition_variable mCv; std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback> Loading @@ -121,7 +123,7 @@ class RemoteAccessService // A mutex to make sure startTaskLoop does not overlap with stopTaskLoop. std::mutex mStartStopTaskLoopLock; bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock) = false; bool mGrpcConnected GUARDED_BY(mLock) = false; bool mGrpcReadChannelOpen GUARDED_BY(mLock) = false; std::unordered_map<std::string, size_t> mClientIdToTaskCount GUARDED_BY(mLock); // Default wait time before retry connecting to remote access client is 10s. Loading @@ -143,9 +145,10 @@ class RemoteAccessService void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData); void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData, const char* latencyInSecStr); void updateGrpcConnected(bool connected); void updateGrpcReadChannelOpen(bool grpcReadChannelOpen); android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId, std::string_view taskData); bool isTaskScheduleSupported(); }; } // namespace remoteaccess Loading automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp +12 −6 Original line number Diff line number Diff line Loading @@ -30,10 +30,9 @@ constexpr char SERVICE_NAME[] = "android.hardware.automotive.remoteaccess.IRemoteAccess/default"; int main(int /* argc */, char* /* argv */[]) { #ifndef GRPC_SERVICE_ADDRESS LOG(ERROR) << "GRPC_SERVICE_ADDRESS is not defined, exiting"; exit(1); #endif android::hardware::automotive::remoteaccess::WakeupClient::StubInterface* grpcStub = nullptr; #ifdef GRPC_SERVICE_ADDRESS LOG(INFO) << "Registering RemoteAccessService as service, server: " << GRPC_SERVICE_ADDRESS << "..."; grpc::ChannelArguments grpcargs = {}; Loading @@ -47,11 +46,18 @@ int main(int /* argc */, char* /* argv */[]) { android::netdevice::waitFor({GRPC_SERVICE_IFNAME}, android::netdevice::WaitCondition::PRESENT_AND_UP); LOG(INFO) << "Waiting for interface: " << GRPC_SERVICE_IFNAME << " done"; #endif #endif // #ifdef GRPC_SERVICE_IFNAME auto channel = grpc::CreateChannel(GRPC_SERVICE_ADDRESS, grpc::InsecureChannelCredentials()); auto clientStub = android::hardware::automotive::remoteaccess::WakeupClient::NewStub(channel); grpcStub = clientStub.get(); #else LOG(INFO) << "GRPC_SERVICE_ADDRESS is not defined, work in fake mode"; #endif // #ifdef GRPC_SERVICE_ADDRESS auto service = ndk::SharedRefBase::make< android::hardware::automotive::remoteaccess::RemoteAccessService>(clientStub.get()); android::hardware::automotive::remoteaccess::RemoteAccessService>(grpcStub); binder_exception_t err = AServiceManager_addService(service->asBinder().get(), SERVICE_NAME); if (err != EX_NONE) { Loading automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp +61 −7 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ std::string boolToString(bool x) { RemoteAccessService::RemoteAccessService(WakeupClient::StubInterface* grpcStub) : mGrpcStub(grpcStub) { if (mGrpcStub != nullptr) { mGrpcServerExist = true; } std::ifstream debugTaskFile; debugTaskFile.open(DEBUG_TASK_FILE, std::ios::in); if (!debugTaskFile.is_open()) { Loading Loading @@ -177,9 +181,9 @@ void RemoteAccessService::maybeStopTaskLoop() { mTaskLoopRunning = false; } void RemoteAccessService::updateGrpcConnected(bool connected) { void RemoteAccessService::updateGrpcReadChannelOpen(bool grpcReadChannelOpen) { std::lock_guard<std::mutex> lockGuard(mLock); mGrpcConnected = connected; mGrpcReadChannelOpen = grpcReadChannelOpen; } Result<void> RemoteAccessService::deliverRemoteTaskThroughCallback(const std::string& clientId, Loading Loading @@ -213,7 +217,7 @@ void RemoteAccessService::runTaskLoop() { mGetRemoteTasksContext.reset(new ClientContext()); reader = mGrpcStub->GetRemoteTasks(mGetRemoteTasksContext.get(), request); } updateGrpcConnected(true); updateGrpcReadChannelOpen(true); GetRemoteTasksResponse response; while (reader->Read(&response)) { ALOGI("Receiving one task from remote task client"); Loading @@ -225,7 +229,7 @@ void RemoteAccessService::runTaskLoop() { continue; } } updateGrpcConnected(false); updateGrpcReadChannelOpen(false); Status status = reader->Finish(); mGetRemoteTasksContext.reset(); Loading Loading @@ -298,6 +302,11 @@ ScopedAStatus RemoteAccessService::clearRemoteTaskCallback() { } ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) { if (!mGrpcServerExist) { ALOGW("GRPC server does not exist, do nothing"); return ScopedAStatus::ok(); } ClientContext context; NotifyWakeupRequiredRequest request = {}; request.set_iswakeuprequired(newState.isWakeupRequired); Loading @@ -315,19 +324,40 @@ ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) return ScopedAStatus::ok(); } bool RemoteAccessService::isTaskScheduleSupported() { if (!mGrpcServerExist) { ALOGW("GRPC server does not exist, task scheduling not supported"); return false; } return true; } ScopedAStatus RemoteAccessService::isTaskScheduleSupported(bool* out) { *out = true; *out = isTaskScheduleSupported(); return ScopedAStatus::ok(); } ndk::ScopedAStatus RemoteAccessService::getSupportedTaskTypesForScheduling( std::vector<TaskType>* out) { out->clear(); if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return empty task types"); return ScopedAStatus::ok(); } // TODO(b/316233421): support ENTER_GARAGE_MODE type. out->push_back(TaskType::CUSTOM); return ScopedAStatus::ok(); } ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return exception"); return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT, "task scheduling is not supported"); } ClientContext context; ScheduleTaskRequest request = {}; ScheduleTaskResponse response = {}; Loading Loading @@ -379,6 +409,11 @@ ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId, const std::string& scheduleId) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, do nothing"); return ScopedAStatus::ok(); } ClientContext context; UnscheduleTaskRequest request = {}; UnscheduleTaskResponse response = {}; Loading @@ -392,6 +427,11 @@ ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId, } ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientId) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, do nothing"); return ScopedAStatus::ok(); } ClientContext context; UnscheduleAllTasksRequest request = {}; UnscheduleAllTasksResponse response = {}; Loading @@ -405,6 +445,12 @@ ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientI ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId, const std::string& scheduleId, bool* out) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return false"); *out = false; return ScopedAStatus::ok(); } ClientContext context; IsTaskScheduledRequest request = {}; IsTaskScheduledResponse response = {}; Loading @@ -420,6 +466,12 @@ ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId, ScopedAStatus RemoteAccessService::getAllPendingScheduledTasks(const std::string& clientId, std::vector<ScheduleInfo>* out) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return empty array"); out->clear(); return ScopedAStatus::ok(); } ClientContext context; GetAllPendingScheduledTasksRequest request = {}; GetAllPendingScheduledTasksResponse response = {}; Loading Loading @@ -560,9 +612,11 @@ void RemoteAccessService::printCurrentStatus(int fd) { dprintf(fd, "\nRemoteAccess HAL status \n" "Remote task callback registered: %s\n" "Task receiving GRPC connection established: %s\n" "GRPC server exist: %s\n" "GRPC read channel for receiving tasks open: %s\n" "Received task count by clientId: \n%s\n", boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcConnected).c_str(), boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcServerExist).c_str(), boolToString(mGrpcReadChannelOpen).c_str(), clientIdToTaskCountToStringLocked().c_str()); } Loading Loading
automotive/remoteaccess/hal/default/Android.bp +3 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,9 @@ cc_binary { vintf_fragments: ["remoteaccess-default-service.xml"], init_rc: ["remoteaccess-default-service.rc"], cflags: [ "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"", // Uncomment this if running on emulator and connecting to a local grpc server // running on host 127.0.0.1:50051 (TestWakeupClientServerHost) // "-DGRPC_SERVICE_ADDRESS=\"10.0.2.2:50051\"", ], } Loading
automotive/remoteaccess/hal/default/include/RemoteAccessService.h +5 −2 Original line number Diff line number Diff line Loading @@ -111,6 +111,8 @@ class RemoteAccessService WakeupClient::StubInterface* mGrpcStub; std::thread mThread; // Whether the GRPC server exists. Only checked and set during init. bool mGrpcServerExist = false; std::mutex mLock; std::condition_variable mCv; std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback> Loading @@ -121,7 +123,7 @@ class RemoteAccessService // A mutex to make sure startTaskLoop does not overlap with stopTaskLoop. std::mutex mStartStopTaskLoopLock; bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock) = false; bool mGrpcConnected GUARDED_BY(mLock) = false; bool mGrpcReadChannelOpen GUARDED_BY(mLock) = false; std::unordered_map<std::string, size_t> mClientIdToTaskCount GUARDED_BY(mLock); // Default wait time before retry connecting to remote access client is 10s. Loading @@ -143,9 +145,10 @@ class RemoteAccessService void debugInjectTask(int fd, std::string_view clientId, std::string_view taskData); void debugInjectTaskNextReboot(int fd, std::string_view clientId, std::string_view taskData, const char* latencyInSecStr); void updateGrpcConnected(bool connected); void updateGrpcReadChannelOpen(bool grpcReadChannelOpen); android::base::Result<void> deliverRemoteTaskThroughCallback(const std::string& clientId, std::string_view taskData); bool isTaskScheduleSupported(); }; } // namespace remoteaccess Loading
automotive/remoteaccess/hal/default/src/RemoteAccessImpl.cpp +12 −6 Original line number Diff line number Diff line Loading @@ -30,10 +30,9 @@ constexpr char SERVICE_NAME[] = "android.hardware.automotive.remoteaccess.IRemoteAccess/default"; int main(int /* argc */, char* /* argv */[]) { #ifndef GRPC_SERVICE_ADDRESS LOG(ERROR) << "GRPC_SERVICE_ADDRESS is not defined, exiting"; exit(1); #endif android::hardware::automotive::remoteaccess::WakeupClient::StubInterface* grpcStub = nullptr; #ifdef GRPC_SERVICE_ADDRESS LOG(INFO) << "Registering RemoteAccessService as service, server: " << GRPC_SERVICE_ADDRESS << "..."; grpc::ChannelArguments grpcargs = {}; Loading @@ -47,11 +46,18 @@ int main(int /* argc */, char* /* argv */[]) { android::netdevice::waitFor({GRPC_SERVICE_IFNAME}, android::netdevice::WaitCondition::PRESENT_AND_UP); LOG(INFO) << "Waiting for interface: " << GRPC_SERVICE_IFNAME << " done"; #endif #endif // #ifdef GRPC_SERVICE_IFNAME auto channel = grpc::CreateChannel(GRPC_SERVICE_ADDRESS, grpc::InsecureChannelCredentials()); auto clientStub = android::hardware::automotive::remoteaccess::WakeupClient::NewStub(channel); grpcStub = clientStub.get(); #else LOG(INFO) << "GRPC_SERVICE_ADDRESS is not defined, work in fake mode"; #endif // #ifdef GRPC_SERVICE_ADDRESS auto service = ndk::SharedRefBase::make< android::hardware::automotive::remoteaccess::RemoteAccessService>(clientStub.get()); android::hardware::automotive::remoteaccess::RemoteAccessService>(grpcStub); binder_exception_t err = AServiceManager_addService(service->asBinder().get(), SERVICE_NAME); if (err != EX_NONE) { Loading
automotive/remoteaccess/hal/default/src/RemoteAccessService.cpp +61 −7 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ std::string boolToString(bool x) { RemoteAccessService::RemoteAccessService(WakeupClient::StubInterface* grpcStub) : mGrpcStub(grpcStub) { if (mGrpcStub != nullptr) { mGrpcServerExist = true; } std::ifstream debugTaskFile; debugTaskFile.open(DEBUG_TASK_FILE, std::ios::in); if (!debugTaskFile.is_open()) { Loading Loading @@ -177,9 +181,9 @@ void RemoteAccessService::maybeStopTaskLoop() { mTaskLoopRunning = false; } void RemoteAccessService::updateGrpcConnected(bool connected) { void RemoteAccessService::updateGrpcReadChannelOpen(bool grpcReadChannelOpen) { std::lock_guard<std::mutex> lockGuard(mLock); mGrpcConnected = connected; mGrpcReadChannelOpen = grpcReadChannelOpen; } Result<void> RemoteAccessService::deliverRemoteTaskThroughCallback(const std::string& clientId, Loading Loading @@ -213,7 +217,7 @@ void RemoteAccessService::runTaskLoop() { mGetRemoteTasksContext.reset(new ClientContext()); reader = mGrpcStub->GetRemoteTasks(mGetRemoteTasksContext.get(), request); } updateGrpcConnected(true); updateGrpcReadChannelOpen(true); GetRemoteTasksResponse response; while (reader->Read(&response)) { ALOGI("Receiving one task from remote task client"); Loading @@ -225,7 +229,7 @@ void RemoteAccessService::runTaskLoop() { continue; } } updateGrpcConnected(false); updateGrpcReadChannelOpen(false); Status status = reader->Finish(); mGetRemoteTasksContext.reset(); Loading Loading @@ -298,6 +302,11 @@ ScopedAStatus RemoteAccessService::clearRemoteTaskCallback() { } ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) { if (!mGrpcServerExist) { ALOGW("GRPC server does not exist, do nothing"); return ScopedAStatus::ok(); } ClientContext context; NotifyWakeupRequiredRequest request = {}; request.set_iswakeuprequired(newState.isWakeupRequired); Loading @@ -315,19 +324,40 @@ ScopedAStatus RemoteAccessService::notifyApStateChange(const ApState& newState) return ScopedAStatus::ok(); } bool RemoteAccessService::isTaskScheduleSupported() { if (!mGrpcServerExist) { ALOGW("GRPC server does not exist, task scheduling not supported"); return false; } return true; } ScopedAStatus RemoteAccessService::isTaskScheduleSupported(bool* out) { *out = true; *out = isTaskScheduleSupported(); return ScopedAStatus::ok(); } ndk::ScopedAStatus RemoteAccessService::getSupportedTaskTypesForScheduling( std::vector<TaskType>* out) { out->clear(); if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return empty task types"); return ScopedAStatus::ok(); } // TODO(b/316233421): support ENTER_GARAGE_MODE type. out->push_back(TaskType::CUSTOM); return ScopedAStatus::ok(); } ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return exception"); return ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT, "task scheduling is not supported"); } ClientContext context; ScheduleTaskRequest request = {}; ScheduleTaskResponse response = {}; Loading Loading @@ -379,6 +409,11 @@ ScopedAStatus RemoteAccessService::scheduleTask(const ScheduleInfo& scheduleInfo ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId, const std::string& scheduleId) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, do nothing"); return ScopedAStatus::ok(); } ClientContext context; UnscheduleTaskRequest request = {}; UnscheduleTaskResponse response = {}; Loading @@ -392,6 +427,11 @@ ScopedAStatus RemoteAccessService::unscheduleTask(const std::string& clientId, } ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientId) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, do nothing"); return ScopedAStatus::ok(); } ClientContext context; UnscheduleAllTasksRequest request = {}; UnscheduleAllTasksResponse response = {}; Loading @@ -405,6 +445,12 @@ ScopedAStatus RemoteAccessService::unscheduleAllTasks(const std::string& clientI ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId, const std::string& scheduleId, bool* out) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return false"); *out = false; return ScopedAStatus::ok(); } ClientContext context; IsTaskScheduledRequest request = {}; IsTaskScheduledResponse response = {}; Loading @@ -420,6 +466,12 @@ ScopedAStatus RemoteAccessService::isTaskScheduled(const std::string& clientId, ScopedAStatus RemoteAccessService::getAllPendingScheduledTasks(const std::string& clientId, std::vector<ScheduleInfo>* out) { if (!isTaskScheduleSupported()) { ALOGW("Task scheduleing is not supported, return empty array"); out->clear(); return ScopedAStatus::ok(); } ClientContext context; GetAllPendingScheduledTasksRequest request = {}; GetAllPendingScheduledTasksResponse response = {}; Loading Loading @@ -560,9 +612,11 @@ void RemoteAccessService::printCurrentStatus(int fd) { dprintf(fd, "\nRemoteAccess HAL status \n" "Remote task callback registered: %s\n" "Task receiving GRPC connection established: %s\n" "GRPC server exist: %s\n" "GRPC read channel for receiving tasks open: %s\n" "Received task count by clientId: \n%s\n", boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcConnected).c_str(), boolToString(mRemoteTaskCallback.get()).c_str(), boolToString(mGrpcServerExist).c_str(), boolToString(mGrpcReadChannelOpen).c_str(), clientIdToTaskCountToStringLocked().c_str()); } Loading