diff options
| author | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
|---|---|---|
| committer | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
| commit | 709c4d66e0b107ca606941b988bad717c0b45d9b (patch) | |
| tree | 37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/tslib | |
| parent | fa6cd5a3b993f16c27de4ff82b42684516d433ba (diff) | |
rename packages/ to recipes/ per earlier agreement
See links below for more details:
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816
Signed-off-by: Denys Dmytriyenko <denis@denix.org>
Acked-by: Mike Westerhof <mwester@dls.net>
Acked-by: Philip Balister <philip@balister.org>
Acked-by: Khem Raj <raj.khem@gmail.com>
Acked-by: Marcin Juszkiewicz <hrw@openembedded.org>
Acked-by: Koen Kooi <koen@openembedded.org>
Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/tslib')
29 files changed, 1241 insertions, 0 deletions
diff --git a/recipes/tslib/tslib.inc b/recipes/tslib/tslib.inc new file mode 100644 index 0000000000..14576166a3 --- /dev/null +++ b/recipes/tslib/tslib.inc @@ -0,0 +1,79 @@ +DESCRIPTION = "tslib is a plugin-based flexible touchscreen access library." +HOMEPAGE = "http://tslib.berlios.de/" +AUTHOR = "Russell King w/ plugins by Chris Larson et. al." +SECTION = "base" +LICENSE = "LGPL" + +SRC_URI += "\ + file://ts.conf \ + file://ts.conf-collie-2.4 \ + file://ts.conf-simpad-2.4 \ + file://tslib.sh \ +" +SRC_URI_append_mnci += "\ + file://devfs.patch;patch=1 \ + file://event1.patch;patch=1 \ +" + +inherit autotools pkgconfig + +EXTRA_OECONF = "--enable-shared" +EXTRA_OECONF_mnci = "--enable-shared --disable-h3600 --enable-input --disable-corgi --disable-collie --disable-mk712 --disable-arctic2 --disable-ucb1x00 " + +do_stage () { + autotools_stage_all +} + +do_install () { + autotools_do_install + install -d ${D}${sysconfdir}/profile.d/ + install -m 0755 ${WORKDIR}/tslib.sh ${D}${sysconfdir}/profile.d/ + install -m 0644 ${WORKDIR}/ts.conf ${D}${sysconfdir}/ts.conf + case ${MACHINE} in + collie) + install -d ${D}${datadir}/tslib + install -m 0644 ${WORKDIR}/ts.conf-collie-2.4 ${D}${datadir}/tslib/ + ;; + simpad) + install -d ${D}${datadir}/tslib + install -m 0644 ${WORKDIR}/ts.conf-simpad-2.4 ${D}${datadir}/tslib/ + ;; + esac +} + +SRC_URI_OVERRIDES_PACKAGE_ARCH = "0" + +# People should consider using udev's /dev/input/touchscreen0 symlink +# instead of detect-stylus +#RDEPENDS_tslib-conf_weird-machine = "detect-stylus" +RPROVIDES_tslib-conf = "libts-0.0-conf" + +# Machines with machine specific patches +PACKAGE_ARCH_mnci = "${MACHINE_ARCH}" +# Machines with machine specific config files (tslib.sh) +PACKAGE_ARCH_tslib-conf_a780 = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_collie = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_e680 = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_jornada56x = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_jornada6xx = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_jornada7xx = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_netbook-pro = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_omap1610h2 = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_omap5912osk = "${MACHINE_ARCH}" +PACKAGE_ARCH_tslib-conf_simpad = "${MACHINE_ARCH}" + +PACKAGES =+ "tslib-conf libts-dev tslib-tests tslib-calibrate" +DEBIAN_NOAUTONAME_tslib-conf = "1" +DEBIAN_NOAUTONAME_tslib-tests = "1" +DEBIAN_NOAUTONAME_tslib-calibrate = "1" + +RDEPENDS_${PN} = "tslib-conf" +# Ship calibration data if it exists +RRECOMMENDS_angstrom = " pointercal " + +FILES_${PN}-dbg += "${libdir}/ts/.debug*" +FILES_tslib-conf = "${sysconfdir}/ts.conf ${sysconfdir}/profile.d/tslib.sh ${datadir}/tslib" +FILES_${PN} = "${libdir}/*.so.* ${libdir}/ts/*.so*" +FILES_libts-dev = "${FILES_tslib-dev} ${libdir}/ts/*.la" +FILES_tslib-calibrate += "${bindir}/ts_calibrate" +FILES_tslib-tests = "${bindir}/ts_harvest ${bindir}/ts_print ${bindir}/ts_print_raw ${bindir}/ts_test" diff --git a/recipes/tslib/tslib/bd-neon/ts.conf b/recipes/tslib/tslib/bd-neon/ts.conf new file mode 100644 index 0000000000..20dd11cf6a --- /dev/null +++ b/recipes/tslib/tslib/bd-neon/ts.conf @@ -0,0 +1,5 @@ +module_raw input +module pthres pmin=1 +module variance delta=500 +module dejitter delta=10000 +module linear diff --git a/recipes/tslib/tslib/collie/tslib.sh b/recipes/tslib/tslib/collie/tslib.sh new file mode 100644 index 0000000000..664bda426a --- /dev/null +++ b/recipes/tslib/tslib/collie/tslib.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +TSLIB_TSDEVICE=/dev/input/touchscreen0 +TSLIB_CONFFILE=/etc/ts.conf + +case `uname -r` in +2.4*) + TSLIB_TSDEVICE=/dev/ts + TSLIB_CONFFILE=/usr/share/tslib/ts.conf-collie-2.4 + ;; +esac + +export TSLIB_TSDEVICE TSLIB_CONFFILE diff --git a/recipes/tslib/tslib/devfs.patch b/recipes/tslib/tslib/devfs.patch new file mode 100644 index 0000000000..d7ef0a9589 --- /dev/null +++ b/recipes/tslib/tslib/devfs.patch @@ -0,0 +1,18 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- tslib/tests/fbutils.c~devfs.patch ++++ tslib/tests/fbutils.c +@@ -44,8 +44,8 @@ + static unsigned colormap [256]; + int xres, yres; + +-static char *defaultfbdevice = "/dev/fb0"; +-static char *defaultconsoledevice = "/dev/tty"; ++static char *defaultfbdevice = "/dev/fb/0"; ++static char *defaultconsoledevice = "/dev/vc/"; + static char *fbdevice = NULL; + static char *consoledevice = NULL; + diff --git a/recipes/tslib/tslib/event1.patch b/recipes/tslib/tslib/event1.patch new file mode 100644 index 0000000000..88cc3f3a2a --- /dev/null +++ b/recipes/tslib/tslib/event1.patch @@ -0,0 +1,80 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- tslib/tests/ts_calibrate.c~event1 ++++ tslib/tests/ts_calibrate.c +@@ -179,11 +179,7 @@ + if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) { + ts = ts_open(tsdevice,0); + } else { +-#ifdef USE_INPUT_API +- ts = ts_open("/dev/input/event0", 0); +-#else +- ts = ts_open("/dev/touchscreen/ucb1x00", 0); +-#endif /* USE_INPUT_API */ ++ ts = ts_open("/dev/input/event1", 0); + } + + if (!ts) { +--- tslib/tests/ts_print.c~event1 ++++ tslib/tests/ts_print.c +@@ -28,11 +28,7 @@ + if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) { + ts = ts_open(tsdevice,0); + } else { +-#ifdef USE_INPUT_API +- ts = ts_open("/dev/input/event0", 0); +-#else +- ts = ts_open("/dev/touchscreen/ucb1x00", 0); +-#endif /* USE_INPUT_API */ ++ ts = ts_open("/dev/input/event1", 0); + } + + if (!ts) { +--- tslib/tests/ts_test.c~event1 ++++ tslib/tests/ts_test.c +@@ -120,11 +120,7 @@ + signal(SIGTERM, sig); + + if ((tsdevice = getenv("TSLIB_TSDEVICE")) == NULL) { +-#ifdef USE_INPUT_API +- tsdevice = strdup ("/dev/input/event0"); +-#else +- tsdevice = strdup ("/dev/touchscreen/ucb1x00"); +-#endif /* USE_INPUT_API */ ++ tsdevice = strdup ("/dev/input/event1"); + } + + ts = ts_open (tsdevice, 0); +--- tslib/tests/ts_print_raw.c~event1 ++++ tslib/tests/ts_print_raw.c +@@ -28,11 +28,7 @@ + if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) { + ts = ts_open(tsdevice,0); + } else { +-#ifdef USE_INPUT_API +- ts = ts_open("/dev/input/event0", 0); +-#else +- ts = ts_open("/dev/touchscreen/ucb1x00", 0); +-#endif /* USE_INPUT_API */ ++ ts = ts_open("/dev/input/event1", 0); + } + + if (!ts) { +--- tslib/tests/ts_harvest.c~event1 ++++ tslib/tests/ts_harvest.c +@@ -75,11 +75,7 @@ + signal(SIGTERM, sig); + + if ((tsdevice = getenv("TSLIB_TSDEVICE")) == NULL) { +-#ifdef USE_INPUT_API +- tsdevice = strdup ("/dev/input/event0"); +-#else +- tsdevice = strdup ("/dev/touchscreen/ucb1x00"); +-#endif /* USE_INPUT_API */ ++ tsdevice = strdup ("/dev/input/event1"); + } + + ts = ts_open (tsdevice, 0); diff --git a/recipes/tslib/tslib/fix_version.patch b/recipes/tslib/tslib/fix_version.patch new file mode 100644 index 0000000000..d6a0ebd0f3 --- /dev/null +++ b/recipes/tslib/tslib/fix_version.patch @@ -0,0 +1,32 @@ +--- + configure.ac | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +Index: tslib-1.0/configure.ac +=================================================================== +--- tslib-1.0.orig/configure.ac 2006-08-24 22:02:55.000000000 +0100 ++++ tslib-1.0/configure.ac 2007-07-09 21:04:38.000000000 +0100 +@@ -2,7 +2,7 @@ + # Process this file with autoconf to produce a configure script. + + AC_PREREQ(2.57) +-AC_INIT(tslib, 0.0.2, kergoth@handhelds.org) ++AC_INIT(tslib, 1.0.0, kergoth@handhelds.org) + # AC_CONFIG_AUX_DIR(config) + AM_INIT_AUTOMAKE(dist-bzip2) + AC_CONFIG_SRCDIR([src/ts_close.c]) +@@ -193,10 +193,10 @@ TS_CONF='${sysconfdir}/ts.conf' + AC_SUBST(TS_CONF) + + # Library versioning +-LT_RELEASE=0.0 +-LT_CURRENT=1 +-LT_REVISION=1 +-LT_AGE=1 ++LT_RELEASE=1.0 ++LT_CURRENT=0 ++LT_REVISION=0 ++LT_AGE=0 + AC_SUBST(LT_RELEASE) + AC_SUBST(LT_CURRENT) + AC_SUBST(LT_REVISION) diff --git a/recipes/tslib/tslib/htctornado/ts.conf b/recipes/tslib/tslib/htctornado/ts.conf new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/recipes/tslib/tslib/htctornado/ts.conf diff --git a/recipes/tslib/tslib/jornada56x/ts.conf b/recipes/tslib/tslib/jornada56x/ts.conf new file mode 100644 index 0000000000..20729b6154 --- /dev/null +++ b/recipes/tslib/tslib/jornada56x/ts.conf @@ -0,0 +1,5 @@ +module_raw h3600 +module pthres pmin=1 +module variance delta=30 +module dejitter delta=100 +module linear diff --git a/recipes/tslib/tslib/jornada56x/tslib.sh b/recipes/tslib/tslib/jornada56x/tslib.sh new file mode 100644 index 0000000000..8f907b0755 --- /dev/null +++ b/recipes/tslib/tslib/jornada56x/tslib.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +TSLIB_TSDEVICE=/dev/input/tsraw0 + +export TSLIB_TSDEVICE diff --git a/recipes/tslib/tslib/jornada6xx/ts.conf b/recipes/tslib/tslib/jornada6xx/ts.conf new file mode 100644 index 0000000000..20729b6154 --- /dev/null +++ b/recipes/tslib/tslib/jornada6xx/ts.conf @@ -0,0 +1,5 @@ +module_raw h3600 +module pthres pmin=1 +module variance delta=30 +module dejitter delta=100 +module linear diff --git a/recipes/tslib/tslib/jornada6xx/tslib.sh b/recipes/tslib/tslib/jornada6xx/tslib.sh new file mode 100644 index 0000000000..1b5db781c1 --- /dev/null +++ b/recipes/tslib/tslib/jornada6xx/tslib.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +TSLIB_TSDEVICE=/dev/input/ts0 + +export TSLIB_TSDEVICE diff --git a/recipes/tslib/tslib/jornada7xx/ts.conf b/recipes/tslib/tslib/jornada7xx/ts.conf new file mode 100644 index 0000000000..09309719f2 --- /dev/null +++ b/recipes/tslib/tslib/jornada7xx/ts.conf @@ -0,0 +1,5 @@ +module_raw input +module pthres pmin=1 +module variance delta=30 +module dejitter delta=100 +module linear diff --git a/recipes/tslib/tslib/jornada7xx/tslib.sh b/recipes/tslib/tslib/jornada7xx/tslib.sh new file mode 100644 index 0000000000..040f4de3d5 --- /dev/null +++ b/recipes/tslib/tslib/jornada7xx/tslib.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +TSLIB_TSDEVICE=/dev/input/event1 + +export TSLIB_TSDEVICE diff --git a/recipes/tslib/tslib/mnci/ts.conf b/recipes/tslib/tslib/mnci/ts.conf new file mode 100644 index 0000000000..adff17717b --- /dev/null +++ b/recipes/tslib/tslib/mnci/ts.conf @@ -0,0 +1,5 @@ +module_raw input +module pthres pmin=600 +module variance delta=30 +module dejitter delta=100 +module linear diff --git a/recipes/tslib/tslib/mnci/tslib.sh b/recipes/tslib/tslib/mnci/tslib.sh new file mode 100644 index 0000000000..07928f226d --- /dev/null +++ b/recipes/tslib/tslib/mnci/tslib.sh @@ -0,0 +1 @@ +export TSLIB_TSDEVICE=/dev/input/event1 diff --git a/recipes/tslib/tslib/multievent.patch b/recipes/tslib/tslib/multievent.patch new file mode 100644 index 0000000000..854e7af5dd --- /dev/null +++ b/recipes/tslib/tslib/multievent.patch @@ -0,0 +1,843 @@ +--- 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 <errno.h> + #include <stdlib.h> + #include <string.h> + #include <limits.h> +- + #include <stdio.h> + + #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 <stdio.h> +- + #include <stdlib.h> + #ifdef HAVE_UNISTD_H + #include <unistd.h> +@@ -25,79 +25,27 @@ + #include <sys/time.h> + #include <sys/types.h> + +-#ifdef USE_INPUT_API +-#include <linux/input.h> +-#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 <linux/input.h> ++ ++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; |
