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