22
22
* @brief Source file for the Arduino Giga Display Touch library.
23
23
*/
24
24
25
+
26
+ #ifdef __ZEPHYR__
27
+ /*
28
+ * Copyright 2023 Arduino SA
29
+ *
30
+ * This program is free software: you can redistribute it and/or modify
31
+ * it under the terms of the GNU Lesser General Public License as published by
32
+ * the Free Software Foundation, either version 3 of the License, or
33
+ * (at your option) any later version.
34
+ *
35
+ * This program is distributed in the hope that it will be useful,
36
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
37
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38
+ * GNU Lesser General Public License for more details.
39
+ *
40
+ * You should have received a copy of the GNU Lesser General Public License
41
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
42
+ *
43
+ */
44
+
45
+ /* *
46
+ * @file Arduino_GigaDisplayTouch.cpp
47
+ * @author Leonardo Cavagnis
48
+ * @brief Source file for the Arduino Giga Display Touch library.
49
+ */
50
+
51
+ /* Includes -----------------------------------------------------------------*/
52
+ #include " Arduino_GigaDisplayTouch.h"
53
+
54
+ #include < zephyr/kernel.h>
55
+ #include < zephyr/device.h>
56
+ #include < zephyr/input/input.h>
57
+ #include < zephyr/drivers/display.h>
58
+ #include < zephyr/sys/util.h>
59
+
60
+
61
+
62
+ /* Callbacks from Zephyr ----------------------- */
63
+
64
+ // Static members defined
65
+ Arduino_GigaDisplayTouch::touch_point_t Arduino_GigaDisplayTouch::zephyr_touch_points[CONFIG_INPUT_GT911_MAX_TOUCH_POINTS];
66
+
67
+ uint8_t Arduino_GigaDisplayTouch::zephyr_touch_cb_slot_num = 0 ;
68
+ struct k_sem Arduino_GigaDisplayTouch::zephyr_touch_event_sync;
69
+
70
+
71
+ void Arduino_GigaDisplayTouch::touch_event_callback (struct input_event *evt, void *user_data) {
72
+ UNUSED (user_data);
73
+ // printk("touch_event_callback(%p %p): %p %u %u %u %d\n", evt, user_data,
74
+ // evt->dev, evt->sync, evt->type, evt->code, evt->value);
75
+ switch (evt->code ) {
76
+ case INPUT_ABS_MT_SLOT:
77
+ zephyr_touch_cb_slot_num = evt->value ;
78
+ break ;
79
+ case INPUT_ABS_X:
80
+ zephyr_touch_points[zephyr_touch_cb_slot_num].x = evt->value ;
81
+ break ;
82
+ case INPUT_ABS_Y:
83
+ zephyr_touch_points[zephyr_touch_cb_slot_num].y = evt->value ;
84
+ break ;
85
+ case INPUT_BTN_TOUCH:
86
+ zephyr_touch_points[zephyr_touch_cb_slot_num].pressed = evt->value ;
87
+ break ;
88
+ }
89
+
90
+ if (evt->sync ) {
91
+ k_sem_give (&zephyr_touch_event_sync);
92
+ }
93
+ }
94
+
95
+
96
+ /* Functions -----------------------------------------------------------------*/
97
+ Arduino_GigaDisplayTouch::Arduino_GigaDisplayTouch ()
98
+ {
99
+ }
100
+
101
+ Arduino_GigaDisplayTouch::~Arduino_GigaDisplayTouch ()
102
+ {
103
+ }
104
+
105
+ extern " C" void registerGigaTouchCallback (void (*cb)(struct input_event *evt, void *user_data));
106
+
107
+ bool Arduino_GigaDisplayTouch::begin () {
108
+ k_sem_init (&zephyr_touch_event_sync, 0 , 1 );
109
+ registerGigaTouchCallback (&touch_event_callback);
110
+ return true ;
111
+ }
112
+
113
+
114
+ void Arduino_GigaDisplayTouch::end ()
115
+ {
116
+ registerGigaTouchCallback (nullptr );
117
+ }
118
+
119
+ uint8_t Arduino_GigaDisplayTouch::getTouchPoints (GDTpoint_t* points, uint32_t timeout) {
120
+
121
+ // First wait to see if we get any events.
122
+ if (k_sem_take (&zephyr_touch_event_sync, timeout? K_MSEC (timeout) : K_NO_WAIT) != 0 ) return 0 ;
123
+
124
+ uint8_t count_pressed = 0 ;
125
+ for (uint8_t i = 0 ; i <= zephyr_touch_cb_slot_num; i++) {
126
+ if (zephyr_touch_points[i].pressed ) {
127
+ points[count_pressed].x = zephyr_touch_points[i].x ;
128
+ points[count_pressed].y = zephyr_touch_points[i].y ;
129
+ count_pressed++;
130
+ }
131
+ }
132
+ return count_pressed;
133
+ }
134
+
135
+ void Arduino_GigaDisplayTouch::onDetect (void (*handler)(uint8_t , GDTpoint_t*)) {
136
+ UNUSED (handler);
137
+ }
138
+
139
+ /* *** END OF FILE ****/
140
+ #else
141
+
25
142
/* Includes -----------------------------------------------------------------*/
26
143
#include " Arduino_GigaDisplayTouch.h"
27
144
35
152
36
153
/* Private variables ---------------------------------------------------------*/
37
154
rtos::Thread t;
38
- events::EventQueue queue (32 * EVENTS_EVENT_SIZE);
155
+ events::EventQueue queue (32 * EVENTS_EVENT_SIZE);
39
156
Arduino_GigaDisplayTouch * gThis ;
40
157
41
158
/* Private function prototypes -----------------------------------------------*/
@@ -52,7 +169,7 @@ Arduino_GigaDisplayTouch::Arduino_GigaDisplayTouch(TwoWire& wire, uint8_t intPin
52
169
: _wire{wire}, _intPin{intPin}, _rstPin{rstPin}, _addr{addr}, _irqInt{digitalPinToPinName (intPin)}
53
170
{ }
54
171
55
- Arduino_GigaDisplayTouch::~Arduino_GigaDisplayTouch ()
172
+ Arduino_GigaDisplayTouch::~Arduino_GigaDisplayTouch ()
56
173
{ }
57
174
58
175
bool Arduino_GigaDisplayTouch::begin () {
@@ -143,7 +260,7 @@ void _lvglTouchCb(lv_indev_drv_t * indev, lv_indev_data_t * data) {
143
260
#endif
144
261
#endif
145
262
146
- void Arduino_GigaDisplayTouch::end ()
263
+ void Arduino_GigaDisplayTouch::end ()
147
264
{ }
148
265
149
266
uint8_t Arduino_GigaDisplayTouch::getTouchPoints (GDTpoint_t* points) {
@@ -159,12 +276,12 @@ uint8_t Arduino_GigaDisplayTouch::getTouchPoints(GDTpoint_t* points) {
159
276
}
160
277
161
278
for (uint8_t i = 0 ; i < contacts; i++) {
162
- points[i].trackId = rawpoints[1 + 8 *i];
279
+ points[i].trackId = rawpoints[1 + 8 *i];
163
280
points[i].x = ((uint16_t )rawpoints[3 + 8 *i] << 8 ) + rawpoints[2 + 8 *i];
164
281
points[i].y = ((uint16_t )rawpoints[5 + 8 *i] << 8 ) + rawpoints[4 + 8 *i];
165
282
points[i].area = ((uint16_t )rawpoints[7 + 8 *i] << 8 ) + rawpoints[6 + 8 *i];
166
283
}
167
-
284
+
168
285
_gt911WriteOp (GT911_REG_GESTURE_START_POINT, 0 ); /* Reset buffer status to finish the reading */
169
286
170
287
return contacts;
@@ -192,7 +309,7 @@ uint8_t Arduino_GigaDisplayTouch::_gt911WriteBytesOp(uint16_t reg, uint8_t * dat
192
309
193
310
/* Data [0..n] */
194
311
for (uint8_t i = 0 ; i < len; i++) {
195
- _wire.write (data[i]);
312
+ _wire.write (data[i]);
196
313
}
197
314
198
315
status = _wire.endTransmission ();
@@ -233,33 +350,35 @@ void Arduino_GigaDisplayTouch::_gt911onIrq() {
233
350
}
234
351
235
352
for (uint8_t i = 0 ; i < contacts; i++) {
236
- _points[i].trackId = rawpoints[1 + 8 *i];
353
+ _points[i].trackId = rawpoints[1 + 8 *i];
237
354
_points[i].x = ((uint16_t )rawpoints[3 + 8 *i] << 8 ) + rawpoints[2 + 8 *i];
238
355
_points[i].y = ((uint16_t )rawpoints[5 + 8 *i] << 8 ) + rawpoints[4 + 8 *i];
239
356
_points[i].area = ((uint16_t )rawpoints[7 + 8 *i] << 8 ) + rawpoints[6 + 8 *i];
240
357
}
241
358
242
359
if (contacts > 0 && _gt911TouchHandler != nullptr ) _gt911TouchHandler (contacts, _points);
243
-
360
+
244
361
_gt911WriteOp (GT911_REG_GESTURE_START_POINT, 0 ); /* Reset buffer status to finish the reading */
245
362
}
246
363
247
364
uint8_t Arduino_GigaDisplayTouch::_gt911ReadInputCoord (uint8_t * pointsbuf, uint8_t & contacts) {
248
365
uint8_t error;
249
-
366
+
250
367
contacts = 0 ;
251
368
error = _gt911ReadOp (GT911_REG_GESTURE_START_POINT, pointsbuf, GT911_CONTACT_SIZE * GT911_MAX_CONTACTS);
252
369
253
370
if (error) {
254
371
return 1 ; /* I2C comm error */
255
372
}
256
-
257
- if (!(pointsbuf[0 ] & 0x80 )) {
373
+
374
+ if (!(pointsbuf[0 ] & 0x80 )) {
258
375
return 2 ; /* Data buffer not ready */
259
376
}
260
377
261
378
contacts = pointsbuf[0 ] & 0xF ;
262
379
return 0 ;
263
380
}
264
381
382
+ #endif /* zephyr */
383
+
265
384
/* *** END OF FILE ****/
0 commit comments