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.

Regards

-- 
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting

Reply via email to