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.
This commit is contained in:
parent
d12afdaedb
commit
bc2e106a8b
11 changed files with 1138 additions and 0 deletions
3
touchTest/makefile
Normal file
3
touchTest/makefile
Normal file
|
@ -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
|
3
touchTest/makefile~
Normal file
3
touchTest/makefile~
Normal file
|
@ -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
|
BIN
touchTest/testIn
Executable file
BIN
touchTest/testIn
Executable file
Binary file not shown.
69
touchTest/testIn.c
Normal file
69
touchTest/testIn.c
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <linux/input.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
|
||||
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;
|
||||
}
|
69
touchTest/testIn.c~
Normal file
69
touchTest/testIn.c~
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <linux/input.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
|
||||
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;
|
||||
}
|
BIN
touchTest/touchPong
Executable file
BIN
touchTest/touchPong
Executable file
Binary file not shown.
272
touchTest/touchPong.c
Normal file
272
touchTest/touchPong.c
Normal file
|
@ -0,0 +1,272 @@
|
|||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
#include <math.h>
|
||||
#include <linux/input.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
#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<MAX_FINGERS;i++)
|
||||
drawCircle(screen,finger[i].x,finger[i].y,30,0xFFFFFF);
|
||||
|
||||
drawCircle(screen,ball.x,ball.y,30,0xFF00FF);
|
||||
|
||||
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
|
||||
|
||||
SDL_Flip(screen);
|
||||
}
|
||||
|
||||
SDL_Surface* initScreen(int width,int height)
|
||||
{
|
||||
return SDL_SetVideoMode(width, height, DEPTH,
|
||||
SDL_HWSURFACE | SDL_RESIZABLE);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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<MAX_FINGERS;i++)
|
||||
{
|
||||
|
||||
if(finger[i].x > 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;
|
||||
}
|
243
touchTest/touchPong.c~
Normal file
243
touchTest/touchPong.c~
Normal file
|
@ -0,0 +1,243 @@
|
|||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
#include <math.h>
|
||||
#include <linux/input.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
#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<MAX_FINGERS;i++)
|
||||
drawCircle(screen,finger[i].x,finger[i].y,30,0xFFFFFF);
|
||||
|
||||
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
|
||||
|
||||
SDL_Flip(screen);
|
||||
}
|
||||
|
||||
SDL_Surface* initScreen(int width,int height)
|
||||
{
|
||||
return SDL_SetVideoMode(width, height, DEPTH,
|
||||
SDL_HWSURFACE | SDL_RESIZABLE);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
BIN
touchTest/touchSimp
Executable file
BIN
touchTest/touchSimp
Executable file
Binary file not shown.
238
touchTest/touchSimp.c
Normal file
238
touchTest/touchSimp.c
Normal file
|
@ -0,0 +1,238 @@
|
|||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
#include <math.h>
|
||||
#include <linux/input.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
#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<MAX_FINGERS;i++)
|
||||
drawCircle(screen,finger[i].x,finger[i].y,30,0xFFFFFF);
|
||||
|
||||
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
|
||||
|
||||
SDL_Flip(screen);
|
||||
}
|
||||
|
||||
SDL_Surface* initScreen(int width,int height)
|
||||
{
|
||||
return SDL_SetVideoMode(width, height, DEPTH,
|
||||
SDL_HWSURFACE | SDL_RESIZABLE);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
241
touchTest/touchSimp.c~
Normal file
241
touchTest/touchSimp.c~
Normal file
|
@ -0,0 +1,241 @@
|
|||
#include <stdio.h>
|
||||
#include <SDL.h>
|
||||
#include <math.h>
|
||||
#include <linux/input.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
|
||||
#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<MAX_FINGERS;i++)
|
||||
drawCircle(screen,finger[i].x,finger[i].y,30,0xFFFFFF);
|
||||
|
||||
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
|
||||
|
||||
SDL_Flip(screen);
|
||||
}
|
||||
|
||||
SDL_Surface* initScreen(int width,int height)
|
||||
{
|
||||
return SDL_SetVideoMode(width, height, DEPTH,
|
||||
SDL_HWSURFACE | SDL_RESIZABLE);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue