You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

71 lines
1.5 KiB

#pragma once
#include <stdint.h>
#include <stdbool.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#define s_key_init(_name, _get_key_state) \
{ \
.name = _name, \
.get_key_state = _get_key_state \
}
#define key_module_init(_skeys, _onkey) \
{ \
.keys = _skeys, \
.nkey = ARRAY_SIZE(_skeys), \
.onkey = _onkey \
}
typedef bool (*get_key_state_t)(void);
/**
* @brief 按键状态
*
*/
typedef enum
{
// mode1
zks_keep,
zks_rising_edge, //上升沿按键按下从0-1
zks_falling_edge, //下降沿按键抬起1-0
// mode2
zks_trigger_event, //触发
zks_longtime_trigger_event, //长时间触发
} key_state_t;
/**
* @brief 按键属性
*
*/
typedef struct
{
const char *name;
get_key_state_t get_key_state;
bool last_io_state;
key_state_t cur_state; //当前的状态
uint32_t keep_state_count; /*按键当前状态保持了多久*/
bool hasProcessed; /*useful for user*/
bool after_filter_state;
uint32_t currentstatekeep_count; //消抖使用
bool last_real_state; //消抖使用
} key_t;
/**
* @brief 按键模块
*
*/
typedef struct
{
key_t *keys;
int nkey;
void (*onkey)(key_t *key, key_state_t key_state);
} key_module_t;
void key_init(key_module_t *key_module);
void key_do_loop_in_each_period();
void key_process_each(key_t *each);