# HG changeset patch # User Sam Lantinga # Date 988304096 0 # Node ID 4f6c5f02132326b5e9bb968d0ee680125e0c10b3 # Parent 3b97b708523c98a8d5b7d125d4ad47e5bbd7683e 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). diff -r 3b97b708523c -r 4f6c5f021323 src/video/fbcon/SDL_fbelo.c --- a/src/video/fbcon/SDL_fbelo.c Thu Apr 26 16:52:42 2001 +0000 +++ b/src/video/fbcon/SDL_fbelo.c Thu Apr 26 16:54:56 2001 +0000 @@ -421,3 +421,26 @@ 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 -r 3b97b708523c -r 4f6c5f021323 src/video/fbcon/SDL_fbelo.h --- a/src/video/fbcon/SDL_fbelo.h Thu Apr 26 16:52:42 2001 +0000 +++ b/src/video/fbcon/SDL_fbelo.h Thu Apr 26 16:54:56 2001 +0000 @@ -52,4 +52,10 @@ */ 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 -r 3b97b708523c -r 4f6c5f021323 src/video/fbcon/SDL_fbevents.c --- a/src/video/fbcon/SDL_fbevents.c Thu Apr 26 16:52:42 2001 +0000 +++ b/src/video/fbcon/SDL_fbevents.c Thu Apr 26 16:54:56 2001 +0000 @@ -619,7 +619,8 @@ 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 @@ 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 @@ 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;