K1Guitar/APP/app_touch.c

164 lines
5.3 KiB
C
Raw Normal View History

#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> */
}