#include #include #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(); }