Add debug message macros controlled by environment variable
[src/libhomescreen.git] / sample / simple-egl / src / simple-egl.cpp
index cfa349c..8be9d2e 100644 (file)
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 
+#include <unistd.h>
+#include <time.h>
+
 #include "libwindowmanager.h"
 #include <libhomescreen.hpp>
 
 #include <ilm/ivi-application-client-protocol.h>
+#include "hmi-debug.h"
+
 using namespace std;
 
 
 uint32_t g_id_ivisurf = 9009;
 long port = 1700;
 string token = string("wm");
-bool enable_debug = false;
 
 string app_name = string("Navigation");
 
 LibHomeScreen* hs;
 LibWindowmanager *wm;
+bool gIsDraw = false;
 
 static const struct wl_interface *types[] = {
         NULL,
@@ -144,7 +149,7 @@ struct window {
        EGLSurface egl_surface;
        struct wl_callback *callback;
        int fullscreen, opaque, buffer_size, frame_sync;
-};
+} *gWindow;
 
 static const char *vert_shader_text =
        "uniform mat4 rotation;\n"
@@ -165,19 +170,6 @@ static const char *frag_shader_text =
 
 static int running = 1;
 
-static void debug_out(const char* str, ...)
-{
-       if(!enable_debug)
-               return;
-       char *out;
-       va_list arg_ptr;
-       va_start(arg_ptr, str);
-       vasprintf(&out, str, arg_ptr);
-       cout << out;
-       va_end(arg_ptr);
-       // cout << endl;
-}
-
 static void
 init_egl(struct display *display, struct window *window)
 {
@@ -232,7 +224,7 @@ init_egl(struct display *display, struct window *window)
        }
        free(configs);
        if (display->egl.conf == NULL) {
-               debug_out("did not find config with buffer size %d\n",
+               HMI_DEBUG("simple-egl","did not find config with buffer size %d",
                        window->buffer_size);
                exit(EXIT_FAILURE);
        }
@@ -252,7 +244,7 @@ init_egl(struct display *display, struct window *window)
                        eglGetProcAddress("eglSwapBuffersWithDamageEXT");
 
        if (display->swap_buffers_with_damage)
-               debug_out("has EGL_EXT_buffer_age and EGL_EXT_swap_buffers_with_damage\n");
+               HMI_DEBUG("simple-egl","has EGL_EXT_buffer_age and EGL_EXT_swap_buffers_with_damage");
 
 }
 
@@ -280,7 +272,7 @@ create_shader(struct window *window, const char *source, GLenum shader_type)
                char log[1000];
                GLsizei len;
                glGetShaderInfoLog(shader, 1000, &len, log);
-               debug_out("Error: compiling %s: %*s\n",
+               HMI_DEBUG("simple-egl","Error: compiling %s: %*s",
                        shader_type == GL_VERTEX_SHADER ? "vertex" : "fragment",
                        len, log);
                exit(1);
@@ -309,7 +301,7 @@ init_gl(struct window *window)
                char log[1000];
                GLsizei len;
                glGetProgramInfoLog(program, 1000, &len, log);
-               debug_out("Error: linking:\n%*s\n", len, log);
+               HMI_DEBUG("simple-egl","Error: linking:%*s", len, log);
                exit(1);
        }
 
@@ -326,25 +318,6 @@ init_gl(struct window *window)
                glGetUniformLocation(program, "rotation");
 }
 
-static void
-handle_ivi_surface_configure(void *data, struct ivi_surface *ivi_surface,
-                             int32_t width, int32_t height)
-{
-       struct window *window = data;
-
-       wl_egl_window_resize(window->native, width, height, 0, 0);
-
-       window->geometry.width = width;
-       window->geometry.height = height;
-
-       if (!window->fullscreen)
-               window->window_size = window->geometry;
-}
-
-static const struct ivi_surface_listener ivi_surface_listener = {
-       handle_ivi_surface_configure,
-};
-
 static void
 create_ivi_surface(struct window *window, struct display *display)
 {
@@ -354,12 +327,10 @@ create_ivi_surface(struct window *window, struct display *display)
                                               id_ivisurf, window->surface);
 
        if (window->ivi_surface == NULL) {
-               debug_out("Failed to create ivi_client_surface\n");
+               HMI_DEBUG("simple-egl","Failed to create ivi_client_surface");
                abort();
        }
 
-       ivi_surface_add_listener(window->ivi_surface,
-                                &ivi_surface_listener, window);
 }
 
 static void
@@ -425,6 +396,12 @@ redraw(void *data, struct wl_callback *callback, uint32_t time)
                {  0,    0.5 }
        };
 
+       static const GLfloat verts_sub[3][2] = {
+               { -0.25, -0.5 },
+               {  0.25, -0.5 },
+               {  0,    0.5 }
+       };
+
        static const GLfloat colors_H[3][3] = {
                { 1, 1, 1 },
                { 1, 1, 1 },
@@ -460,8 +437,9 @@ redraw(void *data, struct wl_callback *callback, uint32_t time)
        time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
        if (window->frames == 0)
                window->benchmark_time = time;
+
        if (time - window->benchmark_time > (benchmark_interval * 1000)) {
-               debug_out("%d frames in %d seconds: %f fps\n",
+               HMI_DEBUG("simple-egl","%d frames in %d seconds: %f fps",
                       window->frames,
                       benchmark_interval,
                       (float) window->frames / benchmark_interval);
@@ -487,7 +465,14 @@ redraw(void *data, struct wl_callback *callback, uint32_t time)
        glClearColor(0.0, 0.0, 0.0, 0.5);
        glClear(GL_COLOR_BUFFER_BIT);
 
-       glVertexAttribPointer(window->gl.pos, 2, GL_FLOAT, GL_FALSE, 0, verts);
+       if(window->geometry.height == 1488)
+       {
+               glVertexAttribPointer(window->gl.pos, 2, GL_FLOAT, GL_FALSE, 0, verts);
+       }
+       else
+       {
+               glVertexAttribPointer(window->gl.pos, 2, GL_FLOAT, GL_FALSE, 0, verts_sub);
+       }
        if(app_name == string("HVAC")){
                glVertexAttribPointer(window->gl.col, 3, GL_FLOAT, GL_FALSE, 0, colors_H);
        }
@@ -565,42 +550,44 @@ signal_int(int signum)
 int
 init_wm(LibWindowmanager *wm)
 {
+       HMI_DEBUG("simple-egl","called");
        char* surfaceIdStr;
 
        if (wm->init(port, token.c_str()) != 0) {
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] wm init failed. \n");
+               HMI_DEBUG("simple-egl","wm init failed. ");
                return -1;
        }
 
        json_object *obj = json_object_new_object();
        json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(app_name.c_str()));
        if (wm->requestSurface(obj) != 0) {
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] wm request surface failed \n");
+               HMI_DEBUG("simple-egl","wm request surface failed ");
                return -1;
        }
 
        wm->set_event_handler(LibWindowmanager::Event_Active, [wm](json_object *object) {
                const char *label = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingName));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got activated! \n", label);
+               HMI_DEBUG("simple-egl","Surface %s got activated! ", label);
        });
 
        wm->set_event_handler(LibWindowmanager::Event_Inactive, [wm](json_object *object) {
                const char *label = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingName));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got inactivated!\n", label);
+               HMI_DEBUG("simple-egl","Surface %s got inactivated!", label);
        });
 
        wm->set_event_handler(LibWindowmanager::Event_Visible, [wm](json_object *object) {
                const char *label = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingName));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got visibled!\n", label);
+               HMI_DEBUG("simple-egl","Surface %s got visibled!", label);
        });
 
        wm->set_event_handler(LibWindowmanager::Event_Invisible, [wm](json_object *object) {
                const char *label = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingName));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got invisibled!\n", label);
+               HMI_DEBUG("simple-egl","Surface %s got invisibled!", label);
+               gIsDraw = false;
        });
 
        wm->set_event_handler(LibWindowmanager::Event_SyncDraw, [wm](json_object *object) {
@@ -608,8 +595,25 @@ init_wm(LibWindowmanager *wm)
                        json_object_object_get(object, wm->kKeyDrawingName));
                const char *area = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingArea));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got syncdraw!\n", label);
-        debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] try to endDraw %s \n", app_name.c_str());
+
+               HMI_DEBUG("simple-egl","Surface %s got syncDraw! Area: %s. ", label, area);
+               if ((wm->kStrLayoutNormal + "." + wm->kStrAreaFull) == std::string(area)) {
+                       HMI_DEBUG("simple-egl","Layout:%s x:%d y:%d w:%d h:%d ", area, 0, 0, 1080, 1488);
+                       wl_egl_window_resize(gWindow->native, 1080, 1488, 0, 0);
+                       gWindow->geometry.width = 1080;
+                       gWindow->geometry.height = 1488;
+               }
+               else if ((wm->kStrLayoutSplit + "." + wm->kStrAreaMain) == std::string(area) ||
+                                (wm->kStrLayoutSplit + "." + wm->kStrAreaSub) == std::string(area)) {
+                       HMI_DEBUG("simple-egl","Layout:%s x:%d y:%d w:%d h:%d ", area, 0, 0, 1080, 744);
+                       wl_egl_window_resize(gWindow->native, 1080, 744, 0, 0);
+                       gWindow->geometry.width = 1080;
+                       gWindow->geometry.height = 744;
+               }
+
+               if (!gWindow->fullscreen)
+                       gWindow->window_size = gWindow->geometry;
+               gIsDraw = true;
                json_object *obj = json_object_new_object();
                json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(app_name.c_str()));
 
@@ -619,7 +623,7 @@ init_wm(LibWindowmanager *wm)
        wm->set_event_handler(LibWindowmanager::Event_FlushDraw, [wm](json_object *object) {
                const char *label = json_object_get_string(
                        json_object_object_get(object, wm->kKeyDrawingName));
-               debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] Surface %s got flushdraw! \n", label);
+               HMI_DEBUG("simple-egl","Surface %s got flushdraw! ", label);
        });
 
        do
@@ -628,7 +632,7 @@ init_wm(LibWindowmanager *wm)
        } while (surfaceIdStr == NULL);
 
        g_id_ivisurf = atoi(surfaceIdStr);
-       debug_out("************** [SIMPLE EGL] [WM SIMPLE >>>>] IVI_SURFACE_ID: %d \n", g_id_ivisurf);
+       HMI_DEBUG("simple-egl","IVI_SURFACE_ID: %d ", g_id_ivisurf);
 
        return 0;
 }
@@ -637,20 +641,21 @@ int
 init_hs(LibHomeScreen* hs){
        if(hs->init(port, token)!=0)
        {
-               debug_out("************** [SIMPLE EGL] [HS SIMPLE >>>>] homescreen init failed. \n");
+               HMI_DEBUG("simple-egl","homescreen init failed. ");
                return -1;
        }
 
        hs->set_event_handler(LibHomeScreen::Event_TapShortcut, [](json_object *object){
                const char *application_name = json_object_get_string(
                        json_object_object_get(object, "application_name"));
-               debug_out("************** [SIMPLE EGL] [HS SIMPLE >>>>] Event_TapShortcut application_name = %s \n", application_name);
+               HMI_DEBUG("simple-egl","Event_TapShortcut application_name = %s ", application_name);
                if(strcmp(application_name, app_name.c_str()) == 0)
                {
-                       debug_out("************** [SIMPLE EGL] [HS SIMPLE] try to activesurface %s \n", app_name.c_str());
+                       HMI_DEBUG("simple-egl","try to activesurface %s ", app_name.c_str());
                        json_object *obj = json_object_new_object();
                        json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(app_name.c_str()));
                        json_object_object_add(obj, wm->kKeyDrawingArea, json_object_new_string("normal.full"));
+                       gIsDraw = false;
                        wm->activateSurface(obj);
                }
        });
@@ -658,7 +663,7 @@ init_hs(LibHomeScreen* hs){
        hs->set_event_handler(LibHomeScreen::Event_OnScreenMessage, [](json_object *object){
                const char *display_message = json_object_get_string(
                        json_object_object_get(object, "display_message"));
-       debug_out("************** [SIMPLE EGL] [HS SIMPLE >>>>] Event_OnScreenMessage display_message = %s \n", display_message);
+        HMI_DEBUG("simple-egl","Event_OnScreenMessage display_message = %s ", display_message);
        });
 
        return 0;
@@ -671,11 +676,6 @@ main(int argc, char **argv)
        struct window  window  = { 0 };
        struct display display = { 0 };
 
-       if(getenv("ENABLE_DEMO_DEBUG"))
-       {
-               enable_debug = true;
-       }
-
        window.display = &display;
        display.window = &window;
        window.geometry.width  = 1080;
@@ -683,6 +683,7 @@ main(int argc, char **argv)
        window.window_size = window.geometry;
        window.buffer_size = 32;
        window.frame_sync = 1;
+       gWindow = &window;
 
        if(argc > 2)
        {
@@ -692,7 +693,7 @@ main(int argc, char **argv)
                token = argv[2];
        }
 
-       debug_out("************** [SIMPLE EGL] [MAIN] app_name: %s, port: %d, token: %s. \n", app_name.c_str(), port, token.c_str());
+       HMI_DEBUG("simple-egl","app_name: %s, port: %d, token: %s. ", app_name.c_str(), port, token.c_str());
 
        display.display = wl_display_connect(NULL);
        assert(display.display);
@@ -739,7 +740,8 @@ main(int argc, char **argv)
        sigint.sa_flags = SA_RESETHAND;
        sigaction(SIGINT, &sigint, NULL);
 
-       eglSwapBuffers(display.egl.dpy, window.egl_surface);
+       wl_display_dispatch_pending(display.display);
+       redraw(&window, NULL, 0);
        json_object *obj = json_object_new_object();
        json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(app_name.c_str()));
        json_object_object_add(obj, wm->kKeyDrawingArea, json_object_new_string("normal.full"));
@@ -751,10 +753,17 @@ main(int argc, char **argv)
         * queued up as a side effect. */
        while (running) {
                wl_display_dispatch_pending(display.display);
-               redraw(&window, NULL, 0);
+               if(!gIsDraw) {
+                       usleep(100000);
+                       continue;
+               }
+               else
+               {
+                       redraw(&window, NULL, 0);
+               }
        }
 
-       debug_out("************** [SIMPLE EGL] [MAIN] simple-egl exiting! \n");
+       HMI_DEBUG("simple-egl","simple-egl exiting! ");
 
        destroy_surface(&window);
        fini_egl(&display);