Files
AC707N/SDK/apps/common/device/key/key_driver.h
T
2025-12-03 11:12:34 +08:00

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