1 
2 #include   "tx_api.h"
3 #include   "gx_api.h"
4 #include   "gx_system.h"
5 #include   "gx_display.h"
6 #include   "gx_display_driver_hardware.h"
7 
8 #define TOUCH_STATE_TOUCHED  1
9 #define TOUCH_STATE_RELEASED 2
10 #define MIN_DRAG_DELTA       10
11 
12 
13 static int last_pos_x;
14 static int last_pos_y;
15 static int curpos_x;
16 static int curpos_y;
17 static int touch_state;
18 
19 /**************************************************************************/
SendPenDownEvent(VOID)20 VOID SendPenDownEvent(VOID)
21 {
22     GX_EVENT event;
23     event.gx_event_type = GX_EVENT_PEN_DOWN;
24     event.gx_event_payload.gx_event_pointdata.gx_point_x = curpos_x;
25     event.gx_event_payload.gx_event_pointdata.gx_point_y = curpos_y;
26     event.gx_event_sender = 0;
27     event.gx_event_target = 0;
28     event.gx_event_display_handle = BOARD_SCREEN_HANDLE;
29     last_pos_x = curpos_x;
30     last_pos_y = curpos_y;
31     gx_system_event_send(&event);
32 }
33 
34 /**************************************************************************/
SendPenDragEvent(VOID)35 VOID SendPenDragEvent(VOID)
36 {
37     GX_EVENT event;
38     int x_delta = abs(curpos_x - last_pos_x);
39     int y_delta = abs(curpos_y - last_pos_y);
40 
41     if (x_delta > MIN_DRAG_DELTA || y_delta > MIN_DRAG_DELTA)
42     {
43         event.gx_event_type = GX_EVENT_PEN_DRAG;
44         event.gx_event_payload.gx_event_pointdata.gx_point_x = curpos_x;
45         event.gx_event_payload.gx_event_pointdata.gx_point_y = curpos_y;
46         event.gx_event_sender = 0;
47         event.gx_event_target = 0;
48         event.gx_event_display_handle = BOARD_SCREEN_HANDLE;
49         last_pos_x = curpos_x;
50         last_pos_y = curpos_y;
51 
52         gx_system_event_fold(&event);
53     }
54 }
55 
56 /**************************************************************************/
SendPenUpEvent(VOID)57 VOID SendPenUpEvent(VOID)
58 {
59     GX_EVENT event;
60     event.gx_event_type = GX_EVENT_PEN_UP;
61     event.gx_event_payload.gx_event_pointdata.gx_point_x = curpos_x;
62     event.gx_event_payload.gx_event_pointdata.gx_point_y = curpos_y;
63     event.gx_event_sender = 0;
64     event.gx_event_target = 0;
65     event.gx_event_display_handle = BOARD_SCREEN_HANDLE;
66     last_pos_x = curpos_x;
67     last_pos_y = curpos_y;
68     gx_system_event_send(&event);
69 }
70 
71 /*
72   *                     ReadBuffer [0]: The Byte count (0x0A)
73   *                     ReadBuffer [1]: X1 coordinate [15,8]
74   *                     ReadBuffer [2]: X1 coordinate [7,0]
75   *                     ReadBuffer [3]: Y1 coordinate [15,8]
76   *                     ReadBuffer [4]: Y1 coordinate [7,0]
77   *                     ReadBuffer [5]: X2 coordinate [15,8]
78   *                     ReadBuffer [6]: X2 coordinate [7,0]
79   *                     ReadBuffer [7]: Y2 coordinate [15,8]
80   *                     ReadBuffer [8]: Y2 coordinate [7,0]
81   *                     ReadBuffer [9]: Gesture command (01: Zoom In 02: Zoom out)
82   *                     ReadBuffer [10]: unused byte
83 */
touch_thread_entry(ULONG thread_input)84 VOID  touch_thread_entry(ULONG thread_input)
85 {
86 
87     TS_StateTypeDef TS_State;
88     touch_state = TOUCH_STATE_RELEASED;
89 
90     BSP_TS_Init(BOARD_SCREEN_WIDTH, BOARD_SCREEN_HEIGHT);
91 
92     while(1)
93     {
94         tx_thread_sleep(2);
95 
96         BSP_TS_GetState(&TS_State);
97 
98 #ifdef  STM32F769I_EVAL
99         if (!(TS_State.touchDetected))
100 #else
101         if (!(TS_State.TouchDetected))
102 #endif
103         {
104             // no touch, check so see if last was touched
105             if (touch_state == TOUCH_STATE_TOUCHED)
106             {
107                 touch_state = TOUCH_STATE_RELEASED;
108                 SendPenUpEvent();
109             }
110         }
111         else
112         {
113 
114 #ifdef STM32F429I_DISCO
115             if (TS_State.X > BOARD_SCREEN_WIDTH ||
116                 TS_State.Y > BOARD_SCREEN_HEIGHT )
117                 continue;
118 
119             // screen is touched, update coords:
120             // screen is rotated, exchange x-coordinate with y-coordinate
121               curpos_y = TS_State.X;
122 
123               curpos_x = ILI9341_LCD_PIXEL_HEIGHT - TS_State.Y;
124 #elif STM32F769I_EVAL
125 
126             if (TS_State.touchX[0] > BOARD_SCREEN_WIDTH ||
127             TS_State.touchY[0] > BOARD_SCREEN_HEIGHT)
128                 continue;
129 
130             // screen is touched, update coords:
131             curpos_x = TS_State.touchX[0];
132 
133             curpos_y = TS_State.touchY[0];
134 #else
135              if (TS_State.x > BOARD_SCREEN_WIDTH ||
136                 TS_State.y > BOARD_SCREEN_HEIGHT )
137                 continue;
138                         // screen is touched, update coords:
139               curpos_x = TS_State.x;
140 
141               curpos_y = TS_State.y;
142 #endif
143 
144               if (touch_state == TOUCH_STATE_RELEASED)
145               {
146                   touch_state = TOUCH_STATE_TOUCHED;
147                   SendPenDownEvent();
148               }
149               else
150               {
151                   // test and send pen drag
152                   SendPenDragEvent();
153               }
154         }
155     }
156 }
157