diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2023-10-25 23:41:46 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2023-10-26 00:41:59 +0300 |
commit | 537937138e9855408c6b8af4331725c8a1d52705 (patch) | |
tree | 40b43c4b1e043ac153e3fc458d4463fbc228af76 | |
parent | c13f6c196066bccb33c3a1f524a108b52c356bfd (diff) |
homescreen: Re-work gRPC client start-up
And start the gRPC client as soon as possible and just wait for
a connected status after we bounded to the agl-shell
extension/interface.
Bug-AGL: SPEC-4912
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I26da89dd6aaf1b5c2357d70dcaed7622c1892c31
-rw-r--r-- | homescreen/src/AglShellGrpcClient.cpp | 27 | ||||
-rw-r--r-- | homescreen/src/AglShellGrpcClient.h | 2 | ||||
-rw-r--r-- | homescreen/src/main.cpp | 15 |
3 files changed, 25 insertions, 19 deletions
diff --git a/homescreen/src/AglShellGrpcClient.cpp b/homescreen/src/AglShellGrpcClient.cpp index ee7510f..f3c72ca 100644 --- a/homescreen/src/AglShellGrpcClient.cpp +++ b/homescreen/src/AglShellGrpcClient.cpp @@ -25,28 +25,31 @@ namespace { GrpcClient::GrpcClient() { - struct timespec ts; - auto channel = grpc::CreateChannel(kDefaultGrpcServiceAddress, + m_channel = grpc::CreateChannel(kDefaultGrpcServiceAddress, grpc::InsecureChannelCredentials()); + // init the stub here + m_stub = agl_shell_ipc::AglShellManagerService::NewStub(m_channel); + reader = new Reader(m_stub.get()); +} + +void +GrpcClient::WaitForConnected(int wait_time_ms, int tries_timeout) +{ + struct timespec ts; + grpc_connectivity_state state; + int try_ = 0; + clock_gettime(CLOCK_MONOTONIC, &ts); ts.tv_sec = 0; ts.tv_nsec = 500 * 1000 * 1000; // 500ms - bool try_to_connect = true; - grpc_connectivity_state state = channel->GetState(try_to_connect); - - while (state != GRPC_CHANNEL_READY) { - state = channel->GetState(try_to_connect); - + while (((state = m_channel->GetState(true)) != GRPC_CHANNEL_READY) && + try_++ < tries_timeout) { HMI_DEBUG("HomesScreen", "waiting for channel state to be ready, current state %d", state); nanosleep(&ts, NULL); } - - // init the stub here - m_stub = agl_shell_ipc::AglShellManagerService::NewStub(channel); - reader = new Reader(m_stub.get()); } diff --git a/homescreen/src/AglShellGrpcClient.h b/homescreen/src/AglShellGrpcClient.h index bb74377..19cfb75 100644 --- a/homescreen/src/AglShellGrpcClient.h +++ b/homescreen/src/AglShellGrpcClient.h @@ -92,6 +92,7 @@ private: class GrpcClient { public: GrpcClient(); + void WaitForConnected(int wait_time_ms, int tries_timeout); bool ActivateApp(const std::string& app_id, const std::string& output_name); bool DeactivateApp(const std::string& app_id); bool SetAppFloat(const std::string& app_id, int32_t x_pos, int32_t y_pos); @@ -108,5 +109,6 @@ public: private: Reader *reader; std::unique_ptr<agl_shell_ipc::AglShellManagerService::Stub> m_stub; + std::shared_ptr<grpc::Channel> m_channel; }; diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp index 66ddb75..ec0e1c5 100644 --- a/homescreen/src/main.cpp +++ b/homescreen/src/main.cpp @@ -321,8 +321,7 @@ run_in_thread(GrpcClient *client) static void load_agl_shell_app(QPlatformNativeInterface *native, QQmlApplicationEngine *engine, - struct shell_data shell_data, const char *screen_name, - bool is_demo, GrpcClient *client) + struct shell_data shell_data, const char *screen_name, bool is_demo) { QScreen *screen = nullptr; HomescreenHandler *homescreenHandler = shell_data.homescreenHandler; @@ -418,6 +417,9 @@ int main(int argc, char *argv[]) // we need to have an app_id app.setDesktopFileName("homescreen"); + GrpcClient *client = new GrpcClient(); + // create a new thread to listner for gRPC events + std::thread th = std::thread(run_in_thread, client); register_agl_shell(native, &shell_data); if (!shell_data.shell) { @@ -444,10 +446,6 @@ int main(int argc, char *argv[]) std::shared_ptr<struct agl_shell> agl_shell{shell_data.shell, agl_shell_destroy}; - GrpcClient *client = new GrpcClient(); - // create a new thread to listner for gRPC events - std::thread th = std::thread(run_in_thread, client); - // Import C++ class to QML qmlRegisterType<StatusBarModel>("HomeScreen", 1, 0, "StatusBarModel"); qmlRegisterType<MasterVolume>("MasterVolume", 1, 0, "MasterVolume"); @@ -459,6 +457,9 @@ int main(int argc, char *argv[]) shell_data.homescreenHandler = homescreenHandler; shell_data.homescreenHandler->setGrpcClient(client); + // blocks until we're sure connected with the server + HMI_DEBUG("HomescreenHandler", "Checking if connected to the gRPC server..."); + client->WaitForConnected(500, 10); client->AppStatusState(app_status_callback, homescreenHandler); QQmlApplicationEngine engine; @@ -470,7 +471,7 @@ int main(int argc, char *argv[]) context->setContextProperty("bluetooth", new Bluetooth(false, context)); load_agl_shell_app(native, &engine, shell_data, - screen_name, is_demo_val, client); + screen_name, is_demo_val); return app.exec(); } |