GUI_TOUCH_DriverAnalog.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:6k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUITOUCH.C
  16. Purpose     : Touch screen manager
  17. ----------------------------------------------------------------------
  18. This module handles the touch screen. It is configured in the file
  19. GUITouch.conf.h (Should be located in the Config directory).
  20. ----------------------------------------------------------------------
  21. */
  22. #include "includes.h"
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include "LCD_Private.H"      /* private modul definitions & config */
  27. #include "GUI_Protected.h"
  28. /* Generate code only if configuration says so ! */
  29. #if GUI_SUPPORT_TOUCH
  30. #include "GUITouchconf.h"    /* Located in GUIx, will include GUITouch.conf.h */
  31. /*
  32. **********************************************************************
  33. *
  34. *          Config defaults
  35. *
  36. **********************************************************************
  37. */
  38. #ifndef GUI_TOUCH_AD_LEFT      /* max value returned by AD-converter */
  39.   #define GUI_TOUCH_AD_LEFT 30   
  40. #endif
  41. #ifndef GUI_TOUCH_AD_RIGHT      /* min value returned by AD-converter */
  42.   #define GUI_TOUCH_AD_RIGHT 220    
  43. #endif
  44. #ifndef GUI_TOUCH_AD_TOP       /* max value returned by AD-converter */
  45.   #define GUI_TOUCH_AD_TOP 30
  46. #endif
  47. #ifndef GUI_TOUCH_AD_BOTTOM      /* min value returned by AD-converter */
  48.   #define GUI_TOUCH_AD_BOTTOM 220
  49. #endif
  50. #ifndef GUI_TOUCH_SWAP_XY    /* Is XY of touch swapped ? */
  51.   #define GUI_TOUCH_SWAP_XY 0
  52. #endif
  53. #ifndef GUI_TOUCH_MIRROR_X
  54.   #define GUI_TOUCH_MIRROR_X 0
  55. #endif
  56. #ifndef GUI_TOUCH_MIRROR_Y
  57.   #define GUI_TOUCH_MIRROR_Y 0
  58. #endif
  59. #ifndef GUI_TOUCH_YSIZE
  60.   #define GUI_TOUCH_YSIZE LCD_YSIZE
  61. #endif
  62. #ifndef GUI_TOUCH_XSIZE
  63.   #define GUI_TOUCH_XSIZE LCD_XSIZE
  64. #endif
  65. /*
  66. **********************************************************************
  67. *
  68. *          Config check
  69. *
  70. **********************************************************************
  71. */
  72. /*
  73.   *****************************************************************
  74.   *                                                               *
  75.   *              Global data                                      *
  76.   *                                                               *
  77.   *****************************************************************
  78. The global data below is for debugging purposes only. A "clean"
  79. application should not use these values for any other purpose.
  80. NEVER write into these values !
  81. */
  82. //int GUI_TOUCH_yPhys, GUI_TOUCH_xPhys;
  83. /****************************************************************
  84. *
  85. *       Static data
  86. *
  87. *****************************************************************
  88. */
  89. typedef struct {int Min; int Max; } tMinMax;
  90. static tMinMax xyMinMax[2] = {
  91. #if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_X==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_Y==0))
  92.   { GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT },
  93. #else
  94.   { GUI_TOUCH_AD_RIGHT, GUI_TOUCH_AD_LEFT },
  95. #endif
  96. #if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_Y==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_X==0))
  97.   { GUI_TOUCH_AD_TOP,  GUI_TOUCH_AD_BOTTOM }
  98. #else
  99.   { GUI_TOUCH_AD_BOTTOM,  GUI_TOUCH_AD_TOP }
  100. #endif
  101. };
  102. #ifndef WIN32
  103. static int xMin;
  104. static int xMax;
  105. static int yMin;
  106. static int yMax;
  107. #endif
  108. /*********************************************************************
  109. *
  110. *       Convert physical value into (logical) coordinates
  111. */
  112. int AD2X(int adx) {
  113.   I32 r = adx - xyMinMax[GUI_COORD_X].Min;
  114.   r *= GUI_TOUCH_XSIZE - 1;
  115.   return r / (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min);    
  116. }
  117. int AD2Y(int ady) {
  118.   I32 r = ady - xyMinMax[GUI_COORD_Y].Min;
  119.   r *= GUI_TOUCH_YSIZE - 1;
  120.   return r/(xyMinMax[GUI_COORD_Y].Max - xyMinMax[GUI_COORD_Y].Min);    
  121. }
  122. /*********************************************************************
  123. *
  124. *        Diagnostic routines
  125. */
  126. extern volatile int xdata, ydata;
  127. int  GUI_TOUCH_GetxPhys(void) {
  128.   return  xdata ; //GUI_TOUCH_xPhys;
  129. }
  130. int  GUI_TOUCH_GetyPhys(void) {
  131.   return ydata ; //GUI_TOUCH_yPhys;
  132. }
  133. /*********************************************************************
  134. *
  135. *              SetDefaultCalibration
  136. */
  137. void GUI_TOUCH_SetDefaultCalibration(void) {
  138.   xyMinMax[0].Min = GUI_TOUCH_AD_LEFT;
  139.   xyMinMax[0].Max = GUI_TOUCH_AD_RIGHT;
  140.   xyMinMax[1].Min = GUI_TOUCH_AD_TOP;
  141.   xyMinMax[1].Max = GUI_TOUCH_AD_BOTTOM;
  142. }
  143. /*********************************************************************
  144. *
  145. *              Calibration
  146. */
  147. static int Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) {
  148.   return p0+ ((p1-p0) * (l-l0)) / (l1-l0);
  149. }
  150. int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1) {
  151.   int l0 = 0;
  152.   int l1 = (Coord==GUI_COORD_X) ? LCD_XSIZE-1 : LCD_YSIZE-1;
  153.   if (labs(Phys0-Phys1) < 20)
  154.     return 1;
  155.   if (labs(Log0-Log1) < 20)
  156.     return 1;
  157.   xyMinMax[Coord].Min = Log2Phys(l0, Log0, Log1, Phys0, Phys1);
  158.   xyMinMax[Coord].Max = Log2Phys(l1, Log0, Log1, Phys0, Phys1);
  159.   return 0;
  160. }
  161. /*********************************************************************
  162. *
  163. *              GUI_TOUCH_Exec
  164. */
  165. void GUI_TOUCH_Exec(void)
  166. {
  167.   int xPhys, yPhys;
  168.   int x,y;
  169.   x = AD2X(xdata);
  170.   y = AD2Y(ydata);
  171.   // added by scw.
  172.   GUI_TOUCH_StoreState( x, y );
  173. /* calculate Min / Max values */
  174.     if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) {
  175.         xMin = xyMinMax[GUI_COORD_X].Min;
  176.         xMax = xyMinMax[GUI_COORD_X].Max;
  177.     } else {
  178.         xMax = xyMinMax[GUI_COORD_X].Min;
  179.         xMin = xyMinMax[GUI_COORD_X].Max;
  180.     }
  181.     if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) {
  182.         yMin = xyMinMax[GUI_COORD_Y].Min;
  183.         yMax = xyMinMax[GUI_COORD_Y].Max;
  184.     } else {
  185.         yMax = xyMinMax[GUI_COORD_Y].Min;
  186.         yMin = xyMinMax[GUI_COORD_Y].Max;
  187.     }
  188. }
  189. #else
  190. void GUI_TOUCH_DriverAnalog_C(void) {}
  191. #endif    /* defined(GUI_SUPPORT_TOUCH) && GUI_SUPPORT_TOUCH */