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.
65 lines
1.5 KiB
65 lines
1.5 KiB
#pragma once
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#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 /**/ \
|
|
}
|