|
|
@ -13,19 +13,25 @@ |
|
|
|
// app_timer |
|
|
|
#include "sdk/components/libraries/timer/app_timer.h" |
|
|
|
// |
|
|
|
#include "app_basic_service/basic/keyid.h" |
|
|
|
#include "app_basic_service\basic\event.h" |
|
|
|
#include "app_basic_service\zapp_core.h" |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* 按键监听 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
#define LONGPRESS_TRIGGER_TIME 1500 |
|
|
|
#define LONGPRESS_TRIGGER_TIME 800 |
|
|
|
#define PERIOD_MS 100 |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
bool keystate; |
|
|
|
bool longPress; |
|
|
|
bool pressing; |
|
|
|
uint32_t pressTicket; |
|
|
|
uint32_t keid; |
|
|
|
bool keystate; |
|
|
|
int keyCurStateCntMs; |
|
|
|
|
|
|
|
uint32_t sessionTp; |
|
|
|
int keyPressCnt; |
|
|
|
int keyPressTime; |
|
|
|
|
|
|
|
bool (*read_key_state)(); |
|
|
|
} key_t; |
|
|
|
|
|
|
@ -50,30 +56,39 @@ static bool key_liquid_reflux_butt_read_state() { |
|
|
|
|
|
|
|
static void process_key(key_t* key) { |
|
|
|
static app_event_t event; |
|
|
|
bool nowState = key->read_key_state(); // 触发按键 |
|
|
|
|
|
|
|
bool nowState = key->read_key_state(); // 触发按键 |
|
|
|
bool stateChange = false; |
|
|
|
if (nowState != key->keystate) { |
|
|
|
// 按下事件 |
|
|
|
if (nowState) { |
|
|
|
key->longPress = false; |
|
|
|
key->pressing = true; |
|
|
|
key->pressTicket = znordic_getpower_on_ms(); |
|
|
|
} |
|
|
|
// 按键松开事件 |
|
|
|
if (!nowState) { |
|
|
|
if (!key->longPress) { |
|
|
|
event.eventType = kappevent_key_pressed; |
|
|
|
event.val.keyid = key->keid; // 触发按键 |
|
|
|
zappcore_push_event(&event); |
|
|
|
} |
|
|
|
key->pressing = false; |
|
|
|
} |
|
|
|
key->keystate = nowState; |
|
|
|
key->keyCurStateCntMs = 0; |
|
|
|
stateChange = true; |
|
|
|
} else { |
|
|
|
key->keyCurStateCntMs += 100; |
|
|
|
} |
|
|
|
if (key->sessionTp != 0 && stateChange && !nowState) { |
|
|
|
key->keyPressCnt++; |
|
|
|
} |
|
|
|
|
|
|
|
if (key->pressing && !key->longPress) { |
|
|
|
if (znordic_haspassed_ms(key->pressTicket) > LONGPRESS_TRIGGER_TIME) { |
|
|
|
key->longPress = true; |
|
|
|
event.eventType = kappevent_key_long_pressed; |
|
|
|
// ZLOGI("key->keystate:%d", key->keystate); |
|
|
|
|
|
|
|
if (key->sessionTp == 0 && nowState && stateChange) { |
|
|
|
key->sessionTp = znordic_getpower_on_ms(); |
|
|
|
key->keyPressCnt = 0; |
|
|
|
key->keyPressTime = 0; |
|
|
|
} else if (key->sessionTp != 0 && nowState && key->keyCurStateCntMs >= LONGPRESS_TRIGGER_TIME) { // 按键长按超过一定时间 |
|
|
|
key->sessionTp = 0; |
|
|
|
event.eventType = kappevent_key_long_pressed; |
|
|
|
event.val.keyid = key->keid; |
|
|
|
zappcore_push_event(&event); |
|
|
|
} else if (key->sessionTp != 0 && !nowState && key->keyCurStateCntMs >= 300) { // 超过500ms没人按下按键 |
|
|
|
key->sessionTp = 0; |
|
|
|
if (key->keyPressCnt == 2) { |
|
|
|
event.eventType = kappevent_key_pressed_double; |
|
|
|
event.val.keyid = key->keid; // 触发按键 |
|
|
|
zappcore_push_event(&event); |
|
|
|
} else if (key->keyPressCnt == 1) { |
|
|
|
event.eventType = kappevent_key_pressed; |
|
|
|
event.val.keyid = key->keid; // 触发按键 |
|
|
|
zappcore_push_event(&event); |
|
|
|
} |
|
|
@ -84,11 +99,11 @@ static void process_key(key_t* key) { |
|
|
|
|
|
|
|
static void key_driver_tmr_cb(void* p_context) { // |
|
|
|
static key_t mode_and_action_butt = { |
|
|
|
.keid = 1, |
|
|
|
.keid = keyid_addliquid, |
|
|
|
.read_key_state = key_read_acid_state, |
|
|
|
}; |
|
|
|
static key_t liquid_reflux_butt = { |
|
|
|
.keid = 2, |
|
|
|
.keid = keyid_reflux, |
|
|
|
.read_key_state = key_liquid_reflux_butt_read_state, |
|
|
|
}; |
|
|
|
|
|
|
@ -98,5 +113,5 @@ static void key_driver_tmr_cb(void* p_context) { // |
|
|
|
|
|
|
|
void zkey_driver_init() { |
|
|
|
ZERROR_CHECK(app_timer_create(&m_key_monitor_tmr, APP_TIMER_MODE_REPEATED, key_driver_tmr_cb)); |
|
|
|
ZERROR_CHECK(app_timer_start(m_key_monitor_tmr, APP_TIMER_TICKS(100), NULL)); |
|
|
|
ZERROR_CHECK(app_timer_start(m_key_monitor_tmr, APP_TIMER_TICKS(PERIOD_MS), NULL)); |
|
|
|
} |