diff options
author | fukubayashi.akio <fukubayashi.akio@genetec.co.jp> | 2019-06-06 17:55:08 +0900 |
---|---|---|
committer | fukubayashi.akio <fukubayashi.akio@genetec.co.jp> | 2019-06-06 17:55:08 +0900 |
commit | ac17da7010c6bd90240a641d503991ca5d0cb41a (patch) | |
tree | a8311029c5c7bc92a64694a1d8d2339b4e1ca38b /src/window_manager.cpp | |
parent | 98006b6538c5be44350746ec3756f004a5c68af8 (diff) |
Add chage remote app
Signed-off-by: fukubayashi.akio <fukubayashi.akio@genetec.co.jp>
Diffstat (limited to 'src/window_manager.cpp')
-rw-r--r-- | src/window_manager.cpp | 110 |
1 files changed, 99 insertions, 11 deletions
diff --git a/src/window_manager.cpp b/src/window_manager.cpp index 1432769..f121709 100644 --- a/src/window_manager.cpp +++ b/src/window_manager.cpp @@ -16,6 +16,7 @@ #include <fstream> #include <regex> +#include <unistd.h> #include "window_manager.hpp" #include "json_helper.hpp" @@ -80,6 +81,7 @@ static const vector<string> kListEventName{ static const char kPathOldRolesConfigFile[] = "/etc/old_roles.json"; static sd_event_source *g_timer_ev_src = nullptr; +static sd_event_source *g_timer_endInit_src = nullptr; static AppList g_app_list; static WindowManager *g_context; static vector<string> white_list_area_size_change = { @@ -106,6 +108,12 @@ static int processTimerHandler(sd_event_source *s, uint64_t usec, void *userdata return 0; } +static int endInitTimerHandler(sd_event_source *s, uint64_t usec, void *userdata) +{ + reinterpret_cast<wm::WindowManager *>(userdata)->sendHandshake(); + return 0; +} + static void onStateTransitioned(vector<WMAction> actions) { g_context->startTransitionWrapper(actions); @@ -129,7 +137,7 @@ WindowManager::WindowManager() : wmcon{}, id_alloc{} { - this->end_init = false; + this->subscribed = false; const char *path = getenv("AFM_APP_INSTALL_DIR"); if (!path) @@ -208,11 +216,59 @@ int WindowManager::init() double scale = static_cast<double>(dp_bg.height()) / css_bg.h; this->lc->setupArea(dp_bg, scale); - this->end_init = true; + sendHandshake(); return 0; //init_layers(); } +void WindowManager::sendHandshake() +{ + struct timespec ts; + + HMI_DEBUG("Check End Init"); + + if (this->subscribed && this->wmcon.getEndInit()) + { + HMI_DEBUG("End Inited"); + api_handshake(); + } + else + { + HMI_DEBUG("Not End Init"); + if (clock_gettime(CLOCK_BOOTTIME, &ts) != 0) + { + HMI_ERROR("Could't set time (clock_gettime() returns with error"); + return; + } + + uint64_t sleep = this->wmcon.getSleepTime(); + uint64_t usec = (ts.tv_sec * 1000000000ULL) + ts.tv_nsec + (sleep * 1000000); + + if (usec > 0) + { + usec /= 1000; + } + + if (g_timer_endInit_src == nullptr) + { + int ret = sd_event_add_time(afb_daemon_get_event_loop(), &g_timer_endInit_src, + CLOCK_BOOTTIME, usec, 1, endInitTimerHandler, this); + } + else + { + sd_event_source_set_time(g_timer_endInit_src, usec); + sd_event_source_set_enabled(g_timer_endInit_src, SD_EVENT_ONESHOT); + } + } +} + +void WindowManager::setSubscribed(bool flg) +{ + usleep(this->wmcon.getSleepTime() * 1000); + + this->subscribed = flg; +} + result<int> WindowManager::api_request_surface(char const *appid, char const *drawing_name) { // TODO: application requests by old role, @@ -473,7 +529,7 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n unsigned layer = client->layerID(); //TODO Deactivate remote viewing app for remote view change to local view. - if(this->lc->hasRemoteLayer(layer) && this->wmcon.getAppIdToEcuName(appid) != "") + if(this->lc->hasRemoteLayer(layer) != "" && this->wmcon.getAppIdToEcuName(appid) != "") { HMI_DEBUG("Deactivate remote App %s", drawing_name); std::string tmp_area = this->wmcon.getAppIdToEcuName(appid) + ".split.sub"; @@ -517,7 +573,7 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n return; } - this->wmcon.setAppIdToEcuName(id, ""); + this->wmcon.setAppIdToEcuName(id, this->wmcon.getEcuName()); reply(nullptr); if (req_num != g_app_list.currentRequestNumber()) @@ -634,6 +690,37 @@ void WindowManager::api_activate_surface_to_master( // g_app_list.removeFloatingSurface(client->surfaceID()); // g_app_list.removeFloatingSurface(client); + unsigned layer = client->layerID(); + + //TODO Deactivate remote viewing app for remote view change to local view. + if(this->lc->hasRemoteLayer(layer) != "" && this->wmcon.getAppIdToEcuName(appid) != "") + { + HMI_DEBUG("Deactivate remote App %s", drawing_name); + std::string tmp_area = this->wmcon.getAppIdToEcuName(appid) + ".split.sub"; + HMI_DEBUG("Deactivate area name: %s", tmp_area.c_str()); + this->wmcon.sendRequest("deactivateWindow", appid, drawing_name, tmp_area.c_str()); + + unsigned req_num = g_app_list.currentRequestNumber(); + const char *c_role = this->convertRoleOldToNew(drawing_name); + bool end_draw_finished = true; + WMAction act + { + req_num, + client, + string(c_role), + "", + TaskVisible::REMOTE_INVISIBLE, + end_draw_finished, + TaskCarState::NO_TASK + }; + + this->lc->renderLayers(); + this->lc->visibilityChange(act); + + this->emit_invisible(role); + this->emit_deactivated(role); + } + Task task = Task::TASK_ALLOCATE; unsigned req_num = 0; WMError ret = WMError::UNKNOWN; @@ -880,10 +967,7 @@ int WindowManager::api_subscribe(afb_req req, int event_id) void WindowManager::api_handshake() { - if (this->end_init && this->wmcon.getEndInit()) - { - this->send_event(kListEventName[Event_Handshake]); - } + this->send_event(kListEventName[Event_Handshake]); } void WindowManager::api_enddraw_for_remote(char const *appid, char const *drawing_name) @@ -1425,9 +1509,11 @@ void WindowManager::startTransitionWrapper(vector<WMAction> &actions) act.req_num = req_num; act.client = client; - if (this->wmcon.getAppIdToEcuName(appid) != "") + std::string appToEcuName = this->wmcon.getAppIdToEcuName(appid); + + if (this->wmcon.isRemoteEcu(appid)) { - if (TaskVisible::VISIBLE == act.visible && this->wmcon.getAreaToEcuName(act.area.c_str()) == this->wmcon.getEcuName()) + if (TaskVisible::VISIBLE == act.visible) { HMI_DEBUG("Set TaskVisible::REQ_REMOTE_VISIBLE"); act.visible = TaskVisible::REQ_REMOTE_VISIBLE; @@ -1604,7 +1690,7 @@ void WindowManager::processForRemoteRequest(json_object *data) // so convert role old to new const char *c_role = this->convertRoleOldToNew(drawing_name); - if(!this->lc->hasRemoteLayer(client->layerID())) + if(!this->wmcon.isRemoteEcu(appid)) { HMI_DEBUG("Deactivated"); return; @@ -1628,6 +1714,8 @@ void WindowManager::processForRemoteRequest(json_object *data) this->emit_invisible(role); this->emit_deactivated(role); + + } else if ("flushDraw" == request) { |