#pragma once #include #include #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif typedef enum { // mode1 zks_keep, zks_rising_edge, zks_falling_edge, // mode2 zks_trigger_event, zks_longtime_trigger_event, } zkey_event_t; typedef void (*zkey_listener_t)(void *keyhandler, zkey_event_t zkey_event, uint32_t keycode); typedef void (*zkey_reg_listener_t)(zkey_listener_t listener); typedef bool (*get_key_state_t)(void); typedef zkey_event_t zkey_state_t; typedef struct { const char *name; get_key_state_t get_key_state; bool last_io_state; zkey_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; // 消抖使用 } zkey_t; typedef struct { zkey_t *keys; int nkey; void (*onkey)(zkey_t *key, zkey_state_t key_state); } zkey_module_t; void zkey_init(zkey_module_t *module); void zkey_do_loop_in_each_period(void *_null); #define ZKEY_INIT(_name, _get_key_state) \ { \ .name = _name, .get_key_state = _get_key_state \ } #define ZMODULE_INIT(_keys, _onkey) /**/ \ { /**/ \ .keys = _keys, /**/ \ .nkey = ARRAY_SIZE(_keys), /**/ \ .onkey = _onkey /**/ \ }