Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Revision:
81:01da2e34283d
Parent:
79:544eb4964795
Child:
83:7bad0068cca0
--- a/RA8875_Touch.cpp	Sun Dec 28 19:58:18 2014 +0000
+++ b/RA8875_Touch.cpp	Sun Dec 28 21:50:28 2014 +0000
@@ -37,6 +37,152 @@
     return noerror;
 }
 
+    // +----------------------------------------------------+
+    // |                                                    |
+    // |  1                                                 |
+    // |                                                    |
+    // |                                                    |
+    // |                                               2    |
+    // |                                                    |
+    // |                                                    |
+    // |                         3                          |
+    // |                                                    |
+    // +----------------------------------------------------+
+
+
+RetCode_t RA8875::TouchPanelCalibrate(tpMatrix_t * matrix)
+{
+    return TouchPanelCalibrate(NULL, matrix);
+}
+
+
+RetCode_t RA8875::TouchPanelCalibrate(const char * msg, tpMatrix_t * matrix)
+{
+    point_t pTest[3];
+    point_t pSample[3];
+    loc_t x,y;
+    
+    cls();
+    if (msg)
+        puts(msg);
+    SetTextCursor(0,height()/2);
+    pTest[0].x = 50;            pTest[0].y = 50;
+    pTest[1].x = width() - 50;  pTest[1].y = height()/2;
+    pTest[2].x = width()/2;     pTest[2].y = height() - 50;
+    for (int i=0; i<3; i++) {
+        foreground(Blue);
+        printf(" (%3d,%3d) => ", pTest[i].x, pTest[i].y);
+        line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, White);
+        line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, White);
+        while (!TouchPanelA2DFiltered(&x, &y))
+            wait_ms(20);
+        pSample[i].x = x;
+        pSample[i].y = y;
+        line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, Black);
+        line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Black);
+        foreground(Blue);
+        printf(" (%4d,%4d)\r\n", x,y);
+        while (TouchPanelA2DFiltered(&x, &y))
+            wait_ms(20);
+        wait(2);
+    }
+    return TouchPanelComputeCalibration(pTest, pSample, matrix);
+}
+
+
+/**********************************************************************
+ *
+ *     Function: getDisplayPoint()
+ *
+ *  Description: Given a valid set of calibration factors and a point
+ *                value reported by the touch screen, this function
+ *                calculates and returns the true (or closest to true)
+ *                display point below the spot where the touch screen 
+ *                was touched.
+ * 
+ *
+ * 
+ *  Argument(s): displayPtr (output) - Pointer to the calculated
+ *                                      (true) display point.
+ *               screenPtr (input) - Pointer to the reported touch
+ *                                    screen point.
+ *               matrixPtr (input) - Pointer to calibration factors
+ *                                    matrix previously calculated
+ *                                    from a call to 
+ *                                    setCalibrationMatrix()
+ * 
+ *
+ *  The function simply solves for Xd and Yd by implementing the 
+ *   computations required by the translation matrix.  
+ * 
+ *                                              /-     -\
+ *              /-    -\     /-            -\   |       |
+ *              |      |     |              |   |   Xs  |
+ *              |  Xd  |     | A    B    C  |   |       |
+ *              |      |  =  |              | * |   Ys  |
+ *              |  Yd  |     | D    E    F  |   |       |
+ *              |      |     |              |   |   1   |
+ *              \-    -/     \-            -/   |       |
+ *                                              \-     -/
+ * 
+ *  It must be kept brief to avoid consuming CPU cycles.
+ *
+ *       Return: OK - the display point was correctly calculated 
+ *                     and its value is in the output argument.
+ *               NOT_OK - an error was detected and the function
+ *                         failed to return a valid point.
+ *
+ *                 NOTE!    NOTE!    NOTE!
+ *
+ *  setCalibrationMatrix() and getDisplayPoint() will do fine
+ *  for you as they are, provided that your digitizer         
+ *  resolution does not exceed 10 bits (1024 values).  Higher
+ *  resolutions may cause the integer operations to overflow
+ *  and return incorrect values.  If you wish to use these   
+ *  functions with digitizer resolutions of 12 bits (4096    
+ *  values) you will either have to a) use 64-bit signed     
+ *  integer variables and math, or b) judiciously modify the 
+ *  operations to scale results by a factor of 2 or even 4.  
+ *
+ */
+bool RA8875::TouchPanelReadable(point_t * TouchPoint)
+{
+    bool touched = false;
+    point_t screenpoint = {0, 0};
+    
+    if (TouchPanelA2DFiltered(&screenpoint.x, &screenpoint.y)) {
+        touched = true;
+        if (tpMatrix.Divider != 0 && TouchPoint) {
+            /* Operation order is important since we are doing integer */
+            /*  math. Make sure you add all terms together before      */
+            /*  dividing, so that the remainder is not rounded off     */
+            /*  prematurely.                                           */
+            TouchPoint->x = ( (tpMatrix.An * screenpoint.x) +
+                              (tpMatrix.Bn * screenpoint.y) +
+                              tpMatrix.Cn
+                            ) / tpMatrix.Divider ;
+
+            TouchPoint->y = ( (tpMatrix.Dn * screenpoint.x) +
+                              (tpMatrix.En * screenpoint.y) +
+                              tpMatrix.Fn
+                            ) / tpMatrix.Divider ;
+        } else {
+            touched = false;
+        }
+    }
+    return touched;
+}
+
+
+RetCode_t RA8875::TouchPanelSetMatrix(tpMatrix_t * matrixPtr)
+{
+    if (matrixPtr == NULL || matrixPtr->Divider == 0)
+        return bad_parameter;
+    memcpy(&tpMatrix, matrixPtr, sizeof(tpMatrix_t));
+    return noerror;
+}
+
+
 bool RA8875::TouchPanelA2DFiltered(loc_t *x, loc_t *y)
 {
     unsigned char touchready;
@@ -276,7 +422,7 @@
  *  operations to scale results by a factor of 2 or even 4.  
  *
  */
-RetCode_t RA8875::TouchPanelCalibrate(point_t * displayPtr, point_t * screenPtr, tpMatrix_t * matrixPtr)
+RetCode_t RA8875::TouchPanelComputeCalibration(point_t * displayPtr, point_t * screenPtr, tpMatrix_t * matrixPtr)
 {
     RetCode_t retValue = noerror;
 
@@ -311,96 +457,4 @@
     return( retValue ) ;
 }
 
-/**********************************************************************
- *
- *     Function: getDisplayPoint()
- *
- *  Description: Given a valid set of calibration factors and a point
- *                value reported by the touch screen, this function
- *                calculates and returns the true (or closest to true)
- *                display point below the spot where the touch screen 
- *                was touched.
- * 
- *
- * 
- *  Argument(s): displayPtr (output) - Pointer to the calculated
- *                                      (true) display point.
- *               screenPtr (input) - Pointer to the reported touch
- *                                    screen point.
- *               matrixPtr (input) - Pointer to calibration factors
- *                                    matrix previously calculated
- *                                    from a call to 
- *                                    setCalibrationMatrix()
- * 
- *
- *  The function simply solves for Xd and Yd by implementing the 
- *   computations required by the translation matrix.  
- * 
- *                                              /-     -\
- *              /-    -\     /-            -\   |       |
- *              |      |     |              |   |   Xs  |
- *              |  Xd  |     | A    B    C  |   |       |
- *              |      |  =  |              | * |   Ys  |
- *              |  Yd  |     | D    E    F  |   |       |
- *              |      |     |              |   |   1   |
- *              \-    -/     \-            -/   |       |
- *                                              \-     -/
- * 
- *  It must be kept brief to avoid consuming CPU cycles.
- *
- *       Return: OK - the display point was correctly calculated 
- *                     and its value is in the output argument.
- *               NOT_OK - an error was detected and the function
- *                         failed to return a valid point.
- *
- *                 NOTE!    NOTE!    NOTE!
- *
- *  setCalibrationMatrix() and getDisplayPoint() will do fine
- *  for you as they are, provided that your digitizer         
- *  resolution does not exceed 10 bits (1024 values).  Higher
- *  resolutions may cause the integer operations to overflow
- *  and return incorrect values.  If you wish to use these   
- *  functions with digitizer resolutions of 12 bits (4096    
- *  values) you will either have to a) use 64-bit signed     
- *  integer variables and math, or b) judiciously modify the 
- *  operations to scale results by a factor of 2 or even 4.  
- *
- */
-bool RA8875::TouchPanelReadable(point_t * TouchPoint)
-{
-    bool touched = false;
-    point_t screenpoint = {0, 0};
-    
-    if (TouchPanelA2DFiltered(&screenpoint.x, &screenpoint.y)) {
-        touched = true;
-        if (tpMatrix.Divider != 0 && TouchPoint) {
-            /* Operation order is important since we are doing integer */
-            /*  math. Make sure you add all terms together before      */
-            /*  dividing, so that the remainder is not rounded off     */
-            /*  prematurely.                                           */
-            TouchPoint->x = ( (tpMatrix.An * screenpoint.x) +
-                              (tpMatrix.Bn * screenpoint.y) +
-                              tpMatrix.Cn
-                            ) / tpMatrix.Divider ;
-
-            TouchPoint->y = ( (tpMatrix.Dn * screenpoint.x) +
-                              (tpMatrix.En * screenpoint.y) +
-                              tpMatrix.Fn
-                            ) / tpMatrix.Divider ;
-        } else {
-            touched = false;
-        }
-    }
-    return touched;
-}
-
-
-RetCode_t RA8875::TouchPanelSetMatrix(tpMatrix_t * matrixPtr)
-{
-    if (matrixPtr == NULL || matrixPtr->Divider == 0)
-        return bad_parameter;
-    memcpy(&tpMatrix, matrixPtr, sizeof(tpMatrix_t));
-    return noerror;
-}
-
 // #### end of touch panel code additions