248 lines
7.1 KiB
C
248 lines
7.1 KiB
C
#ifndef SYS_KEY_DRIVER_H
|
|
#define SYS_KEY_DRIVER_H
|
|
|
|
#include "typedef.h"
|
|
|
|
#define NO_KEY 0xff
|
|
#define KEY_NOT_SUPPORT 0x01
|
|
|
|
|
|
#define KEY_POWER 0
|
|
#define KEY_PREV 1
|
|
#define KEY_NEXT 2
|
|
#define KEY_SLIDER 3
|
|
#define KEY_MODE 4
|
|
#define KEY_PLAY 5
|
|
|
|
#define KEY_AD_NUM0 10
|
|
#define KEY_AD_NUM1 11
|
|
#define KEY_AD_NUM2 12
|
|
#define KEY_AD_NUM3 13
|
|
#define KEY_AD_NUM4 14
|
|
#define KEY_AD_NUM5 15
|
|
#define KEY_AD_NUM6 16
|
|
#define KEY_AD_NUM7 17
|
|
#define KEY_AD_NUM8 18
|
|
#define KEY_AD_NUM9 19
|
|
#define KEY_AD_NUM10 20
|
|
#define KEY_AD_NUM11 21
|
|
#define KEY_AD_NUM12 22
|
|
#define KEY_AD_NUM13 23
|
|
#define KEY_AD_NUM14 24
|
|
#define KEY_AD_NUM15 25
|
|
#define KEY_AD_NUM16 26
|
|
#define KEY_AD_NUM17 27
|
|
#define KEY_AD_NUM18 28
|
|
#define KEY_AD_NUM19 29
|
|
|
|
#define KEY_IR_NUM0 30
|
|
#define KEY_IR_NUM1 31
|
|
#define KEY_IR_NUM2 32
|
|
#define KEY_IR_NUM3 33
|
|
#define KEY_IR_NUM4 34
|
|
#define KEY_IR_NUM5 35
|
|
#define KEY_IR_NUM6 36
|
|
#define KEY_IR_NUM7 37
|
|
#define KEY_IR_NUM8 38
|
|
#define KEY_IR_NUM9 39
|
|
#define KEY_IR_NUM10 40
|
|
#define KEY_IR_NUM11 41
|
|
#define KEY_IR_NUM12 42
|
|
#define KEY_IR_NUM13 43
|
|
#define KEY_IR_NUM14 44
|
|
#define KEY_IR_NUM15 45
|
|
#define KEY_IR_NUM16 46
|
|
#define KEY_IR_NUM17 47
|
|
#define KEY_IR_NUM18 48
|
|
#define KEY_IR_NUM19 49
|
|
#define KEY_IR_NUM20 50
|
|
#define KEY_IR_NUM21 51
|
|
#define KEY_IR_NUM22 52
|
|
#define KEY_IR_NUM23 53
|
|
#define KEY_IR_NUM24 54
|
|
#define KEY_IR_NUM25 55
|
|
#define KEY_IR_NUM26 56
|
|
#define KEY_IR_NUM27 57
|
|
#define KEY_IR_NUM28 58
|
|
#define KEY_IR_NUM29 59
|
|
#define KEY_IR_NUM30 60
|
|
#define KEY_IR_NUM31 61
|
|
#define KEY_IR_NUM32 62
|
|
#define KEY_IR_NUM33 63
|
|
#define KEY_IR_NUM34 64
|
|
|
|
#define KEY_IO_NUM0 65
|
|
#define KEY_IO_NUM1 66
|
|
#define KEY_IO_NUM2 67
|
|
#define KEY_IO_NUM3 68
|
|
#define KEY_IO_NUM4 69
|
|
#define KEY_IO_NUM5 70
|
|
#define KEY_IO_NUM6 71
|
|
#define KEY_IO_NUM7 72
|
|
#define KEY_IO_NUM8 73
|
|
#define KEY_IO_NUM9 74
|
|
#define KEY_IO_NUM10 75
|
|
#define KEY_IO_NUM11 76
|
|
#define KEY_IO_NUM12 77
|
|
#define KEY_IO_NUM13 78
|
|
#define KEY_IO_NUM14 79
|
|
|
|
#define KEY_IO_WATCH_UPPER_LEFT 80 //手表左上的按键
|
|
#define KEY_IO_WATCH_UPPER_RIGHT 81 //手表右上的按键
|
|
#define KEY_IO_WATCH_LOWER_LEFT 82 //手表左下的按键
|
|
#define KEY_IO_WATCH_LOWER_RIGHT 83 //手表右下的按键
|
|
#define KEY_IO_WATCH_ENCODER 84 //手表编码器所带的按键
|
|
|
|
typedef enum __KEY_DRIVER_TYPE {
|
|
KEY_DRIVER_TYPE_IO = 0x0,
|
|
KEY_DRIVER_TYPE_AD,
|
|
KEY_DRIVER_TYPE_RTCVDD_AD,
|
|
KEY_DRIVER_TYPE_IR,
|
|
KEY_DRIVER_TYPE_TOUCH,
|
|
KEY_DRIVER_TYPE_CTMU_TOUCH,
|
|
KEY_DRIVER_TYPE_RDEC,
|
|
KEY_DRIVER_TYPE_SLIDEKEY,
|
|
KEY_DRIVER_TYPE_SOFTKEY,
|
|
KEY_DRIVER_TYPE_BRIGHTNESS,
|
|
KEY_DRIVER_TYPE_VOICE,
|
|
|
|
KEY_DRIVER_TYPE_MAX,
|
|
} KEY_DRIVER_TYPE;
|
|
|
|
|
|
enum key_action {
|
|
KEY_ACTION_CLICK,
|
|
KEY_ACTION_LONG,
|
|
KEY_ACTION_HOLD,
|
|
KEY_ACTION_UP,
|
|
KEY_ACTION_DOUBLE_CLICK,
|
|
KEY_ACTION_TRIPLE_CLICK,
|
|
KEY_ACTION_FOURTH_CLICK,
|
|
KEY_ACTION_FIRTH_CLICK,
|
|
KEY_ACTION_HOLD_3SEC,
|
|
KEY_ACTION_HOLD_5SEC,
|
|
/*=======新增按键动作请在此处之上增加=======*/
|
|
KEY_ACTION_LVGL_DOWN,
|
|
KEY_ACTION_RDEC_ROTATE,
|
|
KEY_ACTION_NO_KEY,
|
|
KEY_ACTION_MAX,
|
|
};
|
|
|
|
enum watch_key_action {
|
|
KEY_WATCH_UPPER_LEFT_DOWN,
|
|
KEY_WATCH_UPPER_LEFT_UP,
|
|
KEY_WATCH_UPPER_LEFT_HOLD,
|
|
KEY_WATCH_UPPER_RIGHT_DOWN,
|
|
KEY_WATCH_UPPER_RIGHT_UP,
|
|
KEY_WATCH_UPPER_RIGHT_HOLD,
|
|
KEY_WATCH_LOWER_LEFT_DOWN,
|
|
KEY_WATCH_LOWER_LEFT_UP,
|
|
KEY_WATCH_LOWER_LEFT_HOLD,
|
|
KEY_WATCH_LOWER_RIGHT_DOWN,
|
|
KEY_WATCH_LOWER_RIGHT_UP,
|
|
KEY_WATCH_LOWER_RIGHT_HOLD,
|
|
KEY_WATCH_ENCODER_DOWN,
|
|
KEY_WATCH_ENCODER_UP,
|
|
KEY_WATCH_NO_KEY,
|
|
};
|
|
|
|
enum slider_key_action {
|
|
KEY_SLIDER_UP,
|
|
KEY_SLIDER_DOWN,
|
|
KEY_SLIDER_LEFT,
|
|
KEY_SLIDER_RIGHT,
|
|
};
|
|
|
|
enum key_event_type {
|
|
KEY_CLICK_EVENT,
|
|
KEY_COMB_EVENT,
|
|
};
|
|
|
|
struct key_event {
|
|
u8 init;
|
|
u8 type;
|
|
u16 event;
|
|
u32 value;
|
|
u32 tmr;
|
|
};
|
|
|
|
struct key_driver_para {
|
|
u8 last_key; //上一次get_value按键值
|
|
//== 用于消抖类参数
|
|
u8 filter_value; //用于按键消抖
|
|
u8 filter_cnt; //用于按键消抖时的累加值
|
|
//== 用于判定连击事件参数
|
|
u8 click_delay_cnt; //按键被抬起后等待连击事件延时计数
|
|
u8 press_cnt; //与long_time和hold_time对比, 判断long_event和hold_event
|
|
u16 press_sum_cnt;
|
|
const u8 key_type;
|
|
const u8 filter_time; //当filter_cnt累加到base_cnt值时, 消抖有效
|
|
const u8 long_time; //按键判定长按数量
|
|
const u8 hold_time; //按键判定HOLD数量
|
|
const u8 click_delay_time; //按键被抬起后等待连击事件延时数量
|
|
const u32 scan_time; //按键扫描频率, 单位ms
|
|
};
|
|
|
|
struct key_driver_ops {
|
|
const u8 idle_query_en;
|
|
const struct key_driver_para *param;
|
|
u8(*get_value)(void);
|
|
int (*key_init)(void);
|
|
};
|
|
|
|
#define REGISTER_KEY_OPS(key_ops) \
|
|
const struct key_driver_ops key_ops sec(.key_operation)
|
|
|
|
extern const struct key_driver_ops key_ops_begin[];
|
|
extern const struct key_driver_ops key_ops_end[];
|
|
|
|
#define list_for_each_key(p) \
|
|
for (p = key_ops_begin; p < key_ops_end; p++)
|
|
|
|
struct key_callback {
|
|
char *name;
|
|
void *arg;
|
|
int(*cb_deal)(void *arg);
|
|
};
|
|
|
|
#define REGISTER_KEY_DET_CALLBACK(cb) \
|
|
const struct key_callback cb sec(.key_cb)
|
|
|
|
extern const struct key_callback key_callback_begin[];
|
|
extern const struct key_callback key_callback_end[];
|
|
|
|
#define list_for_each_key_callback(p) \
|
|
for (p = key_callback_begin; p < key_callback_end; p++)
|
|
|
|
//组合按键映射按键值
|
|
struct key_remap {
|
|
u8 bit_value;
|
|
u8 remap_value;
|
|
};
|
|
|
|
struct key_remap_data {
|
|
u8 remap_num;
|
|
const struct key_remap *table;
|
|
};
|
|
|
|
/* --------------------------------------------------------------------------*/
|
|
/**
|
|
* @brief 按键初始化函数,初始化所有注册的按键驱动
|
|
*/
|
|
/* ----------------------------------------------------------------------------*/
|
|
void key_driver_init(void);
|
|
|
|
/* --------------------------------------------------------------------------*/
|
|
/**
|
|
* @brief 按键事件过滤、检测和发送
|
|
*
|
|
* @param key:基础按键动作(mono_click、long、hold、up)和键值
|
|
*/
|
|
/* ----------------------------------------------------------------------------*/
|
|
void key_event_handler(struct key_event *key);
|
|
|
|
|
|
#endif
|
|
|
|
|