mirror of
https://gitee.com/moluo-tech/CodeBrick.git
synced 2025-02-06 04:48:22 +08:00
74 lines
2.6 KiB
C
74 lines
2.6 KiB
C
/******************************************************************************
|
||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*
|
||
* Copyright (c) 2017~2020, <master_roger@sina.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 <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param[in] key - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param[in] readkey - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ָ<EFBFBD><D6B8>
|
||
* @param[in] event - <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||
* @return true - <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, false - <20><><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 <20><><EFBFBD><EFBFBD>ɨ<EFBFBD>账<EFBFBD><E8B4A6>
|
||
* @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;
|
||
}
|
||
}
|
||
}
|
||
|