#define NR_SAMPHISTLEN 4 static const unsigned char weight [NR_SAMPHISTLEN - 1][NR_SAMPHISTLEN + 1] = { /* The last element is pow2(SUM(0..3)) */ { 5, 3, 0, 0, 3 }, /* When we have 2 samples ... */ { 8, 5, 3, 0, 4 }, /* When we have 3 samples ... */ { 6, 4, 3, 3, 4 }, /* When we have 4 samples ... */ }; struct dejitter_info { int delta; int x; int y; int nr; int head; struct AR7643TS_SAMPLE samp[NR_SAMPHISTLEN]; }; #define FAST_THRESHOLD 100 static struct dejitter_info djt; static void average(struct dejitter_info *djt, struct AR7643TS_SAMPLE *samp); static int dejitter(struct input_dev *dev, struct AR7643TS_SAMPLE *_samp, bool penup); static void average(struct dejitter_info *djt, struct AR7643TS_SAMPLE *samp) { const unsigned char *w; int sn = djt->head; int i, x = 0, y = 0; // unsigned int p = 0; w = weight [djt->nr - 2]; for (i = 0; i < djt->nr; i++) { sn = (sn - 1) & (NR_SAMPHISTLEN - 1); x += djt->samp [sn].x * w [i]; y += djt->samp [sn].y * w [i]; // p += djt->samp [sn].p * w [i]; } //printk("%4d/t%4d/t%d/n", x, y, djt->nr); samp->x = x >> w [NR_SAMPHISTLEN]; samp->y = y >> w [NR_SAMPHISTLEN]; //samp->pressure = p >> w [NR_SAMPHISTLEN]; //PDEBUG("DEJITTER----------------> %d %d %d/n",samp->x, samp->y, 0); } static int dejitter(struct input_dev *dev, struct AR7643TS_SAMPLE *_samp, bool penup) { static struct AR7643TS_SAMPLE temp; if (penup == true) { djt.head = 0; djt.nr = 0;; return 1; } /* If the pen moves too fast, reset the backlog. */ if (djt.nr) { int prev = (djt.head - 1) & (NR_SAMPHISTLEN - 1); if (abs(_samp->x - djt.samp[prev].x) + abs(_samp->y - djt.samp[prev].y) > djt.delta) djt.nr = 0; } djt.samp[djt.head] = *_samp; djt.head = (djt.head + 1) & (NR_SAMPHISTLEN - 1); if (djt.nr < NR_SAMPHISTLEN) ++djt.nr; if (djt.nr == 1) { temp = *_samp; } else { average(&djt, &temp); } report_value(dev, &temp); return 1; }