1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
/*
* tslib/plugins/pthres.c
*
* Copyright (C) 2003 Texas Instruments, Inc.
*
* Based on:
* tslib/plugins/linear.c
* Copyright (C) 2001 Russell King.
*
* This file is placed under the LGPL. Please see the file
* COPYING for more details.
*
* Ensure a release is always pressure 0, and that a press is always >=1.
*/
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
#include "tslib.h"
#include "tslib-filter.h"
struct tslib_pthres {
struct tslib_module_info module;
unsigned int pmin;
unsigned int pmax;
};
static int
pthres_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
{
struct tslib_pthres *p = (struct tslib_pthres *)info;
int ret;
static int xsave = 0, ysave = 0;
static int press = 0;
ret = info->next->ops->read(info->next, samp, nr);
if (ret >= 0) {
int nr = 0, i;
struct ts_sample *s;
for (s = samp, i = 0; i < ret; i++, s++) {
if (s->pressure < p->pmin) {
if (press != 0) {
/* release */
press = 0;
s->pressure = 0;
s->x = xsave;
s->y = ysave;
} else {
/* release with no press, outside bounds, dropping */
int left = ret - nr - 1;
if (left > 0) {
memmove(s, s + 1, left * sizeof(struct ts_sample));
s--;
continue;
}
break;
}
} else {
if (s->pressure > p->pmax) {
/* pressure outside bounds, dropping */
int left = ret - nr - 1;
if (left > 0) {
memmove(s, s + 1, left * sizeof(struct ts_sample));
s--;
continue;
}
break;
}
/* press */
press = 1;
xsave = s->x;
ysave = s->y;
}
nr++;
}
return nr;
}
return ret;
}
static int pthres_fini(struct tslib_module_info *info)
{
free(info);
return 0;
}
static const struct tslib_ops pthres_ops =
{
.read = pthres_read,
.fini = pthres_fini,
};
static int threshold_vars(struct tslib_module_info *inf, char *str, void *data)
{
struct tslib_pthres *p = (struct tslib_pthres *)inf;
unsigned long v;
int err = errno;
v = strtoul(str, NULL, 0);
if (v == ULONG_MAX && errno == ERANGE)
return -1;
errno = err;
switch ((int)data) {
case 0:
p->pmin = v;
break;
case 1:
p->pmax = v;
break;
default:
return -1;
}
return 0;
}
static const struct tslib_vars pthres_vars[] =
{
{ "pmin", (void *)0, threshold_vars },
{ "pmax", (void *)1, threshold_vars }
};
#define NR_VARS (sizeof(pthres_vars) / sizeof(pthres_vars[0]))
TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
{
struct tslib_pthres *p;
p = malloc(sizeof(struct tslib_pthres));
if (p == NULL)
return NULL;
p->module.ops = &pthres_ops;
p->pmin = 1;
p->pmax = INT_MAX;
/*
* Parse the parameters.
*/
if (tslib_parse_vars(&p->module, pthres_vars, NR_VARS, params)) {
free(p);
return NULL;
}
return &p->module;
}
|