From bc2e106a8b00756ce71c097671b98a5a0a4527d0 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Mon, 24 May 2010 23:44:24 -0400 Subject: [PATCH] Added Test Directory. Touch input works in touchSimp for wacom bamboo fun on Ubuntu linux. Not yet integrated into library. Should support other touch devices and other linux distros, but not tested on anything else. --- touchTest/makefile | 3 + touchTest/makefile~ | 3 + touchTest/testIn | Bin 0 -> 7451 bytes touchTest/testIn.c | 69 +++++++++++ touchTest/testIn.c~ | 69 +++++++++++ touchTest/touchPong | Bin 0 -> 28731 bytes touchTest/touchPong.c | 272 +++++++++++++++++++++++++++++++++++++++++ touchTest/touchPong.c~ | 243 ++++++++++++++++++++++++++++++++++++ touchTest/touchSimp | Bin 0 -> 28540 bytes touchTest/touchSimp.c | 238 ++++++++++++++++++++++++++++++++++++ touchTest/touchSimp.c~ | 241 ++++++++++++++++++++++++++++++++++++ 11 files changed, 1138 insertions(+) create mode 100644 touchTest/makefile create mode 100644 touchTest/makefile~ create mode 100755 touchTest/testIn create mode 100644 touchTest/testIn.c create mode 100644 touchTest/testIn.c~ create mode 100755 touchTest/touchPong create mode 100644 touchTest/touchPong.c create mode 100644 touchTest/touchPong.c~ create mode 100755 touchTest/touchSimp create mode 100644 touchTest/touchSimp.c create mode 100644 touchTest/touchSimp.c~ diff --git a/touchTest/makefile b/touchTest/makefile new file mode 100644 index 000000000..820205541 --- /dev/null +++ b/touchTest/makefile @@ -0,0 +1,3 @@ +SDLTest : touchSimp.c touchPong.c + gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g + gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g diff --git a/touchTest/makefile~ b/touchTest/makefile~ new file mode 100644 index 000000000..f27b5aa3d --- /dev/null +++ b/touchTest/makefile~ @@ -0,0 +1,3 @@ +SDLTest : touchSimp.c touchPong.c + gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -gSDLTest : + gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g diff --git a/touchTest/testIn b/touchTest/testIn new file mode 100755 index 0000000000000000000000000000000000000000..6ec332a5c71551edfb3feba2ed7af05c0bc3080f GIT binary patch literal 7451 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 literal 0 HcmV?d00001 diff --git a/touchTest/testIn.c b/touchTest/testIn.c new file mode 100644 index 000000000..73a8364b0 --- /dev/null +++ b/touchTest/testIn.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + +int main (int argc, char *argv[]) +{ + struct input_event ev[64]; + int fd, rd, value, size = sizeof (struct input_event); + char name[256] = "Unknown"; + char *device = NULL; + + //Setup check + if (argv[1] == NULL){ + printf("Please specify (on the command line) the path to the dev event interface device\n"); + exit (0); + } + + if ((getuid ()) != 0) + printf ("You are not root! This may not work...\n"); + + if (argc > 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + while (1){ + + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + printf("time: %i\n type: %X\n code: %X\n value: %i\n ",ev[0].time,ev[0].type,ev[0].value,ev[0].value); + + value = ev[0].value; + + if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event + printf ("Code[%d]\n", (ev[1].code)); + } + } + + return 0; +} diff --git a/touchTest/testIn.c~ b/touchTest/testIn.c~ new file mode 100644 index 000000000..73a8364b0 --- /dev/null +++ b/touchTest/testIn.c~ @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + +int main (int argc, char *argv[]) +{ + struct input_event ev[64]; + int fd, rd, value, size = sizeof (struct input_event); + char name[256] = "Unknown"; + char *device = NULL; + + //Setup check + if (argv[1] == NULL){ + printf("Please specify (on the command line) the path to the dev event interface device\n"); + exit (0); + } + + if ((getuid ()) != 0) + printf ("You are not root! This may not work...\n"); + + if (argc > 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + while (1){ + + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + printf("time: %i\n type: %X\n code: %X\n value: %i\n ",ev[0].time,ev[0].type,ev[0].value,ev[0].value); + + value = ev[0].value; + + if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event + printf ("Code[%d]\n", (ev[1].code)); + } + } + + return 0; +} diff --git a/touchTest/touchPong b/touchTest/touchPong new file mode 100755 index 0000000000000000000000000000000000000000..29e892b462ebea82de922f31e41e8095bcd2283e GIT binary patch literal 28731 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 literal 0 HcmV?d00001 diff --git a/touchTest/touchPong.c b/touchTest/touchPong.c new file mode 100644 index 000000000..4c0bedd6e --- /dev/null +++ b/touchTest/touchPong.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +//Pong Code +Point ball,ballv; + + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->w/2; + ball.y = screen->h/2; + ballv.x = -3; + ballv.y = 1; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + + //Pong code + ball.x += ballv.x; + ball.y += ballv.y; + for(i=0;i 0 || finger[i].y > 0) + { + int d2 = (finger[i].x-ball.x)*(finger[i].x-ball.x) + + (finger[i].y-ball.y)*(finger[i].y-ball.y); + ballv.x += (50*(ball.x-finger[i].x))/d2; + ballv.y += (30*(ball.y-finger[i].y))/d2; + } + } + if((unsigned int)ball.x > screen->w){ + ball.x = screen->w/2; + ball.y = screen->h/2; + ballv.x = -3; + ballv.y = 1; + } + if((unsigned int)ball.y > screen->h) ballv.y *= -1; + printf("(%i,%i)\n",ball.x,ball.y); + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchPong.c~ b/touchTest/touchPong.c~ new file mode 100644 index 000000000..4a60816eb --- /dev/null +++ b/touchTest/touchPong.c~ @@ -0,0 +1,243 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + +//Pong Code +Point ball,ballv; + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->width()/2; + ball.y = screen->height()/2; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchSimp b/touchTest/touchSimp new file mode 100755 index 0000000000000000000000000000000000000000..0caf1d15a2bc7b50101c6e91c88fdddeeeac137a GIT binary patch literal 28540 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 A-2eap literal 0 HcmV?d00001 diff --git a/touchTest/touchSimp.c b/touchTest/touchSimp.c new file mode 100644 index 000000000..b89f78207 --- /dev/null +++ b/touchTest/touchSimp.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchSimp.c~ b/touchTest/touchSimp.c~ new file mode 100644 index 000000000..218cb4a8b --- /dev/null +++ b/touchTest/touchSimp.c~ @@ -0,0 +1,241 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + Point ball,ballv; + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->width()/2; + ball.y = screen->height()/2; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +}