164 lines
5.3 KiB
C
164 lines
5.3 KiB
C
|
|
#include "includes.h"
|
|||
|
|
|
|||
|
|
/* ============================================================================
|
|||
|
|
* app_touch ʵ<EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ Touch_Process һ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* IDLE <EFBFBD><EFBFBD> PRESS_WAIT_STABLE <EFBFBD><EFBFBD> PRESS_STABLE <EFBFBD><EFBFBD> SLIDING
|
|||
|
|
*
|
|||
|
|
* ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD>ȶ<EFBFBD><EFBFBD>ж<EFBFBD> 20ms (TOUCH_STABLE_TIME)
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ 10px (TOUCH_SLIDE_THRESH)
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5px (TOUCH_SLIDE_STEP)
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1000ms (TOUCH_LONG_PRESS_TIME)
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD> 120ms (TOUCH_REPEAT_INTERVAL)
|
|||
|
|
* ==========================================================================*/
|
|||
|
|
|
|||
|
|
/* ==================== ״̬<D7B4><CCAC>ö<EFBFBD><C3B6> ==================== */
|
|||
|
|
typedef enum {
|
|||
|
|
TOUCH_IDLE, /* <20><><EFBFBD><EFBFBD> */
|
|||
|
|
TOUCH_PRESS_WAIT_STABLE, /* <20><><EFBFBD>£<EFBFBD><C2A3>ȴ<EFBFBD><C8B4>ȶ<EFBFBD><C8B6>ж<EFBFBD> */
|
|||
|
|
TOUCH_PRESS_STABLE, /* <20>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD>£<EFBFBD><C2A3>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
TOUCH_SLIDING /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
} touch_state_t;
|
|||
|
|
|
|||
|
|
/* ==================== ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================== */
|
|||
|
|
#define TOUCH_STABLE_TIME 20 /* <20><><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD><C8B6>ж<EFBFBD>ʱ<EFBFBD><CAB1> ms */
|
|||
|
|
#define TOUCH_SLIDE_THRESH 10 /* <20><><EFBFBD>뻬<EFBFBD><EBBBAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сλ<D0A1><CEBB> px */
|
|||
|
|
#define TOUCH_SLIDE_STEP 5 /* <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD> px */
|
|||
|
|
#define TOUCH_LONG_PRESS_TIME 1000 /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ms */
|
|||
|
|
#define TOUCH_REPEAT_INTERVAL 120 /* <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD> ms */
|
|||
|
|
|
|||
|
|
/* ==================== ״̬<D7B4><CCAC><EFBFBD><EFBFBD> ==================== */
|
|||
|
|
static touch_state_t touch_state = TOUCH_IDLE;
|
|||
|
|
static uint16_t down_x = 0;
|
|||
|
|
static uint16_t down_y = 0;
|
|||
|
|
static uint32_t touch_tick = 0;
|
|||
|
|
static uint32_t repeat_tick = 0;
|
|||
|
|
static uint8_t long_press_fired = 0;
|
|||
|
|
static uint16_t last_slide_x = 0;
|
|||
|
|
static uint16_t last_slide_y = 0;
|
|||
|
|
|
|||
|
|
/* ȡ<><C8A1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> math.h<><68> */
|
|||
|
|
static inline uint16_t abs_diff(int16_t a, int16_t b)
|
|||
|
|
{
|
|||
|
|
int16_t d = a - b;
|
|||
|
|
return (d < 0) ? (uint16_t)(-d) : (uint16_t)d;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* ==================== <20><><EFBFBD><EFBFBD> ==================== */
|
|||
|
|
|
|||
|
|
void app_touch_reset(void)
|
|||
|
|
{
|
|||
|
|
touch_state = TOUCH_IDLE;
|
|||
|
|
down_x = down_y = 0;
|
|||
|
|
touch_tick = repeat_tick = 0;
|
|||
|
|
long_press_fired = 0;
|
|||
|
|
last_slide_x = last_slide_y = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* ==================== <20><><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6> ==================== */
|
|||
|
|
|
|||
|
|
app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
|
|||
|
|
{
|
|||
|
|
app_touch_result_t r;
|
|||
|
|
r.gesture = GESTURE_NONE;
|
|||
|
|
r.x = x; r.y = y;
|
|||
|
|
r.down_x = down_x; r.down_y = down_y;
|
|||
|
|
|
|||
|
|
uint32_t now = rt_tick_get();
|
|||
|
|
|
|||
|
|
/* ---------- ̧<><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---------- */
|
|||
|
|
if (!pressed) {
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ͷţ<CDB7><C5A3>ɵ<EFBFBD><C9B5><EFBFBD> TAP<41><50> */
|
|||
|
|
if (touch_state == TOUCH_PRESS_STABLE && !long_press_fired) {
|
|||
|
|
r.gesture = GESTURE_RELEASE;
|
|||
|
|
r.x = down_x; r.y = down_y; /* <20>ð<EFBFBD><C3B0>µ<EFBFBD><C2B5><EFBFBD>Ϊ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
}
|
|||
|
|
touch_state = TOUCH_IDLE;
|
|||
|
|
down_x = down_y = 0;
|
|||
|
|
last_slide_x = last_slide_y = 0;
|
|||
|
|
touch_tick = repeat_tick = 0;
|
|||
|
|
long_press_fired = 0;
|
|||
|
|
return r;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* ---------- <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD> ---------- */
|
|||
|
|
switch (touch_state)
|
|||
|
|
{
|
|||
|
|
case TOUCH_IDLE:
|
|||
|
|
down_x = x;
|
|||
|
|
down_y = y;
|
|||
|
|
touch_tick = now;
|
|||
|
|
long_press_fired = 0;
|
|||
|
|
repeat_tick = 0;
|
|||
|
|
touch_state = TOUCH_PRESS_WAIT_STABLE;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case TOUCH_PRESS_WAIT_STABLE:
|
|||
|
|
if ((now - touch_tick) >= TOUCH_STABLE_TIME) {
|
|||
|
|
/* λ<><CEBB>С <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD> */
|
|||
|
|
if (abs_diff(x, down_x) < 8 && abs_diff(y, down_y) < 8) {
|
|||
|
|
touch_state = TOUCH_PRESS_STABLE;
|
|||
|
|
last_slide_x = down_x;
|
|||
|
|
last_slide_y = down_y;
|
|||
|
|
touch_tick = now;
|
|||
|
|
MainTask_Sendmsg(MSG_ID_TOUCH, 1, down_x, down_y);
|
|||
|
|
} else {
|
|||
|
|
/* λ<>ƴ<EFBFBD> <20><> <20><>Ϊ<EFBFBD><EFBFBD><F3B4A5A3>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
touch_state = TOUCH_IDLE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case TOUCH_PRESS_STABLE:
|
|||
|
|
{
|
|||
|
|
/* ----- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----- */
|
|||
|
|
if (!long_press_fired && (now - touch_tick) >= TOUCH_LONG_PRESS_TIME) {
|
|||
|
|
long_press_fired = 1;
|
|||
|
|
repeat_tick = now;
|
|||
|
|
r.gesture = GESTURE_LONG_PRESS;
|
|||
|
|
MainTask_Sendmsg(MSG_ID_TOUCH_LONG_REPEAT, 1, down_x, down_y);
|
|||
|
|
return r;
|
|||
|
|
}
|
|||
|
|
/* ----- <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD> ----- */
|
|||
|
|
if (long_press_fired && (now - repeat_tick) >= TOUCH_REPEAT_INTERVAL) {
|
|||
|
|
repeat_tick = now;
|
|||
|
|
r.gesture = GESTURE_REPEAT;
|
|||
|
|
MainTask_Sendmsg(MSG_ID_TOUCH_LONG_REPEAT, 1, down_x, down_y);
|
|||
|
|
return r;
|
|||
|
|
}
|
|||
|
|
/* ----- λ<>ƽ<EFBFBD><C6BD>뻬<EFBFBD><EBBBAC> ----- */
|
|||
|
|
if (abs_diff(x, down_x) >= TOUCH_SLIDE_THRESH ||
|
|||
|
|
abs_diff(y, down_y) >= TOUCH_SLIDE_THRESH) {
|
|||
|
|
touch_state = TOUCH_SLIDING;
|
|||
|
|
last_slide_x = x;
|
|||
|
|
last_slide_y = y;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case TOUCH_SLIDING:
|
|||
|
|
{
|
|||
|
|
/* λ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6>¼<EFBFBD> */
|
|||
|
|
if (abs_diff(x, last_slide_x) >= TOUCH_SLIDE_STEP ||
|
|||
|
|
abs_diff(y, last_slide_y) >= TOUCH_SLIDE_STEP) {
|
|||
|
|
r.gesture = GESTURE_DRAG;
|
|||
|
|
r.down_x = last_slide_x; /* <20><>¼<EFBFBD>ϴ<EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѷ<EFBFBD><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
r.down_y = last_slide_y;
|
|||
|
|
MainTask_Sendmsg(MSG_ID_TOUCH, 1, x, y);
|
|||
|
|
last_slide_x = x;
|
|||
|
|
last_slide_y = y;
|
|||
|
|
return r;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
touch_state = TOUCH_IDLE;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return r; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
}
|