Commit 4960f0af authored by Jim Grandpre's avatar Jim Grandpre

Added include/touch.h Now reading in resolution of touch pad.

parent f75117cf
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2010 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
/**
* \file SDL_touch.h
*
* Include file for SDL mouse event handling.
*/
#ifndef _SDL_touch_h
#define _SDL_touch_h
#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
extern "C" {
/* *INDENT-ON* */
#endif
typedef struct SDL_Touch SDL_Touch;
typedef struct SDL_Finger SDL_Finger;
struct SDL_Finger {
int id;
int x;
int y;
int z; /* for future use */
int xdelta;
int ydelta;
int last_x, last_y,last_pressure; /* the last reported coordinates */
int pressure;
};
struct SDL_Touch
{
/* Free the touch when it's time */
void (*FreeTouch) (SDL_Touch * touch);
/* data common for tablets */
int pressure_max, pressure_min;
int x_max,x_min;
int y_max,y_min;
int xres,yres,pressureres;
int tilt; /* for future use */
int rotation; /* for future use */
/* Data common to all touch */
int id;
SDL_Window *focus;
char *name;
Uint8 buttonstate;
SDL_bool relative_mode;
SDL_bool flush_motion;
int num_fingers;
int max_fingers;
SDL_Finger** fingers;
void *driverdata;
};
/* Function prototypes */
/**
* \brief Get the touch object at the given id.
*
*
*/
extern DECLSPEC SDL_Touch* SDLCALL SDL_GetTouch(int id);
/**
* \brief Get the finger object of the given touch, at the given id.
*
*
*/
extern DECLSPEC SDL_Finger* SDLCALL SDL_GetFinger(SDL_Touch *touch, int id);
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
}
/* *INDENT-ON* */
#endif
#include "close_code.h"
#endif /* _SDL_mouse_h */
/* vi: set ts=4 sw=4 expandtab: */
......@@ -133,9 +133,9 @@ SDL_AddTouch(const SDL_Touch * touch, char *name)
SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1);
SDL_touchPads[index]->num_fingers = 0;
SDL_touchPads[index]->max_fingers = 0;
SDL_touchPads[index]->fingers = NULL;
SDL_touchPads[index]->max_fingers = 1;
SDL_touchPads[index]->fingers = (SDL_Finger **) SDL_malloc(sizeof(SDL_Finger*));
SDL_touchPads[index]->fingers[0] = NULL;
SDL_touchPads[index]->buttonstate = 0;
SDL_touchPads[index]->relative_mode = SDL_FALSE;
SDL_touchPads[index]->flush_motion = SDL_FALSE;
......@@ -253,39 +253,37 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger)
int index;
SDL_Finger **fingers;
size_t length;
//printf("Adding Finger...\n");
if (SDL_GetFingerIndexId(touch,finger->id) != -1) {
SDL_SetError("Finger ID already in use");
}
/* Add the touch to the list of touch */
if(touch->num_fingers >= touch->max_fingers){
if(fingers == NULL) {
touch->max_fingers = 1;
fingers = (SDL_Finger **) SDL_malloc(sizeof(finger));
}
else {
printf("Making room for it!\n");
fingers = (SDL_Finger **) SDL_realloc(touch->fingers,
(touch->num_fingers + 1) * sizeof(finger));
(touch->num_fingers + 1) * sizeof(SDL_Finger *));
touch->max_fingers = touch->num_fingers+1;
}
}
if (!fingers) {
SDL_OutOfMemory();
return -1;
}
else {
touch->max_fingers = touch->num_fingers+1;
touch->fingers = fingers;
}
}
index = touch->num_fingers;
touch->num_fingers++;
touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index])));
//printf("Max_Fingers: %i Index: %i\n",touch->max_fingers,index);
touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(SDL_Finger));
if (!touch->fingers[index]) {
SDL_OutOfMemory();
return -1;
}
*touch->fingers[index] = *finger;
*(touch->fingers[index]) = *finger;
touch->num_fingers++;
return index;
}
......@@ -323,6 +321,7 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu
nf.ydelta = 0;
nf.last_x = x;
nf.last_y = y;
nf.last_pressure = pressure;
SDL_AddFinger(touch,&nf);
posted = 0;
......@@ -383,6 +382,7 @@ SDL_SendTouchMotion(int id, int fingerid, int relative,
} else {
if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/
if(y < 0) y = finger->last_y; /*The other is marked as -1*/
if(pressure < 0) pressure = finger->last_pressure;
xrel = x - finger->last_x;
yrel = y - finger->last_y;
}
......@@ -418,8 +418,8 @@ SDL_SendTouchMotion(int id, int fingerid, int relative,
touch->y = 0;
}
*/
finger->xdelta += xrel;
finger->ydelta += yrel;
finger->xdelta = xrel;
finger->ydelta = yrel;
finger->pressure = pressure;
......@@ -440,6 +440,7 @@ SDL_SendTouchMotion(int id, int fingerid, int relative,
}
finger->last_x = finger->x;
finger->last_y = finger->y;
finger->last_pressure = finger->pressure;
return posted;
}
}
......
......@@ -20,52 +20,11 @@
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "../../include/SDL_touch.h"
#ifndef _SDL_touch_c_h
#define _SDL_touch_c_h
typedef struct SDL_Touch SDL_Touch;
typedef struct SDL_Finger SDL_Finger;
struct SDL_Finger {
int id;
int x;
int y;
int z; /* for future use */
int xdelta;
int ydelta;
int last_x, last_y; /* the last reported x and y coordinates */
int pressure;
};
struct SDL_Touch
{
/* Free the touch when it's time */
void (*FreeTouch) (SDL_Touch * touch);
/* data common for tablets */
int pressure_max;
int pressure_min;
int tilt; /* for future use */
int rotation; /* for future use */
/* Data common to all touch */
int id;
SDL_Window *focus;
char *name;
Uint8 buttonstate;
SDL_bool relative_mode;
SDL_bool flush_motion;
int num_fingers;
int max_fingers;
SDL_Finger** fingers;
void *driverdata;
};
/* Initialize the touch subsystem */
......
......@@ -56,6 +56,8 @@ X11_InitTouch(_THIS)
touch.driverdata = SDL_malloc(sizeof(EventTouchData));
EventTouchData* data = (EventTouchData*)(touch.driverdata);
printf("Opening device...\n");
......@@ -64,6 +66,24 @@ X11_InitTouch(_THIS)
O_RDONLY | O_NONBLOCK);
ioctl (data->eventStream, EVIOCGNAME (sizeof (tstr)), tstr);
printf ("Reading From : %s\n", tstr);
int abs[5];
ioctl(data->eventStream,EVIOCGABS(0),abs);
touch.x_min = abs[1];
touch.x_max = abs[2];
touch.xres = touch.x_max - touch.x_min;
ioctl(data->eventStream,EVIOCGABS(ABS_Y),abs);
touch.y_min = abs[1];
touch.y_max = abs[2];
touch.yres = touch.y_max - touch.y_min;
ioctl(data->eventStream,EVIOCGABS(ABS_PRESSURE),abs);
touch.pressure_min = abs[1];
touch.pressure_max = abs[2];
touch.pressureres = touch.pressure_max - touch.pressure_min;
SDL_AddTouch(&touch, tstr);
}
......
......@@ -449,6 +449,7 @@ X11_PumpEvents(_THIS)
break;
case ABS_PRESSURE:
data->pressure = ev[i].value;
if(data->pressure < 0) data->pressure = 0;
break;
case ABS_MISC:
data->up = SDL_TRUE;
......@@ -461,7 +462,7 @@ X11_PumpEvents(_THIS)
data->finger = ev[i].value;
break;
case EV_SYN:
printf("Id: %i\n",touch->id);
//printf("Id: %i\n",touch->id);
if(data->x >= 0 || data->y >= 0)
SDL_SendTouchMotion(touch->id,data->finger,
SDL_FALSE,data->x,data->y,
......
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <fcntl.h>
int main(int agrc,char **argv)
......@@ -22,7 +23,23 @@ int main(int agrc,char **argv)
sprintf(tstr,"/dev/input/event%i",event);
printf("At location: %s\n",tstr);
int inFile = open(tstr,O_RDONLY);
unsigned long bits[4];
int abs[5];
ioctl(inFile,EVIOCGABS(ABS_X),abs);
int minx,maxx,miny,maxy,minp,maxp;
minx = abs[1];
maxx = abs[2];
ioctl(inFile,EVIOCGABS(ABS_Y),abs);
miny = abs[1];
maxy = abs[2];
ioctl(inFile,EVIOCGABS(ABS_PRESSURE),abs);
minp = abs[1];
maxp = abs[2];
close(inFile);
}
vendor = -1;
product = -1;
......
#include <stdio.h>
#include <SDL.h>
#include <math.h>
#include "../src/events/SDL_touch_c.h" //BAD!!!
#include <SDL_touch.h>
#define PI 3.1415926535897
#define WIDTH 640
......@@ -19,12 +19,12 @@ int bstatus;
typedef struct {
int x,y;
float x,y;
} Point;
typedef struct {
Point p;
int pressure;
float pressure;
} Finger;
......@@ -32,7 +32,7 @@ Finger finger[MAXFINGERS];
void handler (int sig)
{
printf ("\nexiting...(%d)\n", sig);
printf ("\exiting...(%d)\n", sig);
exit (0);
}
......@@ -61,8 +61,17 @@ void drawCircle(SDL_Surface* screen,int x,int y,int r,int c)
{
float a;
for(a=0;a<PI/2;a+=1.f/(float)r)
int tx;
for(a=0;a<PI/2;a+=1.f/(float)abs(r))
{
if(r > 0) { //r<0 ==> unfilled circle
for(tx=x-r*cos(a);tx<x+r*cos(a);tx++) {
setpix(screen,tx,(int)(y+r*sin(a)),c);
setpix(screen,tx,(int)(y-r*sin(a)),c);
}
}
//Always Draw Outline
setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c);
setpix(screen,(int)(x-r*cos(a)),(int)(y+r*sin(a)),c);
setpix(screen,(int)(x+r*cos(a)),(int)(y-r*sin(a)),c);
......@@ -89,12 +98,17 @@ void DrawScreen(SDL_Surface* screen, int h)
setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255);
}
}
drawCircle(screen,mousx,mousy,30,0xFFFFFF);
drawCircle(screen,mousx,mousy,-30,0xFFFFFF);
int i;
for(i=0;i<MAXFINGERS;i++)
if(finger[i].p.x >= 0 && finger[i].p.y >= 0)
drawCircle(screen,finger[i].p.x,finger[i].p.y,20,0xFF6600-finger[i].pressure);
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);
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
......@@ -162,14 +176,28 @@ int main(int argc, char* argv[])
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);
finger[event.tfinger.fingerId].p.x = event.tfinger.x;
finger[event.tfinger.fingerId].p.y = event.tfinger.y;
finger[event.tfinger.fingerId].pressure = event.tfinger.pressure;
printf("Finger: %i, pressure: %i\n",event.tfinger.fingerId,
event.tfinger.pressure);
SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId);
SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId);
finger[event.tfinger.fingerId].p.x = ((float)event.tfinger.x)/
inTouch->xres;
finger[event.tfinger.fingerId].p.y = ((float)event.tfinger.y)/
inTouch->yres;
finger[event.tfinger.fingerId].pressure =
((float)event.tfinger.pressure)/inTouch->pressureres;
printf("Finger: %i, Pressure: %f Pressureres: %i\n",
event.tfinger.fingerId,
finger[event.tfinger.fingerId].pressure,
inTouch->pressureres);
//printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId,
// finger[event.tfinger.fingerId].pressure);
break;
case SDL_FINGERDOWN:
printf("Figner: %i down - x: %i, y: %i\n",event.tfinger.fingerId,
......
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