AT-Command/Demo/framework/key.c

74 lines
2.6 KiB
C
Raw Normal View History

2021-01-20 14:18:32 +00:00
/******************************************************************************
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* Copyright (c) 2017~2020, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2017-08-10 Morro Initial version
******************************************************************************/
#include "key.h"
#include <stddef.h>
static key_t *keyhead = NULL; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>*/
/*******************************************************************************
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] key - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] readkey - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param[in] event - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>, false - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
******************************************************************************/
bool key_create(key_t *key, int (*readkey)(void),
void (*event)(int type, unsigned int duration))
{
key_t *keytail = keyhead;
if (key == NULL || readkey == NULL || event == NULL)
return 0;
key->event = event;
key->readkey = readkey;
key->next = NULL;
if (keyhead == NULL) {
keyhead = key;
return 1;
}
while (keytail->next != NULL) /*ת<><D7AA><EFBFBD><EFBFBD>β*/
keytail = keytail->next;
keytail->next = key;
return 1;
}
/*******************************************************************************
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD>
* @return none
******************************************************************************/
void key_scan_process(void)
{
key_t *k;
for (k = keyhead; k != NULL; k = k->next) {
if (k->readkey()) {
if (k->tick) {
if (is_timeout(k->tick, LONG_PRESS_TIME)) /*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
k->event(KEY_LONG_DOWN, get_tick() - k->tick);
} else {
k->tick = get_tick(); /*<2A><>¼<EFBFBD>״ΰ<D7B4><CEB0><EFBFBD>ʱ<EFBFBD><CAB1>*/
}
} else if (k->tick) {
if (is_timeout(k->tick, LONG_PRESS_TIME)) { /*<2A><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> */
k->event(KEY_LONG_UP, get_tick() - k->tick);
}
/*<2A>̰<EFBFBD><CCB0>ͷŲ<CDB7><C5B2><EFBFBD> ---------------------------------------------------*/
if (is_timeout(k->tick, KEY_DEBOUNCE_TIME) &&
!is_timeout(k->tick, LONG_PRESS_TIME)) {
k->event(KEY_PRESS, get_tick() - k->tick);
}
k->tick = 0;
}
}
}