--- tslib/plugins/linear.c~multievent +++ tslib/plugins/linear.c @@ -39,14 +39,12 @@ linear_read(struct tslib_module_info *info, struct ts_sample *samp, int nr) { struct tslib_linear *lin = (struct tslib_linear *)info; - int ret; + int ret, i = 0; int xtemp,ytemp; ret = info->next->ops->read(info->next, samp, nr); if (ret >= 0) { - int nr; - - for (nr = 0; nr < ret; nr++, samp++) { + for (i = 0; i < ret; i++, samp++) { #ifdef DEBUG fprintf(stderr,"BEFORE CALIB--------------------> %d %d %d\n",samp->x, samp->y, samp->pressure); #endif /*DEBUG*/ @@ -66,6 +64,7 @@ samp->y = tmp; } } + ret = i; } return ret; --- tslib/plugins/dejitter.c~multievent +++ tslib/plugins/dejitter.c @@ -24,7 +24,6 @@ struct tslib_threshold { struct tslib_module_info module; - int pthreshold; int xdelta; int ydelta; int delta2; @@ -36,40 +35,28 @@ static int threshold_read(struct tslib_module_info *info, struct ts_sample *samp, int nr) { struct tslib_threshold *thr = (struct tslib_threshold *)info; - struct ts_sample *s; - int ret; + struct ts_sample *src = samp, *dest = samp; + int ret, i = 0; ret = info->next->ops->read(info->next, samp, nr); if (ret >= 0) { - int nr = 0; - - for (s = samp; s < samp + ret; s++) { + for (i = 0; i < ret; i++, samp++) { int dr2; #ifdef DEBUG - fprintf(stderr,"BEFORE DEJITTER---------------> %d %d %d\n",s->x,s->y,s->pressure); + fprintf(stderr,"BEFORE DEJITTER---------------> %d %d %d\n", samp->x, samp->y, samp->pressure); #endif /*DEBUG*/ - thr->down = (s->pressure >= thr->pthreshold); - if (thr->down) { - dr2 = (thr->x - s->x)*(thr->x - s->x) - + (thr->y - s->y)*(thr->y - s->y); - if(dr2 < thr->delta2) { - s->x = thr->x; - s->y = thr->y; - } else { - thr->x = s->x; - thr->y = s->y; - } - + dr2 = (thr->x - samp->x)*(thr->x - samp->x) + + (thr->y - samp->y)*(thr->y - samp->y); + if(dr2 < thr->delta2) { + samp->x = thr->x; + samp->y = thr->y; } else { - s->x = thr->x; - s->y = thr->y; + thr->x = samp->x; + thr->y = samp->y; } - - - samp[nr++] = *s; } - ret = nr; + ret = i; } return ret; } @@ -106,10 +93,6 @@ thr->ydelta = v; break; - case 3: - thr->pthreshold = v; - break; - default: return -1; } @@ -120,7 +103,6 @@ { { "xdelta", (void *)1, threshold_limit }, { "ydelta", (void *)2, threshold_limit }, - { "pthreshold", (void *)3, threshold_limit } }; //#define NR_VARS (sizeof(threshold_vars) / sizeof(threshold_vars[0])) @@ -138,7 +120,6 @@ thr->xdelta = 10; thr->ydelta = 10; - thr->pthreshold = 100; if (tslib_parse_vars(&thr->module, threshold_vars, NR_VARS, params)) { free(thr); --- tslib/plugins/variance.c~multievent +++ tslib/plugins/variance.c @@ -9,25 +9,36 @@ * $Id: variance.c,v 1.3 2002/11/08 23:28:55 dlowder Exp $ * * Variance filter for touchscreen values + * + * Policy question (applies to all tslib modules that consume events): + * 1) User requests a read of 5 events using nr. + * 2) Lower layers return us 4 events. + * 3) Perform variance calculation, we now only have _1_ event. + * 4) Do we, a) duplicate this data across the user requested 4 events, + * b) push up the single event + * c) loop on the read from the lower layers to obtain + * the user's requested number of events, unless we hit + * a pen_up. */ + #include #include #include #include - #include #include "tslib.h" #include "tslib-filter.h" +#define NR_INIT -1 #define NR_LAST 4 struct tslib_variance { struct tslib_module_info module; int nr; - unsigned int pthreshold; unsigned int xlimit; unsigned int ylimit; + unsigned int pthreshold; struct ts_sample last[NR_LAST]; }; @@ -37,8 +48,7 @@ * least variance, and average them. */ static int -variance_calculate(struct tslib_variance *var, struct ts_sample *samp, - struct ts_sample *s) +variance_calculate(struct tslib_variance *var, struct ts_sample *dest, struct ts_sample *src) { int i, j; int diff_x, min_x, i_x, j_x; @@ -100,11 +110,11 @@ } } - samp->x = (var->last[i_x].x + var->last[j_x].x) / 2; - samp->y = (var->last[i_y].y + var->last[j_y].y) / 2; - samp->pressure = (var->last[i_p].pressure + var->last[j_p].pressure) / 2; - samp->tv.tv_sec = s->tv.tv_sec; - samp->tv.tv_usec = s->tv.tv_usec; + dest->x = (var->last[i_x].x + var->last[j_x].x) / 2; + dest->y = (var->last[i_y].y + var->last[j_y].y) / 2; + dest->pressure = (var->last[i_p].pressure + var->last[j_p].pressure) / 2; + dest->tv.tv_sec = src->tv.tv_sec; + dest->tv.tv_usec = src->tv.tv_usec; return 1; } @@ -112,55 +122,57 @@ static int variance_read(struct tslib_module_info *info, struct ts_sample *samp, int nr) { struct tslib_variance *var = (struct tslib_variance *)info; - struct ts_sample *s; - int ret; - - ret = info->next->ops->read(info->next, samp, nr); - if (ret >= 0) { - int nr = 0; - - for (s = samp; s < samp + ret; s++) { - if (s->pressure < var->pthreshold) { - /* - * Pen was released. Reset our state and - * pass up the release information. - */ -// samp[nr].x = 0; -// samp[nr].y = 0; - samp[nr].pressure = s->pressure; - samp[nr].tv.tv_sec = s->tv.tv_sec; - samp[nr].tv.tv_usec = s->tv.tv_usec; - - nr++; - - var->nr = 0; - continue; - } else if (var->nr == -1) { - /* - * Pen was pressed. Inform upper layers - * immediately. - */ - samp[nr] = *s; - nr++; - } - - if (var->nr >= 0) { - var->last[var->nr].x = s->x; - var->last[var->nr].y = s->y; - var->last[var->nr].pressure = s->pressure; - } - - var->nr++; + struct ts_sample *src = samp, *dest = samp; + int ret, i = 0; - if (var->nr == NR_LAST) { - if (variance_calculate(var, samp + nr, s)) - nr++; - var->nr = 0; + /* + * NOTES: + * + * Loop on read, collecting events until we hit nr, unless + * we hit a pen up or encounter a failure. + */ + while ((i < nr) && (ret != -1)) { + ret = info->next->ops->read(info->next, dest + i, nr - i); + if (ret >= 0) { + for (src = dest + i; src < dest + ret; src++) { + if (src->pressure < var->pthreshold) { + /* pen released, reset var->nr, + * do a calc based on what we have so + * far, and let this event flow up */ + if (variance_calculate(var, dest + i, src)) + i++; + var->nr = NR_INIT; + ret = -1; /* break outer loop, push up event */ + break; + } else if (var->nr == NR_INIT) { + /* + * First pen down event. Inform upper layers + * immediately for responsiveness. + */ + var->nr = 0; + i++; + ret = -1; /* break outer loop */ + break; + } + + if (var->nr >= 0) { + var->last[var->nr].x = src->x; + var->last[var->nr].y = src->y; + var->last[var->nr].pressure = src->pressure; + } + + var->nr++; + + if (var->nr == NR_LAST) { + if (variance_calculate(var, dest + i, src)) + i++; + var->nr = 0; + } } } - - ret = nr; } + /* if we've collected at least one event, send it up */ + if (i != 0) ret = i; return ret; } @@ -196,10 +208,6 @@ var->ylimit = v; break; - case 3: - var->pthreshold = v; - break; - default: return -1; } @@ -210,7 +218,6 @@ { { "xlimit", (void *)1, variance_limit }, { "ylimit", (void *)2, variance_limit }, - { "pthreshold", (void *)3, variance_limit } }; #define NR_VARS (sizeof(variance_vars) / sizeof(variance_vars[0])) @@ -218,6 +225,7 @@ struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) { struct tslib_variance *var; + char *pthresvar; var = malloc(sizeof(struct tslib_variance)); if (var == NULL) @@ -225,10 +233,15 @@ var->module.ops = &variance_ops; - var->nr = -1; + var->nr = NR_INIT; var->xlimit = 160; var->ylimit = 160; var->pthreshold = 100; + pthresvar = getenv("TSLIB_PTHRES"); + if (pthresvar != NULL) { + int p = strtol(pthresvar, (char **)NULL, 10); + if (p != -1) var->pthreshold = p; + } if (tslib_parse_vars(&var->module, variance_vars, NR_VARS, params)) { free(var); --- tslib/README~multievent +++ tslib/README @@ -36,6 +36,19 @@ usages. They are by no means exhaustive, nor probably even good examples. They are basically the programs I used to test this library. +Module Creation Notes +===================== + +For those creating tslib modules, it is important to note a couple things with +regard to handling of the ability for a user to request more than one ts event +at a time. The first thing to note is that the lower layers may send up less +events than the user requested, but only if that was a result of a pen release. +Next, your module should send up just as many events as the user requested in +nr. If your module is one that consumes events, such as variance, then you +loop on the read from the lower layers, and only send the events up when +1) you have the number of events requested by the user, or 2) one of the events +from the lower layers was a pen release. + Module Parameters ================= --- tslib/src/ts_read_raw.c~multievent +++ tslib/src/ts_read_raw.c @@ -14,10 +14,10 @@ * * Read raw pressure, x, y, and timestamp from a touchscreen device. */ + #include "config.h" #include - #include #ifdef HAVE_UNISTD_H #include @@ -25,79 +25,27 @@ #include #include -#ifdef USE_INPUT_API -#include -#else -struct ts_event { /* Used in UCB1x00 style touchscreens (the default) */ - unsigned short pressure; - unsigned short x; - unsigned short y; - unsigned short pad; - struct timeval stamp; -}; -struct h3600_ts_event { /* Used in the Compaq IPAQ */ - unsigned short pressure; - unsigned short x; - unsigned short y; - unsigned short pad; -}; -struct mk712_ts_event { /* Used in the Hitachi Webpad */ - unsigned int header; - unsigned int x; - unsigned int y; - unsigned int reserved; -}; -struct arctic2_ts_event { /* Used in the IBM Arctic II */ - signed short pressure; - signed int x; - signed int y; - int millisecs; - int flags; -}; -struct collie_ts_event { /* Used in the Sharp Zaurus SL-5000d and SL-5500 */ - long y; - long x; - long pressure; - long long millisecs; -}; -struct corgi_ts_event { /* Used in the Sharp Zaurus SL-C700 */ - short pressure; - short x; - short y; - short millisecs; -}; -#endif /* USE_INPUT_API */ - #include "tslib-private.h" -int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr) -{ #ifdef USE_INPUT_API +#include + +static inline int get_input_event(struct tsdev *ts, struct ts_sample *samp) { struct input_event ev; -#else - struct ts_event *evt; - struct h3600_ts_event *hevt; - struct mk712_ts_event *mevt; - struct arctic2_ts_event *aevt; - struct collie_ts_event *collie_evt; - struct corgi_ts_event *corgi_evt; -#endif /* USE_INPUT_API */ - int ret; - int total = 0; + struct timeval tv = {0, 0}; + fd_set fdset; + int ret = 0; - char *tseventtype=NULL; - char *defaulttseventtype="UCB1x00"; + /* event vars */ + static int curr_x = 0, curr_y = 0; + int curr_p = 0, next_x = 0, next_y = 0; -#ifdef USE_INPUT_API - /* warning: maybe those static vars should be part of the tsdev struct? */ - static int curr_x = 0, curr_y = 0, curr_p = 0; - static int got_curr_x = 0, got_curr_y = 0; - int got_curr_p = 0; - int next_x, next_y; + /* state variables */ + int got_curr_x = 0, got_curr_y = 0, got_curr_p = 0; int got_next_x = 0, got_next_y = 0; int got_tstamp = 0; - while (total < nr) { + while (1) { ret = read(ts->fd, &ev, sizeof(struct input_event)); if (ret < sizeof(struct input_event)) break; @@ -146,177 +94,231 @@ samp->tv = ev.time; } - if ( (!got_curr_x || !got_curr_y) && !got_curr_p && - !got_next_x && !got_next_y ) { - /* - * The current event is not complete yet. - * Give the kernel a chance to feed us more. - */ - struct timeval tv = {0, 0}; - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(ts->fd, &fdset); - ret = select(ts->fd+1, &fdset, NULL, NULL, &tv); - if (ret == 1) continue; - if (ret == -1) break; + if (got_curr_x && got_curr_y && got_curr_p) { + /* we have a complete event */ + samp->x = curr_x; + samp->y = curr_y; + samp->pressure = curr_p; + ret = 0; /* indicate success */ + if (got_next_x) curr_x = next_x; + if (got_next_y) curr_y = next_y; + break; } - /* We consider having a complete ts event */ - samp->x = curr_x; - samp->y = curr_y; - samp->pressure = curr_p; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - samp++; - total++; - - /* get ready for next event */ - if (got_next_x) curr_x = next_x; else got_curr_x = 0; - if (got_next_y) curr_y = next_y; else got_curr_y = 0; - got_next_x = got_next_y = got_tstamp = 0; + /* + * The current event is not complete yet. + * Give the kernel a chance to feed us more. + */ + FD_ZERO(&fdset); + FD_SET(ts->fd, &fdset); + ret = select(ts->fd+1, &fdset, NULL, NULL, &tv); + if (ret == 1) continue; + if (ret == -1) break; } - if (ret) ret = -1; - if (total) ret = total; +// fprintf(stdout, "%s: returning %d\n", __FUNCTION__, ret); + if (ret != 0) ret = -1; + return ret; +} + #else + +struct ucb1x00_ts_event { /* Used in UCB1x00 style touchscreens (the default) */ + unsigned short pressure; + unsigned short x; + unsigned short y; + unsigned short pad; + struct timeval stamp; +}; +struct h3600_ts_event { /* Used in the Compaq IPAQ */ + unsigned short pressure; + unsigned short x; + unsigned short y; + unsigned short pad; +}; +struct mk712_ts_event { /* Used in the Hitachi Webpad */ + unsigned int header; + unsigned int x; + unsigned int y; + unsigned int reserved; +}; +struct arctic2_ts_event { /* Used in the IBM Arctic II */ + signed short pressure; + signed int x; + signed int y; + int millisecs; + int flags; +}; +struct collie_ts_event { /* Used in the Sharp Zaurus SL-5000d and SL-5500 */ + long y; + long x; + long pressure; + long long millisecs; +}; +struct corgi_ts_event { /* Used in the Sharp Zaurus SL-C700 */ + short pressure; + short x; + short y; + short millisecs; +}; + +static inline int get_ucb1x00_event(struct tsdev *ts, struct ts_sample *samp) { + struct ucb1x00_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct ucb1x00_ts_event)); + if (ret > 0) { + samp->x = evt.x; + samp->y = evt.y; + samp->pressure = evt.pressure; + samp->tv.tv_usec = evt.stamp.tv_usec; + samp->tv.tv_sec = evt.stamp.tv_sec; + ret = 0; /* success */ + } + return ret; +} + +static inline int get_h3600_event(struct tsdev *ts, struct ts_sample *samp) { + struct h3600_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct h3600_ts_event)); + if (ret > 0) { + samp->x = evt.x; + samp->y = evt.y; + samp->pressure = evt.pressure; + gettimeofday(&samp->tv, NULL); + ret = 0; /* success */ + } + return ret; +} + +static inline int get_mk712_event(struct tsdev *ts, struct ts_sample *samp) { + struct mk712_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct mk712_ts_event)); + if (ret > 0) { + samp->x = (short)evt.x; + samp->y = (short)evt.y; + if(evt.header==0) + samp->pressure=1; + else + samp->pressure=0; + gettimeofday(&samp->tv, NULL); + ret = 0; /* success */ + } + return ret; +} + +static inline int get_arctic2_event(struct tsdev *ts, struct ts_sample *samp) { + struct arctic2_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct arctic2_ts_event)); + if (ret > 0) { + samp->x = (short)evt.x; + samp->y = (short)evt.y; + samp->pressure = evt.pressure; + gettimeofday(&samp->tv, NULL); + ret = 0; /* success */ + } + return ret; +} + +static inline int get_collie_event(struct tsdev *ts, struct ts_sample *samp) { + struct collie_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct collie_ts_event)); + if (ret > 0) { + samp->x = evt.x; + samp->y = evt.y; + samp->pressure = evt.pressure; + samp->tv.tv_usec = evt.millisecs % 1000; + samp->tv.tv_sec = evt.millisecs / 1000; + ret = 0; /* success */ + } + return ret; +} + +static inline int get_corgi_event(struct tsdev *ts, struct ts_sample *samp) { + struct corgi_ts_event evt; + int ret = read(ts->fd, &evt, sizeof(struct corgi_ts_event)); + if (ret > 0) { + samp->x = evt.x; + samp->y = evt.y; + samp->pressure = evt.pressure; + samp->tv.tv_usec = evt.millisecs % 1000; + samp->tv.tv_sec = evt.millisecs / 1000; + ret = 0; /* success */ + } + return ret; +} + +#endif + +int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr) +{ + int ret; + int total = 0; + int pen_down = 1; + static short x_save = 0, y_save = 0; + static int pthres = -1; + +#ifndef USE_INPUT_API + char *tseventtype=NULL; + char *defaulttseventtype="UCB1x00"; tseventtype = getenv("TSLIB_TSEVENTTYPE"); if(tseventtype==NULL) tseventtype=defaulttseventtype; +#endif - if( strcmp(tseventtype,"H3600") == 0) { /* iPAQ style h3600 touchscreen events */ - hevt = alloca(sizeof(*hevt) * nr); - ret = read(ts->fd, hevt, sizeof(*hevt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*hevt); - while(ret >= sizeof(*hevt)) { - samp->x = hevt->x; - samp->y = hevt->y; - samp->pressure = hevt->pressure; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - gettimeofday(&samp->tv,NULL); - samp++; - hevt++; - ret -= sizeof(*hevt); - } - } else { - return -1; - } - } else if( strcmp(tseventtype,"MK712") == 0) { /* Hitachi Webpad events */ - mevt = alloca(sizeof(*mevt) * nr); - ret = read(ts->fd, mevt, sizeof(*mevt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*mevt); - while(ret >= sizeof(*mevt)) { - samp->x = (short)mevt->x; - samp->y = (short)mevt->y; - if(mevt->header==0) - samp->pressure=1; - else - samp->pressure=0; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - gettimeofday(&samp->tv,NULL); - samp++; - mevt++; - ret -= sizeof(*mevt); - } - } else { - return -1; - } - - } else if( strcmp(tseventtype,"ARCTIC2") == 0) { /* IBM Arctic II events */ - aevt = alloca(sizeof(*aevt) * nr); - ret = read(ts->fd, aevt, sizeof(*aevt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*aevt); - while(ret >= sizeof(*aevt)) { - samp->x = (short)aevt->x; - samp->y = (short)aevt->y; - samp->pressure = aevt->pressure; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - gettimeofday(&samp->tv,NULL); - samp++; - aevt++; - ret -= sizeof(*aevt); - } + while ((total < nr) && pen_down) { +// fprintf(stdout, "total: %d, nr: %d\n", total, nr); +#ifdef USE_INPUT_API + ret = get_input_event(ts, samp); +#else + if (strcmp(tseventtype, "H3600") == 0) { + /* iPAQ style h3600 touchscreen events */ + ret = get_h3600_event(ts, samp); + } else if (strcmp(tseventtype, "MK712") == 0) { + /* Hitachi Webpad events */ + ret = get_mk712_event(ts, samp); + } else if (strcmp(tseventtype, "ARCTIC2") == 0) { + /* IBM Arctic II events */ + ret = get_arctic2_event(ts, samp); + } else if (strcmp(tseventtype, "COLLIE") == 0) { + /* Sharp Zaurus SL-5000d/5500 events */ + ret = get_collie_event(ts, samp); + } else if (strcmp(tseventtype,"CORGI") == 0) { + /* Sharp Zaurus SL-C700 events */ + ret = get_corgi_event(ts, samp); } else { - return -1; + /* Use normal UCB1x00 type events */ + ret = get_ucb1x00_event(ts, samp); } +#endif + if (ret != 0) break; - } else if( strcmp(tseventtype,"COLLIE") == 0) { /* Sharp Zaurus SL-5000d/5500 events */ - collie_evt = alloca(sizeof(*collie_evt) * nr); - ret = read(ts->fd, collie_evt, sizeof(*collie_evt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*collie_evt); - while(ret >= sizeof(*collie_evt)) { - samp->x = collie_evt->x; - samp->y = collie_evt->y; - samp->pressure = collie_evt->pressure; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - samp->tv.tv_usec = collie_evt->millisecs % 1000; - samp->tv.tv_sec = collie_evt->millisecs / 1000; - samp++; - collie_evt++; - ret -= sizeof(*collie_evt); + if (pthres == -1) { + char *pthresvar = getenv("TSLIB_PTHRES"); + pthres = 100; + if (pthresvar != NULL) { + int p = strtol(pthresvar, (char **)NULL, 10); + if (p != -1) pthres = p; } - } else { - return -1; } - } else if( strcmp(tseventtype,"CORGI") == 0) { /* Sharp Zaurus SL-C700 events */ - corgi_evt = alloca(sizeof(*corgi_evt) * nr); - ret = read(ts->fd, corgi_evt, sizeof(*corgi_evt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*corgi_evt); - while(ret >= sizeof(*corgi_evt)) { - samp->x = corgi_evt->x; - samp->y = corgi_evt->y; - samp->pressure = corgi_evt->pressure; -#ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); -#endif /*DEBUG*/ - samp->tv.tv_usec = corgi_evt->millisecs % 1000; - samp->tv.tv_sec = corgi_evt->millisecs / 1000; - samp++; - corgi_evt++; - ret -= sizeof(*corgi_evt); - } + if (samp->pressure < pthres) { + /* pen released, send events up */ + pen_down = 0; + /* set x and y to previous values */ + samp->x = x_save; + samp->y = y_save; } else { - return -1; + pen_down = 1; + x_save = samp->x; + y_save = samp->y; } - - } else { /* Use normal UCB1x00 type events */ - evt = alloca(sizeof(*evt) * nr); - ret = read(ts->fd, evt, sizeof(*evt) * nr); - if(ret > 0) { - int nr = ret / sizeof(*evt); - while(ret >= sizeof(*evt)) { - samp->x = evt->x; - samp->y = evt->y; - samp->pressure = evt->pressure; #ifdef DEBUG - fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); + fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x, samp->y, samp->pressure); #endif /*DEBUG*/ - samp->tv.tv_usec = evt->stamp.tv_usec; - samp->tv.tv_sec = evt->stamp.tv_sec; - samp++; - evt++; - ret -= sizeof(*evt); - } - } else { - return -1; - } + samp++; + total++; } - ret = nr; -#endif /* USE_INPUT_API */ + if (ret != 0) ret = -1; + if (total) ret = total; return ret; }