STMPE610 touch sensor driver library

Dependents:   TS_Eyes Tokei testUniGraphic_150217 AfficheurTFTAdafruit ... more

Revision:
5:988661c63061
Parent:
4:0aa8f72d3cdd
Child:
6:34e7dc5991b5
Child:
11:b9e339c2ceee
--- a/SPI_STMPE610.cpp	Sat Dec 13 08:11:29 2014 +0000
+++ b/SPI_STMPE610.cpp	Sat Jan 10 15:13:33 2015 +0000
@@ -122,6 +122,16 @@
 #define REG_TSC_I_DRIVE   0x58
 #define REG_TSC_SHIELD    0x59
 
+// following value are measured 
+// and calculated for my system
+// may be insufficient for other device(s)
+// in such case please use "calibrate()" func
+// to tailor the value for your device
+#define DEF_HRAMP   0.066667
+#define DEF_HOFFSET -13.333344
+#define DEF_VRAMP  0.094311
+#define DEF_VOFFSET -30.933990
+
 SPI_STMPE610::SPI_STMPE610(PinName mosi, PinName miso, PinName sclk, PinName cs) :
         m_spi(mosi, miso, sclk), m_cs(cs) {
     // activate the peripheral
@@ -138,6 +148,10 @@
         | REG_TSC_CFG_SETTLE_1MS ) ;
         
     write8(REG_TSC_CTRL, REG_TSC_CTRL_XYZ | REG_TSC_CTRL_EN) ;   
+    hramp   = DEF_HRAMP ;
+    hoffset = DEF_HOFFSET ;
+    vramp   = DEF_VRAMP ;
+    voffset = DEF_VOFFSET ;
     m_cs = 1 ;
 }
 
@@ -222,26 +236,30 @@
     return( touched ) ;
 }
 
-// following values were measured 
-// by using test_SPI_STMPE610
-#define TOUCH_MIN_X 360
-#define TOUCH_MIN_Y 270
-#define TOUCH_MAX_X 3800
-#define TOUCH_MAX_Y 3700
-
-#define TFT_WIDTH 240
-#define TFT_HEIGHT 320
-
 int SPI_STMPE610::getPoint(uint16_t *x, uint16_t *y, uint16_t *z)
 {
     uint8_t touched = 0 ;
     uint16_t tx, ty, tz ;
     
     touched = getRAWPoint(&tx, &ty, &tz) ;
-    *x = TFT_WIDTH * tx / (TOUCH_MAX_X - TOUCH_MIN_X) ;
-    *y = TFT_HEIGHT * ty / (TOUCH_MAX_Y - TOUCH_MIN_Y) ;
+    *x = (uint16_t)(hramp * tx + hoffset + 0.5) ;
+    *y = (uint16_t)(vramp * ty + voffset + 0.5) ;
     if (z != 0) {
         *z = tz ;
     }
     return( touched ) ;
 }
+
+/*
+ * logical_x = hramp * touch_x + hoffset 
+ * logical_y = vramp * touch_y + voffset
+ */
+void SPI_STMPE610::calibrate(int x_at_10, int y_at_10, int x_at_230, int y_at_310) 
+{
+    hramp = (float)(230 - 10) / (float)(x_at_230 - x_at_10) ;
+    hoffset = (float)(230) - hramp * x_at_230 ;
+    vramp = (float)(310 - 10) / (float)(y_at_310 - y_at_10) ;
+    voffset = (float)(310) - vramp * y_at_310 ;
+    printf("hramp = %f , hoffset = %f\n\r", hramp, hoffset) ;
+    printf("vramp = %f , voffset = %f\n\r", vramp, voffset) ;
+}