#ifndef __KEYSCAN_H #define __KEYSCAN_H #include "basic_include.h" /************************************************************************** * 按键的事件 * 说明:按键触发可能短时间由多个事件,比如长按:先是有个按键按下->长按按下->长按释放 * 所以要考虑监听哪个事件,比如短按的,最好监听短按释放,毕竟按键按下事件都会有触发的 ***************************************************************************/ enum { KEY_EVENT_DOWN, //按键按下 KEY_EVENT_SUP, //短按释放 KEY_EVENT_LDOWN, //长按按下 KEY_EVENT_LUP, //长按释放 KEY_EVENT_REPEAT, //一直按住按键 KEY_EVENT_MAX, }; /*************************************** * 按键值的定义 ***************************************/ enum { KEY_NONE, AD_UP, AD_DOWN, AD_LEFT, AD_RIGHT, AD_PRESS, AD_A, AD_B, AD_C, AD_SPEACH, KEY_BACK, KEY_MAGIC_SWITCH, KEY_IPF_SWITCH, KEY_PAIR, KEY_POWER, KEY_POWEROFF, LOWPOWER_CHECK, KEY_CALLING_START, KEY_CALLING_STOP, }; struct key_channel_t ; struct keys_t ; typedef struct key_channel_t key_channel_t; typedef void (*keyinit_func) (struct key_channel_t*); typedef void (*keyprepare_func) (struct key_channel_t*); typedef uint8 (*keyscan_func) (struct key_channel_t*); typedef int32 (*key_send_msg) (uint32 data,uint32_t value); typedef uint32 key_map_t[KEY_EVENT_MAX]; typedef struct keys_t keys_t; struct keys_t { uint32_t period_long; uint32_t period_repeat; uint32_t period_dither; }; struct key_channel_t { keyinit_func init; //初始化 keyprepare_func prepare;//scan之前的准备,可以设置为NULL,也可以去设置enable值来作为是否要进行按键检测 keyscan_func scan; //获取按键键值 const void *key_table;//按键表格,scan需要用到,如果是adc需要根据表格获取是哪个按键被按下 const keys_t *key_arg; void *priv; key_send_msg key_send; uint32_t last_key; uint32_t last_time; uint32_t last_event; uint32_t extern_value; uint8 enable; }; void key_button_scan_init(key_channel_t **channel,key_send_msg send); #endif