diff options
author | fukubayashi.akio <fukubayashi.akio@genetec.co.jp> | 2019-06-03 17:59:13 +0900 |
---|---|---|
committer | fukubayashi.akio <fukubayashi.akio@genetec.co.jp> | 2019-06-03 17:59:13 +0900 |
commit | 98006b6538c5be44350746ec3756f004a5c68af8 (patch) | |
tree | f76ed8991d3837678c00722a23b779c4e2dcb67b /src/main.cpp | |
parent | b6644e5cffa84e40d62e38f4ee0c14e64e0faf48 (diff) |
Add boot sequence and multi ecu transfer
Signed-off-by: fukubayashi.akio <fukubayashi.akio@genetec.co.jp>
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 375 |
1 files changed, 303 insertions, 72 deletions
diff --git a/src/main.cpp b/src/main.cpp index 6483655..6fff161 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,9 @@ #include <algorithm> #include <mutex> #include <json.h> +#include <stdlib.h> +#include <vector> +#include "util.hpp" #include "window_manager.hpp" #include "json_helper.hpp" @@ -56,7 +59,7 @@ int afb_instance::init() return this->wmgr.init(); } -static int _binding_init() +int _binding_init() { HMI_NOTICE("WinMan ver. %s", WINMAN_VERSION_STRING); @@ -78,7 +81,7 @@ error: return -1; } -static int binding_init (afb_api_t api) noexcept +int binding_init() noexcept { try { @@ -110,20 +113,21 @@ static void cbRemoveClientCtxt(void *data) delete ctxt; } -static void createSecurityContext(afb_req_t req, const char* appid, const char* role) +static void createSecurityContext(afb_req req, const char* appid, const char* role) { WMClientCtxt *ctxt = (WMClientCtxt *)afb_req_context_get(req); if (!ctxt) { // Create Security Context at first time - WMClientCtxt *ctxt = new WMClientCtxt(appid, role); + const char *new_role = g_afb_instance->wmgr.convertRoleOldToNew(role); + WMClientCtxt *ctxt = new WMClientCtxt(appid, new_role); HMI_DEBUG("create session for %s", ctxt->name.c_str()); afb_req_session_set_LOA(req, 1); afb_req_context_set(req, ctxt, cbRemoveClientCtxt); } } -void windowmanager_requestsurface(afb_req_t req) noexcept +void windowmanager_requestsurface(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -169,7 +173,7 @@ void windowmanager_requestsurface(afb_req_t req) noexcept } } -void windowmanager_requestsurfacexdg(afb_req_t req) noexcept +void windowmanager_requestsurfacexdg(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -222,7 +226,50 @@ void windowmanager_requestsurfacexdg(afb_req_t req) noexcept } } -void windowmanager_activatewindow(afb_req_t req) noexcept +void windowmanager_setrole(afb_req req) noexcept +{ + std::lock_guard<std::mutex> guard(binding_m); + if (g_afb_instance == nullptr) + { + afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); + return; + } + try + { + json_object *jreq = afb_req_json(req); + + json_object *j_role = nullptr; + if (!json_object_object_get_ex(jreq, "role", &j_role)) + { + afb_req_fail(req, "failed", "Need char const* argument role"); + return; + } + char const *a_role = json_object_get_string(j_role); + char *appid = afb_req_get_application_id(req); + + if(appid) + { + auto ret = g_afb_instance->wmgr.api_set_role(appid, a_role); + if (!ret) + { + afb_req_fail(req, "failed", "Couldn't register"); + } + else + { + createSecurityContext(req, appid, a_role); + afb_req_success(req, NULL, "success"); + } + free(appid); + } + } + catch (std::exception &e) + { + afb_req_fail_f(req, "failed", "Uncaught exception while calling requestsurfacexdg: %s", e.what()); + return; + } +} + +void windowmanager_activatewindow(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -250,17 +297,40 @@ void windowmanager_activatewindow(afb_req_t req) noexcept char* appid = afb_req_get_application_id(req); if(appid) { - g_afb_instance->wmgr.api_activate_window( - appid, a_drawing_name, a_drawing_area, - [&req](const char *errmsg) { - if (errmsg != nullptr) - { - HMI_ERROR(errmsg); - afb_req_fail(req, "failed", errmsg); - return; - } - afb_req_success(req, NULL, "success"); - }); + auto reply = [&req](const char *errmsg) { + if (errmsg != nullptr) + { + HMI_ERROR(errmsg); + afb_req_fail(req, "failed", errmsg); + return; + } + afb_req_success(req, NULL, "success"); + }; + + if (!g_afb_instance->wmgr.wmcon.isRemoteArea(a_drawing_area)) + { + g_afb_instance->wmgr.api_activate_window( + appid, a_drawing_name, a_drawing_area, reply); + } + else + { + std::string ecu_name; + ecu_name = g_afb_instance->wmgr.wmcon.getAreaToEcuName(a_drawing_area); + + // TODO: temporarily + if (!g_afb_instance->wmgr.wmcon.isConnectionMode()) + { + HMI_ERROR("WM Standalone Mode"); + afb_req_fail(req, "failed", "Standalone Mode"); + } + else + { + // If Window Manager is slave and this request is for master, + // request activateWindow to master + g_afb_instance->wmgr.api_activate_surface_to_master( + appid, a_drawing_name, a_drawing_area, reply); + } + } free(appid); } } @@ -272,7 +342,7 @@ void windowmanager_activatewindow(afb_req_t req) noexcept } } -void windowmanager_deactivatewindow(afb_req_t req) noexcept +void windowmanager_deactivatewindow(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -293,17 +363,30 @@ void windowmanager_deactivatewindow(afb_req_t req) noexcept char* appid = afb_req_get_application_id(req); if(appid) { - g_afb_instance->wmgr.api_deactivate_window( - appid, a_drawing_name, - [&req](const char *errmsg) { - if (errmsg != nullptr) - { - HMI_ERROR(errmsg); - afb_req_fail(req, "failed", errmsg); - return; - } - afb_req_success(req, NULL, "success"); - }); + auto reply = [&req](const char *errmsg) { + if (errmsg != nullptr) + { + HMI_ERROR(errmsg); + afb_req_fail(req, "failed", errmsg); + return; + } + afb_req_success(req, NULL, "success"); + }; + + // TODO: Check whether role is tbtnavi to request remote invisible + if (g_afb_instance->wmgr.wmcon.getAppIdToEcuName(appid) == "" || + ("tbtnavi" != std::string(a_drawing_name))) + { + g_afb_instance->wmgr.api_deactivate_window( + appid, a_drawing_name, reply); + } + else + { + // If Window Manager is slave and this request is for master, + // request deactivateWindow to master + g_afb_instance->wmgr.api_deactivate_surface_to_master( + appid, a_drawing_name, reply); + } free(appid); } } @@ -315,7 +398,7 @@ void windowmanager_deactivatewindow(afb_req_t req) noexcept } } -void windowmanager_enddraw(afb_req_t req) noexcept +void windowmanager_enddraw(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -337,8 +420,18 @@ void windowmanager_enddraw(afb_req_t req) noexcept char* appid = afb_req_get_application_id(req); if(appid) { - g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name); - free(appid); + if (g_afb_instance->wmgr.wmcon.getAppIdToEcuName(appid) == "" || + !g_afb_instance->wmgr.wmcon.isSyncDrawingForRemote(appid)) + { + g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name); + } + else + { + // If Window Manager is slave and requesting app is syncDrawing, + // request endDraw to master + g_afb_instance->wmgr.api_enddraw_for_remote(appid, a_drawing_name); + } + free(appid); } } catch (std::exception &e) @@ -349,7 +442,7 @@ void windowmanager_enddraw(afb_req_t req) noexcept } } -void windowmanager_getdisplayinfo_thunk(afb_req_t req) noexcept +void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -376,7 +469,7 @@ void windowmanager_getdisplayinfo_thunk(afb_req_t req) noexcept } } -void windowmanager_getareainfo_thunk(afb_req_t req) noexcept +void windowmanager_getareainfo_thunk(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -413,14 +506,132 @@ void windowmanager_getareainfo_thunk(afb_req_t req) noexcept } } -void windowmanager_get_area_list(afb_req_t req) noexcept +void windowmanager_getcarinfo_thunk(afb_req req) noexcept +{ + std::lock_guard<std::mutex> guard(binding_m); + if (g_afb_instance == nullptr) + { + afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); + return; + } + + try + { + json_object *jreq = afb_req_json(req); + + json_object *j_label = nullptr; + if (! json_object_object_get_ex(jreq, "label", &j_label)) + { + afb_req_fail(req, "failed", "Need char const* argument label"); + return; + } + char const* a_label = json_object_get_string(j_label); + + auto ret = g_afb_instance->wmgr.api_get_car_info(a_label); + if (ret.is_err()) + { + afb_req_fail(req, "failed", ret.unwrap_err()); + return; + } + + afb_req_success(req, ret.unwrap(), "success"); + } + catch (std::exception &e) + { + afb_req_fail_f(req, "failed", "Uncaught exception while calling getcarinfo: %s", e.what()); + return; + } +} + +void windowmanager_set_render_order(afb_req req) noexcept +{ + std::lock_guard<std::mutex> guard(binding_m); + if (g_afb_instance == nullptr) + { + afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); + return; + } + + char* appid = afb_req_get_application_id(req); + if(appid) + { + json_object *jreq = afb_req_json(req); + json_object *j_ro; // Do not free this. binder frees jreq, then free j_ro + if (json_object_object_get_ex(jreq, "render_order", &j_ro)) + { + int size = json_object_array_length(j_ro); + std::vector<std::string> ro(size); + for(int i = 0; i < size; i++) + { + ro[i] = json_object_get_string(json_object_array_get_idx(j_ro, i)); + } + + auto ret = g_afb_instance->wmgr.api_client_set_render_order(appid, ro); + if (!ret) + { + afb_req_fail(req, "failed", nullptr); + } + else + { + afb_req_success(req, nullptr, nullptr); + } + } + free(appid); + } + else + { + afb_req_fail(req, "failed", nullptr); + } +} + +void windowmanager_attach_app(afb_req req) noexcept +{ + std::lock_guard<std::mutex> guard(binding_m); + if (g_afb_instance == nullptr) + { + afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); + return; + } + + char* appid = afb_req_get_application_id(req); + if(appid) + { + json_object *jreq = afb_req_json(req); + json_object *j_dest, *j_id; // Do not free this. binder frees jreq, then free j_ro + if (json_object_object_get_ex(jreq, "destination", &j_dest) && + json_object_object_get_ex(jreq, "service_surface", &j_id)) + { + const char* dest_app = json_object_get_string(j_dest); + const char* service = json_object_get_string(j_id); + + std::string uuid = g_afb_instance->wmgr.api_client_attach_service_surface(appid, dest_app, service); + if (uuid.empty()) + { + afb_req_fail(req, "failed", nullptr); + } + else + { + json_object *resp = json_object_new_object(); + json_object_object_add(resp, "uuid", json_object_new_string(uuid.c_str())); + afb_req_success(req, resp, nullptr); + } + } + free(appid); + } + else + { + afb_req_fail(req, "failed", nullptr); + } +} + +void windowmanager_get_area_list(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); json_object* ret = g_afb_instance->wmgr.api_get_area_list(); afb_req_success(req, ret, nullptr); } -void windowmanager_change_area_size(afb_req_t req) noexcept +void windowmanager_change_area_size(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -480,7 +691,7 @@ void windowmanager_change_area_size(afb_req_t req) noexcept } } -void windowmanager_wm_subscribe(afb_req_t req) noexcept +void windowmanager_wm_subscribe(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -498,15 +709,20 @@ void windowmanager_wm_subscribe(afb_req_t req) noexcept afb_req_fail(req, "failed", "Need char const* argument event"); return; } - wm::WindowManager::EventType event_id = (wm::WindowManager::EventType)json_object_get_int(j); - bool ret = g_afb_instance->wmgr.api_subscribe(req, event_id); + int event_id = json_object_get_int(j); + int ret = g_afb_instance->wmgr.api_subscribe(req, event_id); - if (!ret) + if (ret) { afb_req_fail(req, "failed", "Error: afb_req_subscribe()"); return; } afb_req_success(req, NULL, "success"); + + if (event_id == g_afb_instance->wmgr.Event_Handshake) + { + g_afb_instance->wmgr.api_handshake(); + } } catch (std::exception &e) { @@ -515,7 +731,24 @@ void windowmanager_wm_subscribe(afb_req_t req) noexcept } } -void windowmanager_ping(afb_req_t req) noexcept +void windowmanager_connect(afb_req req) noexcept +{ + std::lock_guard<std::mutex> guard(binding_m); + + HMI_DEBUG("WM - HS Connect"); + + if (g_afb_instance == nullptr) + { + afb_req_fail(req, "Failed", "Not Start WindowManager"); + return; + } + else + { + afb_req_success(req, NULL, "success"); + } +} + +void windowmanager_ping(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); @@ -530,7 +763,7 @@ void windowmanager_ping(afb_req_t req) noexcept } } -void windowmanager_debug_terminate(afb_req_t req) noexcept +void windowmanager_debug_terminate(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); if (g_afb_instance == nullptr) @@ -557,32 +790,30 @@ void windowmanager_debug_terminate(afb_req_t req) noexcept } } -const afb_verb_t windowmanager_verbs[] = { - { .verb = "requestSurface", .callback = windowmanager_requestsurface }, - { .verb = "requestSurfaceXDG", .callback = windowmanager_requestsurfacexdg }, - { .verb = "activateWindow", .callback = windowmanager_activatewindow }, - { .verb = "deactivateWindow", .callback = windowmanager_deactivatewindow }, - { .verb = "endDraw", .callback = windowmanager_enddraw }, - { .verb = "getDisplayInfo", .callback = windowmanager_getdisplayinfo_thunk }, - { .verb = "getAreaInfo", .callback = windowmanager_getareainfo_thunk }, - { .verb = "changeAreaSize", .callback = windowmanager_change_area_size }, - { .verb = "getAreaList", .callback = windowmanager_get_area_list }, - { .verb = "wm_subscribe", .callback = windowmanager_wm_subscribe }, - { .verb = "ping", .callback = windowmanager_ping }, - { .verb = "debug_terminate", .callback = windowmanager_debug_terminate }, - {} }; - -extern "C" const afb_binding_t afbBindingExport = { - .api = "windowmanager", - .specification = "windowmanager", - .info = "windowmanager", - .verbs = windowmanager_verbs, - .preinit = nullptr, - .init = binding_init, - .onevent = nullptr, - .userdata = nullptr, - .provide_class = nullptr, - .require_class = nullptr, - .require_api = nullptr, - .noconcurrency = 0 -}; +void on_event(const char *event, struct json_object *object) +{ + g_afb_instance->wmgr.analyzeReceivedEvent(event, object); +} + +const struct afb_verb_v2 windowmanager_verbs[] = { + {"requestSurface", windowmanager_requestsurface, nullptr, nullptr, AFB_SESSION_NONE}, + {"requestSurfaceXdg", windowmanager_requestsurfacexdg, nullptr, nullptr, AFB_SESSION_NONE}, + {"setRole", windowmanager_setrole, nullptr, nullptr, AFB_SESSION_NONE}, + {"activateWindow", windowmanager_activatewindow, nullptr, nullptr, AFB_SESSION_NONE}, + {"deactivateWindow", windowmanager_deactivatewindow, nullptr, nullptr, AFB_SESSION_NONE}, + {"endDraw", windowmanager_enddraw, nullptr, nullptr, AFB_SESSION_NONE}, + {"getDisplayInfo", windowmanager_getdisplayinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE}, + {"getAreaInfo", windowmanager_getareainfo_thunk, nullptr, nullptr, AFB_SESSION_NONE}, + {"getCarInfo", windowmanager_getcarinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE }, + {"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE}, + {"changeAreaSize", windowmanager_change_area_size, nullptr, nullptr, AFB_SESSION_NONE}, + {"getAreaList", windowmanager_get_area_list, nullptr, nullptr, AFB_SESSION_NONE}, + {"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE}, + {"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE}, + {"wm_connect", windowmanager_connect, nullptr, nullptr, AFB_SESSION_NONE}, + {"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE}, + {"debug_terminate", windowmanager_debug_terminate, nullptr, nullptr, AFB_SESSION_NONE}, + {}}; + +extern "C" const struct afb_binding_v2 afbBindingV2 = { + "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, on_event, 0}; |