X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.cpp;h=e07c2a1f48d705bbce44685a38b51e0c42d4e969;hb=d3125b444d35384eb6db60462c184717e20fca82;hp=8e252d40259b583cc8850b1661791efe6d3c608f;hpb=a94f6c67c67a68df8a894699686f2eaa8e870208;p=apps%2Fagl-service-windowmanager.git diff --git a/src/main.cpp b/src/main.cpp index 8e252d4..e07c2a1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,7 @@ #include "json_helper.hpp" #include "util.hpp" #include "wayland_ivi_wm.hpp" +#include "low_can_client.hpp" extern "C" { #include @@ -39,9 +40,10 @@ typedef struct wmClientCtxt{ struct afb_instance { std::unique_ptr display; + wm::LowCanClient lcc_; wm::App app; - afb_instance() : display{new wl::display}, app{this->display.get()} {} + afb_instance() : display{new wl::display}, lcc_{}, app{this->display.get()} {} int init(); }; @@ -50,6 +52,10 @@ struct afb_instance *g_afb_instance; std::mutex binding_m; int afb_instance::init() { + // Initialize LowCanClient class + this->lcc_.initialize(); + + // Initialize App class return this->app.init(); } @@ -298,15 +304,19 @@ void windowmanager_activatesurface(afb_req req) noexcept { return; } - auto ret = g_afb_instance->app.api_activate_surface(a_drawing_name, a_drawing_area); - if (ret != nullptr) { - afb_req_fail(req, "failed", ret); - return; - } + g_afb_instance->app.allocateWindowResource("activate", + a_drawing_name, a_drawing_area, + [&req](const char* errmsg){ + if (errmsg != nullptr) { + HMI_ERROR("wm", errmsg); + afb_req_fail(req, "failed", errmsg); + return; + } + afb_req_success(req, NULL, "success"); + }); - afb_req_success(req, NULL, "success"); } catch (std::exception &e) { - afb_req_fail_f(req, "failed", "Uncaught exception while calling activatesurface: %s", e.what()); + HMI_WARNING("wm", "failed", "Uncaught exception while calling activatesurface: %s", e.what()); return; } @@ -329,15 +339,19 @@ void windowmanager_deactivatesurface(afb_req req) noexcept { return; } - auto ret = g_afb_instance->app.api_deactivate_surface(a_drawing_name); - if (ret != nullptr) { - afb_req_fail(req, "failed", ret); - return; - } + g_afb_instance->app.allocateWindowResource("deactivate", + a_drawing_name, nullptr, + [&req](const char* errmsg){ + if (errmsg != nullptr) { + HMI_ERROR("wm", errmsg); + afb_req_fail(req, "failed", errmsg); + return; + } + afb_req_success(req, NULL, "success"); + }); - afb_req_success(req, NULL, "success"); } catch (std::exception &e) { - afb_req_fail_f(req, "failed", "Uncaught exception while calling deactivatesurface: %s", e.what()); + HMI_WARNING("wm", "Uncaught exception while calling deactivatesurface: %s", e.what()); return; } } @@ -358,16 +372,71 @@ void windowmanager_enddraw(afb_req req) noexcept { afb_req_fail(req, "failed", "Need char const* argument drawing_name"); return; } + afb_req_success(req, NULL, "success"); - auto ret = g_afb_instance->app.api_enddraw(a_drawing_name); - if (ret != nullptr) { - afb_req_fail(req, "failed", ret); + g_afb_instance->app.api_enddraw(a_drawing_name); + + } catch (std::exception &e) { + HMI_WARNING("wm", "failed", "Uncaught exception while calling enddraw: %s", e.what()); return; } - afb_req_success(req, NULL, "success"); +} + +void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept { + std::lock_guard guard(binding_m); + #ifdef ST + ST(); + #endif + if (g_afb_instance == nullptr) { + afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); + return; + } + + try { + auto ret = g_afb_instance->app.api_get_display_info(); + 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 enddraw: %s", e.what()); + afb_req_fail_f(req, "failed", "Uncaught exception while calling getdisplayinfo: %s", e.what()); + return; + } + +} + +void windowmanager_getareainfo_thunk(afb_req req) noexcept { + std::lock_guard guard(binding_m); + #ifdef ST + ST(); + #endif + 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_drawing_name = nullptr; + if (! json_object_object_get_ex(jreq, "drawing_name", &j_drawing_name)) { + afb_req_fail(req, "failed", "Need char const* argument drawing_name"); + return; + } + char const* a_drawing_name = json_object_get_string(j_drawing_name); + + auto ret = g_afb_instance->app.api_get_area_info(a_drawing_name); + 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 getareainfo: %s", e.what()); return; } @@ -391,6 +460,12 @@ void windowmanager_wm_subscribe(afb_req req) noexcept { return; } int event_type = json_object_get_int(j); + if ((wm::App::Event_Val_Min > event_type) + || (wm::App::Event_Val_Max < event_type)) { + afb_req_fail(req, "failed", "Invalid EventType"); + return; + } + const char *event_name = g_afb_instance->app.kListEventName[event_type]; struct afb_event event = g_afb_instance->app.map_afb_event[event_name]; int ret = afb_req_subscribe(req, event); @@ -562,6 +637,8 @@ const struct afb_verb_v2 windowmanager_verbs[] = { { "activatesurface", windowmanager_activatesurface, nullptr, nullptr, AFB_SESSION_NONE }, { "deactivatesurface", windowmanager_deactivatesurface, 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 }, { "wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE }, { "list_drawing_names", windowmanager_list_drawing_names, nullptr, nullptr, AFB_SESSION_NONE }, { "ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE }, @@ -572,5 +649,81 @@ const struct afb_verb_v2 windowmanager_verbs[] = { {} }; +void on_event(const char *event, struct json_object *object){ + HMI_DEBUG("wm", "event:%s", event); + + // If receive low can signal + if (strstr(event, "low-can")) { + wm::LowCanClient *lcc = &(g_afb_instance->lcc_); + wm::App *app = &(g_afb_instance->app); + + // Analyze low can signal + const char* signal_name = lcc->analyzeCanSignal(object); + + // If car info is updated, set event name + const char *can_event = nullptr; + if (strstr(signal_name, lcc->kSignalName_[lcc->SignalNoParkingBrake])) { + HMI_DEBUG("wm", "Parking Brake state is changed"); + + // Set event + if (lcc->getCurrentParkingBrakeState()) { + can_event = "parking_brake_on"; + } + else { + can_event = "parking_brake_off"; + } + } + else if (strstr(signal_name, lcc->kSignalName_[lcc->SignalNoAccelPedalPos])) { + // Update accel pedal position + app->setAccelPedalPos(lcc->getCurrentAccelPedalPosition()); + + if (lcc->isChangedAccelPedalState()) { + HMI_DEBUG("wm", "Accelerator Pedal state is changed"); + + // Set event + if (lcc->getCurrentAccelPedalState()) { + can_event = "accel_pedal_on"; + } + else { + can_event = "accel_pedal_off"; + } + } + } + else if (strstr(signal_name, lcc->kSignalName_[lcc->SignalNoHeadlame])) { + HMI_DEBUG("wm", "Headlamp state is changed"); + + // Set event + if (lcc->getCurrentHeadlampState()) { + can_event = "headlamp_on"; + } + else { + can_event = "headlamp_off"; + } + } + else if (strstr(signal_name, lcc->kSignalName_[lcc->SignalNoLightstatusBrake])) { + HMI_DEBUG("wm", "Lightstatus Brake state is changed"); + + // Set event + if (lcc->getCurrentLightstatusBrakeState()) { + can_event = "lightstatus_brake_on"; + } + else { + can_event = "lightstatus_brake_off"; + } + } + + // Allocate window resource + if (nullptr != can_event) { + g_afb_instance->app.allocateWindowResource(can_event, + nullptr, nullptr, + [](const char* errmsg){ + if (errmsg != nullptr) { + HMI_ERROR("wm", errmsg); + } + }); + } + } +} + extern "C" const struct afb_binding_v2 afbBindingV2 = { - "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, nullptr, 0}; + "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, on_event, 0};