#pragma once #include #include #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);