summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/eve_vtrack.c
blob: 6cc3c76f0006f1e2ee5466d0dae1755a6d571db1 (plain)
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();
}