92 lines
2.2 KiB
C
92 lines
2.2 KiB
C
|
|
#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
|