#include <tslib.h> int ts_read(struct tsdev *dev, struct ts_sample *samp, int nr); int ts_read_raw(struct tsdev *dev, struct ts_sample *samp, int nr); int ts_read_mt(struct tsdev *dev, struct ts_sample_mt **samp, int slots, int nr); int ts_read_raw_mt(struct tsdev *dev, struct ts_sample_mt **samp, int slots, int nr);
struct ts_sample { int x; int y; unsigned int pressure; struct timeval tv; };
ts_read_mt() reads nr * slots input samples with tslib's filters applied. struct ts_sample_mt is defined as follows:
struct ts_sample_mt { /* most recent ABS_MT_* event codes. * see linux/input.h for descriptions */ int x; int y; unsigned int pressure; int slot; int tracking_id; int tool_type; int tool_x; int tool_y; unsigned int touch_major; unsigned int width_major; unsigned int touch_minor; unsigned int width_minor; int orientation; int distance; int blob_id; struct timeval tv; /* BTN_TOUCH state */ short pen_down; /* the TSLIB_MT_VALID bit is set in valid if this sample * contains new data; * valid is set to 0 otherwise */ short valid; };
The user has to provide the amount of memory described in nr and slots to hold them.
ts_read_raw() and ts_read_raw_mt() do the same thing without tslib's filters applied.
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <tslib.h> #define READ_SAMPLES 1 #define MAX_SLOTS 5 int main(int argc, char **argv) { struct tsdev *ts; struct ts_sample_mt **samp_mt = NULL; int i, j; int ret; ts = ts_setup(NULL, 0); if (!ts) return -1; samp_mt = malloc(READ_SAMPLES * sizeof(struct ts_sample_mt **)); if (!samp_mt) return -1; for (i = 0; i < READ_SAMPLES; i++) { samp_mt[i] = calloc(MAX_SLOTS, sizeof(struct ts_sample_mt)); if (!samp_mt[i]) return -1; } while(1) { ret = ts_read_mt(ts, samp_mt, MAX_SLOTS, READ_SAMPLES); for (i = 0; i < ret; i++) { printf("sample nr %d, i); for (j = 0; i < MAX_SLOTS; j++) { if (!(samp_mt[i][j].valid & TSLIB_MT_VALID)) continue; printf("slot %d: X:%d Y: %d, samp_mt[i][j].slot, samp_mt[i][j].x, samp_mt[i][j].y); } } } }