From: Chris Bagwell <ch...@cnpbagwell.com> This helps abstract out filtering better and also allows custom behavior on storing of samples as well; such as not moving avg window if no X/Y values have changed in current event cycle.
Intent of this change is refactor only (no behavior change). Most off diff is moving logic over to wcmFilter.c. There is minor flow difference because RawFilter() and wcmCheckSuppress() needs to be kept in wcmCommon.c, and so outside logic that stores samples, but intent is same results. Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com> --- src/wcmCommon.c | 81 +++++++++++++----------------------------------------- src/wcmFilter.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/wcmFilter.h | 1 + 3 files changed, 94 insertions(+), 64 deletions(-) diff --git a/src/wcmCommon.c b/src/wcmCommon.c index 1a87027..9bb5afb 100644 --- a/src/wcmCommon.c +++ b/src/wcmCommon.c @@ -23,6 +23,7 @@ #include "xf86Wacom.h" #include "Xwacom.h" +#include "wcmFilter.h" #include <xkbsrv.h> #include <xf86_OSproc.h> @@ -37,7 +38,6 @@ static void transPressureCurve(WacomDevicePtr pDev, WacomDeviceStatePtr pState); static void commonDispatchDevice(WacomCommonPtr common, unsigned int channel, const WacomChannelPtr pChannel, int suppress); -static void resetSampleCounter(const WacomChannelPtr pChannel); static void sendAButton(InputInfoPtr pInfo, int button, int mask, int rx, int ry, int rz, int v3, int v4, int v5); @@ -855,13 +855,6 @@ static int wcmCheckSuppress(WacomCommonPtr common, return returnV; } -/* reset raw data counters for filters */ -static void resetSampleCounter(const WacomChannelPtr pChannel) -{ - pChannel->nSamples = 0; - pChannel->rawFilter.npoints = 0; -} - /***************************************************************************** * wcmEvent - * Handles suppression, transformation, filtering, and event dispatch. @@ -873,8 +866,7 @@ void wcmEvent(WacomCommonPtr common, unsigned int channel, WacomDeviceState* pLast; WacomDeviceState ds; WacomChannelPtr pChannel; - WacomFilterState* fs; - int i, suppress = 0; + int suppress = 0; WacomDevicePtr priv = common->wcmDevices; pChannel = common->wcmChannel + channel; pLast = &pChannel->valid.state; @@ -937,62 +929,29 @@ void wcmEvent(WacomCommonPtr common, unsigned int channel, wcmTilt2R(&ds); } - fs = &pChannel->rawFilter; - if (!fs->npoints && ds.proximity) + /* Optionally filter values only while in proximity */ + if (RAW_FILTERING(common) && common->wcmModel->FilterRaw && + ds.proximity && ds.device_type != PAD_ID) { - DBG(11, common, "initialize Channel data.\n"); - /* store channel device state for later use */ - for (i=common->wcmRawSample - 1; i>=0; i--) - { - fs->x[i]= ds.x; - fs->y[i]= ds.y; - fs->tiltx[i] = ds.tiltx; - fs->tilty[i] = ds.tilty; - } - ++fs->npoints; - } else { - /* Filter raw data, fix hardware defects, perform error correction */ - for (i=common->wcmRawSample - 1; i>0; i--) - { - fs->x[i]= fs->x[i-1]; - fs->y[i]= fs->y[i-1]; - } - fs->x[0] = ds.x; - fs->y[0] = ds.y; - if (HANDLE_TILT(common) && (ds.device_type == STYLUS_ID || ds.device_type == ERASER_ID)) - { - for (i=common->wcmRawSample - 1; i>0; i--) - { - fs->tiltx[i]= fs->tiltx[i-1]; - fs->tilty[i]= fs->tilty[i-1]; - } - fs->tiltx[0] = ds.tiltx; - fs->tilty[0] = ds.tilty; - } - /* Optionally filter values while in proximity */ - if (RAW_FILTERING(common) && common->wcmModel->FilterRaw && - ds.proximity && ds.device_type != PAD_ID) - { - if (!pLast->proximity) - resetSampleCounter(pChannel); - - if (common->wcmModel->FilterRaw(common,pChannel,&ds)) - { - DBG(10, common, - "Raw filtering discarded data.\n"); - resetSampleCounter(pChannel); - return; /* discard */ - } - } + /* Start filter fresh when entering proximity */ + if (!pLast->proximity) + wcmResetSampleCounter(pChannel); - /* Discard unwanted data */ - suppress = wcmCheckSuppress(common, pLast, &ds); - if (!suppress) + if (common->wcmModel->FilterRaw(common,pChannel,&ds)) { - return; + DBG(10, common, "Raw filtering discarded data.\n"); + wcmResetSampleCounter(pChannel); + return; /* discard */ } } + /* Discard unwanted data */ + suppress = wcmCheckSuppress(common, pLast, &ds); + if (!suppress) + { + return; + } + /* JEJ - Do not move this code without discussing it with me. * The device state is invariant of any filtering performed below. * Changing the device state after this point can and will cause @@ -1018,7 +977,7 @@ void wcmEvent(WacomCommonPtr common, unsigned int channel, (ds.device_type != TOUCH_ID)) commonDispatchDevice(common,channel,pChannel, suppress); ret: - resetSampleCounter(pChannel); + wcmResetSampleCounter(pChannel); } static int idtotype(int id) diff --git a/src/wcmFilter.c b/src/wcmFilter.c index f2cbec1..4af4911 100644 --- a/src/wcmFilter.c +++ b/src/wcmFilter.c @@ -35,7 +35,7 @@ static void filterCurveToLine(int* pCurve, int nMax, double x0, double y0, static int filterOnLine(double x0, double y0, double x1, double y1, double a, double b); static void filterLine(int* pCurve, int nMax, int x0, int y0, int x1, int y1); -static void filterIntuosStylus(WacomCommonPtr common, WacomFilterStatePtr state, WacomDeviceStatePtr ds); +static void filterIntuosStylus(WacomCommonPtr common, WacomChannelPtr pChannel, WacomDeviceStatePtr ds); void wcmTilt2R(WacomDeviceStatePtr ds); @@ -80,6 +80,19 @@ void wcmSetPressureCurve(WacomDevicePtr pDev, int x0, int y0, pDev->nPressCtrl[3] = y1; } +/* + * wcmResetSampleCounter -- + * Device specific filter routines are responcable for storing raw data + * as well as filtering. wcmResetSampleCounter is called to reset + * raw counters. + */ +void wcmResetSampleCounter(const WacomChannelPtr pChannel) +{ + pChannel->nSamples = 0; + pChannel->rawFilter.npoints = 0; +} + + static void filterNearestPoint(double x0, double y0, double x1, double y1, double a, double b, double* x, double* y) { @@ -202,16 +215,70 @@ static void filterLine(int* pCurve, int nMax, int x0, int y0, int x1, int y1) } } } +static void storeRawSample(WacomCommonPtr common, WacomChannelPtr pChannel, + WacomDeviceStatePtr ds) +{ + WacomFilterState *fs; + int i; + fs = &pChannel->rawFilter; + if (!fs->npoints) + { + DBG(10, common, "initialize channel data.\n"); + /* Store initial value over whole average window */ + for (i=common->wcmRawSample - 1; i>=0; i--) + { + fs->x[i]= ds->x; + fs->y[i]= ds->y; + } + if (HANDLE_TILT(common) && (ds->device_type == STYLUS_ID || + ds->device_type == ERASER_ID)) + { + for (i=common->wcmRawSample - 1; i>=0; i--) + { + fs->tiltx[i] = ds->tiltx; + fs->tilty[i] = ds->tilty; + } + } + ++fs->npoints; + } else { + /* Shift window and insert latest sample */ + for (i=common->wcmRawSample - 1; i>0; i--) + { + fs->x[i]= fs->x[i-1]; + fs->y[i]= fs->y[i-1]; + } + fs->x[0] = ds->x; + fs->y[0] = ds->y; + if (HANDLE_TILT(common) && (ds->device_type == STYLUS_ID || + ds->device_type == ERASER_ID)) + { + for (i=common->wcmRawSample - 1; i>0; i--) + { + fs->tiltx[i]= fs->tiltx[i-1]; + fs->tilty[i]= fs->tilty[i-1]; + } + fs->tiltx[0] = ds->tiltx; + fs->tilty[0] = ds->tilty; + } + } +} /***************************************************************************** * filterIntuosStylus -- * Correct some hardware defects we've been seeing in Intuos pads, * but also cuts down quite a bit on jitter. ****************************************************************************/ -static void filterIntuosStylus(WacomCommonPtr common, WacomFilterStatePtr state, WacomDeviceStatePtr ds) +static void filterIntuosStylus(WacomCommonPtr common, + WacomChannelPtr pChannel, + WacomDeviceStatePtr ds) { int x=0, y=0, tx=0, ty=0, i; + WacomFilterState *state; + + storeRawSample(common, pChannel, ds); + + state = &pChannel->rawFilter; for ( i=0; i<common->wcmRawSample; i++ ) { @@ -250,6 +317,9 @@ int wcmFilterCoord(WacomCommonPtr common, WacomChannelPtr pChannel, int *x, *y, i; DBG(10, common, "common->wcmRawSample = %d \n", common->wcmRawSample); + + storeRawSample(common, pChannel, ds); + x = pChannel->rawFilter.x; y = pChannel->rawFilter.y; @@ -279,7 +349,7 @@ int wcmFilterIntuos(WacomCommonPtr common, WacomChannelPtr pChannel, * cannot be fixed, return 1 such that the data is discarded. */ if (ds->device_type != CURSOR_ID) - filterIntuosStylus(common, &pChannel->rawFilter, ds); + filterIntuosStylus(common, pChannel, ds); else wcmFilterCoord(common, pChannel, ds); diff --git a/src/wcmFilter.h b/src/wcmFilter.h index db84dc9..3a8204d 100644 --- a/src/wcmFilter.h +++ b/src/wcmFilter.h @@ -30,6 +30,7 @@ int wcmFilterIntuos(WacomCommonPtr common, WacomChannelPtr pChannel, WacomDeviceStatePtr ds); int wcmFilterCoord(WacomCommonPtr common, WacomChannelPtr pChannel, WacomDeviceStatePtr ds); +void wcmResetSampleCounter(const WacomChannelPtr pChannel); /****************************************************************************/ #endif /* __XF86_WCMFILTER_H */ -- 1.7.3.2 ------------------------------------------------------------------------------ Centralized Desktop Delivery: Dell and VMware Reference Architecture Simplifying enterprise desktop deployment and management using Dell EqualLogic storage and VMware View: A highly scalable, end-to-end client virtualization framework. Read more! http://p.sf.net/sfu/dell-eql-dev2dev _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel