From 6acbf24eec844333adbe75d1a5d63363f70f06d4 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Fri, 13 Aug 2010 23:08:32 -0400 Subject: [PATCH] Fixed bugs related to keyboard handling in gestureSDLTest. Fixed gesture code (dynamic memory allocation). Cleaned up gesture and test code. --- src/events/SDL_gesture.c | 253 ++++++++++++++++++----------------- touchTest/gestureSDLTest.c | 267 ++++++++----------------------------- 2 files changed, 186 insertions(+), 334 deletions(-) diff --git a/src/events/SDL_gesture.c b/src/events/SDL_gesture.c index 5f46b8e70..93ded4d0f 100644 --- a/src/events/SDL_gesture.c +++ b/src/events/SDL_gesture.c @@ -27,11 +27,12 @@ #include "SDL_gesture_c.h" //TODO: Replace with malloc -#define MAXFINGERS 5 -#define MAXTOUCHES 2 -#define MAXTEMPLATES 4 + #define MAXPATHSIZE 1024 + + + #define DOLLARNPOINTS 64 #define DOLLARSIZE 256 @@ -42,55 +43,38 @@ typedef struct { float x,y; -} Point; - - -typedef struct { - Point p; - float pressure; - SDL_FingerID id; -} Finger; - +} SDL_FloatPoint; typedef struct { float length; int numPoints; - Point p[MAXPATHSIZE]; -} DollarPath; + SDL_FloatPoint p[MAXPATHSIZE]; +} SDL_DollarPath; -/* typedef struct { - Finger f; - Point cv; - float dtheta,dDist; - DollarPath dollarPath; -} TouchPoint; -*/ -typedef struct { - Point path[DOLLARNPOINTS]; + SDL_FloatPoint path[DOLLARNPOINTS]; unsigned long hash; -} DollarTemplate; +} SDL_DollarTemplate; typedef struct { SDL_GestureID id; - Point res; - Point centroid; - //TouchPoint gestureLast[MAXFINGERS]; - DollarPath dollarPath; + SDL_FloatPoint res; + SDL_FloatPoint centroid; + SDL_DollarPath dollarPath; Uint16 numDownFingers; int numDollarTemplates; - DollarTemplate dollarTemplate[MAXTEMPLATES]; + SDL_DollarTemplate *dollarTemplate; SDL_bool recording; -} GestureTouch; +} SDL_GestureTouch; -GestureTouch gestureTouch[MAXTOUCHES]; -int numGestureTouches = 0; +SDL_GestureTouch *SDL_gestureTouch; +int SDL_numGestureTouches = 0; SDL_bool recordAll; -void SDL_PrintPath(Point *path) { +void SDL_PrintPath(SDL_FloatPoint *path) { int i; printf("Path:"); for(i=0;i= 0) return 1; } @@ -112,7 +96,7 @@ int SDL_RecordGesture(SDL_TouchID touchId) { return (touchId < 0); } -unsigned long SDL_HashDollar(Point* points) { +unsigned long SDL_HashDollar(SDL_FloatPoint* points) { unsigned long hash = 5381; int i; for(i = 0;i < DOLLARNPOINTS; i++) { @@ -123,14 +107,14 @@ unsigned long SDL_HashDollar(Point* points) { } -static int SaveTemplate(DollarTemplate *templ, SDL_RWops * src) { +static int SaveTemplate(SDL_DollarTemplate *templ, SDL_RWops * src) { if(src == NULL) return 0; int i; //No Longer storing the Hash, rehash on load //if(SDL_RWops.write(src,&(templ->hash),sizeof(templ->hash),1) != 1) return 0; - + if(SDL_RWwrite(src,templ->path, sizeof(templ->path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) return 0; @@ -141,8 +125,8 @@ static int SaveTemplate(DollarTemplate *templ, SDL_RWops * src) { int SDL_SaveAllDollarTemplates(SDL_RWops *src) { int i,j,rtrn = 0; - for(i = 0; i < numGestureTouches; i++) { - GestureTouch* touch = &gestureTouch[i]; + for(i = 0; i < SDL_numGestureTouches; i++) { + SDL_GestureTouch* touch = &SDL_gestureTouch[i]; for(j = 0;j < touch->numDollarTemplates; j++) { rtrn += SaveTemplate(&touch->dollarTemplate[i],src); } @@ -152,8 +136,8 @@ int SDL_SaveAllDollarTemplates(SDL_RWops *src) { int SDL_SaveDollarTemplate(SDL_GestureID gestureId, SDL_RWops *src) { int i,j; - for(i = 0; i < numGestureTouches; i++) { - GestureTouch* touch = &gestureTouch[i]; + for(i = 0; i < SDL_numGestureTouches; i++) { + SDL_GestureTouch* touch = &SDL_gestureTouch[i]; for(j = 0;j < touch->numDollarTemplates; j++) { if(touch->dollarTemplate[i].hash == gestureId) { return SaveTemplate(&touch->dollarTemplate[i],src); @@ -166,25 +150,46 @@ int SDL_SaveDollarTemplate(SDL_GestureID gestureId, SDL_RWops *src) { //path is an already sampled set of points //Returns the index of the gesture on success, or -1 -static int SDL_AddDollarGesture(GestureTouch* inTouch,Point* path) { +static int SDL_AddDollarGesture(SDL_GestureTouch* inTouch,SDL_FloatPoint* path) { if(inTouch == NULL) { - if(numGestureTouches == 0) return -1; + if(SDL_numGestureTouches == 0) return -1; int i = 0; - for(i = 0;i < numGestureTouches; i++) { - inTouch = &gestureTouch[i]; - if(inTouch->numDollarTemplates < MAXTEMPLATES) { - DollarTemplate *templ = - &inTouch->dollarTemplate[inTouch->numDollarTemplates]; - memcpy(templ->path,path,DOLLARNPOINTS*sizeof(Point)); - templ->hash = SDL_HashDollar(templ->path); - inTouch->numDollarTemplates++; + for(i = 0;i < SDL_numGestureTouches; i++) { + inTouch = &SDL_gestureTouch[i]; + + SDL_DollarTemplate* dollarTemplate = + SDL_realloc(inTouch->dollarTemplate, + (inTouch->numDollarTemplates + 1) * + sizeof(SDL_DollarTemplate)); + if(!dollarTemplate) { + SDL_OutOfMemory(); + return -1; } + + inTouch->dollarTemplate = dollarTemplate; + + SDL_DollarTemplate *templ = + &inTouch->dollarTemplate[inTouch->numDollarTemplates]; + memcpy(templ->path,path,DOLLARNPOINTS*sizeof(SDL_FloatPoint)); + templ->hash = SDL_HashDollar(templ->path); + inTouch->numDollarTemplates++; } return inTouch->numDollarTemplates - 1; - }else if(inTouch->numDollarTemplates < MAXTEMPLATES) { - DollarTemplate *templ = + } else { + SDL_DollarTemplate* dollarTemplate = + SDL_realloc(inTouch->dollarTemplate, + (inTouch->numDollarTemplates + 1) * + sizeof(SDL_DollarTemplate)); + if(!dollarTemplate) { + SDL_OutOfMemory(); + return -1; + } + + inTouch->dollarTemplate = dollarTemplate; + + SDL_DollarTemplate *templ = &inTouch->dollarTemplate[inTouch->numDollarTemplates]; - memcpy(templ->path,path,DOLLARNPOINTS*sizeof(Point)); + memcpy(templ->path,path,DOLLARNPOINTS*sizeof(SDL_FloatPoint)); templ->hash = SDL_HashDollar(templ->path); inTouch->numDollarTemplates++; return inTouch->numDollarTemplates - 1; @@ -195,36 +200,28 @@ static int SDL_AddDollarGesture(GestureTouch* inTouch,Point* path) { int SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src) { if(src == NULL) return 0; int i,loaded = 0; - GestureTouch *touch = NULL; + SDL_GestureTouch *touch = NULL; if(touchId >= 0) { - for(i = 0;i < numGestureTouches; i++) - if(gestureTouch[i].id == touchId) - touch = &gestureTouch[i]; + for(i = 0;i < SDL_numGestureTouches; i++) + if(SDL_gestureTouch[i].id == touchId) + touch = &SDL_gestureTouch[i]; if(touch == NULL) return -1; } while(1) { - DollarTemplate templ; - //fscanf(fp,"%lu ",&templ.hash); - /* - for(i = 0;i < DOLLARNPOINTS; i++) { - int x,y; - if(fscanf(fp,"%i %i ",&x,&y) != 2) break; - templ.path[i].x = x; - templ.path[i].y = y; - } - fscanf(fp,"\n"); - */ - if(SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < DOLLARNPOINTS) break; + SDL_DollarTemplate templ; + + if(SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < + DOLLARNPOINTS) break; if(touchId >= 0) { printf("Adding loaded gesture to 1 touch\n"); if(SDL_AddDollarGesture(touch,templ.path)) loaded++; } else { - printf("Adding to: %i touches\n",numGestureTouches); - for(i = 0;i < numGestureTouches; i++) { - touch = &gestureTouch[i]; + printf("Adding to: %i touches\n",SDL_numGestureTouches); + for(i = 0;i < SDL_numGestureTouches; i++) { + touch = &SDL_gestureTouch[i]; printf("Adding loaded gesture to + touches\n"); //TODO: What if this fails? SDL_AddDollarGesture(touch,templ.path); @@ -237,10 +234,10 @@ int SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src) { } -float dollarDifference(Point* points,Point* templ,float ang) { - // Point p[DOLLARNPOINTS]; +float dollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ,float ang) { + // SDL_FloatPoint p[DOLLARNPOINTS]; float dist = 0; - Point p; + SDL_FloatPoint p; int i; for(i = 0; i < DOLLARNPOINTS; i++) { p.x = points[i].x * cos(ang) - points[i].y * sin(ang); @@ -252,7 +249,7 @@ float dollarDifference(Point* points,Point* templ,float ang) { } -float bestDollarDifference(Point* points,Point* templ) { +float bestDollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ) { //------------BEGIN DOLLAR BLACKBOX----------------// //-TRANSLATED DIRECTLY FROM PSUDEO-CODE AVAILABLE AT-// //-"http://depts.washington.edu/aimgroup/proj/dollar/"-// @@ -289,10 +286,9 @@ float bestDollarDifference(Point* points,Point* templ) { } //DollarPath contains raw points, plus (possibly) the calculated length -int dollarNormalize(DollarPath path,Point *points) { +int dollarNormalize(SDL_DollarPath path,SDL_FloatPoint *points) { int i; //Calculate length if it hasn't already been done - printf("length: %f\n",path.length); if(path.length <= 0) { for(i=1;i= MAXTOUCHES) return -1; - - gestureTouch[numGestureTouches].res.x = touch->xres; - gestureTouch[numGestureTouches].res.y = touch->yres; - gestureTouch[numGestureTouches].numDownFingers = 0; +int SDL_GestureAddTouch(SDL_Touch* touch) { + SDL_GestureTouch *gestureTouch = SDL_realloc(SDL_gestureTouch, + (SDL_numGestureTouches + 1) * + sizeof(SDL_GestureTouch)); + + if(!gestureTouch) { + SDL_OutOfMemory(); + return -1; + } + + SDL_gestureTouch = gestureTouch; + + SDL_gestureTouch[SDL_numGestureTouches].res.x = touch->xres; + SDL_gestureTouch[SDL_numGestureTouches].res.y = touch->yres; + SDL_gestureTouch[SDL_numGestureTouches].numDownFingers = 0; - gestureTouch[numGestureTouches].res.x = touch->xres; - gestureTouch[numGestureTouches].id = touch->id; + SDL_gestureTouch[SDL_numGestureTouches].res.x = touch->xres; + SDL_gestureTouch[SDL_numGestureTouches].id = touch->id; - gestureTouch[numGestureTouches].numDollarTemplates = 0; + SDL_gestureTouch[SDL_numGestureTouches].numDollarTemplates = 0; - gestureTouch[numGestureTouches].recording = SDL_FALSE; + SDL_gestureTouch[SDL_numGestureTouches].recording = SDL_FALSE; - numGestureTouches++; + SDL_numGestureTouches++; return 0; } -GestureTouch * SDL_GetGestureTouch(SDL_TouchID id) { +int SDL_GestureRemoveTouch(SDL_TouchID id) { int i; - for(i = 0;i < numGestureTouches; i++) { - //printf("%i ?= %i\n",gestureTouch[i].id,id); - if(gestureTouch[i].id == id) return &gestureTouch[i]; + for(i = 0;i < SDL_numGestureTouches; i++) { + if(SDL_gestureTouch[i].id == id) { + SDL_numGestureTouches--; + SDL_gestureTouch[i] = SDL_gestureTouch[SDL_numGestureTouches]; + return 1; + } + } + return -1; +} + + +SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id) { + int i; + for(i = 0;i < SDL_numGestureTouches; i++) { + //printf("%i ?= %i\n",SDL_gestureTouch[i].id,id); + if(SDL_gestureTouch[i].id == id) return &SDL_gestureTouch[i]; } return NULL; } -int SDL_SendGestureMulti(GestureTouch* touch,float dTheta,float dDist) { +int SDL_SendGestureMulti(SDL_GestureTouch* touch,float dTheta,float dDist) { SDL_Event event; event.mgesture.type = SDL_MULTIGESTURE; event.mgesture.touchId = touch->id; @@ -433,7 +450,7 @@ int SDL_SendGestureMulti(GestureTouch* touch,float dTheta,float dDist) { return SDL_PushEvent(&event) > 0; } -int SDL_SendGestureDollar(GestureTouch* touch, +int SDL_SendGestureDollar(SDL_GestureTouch* touch, SDL_GestureID gestureId,float error) { SDL_Event event; event.dgesture.type = SDL_DOLLARGESTURE; @@ -449,7 +466,7 @@ int SDL_SendGestureDollar(GestureTouch* touch, } -int SDL_SendDollarRecord(GestureTouch* touch,SDL_GestureID gestureId) { +int SDL_SendDollarRecord(SDL_GestureTouch* touch,SDL_GestureID gestureId) { SDL_Event event; event.dgesture.type = SDL_DOLLARRECORD; event.dgesture.touchId = touch->id; @@ -464,7 +481,7 @@ void SDL_GestureProcessEvent(SDL_Event* event) if(event->type == SDL_FINGERMOTION || event->type == SDL_FINGERDOWN || event->type == SDL_FINGERUP) { - GestureTouch* inTouch = SDL_GetGestureTouch(event->tfinger.touchId); + SDL_GestureTouch* inTouch = SDL_GetGestureTouch(event->tfinger.touchId); //Shouldn't be possible if(inTouch == NULL) return; @@ -485,15 +502,15 @@ void SDL_GestureProcessEvent(SDL_Event* event) #ifdef ENABLE_DOLLAR if(inTouch->recording) { inTouch->recording = SDL_FALSE; - Point path[DOLLARNPOINTS]; + SDL_FloatPoint path[DOLLARNPOINTS]; dollarNormalize(inTouch->dollarPath,path); //SDL_PrintPath(path); int index; if(recordAll) { index = SDL_AddDollarGesture(NULL,path); int i; - for(i = 0;i < numGestureTouches; i++) - gestureTouch[i].recording = SDL_FALSE; + for(i = 0;i < SDL_numGestureTouches; i++) + SDL_gestureTouch[i].recording = SDL_FALSE; } else { index = SDL_AddDollarGesture(inTouch,path); @@ -532,7 +549,7 @@ void SDL_GestureProcessEvent(SDL_Event* event) float dy = ((float)event->tfinger.dy)/(float)inTouch->res.y; //printf("dx,dy: (%f,%f)\n",dx,dy); #ifdef ENABLE_DOLLAR - DollarPath* path = &inTouch->dollarPath; + SDL_DollarPath* path = &inTouch->dollarPath; if(path->numPoints < MAXPATHSIZE) { path->p[path->numPoints].x = inTouch->centroid.x; path->p[path->numPoints].y = inTouch->centroid.y; @@ -544,18 +561,18 @@ void SDL_GestureProcessEvent(SDL_Event* event) path->numPoints++; } #endif - Point lastP; + SDL_FloatPoint lastP; lastP.x = x - dx; lastP.y = y - dy; - Point lastCentroid; + SDL_FloatPoint lastCentroid; lastCentroid = inTouch->centroid; inTouch->centroid.x += dx/inTouch->numDownFingers; inTouch->centroid.y += dy/inTouch->numDownFingers; //printf("Centrid : (%f,%f)\n",inTouch->centroid.x,inTouch->centroid.y); if(inTouch->numDownFingers > 1) { - Point lv; //Vector from centroid to last x,y position - Point v; //Vector from centroid to current x,y position + SDL_FloatPoint lv; //Vector from centroid to last x,y position + SDL_FloatPoint v; //Vector from centroid to current x,y position //lv = inTouch->gestureLast[j].cv; lv.x = lastP.x - lastCentroid.x; lv.y = lastP.y - lastCentroid.y; @@ -608,15 +625,9 @@ void SDL_GestureProcessEvent(SDL_Event* event) x)/inTouch->numDownFingers; inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers - 1)+ y)/inTouch->numDownFingers; - printf("Finger Down: (%f,%f). Centroid: (%f,%f\n",x,y, - inTouch->centroid.x,inTouch->centroid.y); - /* - inTouch->gestureLast[j].f.id = event->tfinger.fingerId; - inTouch->gestureLast[j].f.p.x = x; - inTouch->gestureLast[j].f.p.y = y; - inTouch->gestureLast[j].cv.x = 0; - inTouch->gestureLast[j].cv.y = 0; - */ + //printf("Finger Down: (%f,%f). Centroid: (%f,%f\n",x,y, + // inTouch->centroid.x,inTouch->centroid.y); + #ifdef ENABLE_DOLLAR inTouch->dollarPath.length = 0; inTouch->dollarPath.p[0].x = x; diff --git a/touchTest/gestureSDLTest.c b/touchTest/gestureSDLTest.c index 0496b74d1..e4f8ecc65 100644 --- a/touchTest/gestureSDLTest.c +++ b/touchTest/gestureSDLTest.c @@ -26,63 +26,26 @@ #endif #endif -#define PI 3.1415926535897 -#define PHI ((sqrt(5)-1)/2) #define WIDTH 640 #define HEIGHT 480 #define BPP 4 #define DEPTH 32 -#define MAXFINGERS 5 - -#define DOLLARNPOINTS 64 -#define DOLLARSIZE 256 - //MUST BE A POWER OF 2! #define EVENT_BUF_SIZE 256 + +#define VERBOSE SDL_FALSE + SDL_Event events[EVENT_BUF_SIZE]; int eventWrite; -int mousx,mousy; -int keystat[512]; -int bstatus; - int colors[7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF}; -SDL_FingerID index2fingerid[MAXFINGERS]; -int fingersDown; - typedef struct { float x,y; } Point; -typedef struct { - Point p; - float pressure; - SDL_FingerID id; -} Finger; - -typedef struct { - Finger f; - Point cv; - float dtheta,dDist; -} TouchPoint; - - -typedef struct { //dt + s - Point d,s; //direction, start - int points; -} Line; - - -typedef struct { - float length; - - int numPoints; - Point p[EVENT_BUF_SIZE]; //To be safe -} DollarPath; - typedef struct { float ang,r; Point p; @@ -90,19 +53,6 @@ typedef struct { Knob knob; -Finger finger[MAXFINGERS]; - - -DollarPath dollarPath[MAXFINGERS]; - -#define MAXTEMPLATES 4 - -Point dollarTemplate[MAXTEMPLATES][DOLLARNPOINTS]; -int numDollarTemplates = 0; -#ifdef DRAW_VECTOR_EST -Line gestureLine[MAXFINGERS]; -#endif - void handler (int sig) { printf ("\exiting...(%d)\n", sig); @@ -115,7 +65,6 @@ void perror_exit (char *error) handler (9); } - void setpix(SDL_Surface *screen, int x, int y, unsigned int col) { Uint32 *pixmem32; @@ -150,13 +99,10 @@ void drawLine(SDL_Surface *screen,int x0,int y0,int x1,int y1,unsigned int col) for(t=0;t<1;t+=1.f/SDL_max(abs(x0-x1),abs(y0-y1))) setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col); } + void drawCircle(SDL_Surface* screen,int x,int y,int r,unsigned int c) { - - float a; - int tx; - - int ty; + int tx,ty; float xr; for(ty = -abs(r);ty <= abs(r);ty++) { xr = sqrt(r*r - ty*ty); @@ -173,50 +119,24 @@ void drawCircle(SDL_Surface* screen,int x,int y,int r,unsigned int c) } void drawKnob(SDL_Surface* screen,Knob k) { - //printf("Knob: x = %f, y = %f, r = %f, a = %f\n",k.p.x,k.p.y,k.r,k.ang); - - drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF); - + drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF); drawCircle(screen,(k.p.x+k.r/2*cos(k.ang))*screen->w, (k.p.y+k.r/2*sin(k.ang))*screen->h,k.r/4*screen->w,0); - } -void DrawScreen(SDL_Surface* screen, int h) +void DrawScreen(SDL_Surface* screen) { - int x, y, xm,ym,c; + int x, y; 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); - //setpix(screen,x,y,0); //Inefficient, but that's okay... - } - } - drawCircle(screen,mousx,mousy,-30,0xFFFFFF); - drawLine(screen,0,0,screen->w,screen->h,0xFFFFFF); + for(y = 0;y < screen->h;y++) + for(x = 0;x < screen->w;x++) + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); int i; -//draw Touch History - TouchPoint gestureLast[MAXFINGERS]; - //printf("------------------Start History------------------\n"); - for(i = 0;i < MAXFINGERS;i++) { - gestureLast[i].f.id = -1; - } - int numDownFingers = 0; - Point centroid; - float gdtheta,gdDist; - - + //draw Touch History for(i = SDL_max(0,eventWrite - EVENT_BUF_SIZE);i < eventWrite;i++) { SDL_Event event = events[i&(EVENT_BUF_SIZE-1)]; int age = eventWrite - i - 1; @@ -224,13 +144,12 @@ void DrawScreen(SDL_Surface* screen, int h) event.type == SDL_FINGERDOWN || event.type == SDL_FINGERUP) { SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); - //SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); - + if(inTouch == NULL) continue; + float x = ((float)event.tfinger.x)/inTouch->xres; float y = ((float)event.tfinger.y)/inTouch->yres; - //draw the touch: - + //draw the touch: unsigned int c = colors[event.tfinger.touchId%7]; unsigned int col = ((unsigned int)(c*(.1+.85))) | @@ -243,25 +162,10 @@ void DrawScreen(SDL_Surface* screen, int h) } } - /* - for(i=0;i= 0 && finger[i].p.y >= 0) - if(finger[i].pressure > 0) - drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h - ,20,0xFF*finger[i].pressure); - else - drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h - ,20,0xFF); - */ - - - keystat[32] = 0; - if(knob.p.x > 0) drawKnob(screen,knob); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); - SDL_Flip(screen); } @@ -275,21 +179,15 @@ int main(int argc, char* argv[]) { SDL_Surface *screen; SDL_Event event; - - int keypress = 0; - int h=0,s=1,i,j; //gesture variables - int numDownFingers = 0; - float gdtheta = 0,gdDist = 0; - Point centroid; knob.r = .1; knob.ang = 0; - TouchPoint gestureLast[MAXFINGERS]; - + + SDL_bool quitting = SDL_FALSE; + SDL_RWops *src; - memset(keystat,0,512*sizeof(keystat[0])); if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; if (!(screen = initScreen(WIDTH,HEIGHT))) @@ -298,8 +196,7 @@ int main(int argc, char* argv[]) return 1; } - while(!keystat[27]) { - //Poll SDL + while(!quitting) { while(SDL_PollEvent(&event)) { //Record _all_ events @@ -309,38 +206,28 @@ int main(int argc, char* argv[]) switch (event.type) { case SDL_QUIT: - keystat[27] = 1; + quitting = SDL_TRUE; break; case SDL_KEYDOWN: - //printf("%i\n",event.key.keysym.sym); - keystat[event.key.keysym.sym] = 1; - if(event.key.keysym.sym == 32) { - SDL_RecordGesture(-1); - } - else if(event.key.keysym.sym == 115) { - SDL_RWops *src; - //fp = fopen("gestureSave","w"); - src = SDL_RWFromFile("gestureSave","w"); - - printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src)); - //fclose(fp); - SDL_RWclose(src); - } - else if(event.key.keysym.sym == 108) { - SDL_RWops *src; - //fp = fopen("gestureSave","r"); - src = SDL_RWFromFile("gestureSave","r"); - printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src)); - //fclose(fp); - SDL_RWclose(src); + switch (event.key.keysym.sym) + { + case SDLK_SPACE: + SDL_RecordGesture(-1); + break; + case SDLK_s: + src = SDL_RWFromFile("gestureSave","w"); + printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src)); + SDL_RWclose(src); + break; + case SDLK_l: + src = SDL_RWFromFile("gestureSave","r"); + printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src)); + SDL_RWclose(src); + break; + case SDLK_ESCAPE: + quitting = SDL_TRUE; + break; } - - //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, @@ -350,78 +237,36 @@ int main(int argc, char* argv[]) 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; case SDL_FINGERMOTION: ; - //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, - // event.tfinger.x,event.tfinger.y); +#if VERBOSE + printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, + event.tfinger.x,event.tfinger.y); +#endif SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); - /* - for(i = 0;i 0) { - finger[i].p.x = ((float)event.tfinger.x)/ - inTouch->xres; - finger[i].p.y = ((float)event.tfinger.y)/ - inTouch->yres; - - finger[i].pressure = - ((float)event.tfinger.pressure)/inTouch->pressureres; - */ - /* - printf("Finger: %i, Pressure: %f Pressureres: %i\n", - event.tfinger.fingerId, - finger[i].pressure, - inTouch->pressureres); - */ - //printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId, - // finger[event.tfinger.fingerId].pressure); - //} - break; case SDL_FINGERDOWN: - //printf("Finger: %"PRIs64" down - x: %i, y: %i\n",event.tfinger.fingerId,event.tfinger.x,event.tfinger.y); - /* - for(i = 0;i