summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve/eve_touch.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve/eve_touch.c')
-rw-r--r--fw/fe310/eos/eve/eve_touch.c497
1 files changed, 217 insertions, 280 deletions
diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c
index 7c06f81..d17a509 100644
--- a/fw/fe310/eos/eve/eve_touch.c
+++ b/fw/fe310/eos/eve/eve_touch.c
@@ -1,10 +1,9 @@
#include <stdlib.h>
#include <string.h>
-#include <math.h>
#include "eve.h"
+#include "eve_touch_engine.h"
-static int touch_multi;
static uint8_t touch_tag0;
static EVETouch touch_obj[EVE_MAX_TOUCH];
@@ -14,235 +13,222 @@ static eve_touch_handler_t touch_handler;
static void *touch_handler_param;
static uint8_t touch_tag_opt[256];
-static const uint32_t _reg_touch[] = {
- REG_CTOUCH_TOUCH0_XY,
- REG_CTOUCH_TOUCH1_XY,
- REG_CTOUCH_TOUCH2_XY,
- REG_CTOUCH_TOUCH3_XY
-};
-
-static const uint32_t _reg_tag[] = {
- REG_TOUCH_TAG,
- REG_TOUCH_TAG1,
- REG_TOUCH_TAG2,
- REG_TOUCH_TAG3,
- REG_TOUCH_TAG4
-};
-
-static const uint32_t _reg_track[] = {
- REG_TRACKER,
- REG_TRACKER_1,
- REG_TRACKER_2,
- REG_TRACKER_3,
- REG_TRACKER_4
-};
+void eve_touch_init(void) {
+ int i;
+
+ touch_tag0 = 0;
+ memset(&touch_timer, 0, sizeof(touch_timer));
+ for (i=0; i<EVE_MAX_TOUCH; i++) {
+ EVETouch *touch = &touch_obj[i];
+
+ memset(&touch_obj[i], 0, sizeof(EVETouch));
+ touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
+ }
+ eve_vtrack_init();
+}
void eve_handle_touch(uint16_t intr_flags) {
int i;
- char touch_ex = 0;
- char int_ccomplete = 0;
- uint16_t intr_mask;
-
- intr_mask = eve_read16(REG_INT_MASK);
- if (!touch_multi && (intr_flags & EVE_INT_TOUCH)) touch_multi = 1;
for (i=0; i<EVE_MAX_TOUCH; i++) {
- uint8_t touch_tag;
- uint32_t touch_xy;
- uint64_t now = 0;
+ uint32_t now = 0;
uint16_t touch_evt = 0;
EVETouch *touch = &touch_obj[i];
- touch_xy = i < 4 ? eve_read32(_reg_touch[i]) : (((uint32_t)eve_read16(REG_CTOUCH_TOUCH4_X) << 16) | eve_read16(REG_CTOUCH_TOUCH4_Y));
-
- if (touch_xy != EVE_NOTOUCH) {
- int16_t touch_x = touch_xy >> 16;
- int16_t touch_y = touch_xy & 0xffff;
- now = eve_time_get_tick();
- if (touch->eevt & EVE_TOUCH_EETYPE_NOTOUCH) {
- uint16_t _evt = 0;
- uint16_t _eevt = 0;
- uint16_t _ttevt = eve_touch_timer_get_evt(touch);
-
- if (_ttevt) {
- touch->eevt &= ~EVE_TOUCH_EETYPE_NOTOUCH;
+ now = eve_get_tick();
+
+ if (intr_flags & EVE_INT_CONVCOMPLETE) {
+ uint32_t touch_xy = eve_touch_reg_xy(i);
+ uint16_t timer_evt;
+
+ if (touch_xy != EVE_NOTOUCH) {
+ int16_t touch_x = touch_xy >> 16;
+ int16_t touch_y = touch_xy & 0xffff;
+ int check_track, check_timer;
+
+ if (touch->eevt & EVE_TOUCH_EETYPE_NOTOUCH) {
+ uint16_t _evt = 0;
+ uint16_t _eevt = 0;
+
+ timer_evt = eve_timer_get_evt(touch);
+ if (timer_evt) {
+ uint16_t _touch_evt = 0;
+
+ touch->eevt &= ~EVE_TOUCH_EETYPE_NOTOUCH;
+ if (timer_evt & EVE_TOUCH_ETYPE_TAP2) {
+ int dx = touch_x - touch->x0;
+ int dy = touch_y - touch->y0;
+
+ dx = dx < 0 ? -dx : dx;
+ dy = dy < 0 ? -dy : dy;
+ if ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y)) {
+ _touch_evt |= EVE_TOUCH_ETYPE_TAP1;
+ } else {
+ _evt |= EVE_TOUCH_ETYPE_TAP2;
+ _eevt |= EVE_TOUCH_EETYPE_TAP2;
+ }
+ }
+ if (timer_evt & EVE_TOUCH_ETYPE_TRACK) {
+ EVEVTrack *vtrack = eve_vtrack_get();
- if (_ttevt & EVE_TOUCH_ETYPE_TAP2) {
- int dx = touch_x - touch->x0;
- int dy = touch_y - touch->y0;
+ _eevt |= EVE_TOUCH_EETYPE_TRACK_ABORT;
+ _touch_evt |= (EVE_TOUCH_ETYPE_TRACK_STOP | EVE_TOUCH_ETYPE_TRACK_ABORT);
+ if (vtrack->stop) vtrack->stop(touch, vtrack->param);
+ }
+ if (timer_evt & EVE_TOUCH_ETYPE_TIMER) {
+ _eevt |= EVE_TOUCH_EETYPE_TIMER_ABORT;
+ _touch_evt |= EVE_TOUCH_ETYPE_TIMER_ABORT;
+ }
- dx = dx < 0 ? -dx : dx;
- dy = dy < 0 ? -dy : dy;
- if ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y)) {
- touch_evt |= EVE_TOUCH_ETYPE_TAP1;
- } else {
- _evt |= EVE_TOUCH_ETYPE_TAP2;
- _eevt |= EVE_TOUCH_EETYPE_TAP2;
+ eve_timer_clear(touch);
+ if (touch_handler && _touch_evt) {
+ touch_handler(touch_timer.touch, _touch_evt, touch_timer.tag0, touch_handler_param);
}
}
- if (_ttevt & EVE_TOUCH_ETYPE_TRACK) {
- EVEVTrack *vtrack = eve_vtrack_get();
-
- _eevt |= EVE_TOUCH_EETYPE_TRACK_ABORT;
- touch_evt |= (EVE_TOUCH_ETYPE_TRACK_STOP | EVE_TOUCH_ETYPE_TRACK_ABORT);
- if (vtrack->stop) vtrack->stop(touch, vtrack->param);
+ touch_evt |= EVE_TOUCH_ETYPE_POINT | _evt;
+ touch->eevt = _eevt;
+ touch->tag0 = 0;
+ touch->tag = 0;
+ touch->tag_up = 0;
+ touch->tracker.tag = 0;
+ touch->tracker.track = 0;
+ touch->tracker.val = 0;
+ touch->t = 0;
+ touch->vx = 0;
+ touch->vy = 0;
+ touch->x0 = touch_x;
+ touch->y0 = touch_y;
+ } else if (touch->tracker.track) {
+ uint32_t dt = now - touch->t;
+ int vx = ((int)touch_x - touch->x) * EVE_RTC_FREQ / (int)dt;
+ int vy = ((int)touch_y - touch->y) * EVE_RTC_FREQ / (int)dt;
+
+ touch->vx = vx;
+ touch->vy = vy;
+ touch->t = now;
+ }
+ touch->x = touch_x;
+ touch->y = touch_y;
+
+ timer_evt = eve_timer_get_evt(touch);
+ check_track = touch->tracker.tag && !touch->tracker.track;
+ check_timer = timer_evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP2);
+
+ if (check_track || check_timer) {
+ int dx = touch->x - touch->x0;
+ int dy = touch->y - touch->y0;
+
+ dx = dx < 0 ? -dx : dx;
+ dy = dy < 0 ? -dy : dy;
+ if (check_track) {
+ if ((dx > EVE_TOUCH_THRESHOLD_X) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) {
+ touch->tracker.tag = 0;
+ }
+ if ((dy > EVE_TOUCH_THRESHOLD_Y) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y)) {
+ touch->tracker.tag = 0;
+ }
+ if (touch->tracker.tag && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
+ int track_x = 0;
+
+ if ((dx > EVE_TOUCH_THRESHOLD_X) && (dx > EVE_TOUCH_THRESHOLD_Y) && ((touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY) == EVE_TOUCH_OPT_TRACK_XY)) {
+ if (dx > dy) {
+ track_x = 1;
+ }
+ } else if (dx > EVE_TOUCH_THRESHOLD_X) {
+ track_x = 1;
+ }
+ if (track_x) {
+ touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
+ } else {
+ touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
+ }
+ touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
+ touch->tracker.track = 1;
+ touch->t = now;
+ }
}
- if (_ttevt & EVE_TOUCH_ETYPE_TIMER) {
- _eevt |= EVE_TOUCH_EETYPE_TIMER_ABORT;
- touch_evt |= EVE_TOUCH_ETYPE_TIMER_ABORT;
+ if (check_timer && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
+ eve_timer_set_evt(touch, timer_evt & ~(EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP2));
}
-
- eve_touch_timer_clear(touch);
- if (touch_handler && touch_evt) {
- touch_handler(touch_timer.touch, touch_evt, touch_timer.tag0, touch_handler_param);
- }
- }
- touch_evt = EVE_TOUCH_ETYPE_POINT | _evt;
- touch->eevt = _eevt;
- touch->tag0 = 0;
- touch->tag = 0;
- touch->tag_up = 0;
- touch->tracker.tag = 0;
- touch->tracker.track = 0;
- touch->tracker.val = 0;
- touch->t = 0;
- touch->vx = 0;
- touch->vy = 0;
- touch->x0 = touch_x;
- touch->y0 = touch_y;
- } else if (touch->t) {
- int dt = now - touch->t;
- int vx = ((int)touch_x - touch->x) * (int)(EVE_RTC_FREQ) / dt;
- int vy = ((int)touch_y - touch->y) * (int)(EVE_RTC_FREQ) / dt;
- touch->vx = touch->vx ? (vx + touch->vx * EVE_TOUCH_TRAVG) / (EVE_TOUCH_TRAVG + 1) : vx;
- touch->vy = touch->vy ? (vy + touch->vy * EVE_TOUCH_TRAVG) / (EVE_TOUCH_TRAVG + 1) : vy;
- touch->t = now;
- }
- touch->x = touch_x;
- touch->y = touch_y;
- if (touch_multi || (intr_flags & EVE_INT_TAG)) {
- touch_tag = eve_read8(_reg_tag[i]);
- } else {
- touch_tag = touch->tag;
- }
- touch_ex = 1;
- } else {
- touch_tag = 0;
- if (!(touch->eevt & EVE_TOUCH_EETYPE_NOTOUCH)) {
- uint16_t _ttevt = eve_touch_timer_get_evt(touch);
-
- touch_evt = EVE_TOUCH_ETYPE_POINT_UP;
- touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
- if (_ttevt & EVE_TOUCH_ETYPE_LPRESS) {
- eve_touch_timer_set_evt(touch, _ttevt & ~EVE_TOUCH_ETYPE_LPRESS);
}
if (touch->tracker.tag && touch->tracker.track) {
- uint8_t opt = touch_tag_opt[touch->tracker.tag];
- char track_ext = ((opt & EVE_TOUCH_OPT_TRACK_EXT_X) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X)) ||
- ((opt & EVE_TOUCH_OPT_TRACK_EXT_Y) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y));
- if (!eve_touch_timer_get_evt(NULL) && track_ext) {
- EVEVTrack *vtrack = eve_vtrack_get();
-
- eve_touch_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, touch_tag0, EVE_TOUCH_TIMEOUT_TRACK);
- if (vtrack->start) vtrack->start(touch, vtrack->param);
+ if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
+ if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_REG) touch_evt |= EVE_TOUCH_ETYPE_TRACK_REG;
+ }
+ if (touch_evt & EVE_TOUCH_ETYPE_TRACK_REG) {
+ uint32_t touch_track = eve_touch_reg_track(i);
+
+ if (touch->tracker.tag == (touch_track & 0xff)) {
+ touch->tracker.val = touch_track >> 16;
} else {
- touch_evt |= EVE_TOUCH_ETYPE_TRACK_STOP;
+ touch_evt &= ~EVE_TOUCH_ETYPE_TRACK_REG;
}
}
- }
- }
- if (touch_tag != touch->tag) {
- if (touch_tag) {
- if (!touch_tag0) touch_tag0 = touch_tag;
- if (!touch->tag0) {
- touch->tag0 = touch_tag;
- if (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_REG)) {
- touch->tracker.tag = touch_tag;
- }
- if (touch->tracker.tag && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) {
- touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
- touch->tracker.track = 1;
- touch->t = now;
+ } else {
+ if (!(touch->eevt & EVE_TOUCH_EETYPE_NOTOUCH)) {
+ touch_evt |= EVE_TOUCH_ETYPE_POINT_UP;
+ touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
+
+ timer_evt = eve_timer_get_evt(touch);
+ if (timer_evt & EVE_TOUCH_ETYPE_LPRESS) {
+ eve_timer_set_evt(touch, timer_evt & ~EVE_TOUCH_ETYPE_LPRESS);
}
- if (!eve_touch_timer_get_evt(NULL) && (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) {
- uint16_t _evt = 0;
+ if (touch->tracker.tag && touch->tracker.track) {
+ int start = 0;
+ uint8_t opt = touch_tag_opt[touch->tracker.tag];
+ uint8_t track_ext = ((opt & EVE_TOUCH_OPT_TRACK_EXT_X) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X)) ||
+ ((opt & EVE_TOUCH_OPT_TRACK_EXT_Y) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y));
+
+ if (!eve_timer_get_evt(NULL) && track_ext) {
+ EVEVTrack *vtrack = eve_vtrack_get();
- if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS;
- if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_TAP2) _evt |= EVE_TOUCH_ETYPE_TAP2;
- eve_touch_timer_set(touch, _evt, touch_tag0, EVE_TOUCH_TIMEOUT_TAP);
+ if (vtrack->start) start = vtrack->start(touch, vtrack->param);
+ }
+ if (start) {
+ eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, touch_tag0, EVE_TOUCH_TIMEOUT_TRACK);
+ } else {
+ touch_evt |= EVE_TOUCH_ETYPE_TRACK_STOP;
+ }
}
}
}
- touch->tag_up = touch->tag;
- if (touch->tag_up) touch_evt |= EVE_TOUCH_ETYPE_TAG_UP;
- touch->tag = touch_tag;
- if (touch->tag) touch_evt |= EVE_TOUCH_ETYPE_TAG;
}
- if (touch_xy != EVE_NOTOUCH) {
- uint16_t _ttevt = eve_touch_timer_get_evt(touch);
- int _track = touch->tracker.tag && !touch->tracker.track;
- int _timer = _ttevt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP2);
- if (_track || _timer) {
- int dx = touch->x - touch->x0;
- int dy = touch->y - touch->y0;
- dx = dx < 0 ? -dx : dx;
- dy = dy < 0 ? -dy : dy;
- if (_track) {
- if ((dx > EVE_TOUCH_THRESHOLD_X) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) {
- touch->tracker.tag = 0;
- }
- if ((dy > EVE_TOUCH_THRESHOLD_Y) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y)) {
- touch->tracker.tag = 0;
- }
- if (touch->tracker.tag && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
- if (dx > EVE_TOUCH_THRESHOLD_X) {
- touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
+
+ if (intr_flags & EVE_INT_TAG) {
+ uint8_t touch_tag = eve_touch_reg_tag(i);
+
+ if (touch_tag != touch->tag) {
+ if (touch_tag) {
+ if (!touch_tag0) touch_tag0 = touch_tag;
+ if (!touch->tag0) {
+ touch->tag0 = touch_tag;
+ if (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_REG)) {
+ touch->tracker.tag = touch_tag;
}
- if (dy > EVE_TOUCH_THRESHOLD_Y) {
- touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
+ if (touch->tracker.tag && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) {
+ touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
+ touch->tracker.track = 1;
+ touch->t = now;
+ }
+ if (!eve_timer_get_evt(NULL) && (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) {
+ uint16_t _evt = 0;
+
+ if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS;
+ if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_TAP2) _evt |= EVE_TOUCH_ETYPE_TAP2;
+ eve_timer_set(touch, _evt, touch_tag0, EVE_TOUCH_TIMEOUT_TAP);
}
- touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
- touch->tracker.track = 1;
- touch->t = now;
}
}
- if (_timer && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
- eve_touch_timer_set_evt(touch, _ttevt & ~(EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP2));
- _timer = 0;
- }
+ touch->tag_up = touch->tag;
+ if (touch->tag_up) touch_evt |= EVE_TOUCH_ETYPE_TAG_UP;
+ touch->tag = touch_tag;
+ if (touch->tag) touch_evt |= EVE_TOUCH_ETYPE_TAG;
}
- if (touch->tracker.tag && touch->tracker.track) {
- if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
- if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_REG) touch_evt |= EVE_TOUCH_ETYPE_TRACK_REG;
- }
- if (touch_evt & EVE_TOUCH_ETYPE_TRACK_REG) {
- uint32_t touch_track = eve_read32(_reg_track[i]);
- if (touch->tracker.tag == (touch_track & 0xff)) {
- touch->tracker.val = touch_track >> 16;
- } else {
- touch_evt &= ~EVE_TOUCH_ETYPE_TRACK_REG;
- }
- }
- if (touch->tracker.tag || _timer) int_ccomplete = 1;
}
+
if (touch_handler && touch_evt) {
touch_handler(touch, touch_evt, touch_tag0, touch_handler_param);
}
- if (!touch_multi) break;
- }
-
- if (!touch_ex) {
- touch_tag0 = 0;
- touch_multi = 0;
- }
-
- if (touch_multi) int_ccomplete = 1;
-
- if (int_ccomplete && !(intr_mask & EVE_INT_CONVCOMPLETE)) {
- eve_write16(REG_INT_MASK, intr_mask | EVE_INT_CONVCOMPLETE);
- }
- if (!int_ccomplete && (intr_mask & EVE_INT_CONVCOMPLETE)) {
- eve_write16(REG_INT_MASK, intr_mask & ~EVE_INT_CONVCOMPLETE);
}
}
@@ -278,7 +264,7 @@ void eve_handle_time(void) {
}
if (more) {
- eve_timer_set(touch_timer.to);
+ eve_sys_timer_set(touch_timer.to);
} else {
touch_timer.evt = 0;
}
@@ -289,74 +275,12 @@ void eve_handle_time(void) {
}
}
-void eve_touch_init(int touch_calibrate, uint32_t *touch_matrix) {
- /* configure touch */
- eve_write8(REG_CPURESET, 2); /* touch engine reset */
- eve_write16(REG_TOUCH_CONFIG, 0x4000); /* host mode multi touch */
- eve_write8(REG_CPURESET, 0); /* clear reset */
-
- if (touch_calibrate) {
- eve_write8(REG_PWM_DUTY, 0x40);
- eve_cmd(CMD_TEXT, "hhhhs", EVE_HSIZE/2, EVE_VSIZE/2, 27, EVE_OPT_CENTER, "Please tap on the dot.");
- eve_cmd(CMD_CALIBRATE, "w", 0);
- eve_cmd_exec(1);
- eve_write8(REG_PWM_DUTY, 0);
-
- touch_matrix[0] = eve_read32(REG_TOUCH_TRANSFORM_A);
- touch_matrix[1] = eve_read32(REG_TOUCH_TRANSFORM_B);
- touch_matrix[2] = eve_read32(REG_TOUCH_TRANSFORM_C);
- touch_matrix[3] = eve_read32(REG_TOUCH_TRANSFORM_D);
- touch_matrix[4] = eve_read32(REG_TOUCH_TRANSFORM_E);
- touch_matrix[5] = eve_read32(REG_TOUCH_TRANSFORM_F);
- } else {
- eve_write32(REG_TOUCH_TRANSFORM_A, touch_matrix[0]);
- eve_write32(REG_TOUCH_TRANSFORM_B, touch_matrix[1]);
- eve_write32(REG_TOUCH_TRANSFORM_C, touch_matrix[2]);
- eve_write32(REG_TOUCH_TRANSFORM_D, touch_matrix[3]);
- eve_write32(REG_TOUCH_TRANSFORM_E, touch_matrix[4]);
- eve_write32(REG_TOUCH_TRANSFORM_F, touch_matrix[5]);
- }
-
- eve_write8(REG_CTOUCH_EXTENDED, 0x00); /* set extended mode */
-}
-
-void eve_touch_start(void) {
- uint16_t intr_mask;
- int i;
-
- touch_multi = 0;
- touch_tag0 = 0;
- memset(&touch_timer, 0, sizeof(touch_timer));
- for (i=0; i<EVE_MAX_TOUCH; i++) {
- EVETouch *touch = &touch_obj[i];
-
- memset(&touch_obj[i], 0, sizeof(EVETouch));
- touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
- }
- eve_vtrack_init();
-
- intr_mask = eve_read16(REG_INT_MASK);
- eve_write16(REG_INT_MASK, intr_mask | EVE_INT_TAG | EVE_INT_TOUCH);
-
- eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);
-}
-
-void eve_touch_stop(void) {
- uint16_t intr_mask;
-
- intr_mask = eve_read16(REG_INT_MASK);
- eve_write16(REG_INT_MASK, intr_mask & ~(EVE_INT_TAG | EVE_INT_TOUCH | EVE_INT_CONVCOMPLETE));
- eve_touch_timer_clear(touch_timer.touch);
-
- eve_write8(REG_TOUCH_MODE, EVE_TMODE_OFF);
-}
-
void eve_touch_set_handler(eve_touch_handler_t handler, void *param) {
touch_handler = handler;
touch_handler_param = param;
}
-EVETouch *eve_touch_get(int i) {
+EVETouch *eve_touch_get_obj(int i) {
return &touch_obj[i];
}
@@ -411,46 +335,59 @@ void eve_touch_clear_opt(void) {
memset(touch_tag_opt, 0, sizeof(touch_tag_opt));
}
-void eve_touch_timer_set(EVETouch *touch, uint16_t evt, uint8_t tag0, uint32_t to) {
+void eve_timer_set(EVETouch *touch, uint16_t evt, uint8_t tag0, uint32_t to) {
touch_timer.touch = touch;
touch_timer.evt = evt;
touch_timer.tag0 = tag0;
touch_timer.to = to;
- eve_timer_set(to);
+ eve_sys_timer_set(to);
+}
+
+void eve_timer_clear(EVETouch *touch) {
+ eve_timer_set_evt(touch, 0);
}
-void eve_touch_timer_clear(EVETouch *touch) {
- eve_touch_timer_set_evt(touch, 0);
+void eve_timer_set_evt(EVETouch *touch, uint16_t evt) {
+ if ((touch == NULL) || (touch == touch_timer.touch)) {
+ touch_timer.evt = evt;
+ } else if (touch_timer.touch == NULL) {
+ touch_timer.evt = evt;
+ }
+ if (!touch_timer.evt) {
+ eve_sys_timer_clear();
+ touch_timer.touch = NULL;
+ touch_timer.tag0 = 0;
+ touch_timer.to = 0;
+ }
}
-uint16_t eve_touch_timer_get_evt(EVETouch *touch) {
+uint16_t eve_timer_get_evt(EVETouch *touch) {
uint16_t ret = 0;
if ((touch == NULL) || (touch_timer.touch == touch)) {
ret = touch_timer.evt;
} else if (touch_timer.touch == NULL) {
- ret = touch_timer.evt & EVE_TOUCH_ETYPE_TIMER;
+ ret = touch_timer.evt;
}
return ret;
}
-void eve_touch_timer_set_evt(EVETouch *touch, uint16_t evt) {
- if (touch == touch_timer.touch) {
- touch_timer.evt = evt;
- } else if (touch_timer.touch == NULL) {
- touch_timer.evt = evt & EVE_TOUCH_ETYPE_TIMER;
- }
- if (!touch_timer.evt) eve_timer_clear();
+EVETouchTimer *eve_timer_get_obj(void) {
+ return &touch_timer;
}
-void eve_touch_timer_start(uint8_t tag0, uint32_t to) {
- eve_touch_timer_set(NULL, EVE_TOUCH_ETYPE_TIMER, tag0, to);
+void eve_timer_start(uint8_t tag0, uint32_t to) {
+ if (!touch_timer.evt) eve_timer_set(NULL, EVE_TOUCH_ETYPE_TIMER, tag0, to);
}
-void eve_touch_timer_stop(void) {
- eve_touch_timer_clear(NULL);
+void eve_timer_stop(void) {
+ if (touch_timer.touch == NULL) eve_timer_clear(NULL);
}
-EVETouchTimer *eve_touch_timer_get(void) {
- return &touch_timer;
+int eve_timer_running(void) {
+ return (touch_timer.evt == EVE_TOUCH_ETYPE_TIMER);
+}
+
+void eve_touch_clear_tag0(void) {
+ touch_tag0 = 0;
}