summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/eve_vtrack.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/eve_vtrack.c')
-rw-r--r--fw/fe310/eos/eve/eve_vtrack.c72
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();
}