[Title] non-user touch event handling
authorgiwoong.kim <giwoong.kim@samsung.com>
Thu, 22 Mar 2012 16:43:25 +0000 (01:43 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Thu, 22 Mar 2012 16:43:25 +0000 (01:43 +0900)
[Type] bugfix
[Module] Emulator
[Priority]
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/hw/maru_touchscreen.c [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 2b99cbe..b779ba9
@@ -43,19 +43,9 @@ static QTAILQ_HEAD(, TouchEventEntry) events_queue =
 static pthread_mutex_t event_mutex = PTHREAD_MUTEX_INITIALIZER;
 static int event_cnt = 0;
 
-
 static void usb_touchscreen_event(void *opaque, int x, int y, int z, int buttons_state)
 {
-    USBTouchscreenState *s = opaque;
-
-    /* scale to resolution */
-    s->dx = x; //(x * TOUCHSCREEN_RESOLUTION_X / 0x7FFF);
-    s->dy = y; //(y * TOUCHSCREEN_RESOLUTION_Y / 0x7FFF);
-    s->dz = z;
-    s->buttons_state = buttons_state;
-    s->changed = 1;
-
-    /*TouchEventEntry *te;
+    TouchEventEntry *te;
     USBTouchscreenState *s = opaque;
 
     te = g_malloc0(sizeof(TouchEventEntry));
@@ -70,14 +60,14 @@ static void usb_touchscreen_event(void *opaque, int x, int y, int z, int buttons
         INFO("full touch event queue, lose event\n", event_cnt);
         return;
     }
-    te->index = event_cnt++;
+    te->index = ++event_cnt;
 
     QTAILQ_INSERT_TAIL(&events_queue, te, node);
-    s->changed = 0;
+    s->changed = 1;
 
     pthread_mutex_unlock(&event_mutex);
 
-    TRACE("touch event(%d) : x=%d, y=%d, z=%d, state=%d\n", te->index, x, y, z, buttons_state);*/
+    TRACE("touch event (%d) : x=%d, y=%d, z=%d, state=%d\n", te->index, x, y, z, buttons_state);
 }
 
 static int usb_touchscreen_poll(USBTouchscreenState *s, uint8_t *buf, int len)
@@ -140,33 +130,37 @@ static int usb_touchscreen_handle_data(USBDevice *dev, USBPacket *p)
     switch (p->pid) {
     case USB_TOKEN_IN:
         if (p->devep == 1) {
-            //pthread_mutex_lock(&event_mutex);
+            pthread_mutex_lock(&event_mutex);
 
             if (s->changed == 0) {
-                //pthread_mutex_unlock(&event_mutex);
+                pthread_mutex_unlock(&event_mutex);
                 return USB_RET_NAK;
             }
 
-            /*if (!QTAILQ_EMPTY(&events_queue)) {
-                TouchEventEntry *te = QTAILQ_FIRST(&events_queue);
+            if (event_cnt != 0) {
+                if (!QTAILQ_EMPTY(&events_queue)) {
+                    TouchEventEntry *te = QTAILQ_FIRST(&events_queue);
 
-                s->dx = te->queue_packet.x;
-                s->dy = te->queue_packet.y;
-                s->dz = te->queue_packet.z;
-                s->buttons_state = te->queue_packet.state;
+                    s->dx = te->queue_packet.x;
+                    s->dy = te->queue_packet.y;
+                    s->dz = te->queue_packet.z;
+                    s->buttons_state = te->queue_packet.state;
 
-                QTAILQ_REMOVE(&events_queue, te, node);
-                event_cnt--;
-                TRACE("processed touch event(%d) : x=%d, y=%d, z=%d, state=%d\n",
-                    te->index, s->dx, s->dy, s->dz, s->buttons_state);
+                    QTAILQ_REMOVE(&events_queue, te, node);
+                    event_cnt--;
+                    TRACE("processed touch event (%d) : x=%d, y=%d, z=%d, state=%d\n",
+                        te->index, s->dx, s->dy, s->dz, s->buttons_state);
 
-                if (QTAILQ_EMPTY(&events_queue)) {
-                    s->changed = 0;
+                    if (QTAILQ_EMPTY(&events_queue)) {
+                        s->changed = 0;
+                        TRACE("processed all touch events (%d)\n", event_cnt);
+                    }
                 }
+            } else {
+                s->changed = 0;
             }
 
-            pthread_mutex_unlock(&event_mutex); */
-            s->changed = 0;
+            pthread_mutex_unlock(&event_mutex);
 
             ret = usb_touchscreen_poll(s, buf, p->iov.size);
             usb_packet_copy(p, buf, ret);
@@ -195,7 +189,11 @@ static int usb_touchscreen_initfn(USBDevice *dev)
 {
     USBTouchscreenState *s = DO_UPCAST(USBTouchscreenState, dev, dev);
     usb_desc_init(dev);
+
+    pthread_mutex_lock(&event_mutex);
     s->changed = 1;
+    pthread_mutex_unlock(&event_mutex);
+
     return 0;
 }
 
@@ -215,7 +213,10 @@ static int touchscreen_post_load(void *opaque, int version_id)
 {
     USBTouchscreenState *s = (USBTouchscreenState *)opaque;
 
+    pthread_mutex_lock(&event_mutex);
     s->changed = 1;
+    pthread_mutex_unlock(&event_mutex);
+
     if (s->mouse_grabbed == 1) {
         s->eh_entry = qemu_add_mouse_event_handler(usb_touchscreen_event, s, 1, "QEMU Virtual touchscreen");
         qemu_activate_mouse_event_handler(s->eh_entry);