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

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        : GUIDEMO_Touch
  16. Purpose     : Touch demo
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include "GUI.h"
  20. //#include "LCD_ConfDefaults.h"      /* valid LCD configuration */
  21. #include "GUIDEMO.h"
  22. #include "Button.h"
  23. #include "Edit.h"
  24. #if (GUI_WINSUPPORT && GUI_SUPPORT_TOUCH)
  25. #define countof(Obj) (sizeof(Obj)/sizeof(Obj[0]))
  26. /*********************************************************************
  27. *
  28. *       Static functions
  29. *
  30. **********************************************************************
  31. */
  32. static int _Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) {
  33.   return p0 + ((p1 - p0) * (l - l0)) / (l1 - l0);
  34. }
  35. static void _Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1, int *p0, int *p1) {
  36.   int l0 = 0;
  37.   int l1 = (Coord == GUI_COORD_X) ? LCD_XSIZE - 1 : LCD_YSIZE - 1;
  38.   *p0 = _Log2Phys(l0, Log0, Log1, Phys0, Phys1);
  39.   *p1 = _Log2Phys(l1, Log0, Log1, Phys0, Phys1);
  40. }
  41. /*********************************************************************
  42. *
  43. *       _ExecCalibration
  44. *
  45. **********************************************************************
  46. */
  47. void _ExecCalibration(void) {
  48.   int ax_Phys[2],ay_Phys[2];
  49. /* calculate log. Positions */
  50.   int ax[2] = { 15, LCD_XSIZE -1-15};
  51. //  const int ay[2] = { 15, LCD_YSIZE-1-15};
  52.   int ay[2] = { LCD_YSIZE-1-15, 15};
  53.   GUI_TOUCH_SetDefaultCalibration();
  54. /* _Calibrate upper left */
  55.   GUI_SetBkColor(GUI_RED);  
  56.   GUI_Clear();
  57.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[0], ay[0], 10);
  58.   GUI_SetColor(GUI_RED);    GUI_FillCircle(ax[0], ay[0], 5);
  59.   GUI_SetColor(GUI_WHITE);
  60.   GUI_DispStringAt("Press here", ax[0]+20, ay[0]);
  61.   do {
  62.     GUI_TOUCH_tState State;
  63.     GUI_TOUCH_GetState(&State);
  64.     if (State.Pressed) {
  65.       ax_Phys[0] = State.x;//GUI_TOUCH_GetxPhys();
  66.       ay_Phys[0] = State.y;//GUI_TOUCH_GetyPhys();
  67.       break;
  68.     }
  69.     GUI_Delay (100);
  70.   } while (1);
  71. /* Tell user to release */
  72.   GUI_Clear();
  73.   GUI_DispStringAt("OK", ax[0]+20, ay[0]);
  74.   do {
  75.     GUI_TOUCH_tState State;
  76.     GUI_TOUCH_GetState(&State);
  77.     if (State.Pressed == 0) {
  78.       break;
  79.     }
  80.     GUI_Delay (100);
  81.   } while (1);
  82. /* _Calibrate lower right */
  83.   GUI_SetBkColor(GUI_RED);  
  84.   GUI_Clear();
  85.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[1], ay[1], 10);
  86.   GUI_SetColor(GUI_RED);    GUI_FillCircle(ax[1], ay[1], 5);
  87.   GUI_SetColor(GUI_WHITE);
  88.   GUI_SetTextAlign(GUI_TA_RIGHT);
  89.   GUI_DispStringAt("Press here", ax[1]-20, ay[1]);
  90.   do {
  91.     GUI_TOUCH_tState State;
  92.     GUI_TOUCH_GetState(&State);
  93.     if (State.Pressed) {
  94.       ax_Phys[1] = GUI_TOUCH_GetxPhys();//State.x;//
  95.       ay_Phys[1] = GUI_TOUCH_GetyPhys();//State.y;//
  96.       break;
  97.     }
  98.     GUI_Delay (100);
  99.   } while (1);
  100.   GUI_TOUCH_Calibrate(GUI_COORD_X, ax[0], ax[1], ax_Phys[0], ax_Phys[1]);
  101.   GUI_TOUCH_Calibrate(GUI_COORD_Y, ay[0], ay[1], ay_Phys[0], ay_Phys[1]);
  102.   { /* calculate and display values for configuration file */
  103.     int x0, x1;
  104.     int y0, y1;
  105.     GUI_Clear();
  106.     _Calibrate(GUI_COORD_X, ax[0], ax[1], ax_Phys[0], ax_Phys[1], &x0, &x1);
  107.     _Calibrate(GUI_COORD_Y, ay[0], ay[1], ay_Phys[0], ay_Phys[1], &y0, &y1);
  108.     GUI_DispStringAt("x0: ", 0, 0); GUI_DispDec(x0, 4); GUI_DispNextLine();
  109.     GUI_DispString  ("x1: ");       GUI_DispDec(x1, 4); GUI_DispNextLine();
  110.     GUI_DispString  ("y0: ");       GUI_DispDec(y0, 4); GUI_DispNextLine();
  111.     GUI_DispString  ("y1: ");       GUI_DispDec(y1, 4); GUI_DispNextLine();
  112.     GUI_DispString  ("Please touch display to continue...");
  113.     GUI_Delay(1000);
  114.     do {
  115.       GUI_TOUCH_tState State;
  116.       GUI_TOUCH_GetState(&State);
  117.       if (State.Pressed)
  118.         break;
  119.       GUI_Delay (10);
  120.     } while (1);
  121.   }
  122. }
  123. /*********************************************************************
  124. *
  125. *       _TestCalibration
  126. *
  127. **********************************************************************
  128. */
  129. void _TestCalibration(void) {
  130.   int IdleCnt=0;
  131.   BUTTON_Handle hButton;
  132.   GUI_SetBkColor(GUI_RED);  
  133.   GUI_SetColor(GUI_WHITE);  
  134.   GUI_Clear();
  135.   hButton =  BUTTON_Create( 225, 15, 80, 40, 1, BUTTON_CF_SHOW );
  136.   BUTTON_SetText (hButton, "ABORT");
  137.   BUTTON_SetFont (hButton, &GUI_FontComic18B_ASCII);
  138.   while ((IdleCnt<50) && (GUI_GetKey()==0)) {
  139.     static GUI_TOUCH_tState StateLast;
  140.     GUI_TOUCH_tState State;
  141.     GUI_TOUCH_GetState(&State);
  142.     if ((StateLast.Pressed != State.Pressed) && (State.Pressed == 0)) {
  143.       GUI_Clear();
  144.     }
  145.     if ((StateLast.x != State.x) || ((StateLast.y != State.y))) {
  146.       if (State.Pressed) {
  147.         GUI_FillCircle(State.x, State.y, 5);
  148.       }
  149.       StateLast = State;
  150.     }
  151.     if (State.Pressed) {
  152.       IdleCnt =0;
  153.     } else {
  154.       IdleCnt++;
  155.     }
  156.     GUI_Delay (100);
  157.   }
  158.   EDIT_Delete(hButton);
  159. }
  160. /*********************************************************************
  161. *
  162. *       _ExecKeyboard
  163. *
  164. **********************************************************************
  165. This creates a sample keyboard.
  166. The routine returns after ENTER or ESC has been pressed.
  167. */
  168. #if (LCD_XSIZE == 320) && (LCD_YSIZE == 240)
  169. static char _acText[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '='
  170.                         ,0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'
  171.                         ,0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Q'
  172.                         ,0, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '