Bug fix: Always changed flag becomes true when restriction mode is changed
[apps/agl-service-windowmanager.git] / src / main.cpp
index fd96d33..f7ec927 100644 (file)
@@ -24,6 +24,7 @@
 #include "json_helper.hpp"
 #include "util.hpp"
 #include "wayland_ivi_wm.hpp"
+#include "low_can_client.hpp"
 
 extern "C" {
 #include <afb/afb-binding.h>
@@ -39,9 +40,10 @@ typedef struct wmClientCtxt{
 
 struct afb_instance {
    std::unique_ptr<wl::display> 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,12 @@ 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);
-      return;
-   }
+   g_afb_instance->app.api_enddraw(a_drawing_name);
 
-   afb_req_success(req, NULL, "success");
    } catch (std::exception &e) {
-      afb_req_fail_f(req, "failed", "Uncaught exception while calling enddraw: %s", e.what());
+      HMI_WARNING("wm", "failed", "Uncaught exception while calling enddraw: %s", e.what());
       return;
    }
 
@@ -450,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);
@@ -633,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};