MULTI_DEBUG_CHANNEL(qemu, touchscreen);
+#define MAX_TOUCH_EVENT_CNT 256
+
static QTAILQ_HEAD(, TouchEventEntry) events_queue =
QTAILQ_HEAD_INITIALIZER(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)
{
- TouchEventEntry *te;
+ 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;
USBTouchscreenState *s = opaque;
te = g_malloc0(sizeof(TouchEventEntry));
te->queue_packet.state = buttons_state;
pthread_mutex_lock(&event_mutex);
+ if (event_cnt > MAX_TOUCH_EVENT_CNT) {
+ pthread_mutex_unlock(&event_mutex);
+ INFO("full touch event queue, lose event\n", event_cnt);
+ return;
+ }
te->index = event_cnt++;
QTAILQ_INSERT_TAIL(&events_queue, te, node);
- s->changed = 1;
+ s->changed = 0;
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)
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)) {
+ /*if (!QTAILQ_EMPTY(&events_queue)) {
TouchEventEntry *te = QTAILQ_FIRST(&events_queue);
s->dx = te->queue_packet.x;
}
}
- pthread_mutex_unlock(&event_mutex);
+ pthread_mutex_unlock(&event_mutex); */
+ s->changed = 0;
ret = usb_touchscreen_poll(s, buf, p->iov.size);
usb_packet_copy(p, buf, ret);