[Miscellaneous Android Development] DuB:
Has any dev seen this "Resistive Touchscreen Calibration in Gingerbread [Patch]"

may be helpful!!

http://groups.google.com/group/andr...read/thread/d8ab71947bc96c6a/78fa66c89d0b5d99

Gaurav Singh

Date: Mon, 23 May 2011 11:04:55 +0530

Subject: Resistive Touchscreen Calibration in Gingerbread [Patch]

I have a resistive touchscreen with mechanical misalignments on my

board. The "5 point calibration method" solves errors caused by these

misalignments and converts Touchscreen controller data to actual

screen coordinates. A complete description of mechanical misalignments

and 5 point calibration method can be found at

http://focus.tij.co.jp/jp/lit/an/slyt277/slyt277.pdf.

5-point calibration method is part of the TSLIB touchscreen

calibration commonly used for our QT based devices. We can extend

Android's touchscreen Calibration parameters to include the 6

parameters that are part of the /etc/pointercal file ( calculated when

we run ts_calibrate on TSLIB). Sample idc file below:

# See output of /etc/pointercal file after running ts_calibrate on normal Linux

#

# Before running ts_calibrate -

# export TSLIB_TSDEVICE=/dev/input/event1

# export TSLIB_CALIBFILE=/etc/pointercal

# export TSLIB_CONFFILE=/etc/ts.conf

# export TSLIB_FBDEVICE=/dev/fb0

#

# Pointercal file format - xscale, xymix, xoffset, yxmix, yscale,

yoffset, divider.

# Enter here the values after dividing xscale etc. with the divider.

#

touch.5pointcalib.xscale = 0.199488

touch.5pointcalib.xymix = -0.000325

touch.5pointcalib.xoffset = -6.898865

touch.5pointcalib.yxmix = -0.000795

touch.5pointcalib.yscale = 0.124000

touch.5pointcalib.yoffset = -8.484802

I patched the Android Input subsystem to include the 5 point

calibration method for generating actual screen coordinates.

Gingerbread currently uses simple scaling of touchscreen X and Y data

to CLCD screen X and Y coordinates. In frameworks/base made the

following changes :

diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h

index 49351b0..bb3ec5e 100644

--- a/include/ui/InputReader.h

+++ b/include/ui/InputReader.h

@@ -589,6 +589,20 @@ protected:

// Immutable calibration parameters in parsed form.

struct Calibration {

+ // 5 point calibration algorithm coefficients

+ bool havexscale;

+ float xscale;

+ bool havexymix;

+ float xymix;

+ bool havexoffset;

+ float xoffset;

+ bool haveyxmix;

+ float yxmix;

+ bool haveyscale;

+ float yscale;

+ bool haveyoffset;

+ float yoffset;

+

// Touch Size

enum TouchSizeCalibration {

TOUCH_SIZE_CALIBRATION_DEFAULT,

diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp

index 3197ab2..9345dca 100644

--- a/libs/ui/InputReader.cpp

+++ b/libs/ui/InputReader.cpp

@@ -1682,6 +1682,20 @@ void TouchInputMapper::parseCalibration() {

const InputDeviceCalibration& in = getDevice()->getCalibration();

Calibration& out = mCalibration;

+ out.havexscale = in.tryGetProperty(String8("touch.5pointcalib.xscale"),

+ out.xscale);

+ out.havexymix = in.tryGetProperty(String8("touch.5pointcalib.xymix"),

+ out.xymix);

+ out.havexoffset = in.tryGetProperty(String8("touch.5pointcalib.xoffset"),

+ out.xoffset);

+ out.haveyxmix = in.tryGetProperty(String8("touch.5pointcalib.yxmix"),

+ out.yxmix);

+ out.haveyscale = in.tryGetProperty(String8("touch.5pointcalib.yscale"),

+ out.yscale);

+ out.haveyoffset = in.tryGetProperty(String8("touch.5pointcalib.yoffset"),

+ out.yoffset);

+

+

// Touch Size

out.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_DEFAULT;

String8 touchSizeCalibrationString;

@@ -2294,10 +2308,47 @@ void TouchInputMapper::dispatchTouch(nsecs_t

when, uint32_t policyFlags,

uint32_t inIndex = touch->idToIndex[id];

const PointerData& in = touch->pointers[inIndex];

+ float x,y;

// X and Y

- float x = float(in.x - mLocked.xOrigin) * mLocked.xScale;

- float y = float(in.y - mLocked.yOrigin) * mLocked.yScale;

+ if ( mCalibration.havexscale && mCalibration.havexymix &&

+ mCalibration.havexoffset && mCalibration.haveyxmix &&

+ mCalibration.haveyscale && mCalibration.haveyoffset) {

+

+ x = float(in.x - mLocked.xOrigin) * mLocked.xScale;

+ y = float(in.y - mLocked.yOrigin) * mLocked.yScale;

+ LOGI("x_orig = %f, y_orig = %f\n", x, y);

+ float x_temp = float(in.x - mLocked.xOrigin);

+ float y_temp = float(in.y - mLocked.yOrigin);

+

+ //float xscale = 0.199488;

+ //float xymix = -0.000325;

+ //float xoffset = -6.898865;

+ //float yxmix = -0.000795;

+ //float yscale = 0.124000;

+ //float yoffset = -8.484802;

+

+ // 5 point Calibration coefficients - from tsc.idc

+ float xscale = mCalibration.xscale;

+ float xymix = mCalibration.xymix;

+ float xoffset = mCalibration.xoffset;

+ float yxmix = mCalibration.yxmix;

+ float yscale = mCalibration.yscale;

+ float yoffset = mCalibration.yoffset;

+

+ float x_after_calib = (xscale * x_temp) + (xymix * y_temp) + xoffset;

+ float y_after_calib = (yxmix * x_temp) + (yscale * y_temp) + yoffset;

+

+

+ LOGI("x_after_calib = %f, y_after_calib = %f\n xscale = %f,

yoffset = %f\n", x_after_calib, y_after_calib, xscale, yoffset);

+ x = x_after_calib;

+ y = y_after_calib;

+

+ }

+ else {

+ x = float(in.x - mLocked.xOrigin) * mLocked.xScale;

+ y = float(in.y - mLocked.yOrigin) * mLocked.yScale;

+ }

// ToolMajor and ToolMinor

float toolMajor, toolMinor;

Touchscreen soft-keyboard inputs were being mis-reported on my WVGA

screen and with the patch, keypresses are more accurate.