diff options
Diffstat (limited to 'fw/fe310/eos/eve/eve_vtrack.c')
-rw-r--r-- | fw/fe310/eos/eve/eve_vtrack.c | 72 |
1 files changed, 41 insertions, 31 deletions
diff --git a/fw/fe310/eos/eve/eve_vtrack.c b/fw/fe310/eos/eve/eve_vtrack.c index a7619fb..6cc3c76 100644 --- a/fw/fe310/eos/eve/eve_vtrack.c +++ b/fw/fe310/eos/eve/eve_vtrack.c @@ -4,53 +4,63 @@ #include "eve.h" static EVEVTrack vtrack; -static EVEPhyAcc vtrack_acc; void eve_vtrack_init(void) { - eve_phy_acc_init(&vtrack_acc, -EVE_VTRACK_ACC_A); eve_vtrack_reset(); } -EVEVTrack *eve_vtrack_get(void) { - return &vtrack; +void eve_vtrack_reset(void) { + vtrack.param = NULL; + vtrack.tick_f = NULL; + vtrack.tick_ms = 0; + vtrack.touch = NULL; } -void eve_vtrack_set(eve_vtrack_start_t start, eve_vtrack_tick_t tick, eve_vtrack_stop_t stop, void *param) { - vtrack.start = start; - vtrack.tick = tick; - vtrack.stop = stop; +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_reset(void) { - eve_vtrack_set(eve_vtrack_acc_start, eve_vtrack_acc_tick, NULL, &vtrack_acc); -} - -int eve_vtrack_start(EVETouch *touch, uint8_t tag0, uint32_t to) { - if (vtrack.start) { - int start; - - start = vtrack.start(touch, vtrack.param); - if (start) eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, tag0, to); +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); - return start; - } - return 0; + /* ensure that track start event is emitted on first vtrack tick */ + touch->eevt &= ~EVE_TOUCH_EETYPE_TRACK_XY; } -void eve_vtrack_stop(EVETouch *touch) { - eve_timer_clear(touch); - eve_vtrack_reset(); +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_acc_start(EVETouch *touch, void *p) { - EVEPhyAcc *param = (EVEPhyAcc *)p; +int eve_vtrack_tick(uint16_t *touch_evt) { + EVETouch *touch = vtrack.touch; + int more = 0; - return eve_phy_acc_start(param, touch->x, touch->y, touch->t, touch->vx, touch->vy); -} + 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(); + } -int eve_vtrack_acc_tick(EVETouch *touch, void *p) { - EVEPhyAcc *param = (EVEPhyAcc *)p; + return more; +} - return eve_phy_acc_tick(param, eve_get_tick() - touch->t, &touch->x, &touch->y); +void eve_vtrack_stop(void) { + eve_vtrack_reset(); } |