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

2 years ago
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #ifndef ARRAY_SIZE
  5. #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
  6. #endif
  7. typedef enum
  8. {
  9. // mode1
  10. zks_keep,
  11. zks_rising_edge,
  12. zks_falling_edge,
  13. // mode2
  14. zks_trigger_event,
  15. zks_longtime_trigger_event,
  16. } zkey_event_t;
  17. typedef void (*zkey_listener_t)(void *keyhandler, zkey_event_t zkey_event,
  18. uint32_t keycode);
  19. typedef void (*zkey_reg_listener_t)(zkey_listener_t listener);
  20. typedef bool (*get_key_state_t)(void);
  21. typedef zkey_event_t zkey_state_t;
  22. typedef struct
  23. {
  24. const char *name;
  25. get_key_state_t get_key_state;
  26. bool last_io_state;
  27. zkey_state_t cur_state; /**/
  28. uint32_t keep_state_count; /*按键当前状态保持了多久*/
  29. bool hasProcessed; /*useful for user*/
  30. bool after_filter_state;
  31. uint32_t currentstatekeep_count; // 消抖使用
  32. bool last_real_state; // 消抖使用
  33. } zkey_t;
  34. typedef struct
  35. {
  36. zkey_t *keys;
  37. int nkey;
  38. void (*onkey)(zkey_t *key, zkey_state_t key_state);
  39. } zkey_module_t;
  40. void zkey_init(zkey_module_t *module);
  41. void zkey_do_loop_in_each_period(void *_null);
  42. #define ZKEY_INIT(_name, _get_key_state) \
  43. { \
  44. .name = _name, .get_key_state = _get_key_state \
  45. }
  46. #define ZMODULE_INIT(_keys, _onkey) /**/ \
  47. { /**/ \
  48. .keys = _keys, /**/ \
  49. .nkey = ARRAY_SIZE(_keys), /**/ \
  50. .onkey = _onkey /**/ \
  51. }