diff options
author | Uros Majstorovic <majstor@majstor.org> | 2022-05-13 12:26:19 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2022-05-13 12:26:19 +0200 |
commit | 9ccb4db8d59ec9dab33ee8617d462f21a8bb4fa8 (patch) | |
tree | a4f8ba9375a4ee82bae6ddc0cb3a35227f6f9469 /fw/fe310/eos/eve/eve_touch.c | |
parent | 45f0d9b890b086493f9bb06428c46cd802324223 (diff) |
touch controller/eve fixes
Diffstat (limited to 'fw/fe310/eos/eve/eve_touch.c')
-rw-r--r-- | fw/fe310/eos/eve/eve_touch.c | 483 |
1 files changed, 202 insertions, 281 deletions
diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c index 7c06f81..0dc8b31 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,210 @@ 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_handle_touch(uint16_t intr_flags) { +void eve_touch_init(void) { 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; + touch_tag0 = 0; + memset(&touch_timer, 0, sizeof(touch_timer)); for (i=0; i<EVE_MAX_TOUCH; i++) { - uint8_t touch_tag; - uint32_t touch_xy; - uint64_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)); + memset(&touch_obj[i], 0, sizeof(EVETouch)); + touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH; + } + eve_vtrack_init(); +} - 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); +void eve_handle_touch(uint16_t intr_flags) { + int i; - if (_ttevt) { - touch->eevt &= ~EVE_TOUCH_EETYPE_NOTOUCH; + for (i=0; i<EVE_MAX_TOUCH; i++) { + uint32_t now = 0; + uint16_t touch_evt = 0; + EVETouch *touch = &touch_obj[i]; - if (_ttevt & EVE_TOUCH_ETYPE_TAP2) { - int dx = touch_x - touch->x0; - int dy = touch_y - touch->y0; + 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(); - 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; + _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; } - } - 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); + 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_TIMER) { - _eevt |= EVE_TOUCH_EETYPE_TIMER_ABORT; - touch_evt |= EVE_TOUCH_ETYPE_TIMER_ABORT; + 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))) { + if (dx > EVE_TOUCH_THRESHOLD_X) { + touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT; + } + if (dy > EVE_TOUCH_THRESHOLD_Y) { + 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; + } } - - eve_touch_timer_clear(touch); - if (touch_handler && touch_evt) { - touch_handler(touch_timer.touch, touch_evt, touch_timer.tag0, touch_handler_param); + 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)); } } - 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; - } - if (!eve_touch_timer_get_evt(NULL) && (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) { - uint16_t _evt = 0; + } else { + if (!(touch->eevt & EVE_TOUCH_EETYPE_NOTOUCH)) { + touch_evt |= EVE_TOUCH_ETYPE_POINT_UP; + touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH; - 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); + 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 (touch->tracker.tag && touch->tracker.track) { + 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(); + + eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, touch_tag0, EVE_TOUCH_TIMEOUT_TRACK); + if (vtrack->start) vtrack->start(touch, vtrack->param); + } 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 +252,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 +263,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 +323,55 @@ 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_touch_timer_clear(EVETouch *touch) { - eve_touch_timer_set_evt(touch, 0); +void eve_timer_clear(EVETouch *touch) { + eve_timer_set_evt(touch, 0); } -uint16_t eve_touch_timer_get_evt(EVETouch *touch) { +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_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; +void eve_touch_clear_tag0(void) { + touch_tag0 = 0; } |