From 9855645ef86baa7345f402a60f97b7b0f4937520 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 26 Apr 2001 16:54:56 +0000 Subject: [PATCH] Date: Thu, 26 Apr 2001 10:46:23 +0200 From: Alexander Pipelka Subject: SDL ELO driver bugfix Hi Sam! We noticed that the ELO serial touchscreen controller is quite sensitive in terms of correct protocol handling. The current implementation cause some controllers to hangup after some time (> 24h). I think the attached patch should fix this (I ran my device more than 3 days without any hangups). --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%405 --- src/video/fbcon/SDL_fbelo.c | 23 +++++++++++++++++++++++ src/video/fbcon/SDL_fbelo.h | 6 ++++++ src/video/fbcon/SDL_fbevents.c | 25 +++++++++++++++++++------ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/video/fbcon/SDL_fbelo.c b/src/video/fbcon/SDL_fbelo.c index 3580a2d17..046f5b561 100644 --- a/src/video/fbcon/SDL_fbelo.c +++ b/src/video/fbcon/SDL_fbelo.c @@ -421,3 +421,26 @@ int eloInitController(int fd) { return 1; } + +int eloReadPosition(_THIS, int fd, int* x, int* y, int* button_state, int* realx, int* realy) { + unsigned char buffer[ELO_PACKET_SIZE]; + int pointer = 0; + int checksum = ELO_INIT_CHECKSUM; + + while(pointer < ELO_PACKET_SIZE) { + if(eloGetPacket(buffer, &pointer, &checksum, fd)) { + break; + } + } + + if(!eloParsePacket(buffer, realx, realy, button_state)) { + return 0; + } + + *x = *realx; + *y = *realy; + + eloConvertXY(this, x, y); + + return 1; +} diff --git a/src/video/fbcon/SDL_fbelo.h b/src/video/fbcon/SDL_fbelo.h index 161c28509..8ffa77a75 100644 --- a/src/video/fbcon/SDL_fbelo.h +++ b/src/video/fbcon/SDL_fbelo.h @@ -52,4 +52,10 @@ int eloInitController(int fd); */ int eloParsePacket(unsigned char* mousebuf, int* dx, int* dy, int* button_state); +/* eloReadPosition + read a packet and get the cursor position +*/ + +int eloReadPosition(_THIS, int fd, int* x, int* y, int* button_state, int* realx, int* realy); + #endif /* SDL_fbelo_h */ diff --git a/src/video/fbcon/SDL_fbevents.c b/src/video/fbcon/SDL_fbevents.c index 04694ef2a..d64bb7682 100644 --- a/src/video/fbcon/SDL_fbevents.c +++ b/src/video/fbcon/SDL_fbevents.c @@ -619,7 +619,8 @@ static void handle_mouse(_THIS) int button = 0; int dx = 0, dy = 0; int packetsize = 0; - + int realx, realy; + /* Figure out the mouse packet size */ switch (mouse_drv) { case MOUSE_NONE: @@ -647,6 +648,18 @@ static void handle_mouse(_THIS) break; } + /* Special handling for the quite sensitive ELO controller */ + if (mouse_drv == MOUSE_ELO) { + + /* try to read the next packet */ + if(eloReadPosition(this, mouse_fd, &dx, &dy, &button, &realx, &realy)) { + button = (button & 0x01) << 2; + FB_vgamousecallback(button, relative, dx, dy); + } + + return; + } + /* Read as many packets as possible */ nread = read(mouse_fd, &mousebuf[start], BUFSIZ-start); if ( nread < 0 ) { @@ -740,25 +753,25 @@ static void handle_mouse(_THIS) dx = (signed char)mousebuf[i+1]; dy = -(signed char)mousebuf[i+2]; break; + /* case MOUSE_ELO: - /* ELO protocol has ELO_START_BYTE as first byte */ if ( mousebuf[i] != ELO_START_BYTE ) { - /* Go to next byte */ i -= (packetsize-1); continue; } - /* parse the packet */ if(!eloParsePacket(&(mousebuf[i]), &dx, &dy, &button)) { - break; + i -= (packetsize-1); + continue; } button = (button & 0x01) << 2; - /* convert to screen coordinates */ eloConvertXY(this, &dx, &dy); break; + */ + case MOUSE_ELO: case NUM_MOUSE_DRVS: /* Uh oh.. */ dx = 0;