Commit bcd4b4df authored by Jim Grandpre's avatar Jim Grandpre

Fixed gestureMulti. Disabled dollar gesture temporarily.

parent c2191447
...@@ -296,6 +296,8 @@ typedef struct SDL_TouchFingerEvent ...@@ -296,6 +296,8 @@ typedef struct SDL_TouchFingerEvent
Uint8 padding3; Uint8 padding3;
Uint16 x; Uint16 x;
Uint16 y; Uint16 y;
Sint16 dx;
Sint16 dy;
Uint16 pressure; Uint16 pressure;
} SDL_TouchFingerEvent; } SDL_TouchFingerEvent;
...@@ -328,7 +330,8 @@ typedef struct SDL_MultiGestureEvent ...@@ -328,7 +330,8 @@ typedef struct SDL_MultiGestureEvent
float dDist; float dDist;
float x; //currently 0...1. Change to screen coords? float x; //currently 0...1. Change to screen coords?
float y; float y;
Uint16 numFingers;
Uint16 padding;
} SDL_MultiGestureEvent; } SDL_MultiGestureEvent;
typedef struct SDL_DollarGestureEvent typedef struct SDL_DollarGestureEvent
......
...@@ -75,7 +75,7 @@ typedef struct { ...@@ -75,7 +75,7 @@ typedef struct {
Point res; Point res;
Point centroid; Point centroid;
TouchPoint gestureLast[MAXFINGERS]; TouchPoint gestureLast[MAXFINGERS];
int numDownFingers; Uint16 numDownFingers;
int numDollarTemplates; int numDollarTemplates;
DollarTemplate dollarTemplate[MAXTEMPLATES]; DollarTemplate dollarTemplate[MAXTEMPLATES];
...@@ -406,6 +406,7 @@ int SDL_SendGestureMulti(GestureTouch* touch,float dTheta,float dDist) { ...@@ -406,6 +406,7 @@ int SDL_SendGestureMulti(GestureTouch* touch,float dTheta,float dDist) {
event.mgesture.y = touch->centroid.y; event.mgesture.y = touch->centroid.y;
event.mgesture.dTheta = dTheta; event.mgesture.dTheta = dTheta;
event.mgesture.dDist = dDist; event.mgesture.dDist = dDist;
event.mgesture.numFingers = touch->numDownFingers;
return SDL_PushEvent(&event) > 0; return SDL_PushEvent(&event) > 0;
} }
...@@ -445,17 +446,20 @@ void SDL_GestureProcessEvent(SDL_Event* event) ...@@ -445,17 +446,20 @@ void SDL_GestureProcessEvent(SDL_Event* event)
//Shouldn't be possible //Shouldn't be possible
if(inTouch == NULL) return; if(inTouch == NULL) return;
//printf("@ (%i,%i) with res: (%i,%i)\n",(int)event->tfinger.x,
// (int)event->tfinger.y,
// (int)inTouch->res.x,(int)inTouch->res.y);
float x = ((float)event->tfinger.x)/(float)inTouch->res.x;
float y = ((float)event->tfinger.y)/(float)inTouch->res.y;
float x = ((float)event->tfinger.x)/inTouch->res.x;
float y = ((float)event->tfinger.y)/inTouch->res.y;
int j,empty = -1;
for(j = 0;j<inTouch->numDownFingers;j++) {
if(inTouch->gestureLast[j].f.id != event->tfinger.fingerId) continue;
//Finger Up //Finger Up
if(event->type == SDL_FINGERUP) { if(event->type == SDL_FINGERUP) {
inTouch->numDownFingers--; inTouch->numDownFingers--;
#ifdef ENABLE_DOLLAR
if(inTouch->recording) { if(inTouch->recording) {
inTouch->recording = SDL_FALSE; inTouch->recording = SDL_FALSE;
Point path[DOLLARNPOINTS]; Point path[DOLLARNPOINTS];
...@@ -487,16 +491,23 @@ void SDL_GestureProcessEvent(SDL_Event* event) ...@@ -487,16 +491,23 @@ void SDL_GestureProcessEvent(SDL_Event* event)
//Send Event //Send Event
unsigned long gestureId = inTouch->dollarTemplate[bestTempl].hash; unsigned long gestureId = inTouch->dollarTemplate[bestTempl].hash;
SDL_SendGestureDollar(inTouch,gestureId,error); SDL_SendGestureDollar(inTouch,gestureId,error);
printf("Dollar error: %f\n",error); printf ("%s\n",);("Dollar error: %f\n",error);
}
} }
#endif
//inTouch->gestureLast[j] = inTouch->gestureLast[inTouch->numDownFingers];
if(inTouch->numDownFingers > 0) {
inTouch->centroid.x = (inTouch->centroid.x*(inTouch->numDownFingers+1)-
x)/inTouch->numDownFingers;
inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers+1)-
y)/inTouch->numDownFingers;
} }
inTouch->gestureLast[j] = inTouch->gestureLast[inTouch->numDownFingers];
j = -1;
break;
} }
else if(event->type == SDL_FINGERMOTION) { else if(event->type == SDL_FINGERMOTION) {
float dx = x - inTouch->gestureLast[j].f.p.x; float dx = ((float)event->tfinger.dx)/(float)inTouch->res.x;
float dy = y - inTouch->gestureLast[j].f.p.y; float dy = ((float)event->tfinger.dy)/(float)inTouch->res.y;
//printf("dx,dy: (%f,%f)\n",dx,dy);
#ifdef ENABLE_DOLLAR
DollarPath* path = &inTouch->gestureLast[j].dollarPath; DollarPath* path = &inTouch->gestureLast[j].dollarPath;
if(path->numPoints < MAXPATHSIZE) { if(path->numPoints < MAXPATHSIZE) {
path->p[path->numPoints].x = x; path->p[path->numPoints].x = x;
...@@ -504,19 +515,26 @@ void SDL_GestureProcessEvent(SDL_Event* event) ...@@ -504,19 +515,26 @@ void SDL_GestureProcessEvent(SDL_Event* event)
path->length += sqrt(dx*dx + dy*dy); path->length += sqrt(dx*dx + dy*dy);
path->numPoints++; path->numPoints++;
} }
#endif
Point lastP;
lastP.x = x - dx;
lastP.y = y - dy;
Point lastCentroid;
lastCentroid = inTouch->centroid;
inTouch->centroid.x += dx/inTouch->numDownFingers; inTouch->centroid.x += dx/inTouch->numDownFingers;
inTouch->centroid.y += dy/inTouch->numDownFingers; inTouch->centroid.y += dy/inTouch->numDownFingers;
if(inTouch->numDownFingers > 1) { if(inTouch->numDownFingers > 1) {
Point lv; //Vector from centroid to last x,y position Point lv; //Vector from centroid to last x,y position
Point v; //Vector from centroid to current x,y position Point v; //Vector from centroid to current x,y position
lv = inTouch->gestureLast[j].cv; //lv = inTouch->gestureLast[j].cv;
lv.x = lastP.x - lastCentroid.x;
lv.y = lastP.y - lastCentroid.y;
float lDist = sqrt(lv.x*lv.x + lv.y*lv.y); float lDist = sqrt(lv.x*lv.x + lv.y*lv.y);
//printf("lDist = %f\n",lDist); //printf("lDist = %f\n",lDist);
v.x = x - inTouch->centroid.x; v.x = x - inTouch->centroid.x;
v.y = y - inTouch->centroid.y; v.y = y - inTouch->centroid.y;
inTouch->gestureLast[j].cv = v; //inTouch->gestureLast[j].cv = v;
float Dist = sqrt(v.x*v.x+v.y*v.y); float Dist = sqrt(v.x*v.x+v.y*v.y);
// cos(dTheta) = (v . lv)/(|v| * |lv|) // cos(dTheta) = (v . lv)/(|v| * |lv|)
...@@ -529,8 +547,9 @@ void SDL_GestureProcessEvent(SDL_Event* event) ...@@ -529,8 +547,9 @@ void SDL_GestureProcessEvent(SDL_Event* event)
float dDist = (Dist - lDist); float dDist = (Dist - lDist);
if(lDist == 0) {dDist = 0;dtheta = 0;} //To avoid impossible values if(lDist == 0) {dDist = 0;dtheta = 0;} //To avoid impossible values
inTouch->gestureLast[j].dDist = dDist;
inTouch->gestureLast[j].dtheta = dtheta; //inTouch->gestureLast[j].dDist = dDist;
//inTouch->gestureLast[j].dtheta = dtheta;
//printf("dDist = %f, dTheta = %f\n",dDist,dtheta); //printf("dDist = %f, dTheta = %f\n",dDist,dtheta);
//gdtheta = gdtheta*.9 + dtheta*.1; //gdtheta = gdtheta*.9 + dtheta*.1;
...@@ -542,36 +561,39 @@ void SDL_GestureProcessEvent(SDL_Event* event) ...@@ -542,36 +561,39 @@ void SDL_GestureProcessEvent(SDL_Event* event)
SDL_SendGestureMulti(inTouch,dtheta,dDist); SDL_SendGestureMulti(inTouch,dtheta,dDist);
} }
else { else {
inTouch->gestureLast[j].dDist = 0; //inTouch->gestureLast[j].dDist = 0;
inTouch->gestureLast[j].dtheta = 0; //inTouch->gestureLast[j].dtheta = 0;
inTouch->gestureLast[j].cv.x = 0; //inTouch->gestureLast[j].cv.x = 0;
inTouch->gestureLast[j].cv.y = 0; //inTouch->gestureLast[j].cv.y = 0;
} }
inTouch->gestureLast[j].f.p.x = x; //inTouch->gestureLast[j].f.p.x = x;
inTouch->gestureLast[j].f.p.y = y; //inTouch->gestureLast[j].f.p.y = y;
break; //break;
//pressure? //pressure?
} }
}
if(j == inTouch->numDownFingers) { if(event->type == SDL_FINGERDOWN) {
//printf("Finger Down!!!\n");
inTouch->numDownFingers++; inTouch->numDownFingers++;
inTouch->centroid.x = (inTouch->centroid.x*(inTouch->numDownFingers - 1)+ inTouch->centroid.x = (inTouch->centroid.x*(inTouch->numDownFingers - 1)+
x)/inTouch->numDownFingers; x)/inTouch->numDownFingers;
inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers - 1)+ inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers - 1)+
y)/inTouch->numDownFingers; 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.id = event->tfinger.fingerId;
inTouch->gestureLast[j].f.p.x = x; inTouch->gestureLast[j].f.p.x = x;
inTouch->gestureLast[j].f.p.y = y; inTouch->gestureLast[j].f.p.y = y;
inTouch->gestureLast[j].cv.x = 0; inTouch->gestureLast[j].cv.x = 0;
inTouch->gestureLast[j].cv.y = 0; inTouch->gestureLast[j].cv.y = 0;
*/
#ifdef ENABlE_DOLLAR
inTouch->gestureLast[j].dollarPath.length = 0; inTouch->gestureLast[j].dollarPath.length = 0;
inTouch->gestureLast[j].dollarPath.p[0].x = x; inTouch->gestureLast[j].dollarPath.p[0].x = x;
inTouch->gestureLast[j].dollarPath.p[0].y = y; inTouch->gestureLast[j].dollarPath.p[0].y = y;
inTouch->gestureLast[j].dollarPath.numPoints = 1; inTouch->gestureLast[j].dollarPath.numPoints = 1;
#endif
} }
} }
} }
......
...@@ -318,15 +318,17 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, ...@@ -318,15 +318,17 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down,
if(!touch) { if(!touch) {
return SDL_TouchNotFoundError(id); return SDL_TouchNotFoundError(id);
} }
//scale to Integer coordinates //scale to Integer coordinates
Uint16 x = (xin+touch->x_min)*(touch->xres)/(touch->native_xres); Uint16 x = (xin+touch->x_min)*(touch->xres)/(touch->native_xres);
Uint16 y = (yin+touch->y_min)*(touch->yres)/(touch->native_yres); Uint16 y = (yin+touch->y_min)*(touch->yres)/(touch->native_yres);
Uint16 pressure = (yin+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres); Uint16 pressure = (yin+touch->pressure_min)*(touch->pressureres)/(touch->native_pressureres);
if(down) {
SDL_Finger *finger = SDL_GetFinger(touch,fingerid); SDL_Finger *finger = SDL_GetFinger(touch,fingerid);
SDL_Finger nf; if(down) {
if(finger == NULL) { if(finger == NULL) {
SDL_Finger nf;
nf.id = fingerid; nf.id = fingerid;
nf.x = x; nf.x = x;
nf.y = y; nf.y = y;
...@@ -337,8 +339,8 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, ...@@ -337,8 +339,8 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down,
nf.last_y = y; nf.last_y = y;
nf.last_pressure = pressure; nf.last_pressure = pressure;
nf.down = SDL_FALSE; nf.down = SDL_FALSE;
SDL_AddFinger(touch,&nf); if(SDL_AddFinger(touch,&nf) < 0) return 0;
finger = &nf; finger = SDL_GetFinger(touch,fingerid);
} }
else if(finger->down) return 0; else if(finger->down) return 0;
if(xin < touch->x_min || yin < touch->y_min) return 0; //should defer if only a partial input if(xin < touch->x_min || yin < touch->y_min) return 0; //should defer if only a partial input
...@@ -358,7 +360,7 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, ...@@ -358,7 +360,7 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down,
return posted; return posted;
} }
else { else {
if(SDL_DelFinger(touch,fingerid) < 0) return 0; if(finger == NULL) {printf("Finger not found...\n");return 0;}
posted = 0; posted = 0;
if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) { if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
SDL_Event event; SDL_Event event;
...@@ -367,6 +369,13 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, ...@@ -367,6 +369,13 @@ SDL_SendFingerDown(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down,
event.tfinger.state = touch->buttonstate; event.tfinger.state = touch->buttonstate;
event.tfinger.windowID = touch->focus ? touch->focus->id : 0; event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
event.tfinger.fingerId = fingerid; event.tfinger.fingerId = fingerid;
//I don't trust the coordinates passed on fingerUp
event.tfinger.x = finger->x;
event.tfinger.y = finger->y;
event.tfinger.dx = 0;
event.tfinger.dy = 0;
if(SDL_DelFinger(touch,fingerid) < 0) return 0;
posted = (SDL_PushEvent(&event) > 0); posted = (SDL_PushEvent(&event) > 0);
} }
return posted; return posted;
...@@ -381,8 +390,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, ...@@ -381,8 +390,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative,
SDL_Touch *touch = SDL_GetTouch(id); SDL_Touch *touch = SDL_GetTouch(id);
SDL_Finger *finger = SDL_GetFinger(touch,fingerid); SDL_Finger *finger = SDL_GetFinger(touch,fingerid);
int posted; int posted;
float xrel; Sint16 xrel, yrel;
float yrel;
float x_max = 0, y_max = 0; float x_max = 0, y_max = 0;
if (!touch) { if (!touch) {
...@@ -398,7 +406,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, ...@@ -398,7 +406,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative,
} }
if(finger == NULL || !finger->down) { if(finger == NULL || !finger->down) {
return SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure); return SDL_SendFingerDown(id,fingerid,SDL_TRUE,xin,yin,pressurein);
} else { } else {
/* the relative motion is calculated regarding the last position */ /* the relative motion is calculated regarding the last position */
if (relative) { if (relative) {
...@@ -412,6 +420,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, ...@@ -412,6 +420,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative,
if(pressurein < touch->pressure_min) pressure = finger->last_pressure; if(pressurein < touch->pressure_min) pressure = finger->last_pressure;
xrel = x - finger->last_x; xrel = x - finger->last_x;
yrel = y - finger->last_y; yrel = y - finger->last_y;
//printf("xrel,yrel (%i,%i)\n",(int)xrel,(int)yrel);
} }
/* Drop events that don't change state */ /* Drop events that don't change state */
...@@ -460,6 +469,9 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, ...@@ -460,6 +469,9 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative,
event.tfinger.fingerId = fingerid; event.tfinger.fingerId = fingerid;
event.tfinger.x = x; event.tfinger.x = x;
event.tfinger.y = y; event.tfinger.y = y;
event.tfinger.dx = xrel;
event.tfinger.dy = yrel;
event.tfinger.pressure = pressure; event.tfinger.pressure = pressure;
event.tfinger.state = touch->buttonstate; event.tfinger.state = touch->buttonstate;
......
...@@ -61,6 +61,14 @@ X11_InitTouch(_THIS) ...@@ -61,6 +61,14 @@ X11_InitTouch(_THIS)
touch.driverdata = SDL_malloc(sizeof(EventTouchData)); touch.driverdata = SDL_malloc(sizeof(EventTouchData));
EventTouchData* data = (EventTouchData*)(touch.driverdata); EventTouchData* data = (EventTouchData*)(touch.driverdata);
data->x = -1;
data->y = -1;
data->pressure = -1;
data->finger = 0;
data->up = SDL_FALSE;
printf("Opening device...\n"); printf("Opening device...\n");
//printf("New Touch - DataPtr: %i\n",data); //printf("New Touch - DataPtr: %i\n",data);
data->eventStream = open(tstr, data->eventStream = open(tstr,
......
...@@ -439,8 +439,8 @@ X11_PumpEvents(_THIS) ...@@ -439,8 +439,8 @@ X11_PumpEvents(_THIS)
if(data->pressure < 0) data->pressure = 0; if(data->pressure < 0) data->pressure = 0;
break; break;
case ABS_MISC: case ABS_MISC:
if(ev[i].value == 0)
data->up = SDL_TRUE; data->up = SDL_TRUE;
data->finger = ev[i].value;
break; break;
} }
break; break;
......
...@@ -414,11 +414,14 @@ int main(int argc, char* argv[]) ...@@ -414,11 +414,14 @@ int main(int argc, char* argv[])
*/ */
break; break;
case SDL_MULTIGESTURE: case SDL_MULTIGESTURE:
/*
printf("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f\n", printf("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f\n",
event.mgesture.x, event.mgesture.x,
event.mgesture.y, event.mgesture.y,
event.mgesture.dTheta, event.mgesture.dTheta,
event.mgesture.dDist); event.mgesture.dDist);
printf("MG: numDownTouch = %i\n",event.mgesture.numFingers);
*/
knob.p.x = event.mgesture.x; knob.p.x = event.mgesture.x;
knob.p.y = event.mgesture.y; knob.p.y = event.mgesture.y;
knob.ang += event.mgesture.dTheta; knob.ang += event.mgesture.dTheta;
...@@ -435,9 +438,9 @@ int main(int argc, char* argv[]) ...@@ -435,9 +438,9 @@ int main(int argc, char* argv[])
} }
} }
DrawScreen(screen,h); DrawScreen(screen,h);
for(i = 0; i < 256; i++) //for(i = 0; i < 256; i++)
if(keystat[i]) // if(keystat[i])
printf("Key %i down\n",i); // printf("Key %i down\n",i);
} }
SDL_Quit(); SDL_Quit();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment