1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include <stdlib.h>
#include <math.h>
#include "eve.h"
static EVEVTrack vtrack;
void eve_vtrack_init(void) {
eve_vtrack_reset();
}
void eve_vtrack_reset(void) {
vtrack.param = NULL;
vtrack.tick_f = NULL;
vtrack.tick_ms = 0;
vtrack.touch = NULL;
}
static void vtrack_start(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch, uint8_t tag) {
eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, tick_ms);
vtrack.param = param;
vtrack.tick_f = tick_f;
vtrack.tick_ms = tick_ms;
vtrack.touch = touch;
if (tag != EVE_NOTAG) {
touch->tracker.tag = tag;
touch->tracker.track = 1;
}
}
void eve_vtrack_start(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch, uint8_t tag) {
vtrack_start(param, tick_f, tick_ms, touch, tag);
/* ensure that track start event is emitted on first vtrack tick */
touch->eevt &= ~EVE_TOUCH_EETYPE_TRACK_XY;
}
void eos_vtrack_cont(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch) {
vtrack_start(param, tick_f, tick_ms, touch, EVE_NOTAG);
}
int eve_vtrack_tick(uint16_t *touch_evt) {
EVETouch *touch = vtrack.touch;
int more = 0;
if (vtrack.tick_f) {
more = vtrack.tick_f(vtrack.param, &touch->x, &touch->y);
}
if (more) {
eve_ostimer_set(vtrack.tick_ms);
if (!(touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY)) {
if ((eve_tag_get_opt(touch->tracker.tag) & EVE_TOUCH_OPT_TRACK_X) && (touch->x != touch->x0)) touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
if ((eve_tag_get_opt(touch->tracker.tag) & EVE_TOUCH_OPT_TRACK_Y) && (touch->y != touch->y0)) touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
*touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
}
} else {
eve_timer_reset();
eve_vtrack_reset();
}
return more;
}
void eve_vtrack_stop(void) {
eve_vtrack_reset();
}
|