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.

70 lines
1.5 KiB

  1. #pragma once
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
  5. #define s_key_init(_name, _get_key_state) \
  6. { \
  7. .name = _name, \
  8. .get_key_state = _get_key_state \
  9. }
  10. #define key_module_init(_skeys, _onkey) \
  11. { \
  12. .keys = _skeys, \
  13. .nkey = ARRAY_SIZE(_skeys), \
  14. .onkey = _onkey \
  15. }
  16. typedef bool (*get_key_state_t)(void);
  17. /**
  18. * @brief
  19. *
  20. */
  21. typedef enum
  22. {
  23. // mode1
  24. zks_keep,
  25. zks_rising_edge, //上升沿按键按下从0-1
  26. zks_falling_edge, //下降沿按键抬起1-0
  27. // mode2
  28. zks_trigger_event, //触发
  29. zks_longtime_trigger_event, //长时间触发
  30. } key_state_t;
  31. /**
  32. * @brief
  33. *
  34. */
  35. typedef struct
  36. {
  37. const char *name;
  38. get_key_state_t get_key_state;
  39. bool last_io_state;
  40. key_state_t cur_state; //当前的状态
  41. uint32_t keep_state_count; /*按键当前状态保持了多久*/
  42. bool hasProcessed; /*useful for user*/
  43. bool after_filter_state;
  44. uint32_t currentstatekeep_count; //消抖使用
  45. bool last_real_state; //消抖使用
  46. } key_t;
  47. /**
  48. * @brief
  49. *
  50. */
  51. typedef struct
  52. {
  53. key_t *keys;
  54. int nkey;
  55. void (*onkey)(key_t *key, key_state_t key_state);
  56. } key_module_t;
  57. void key_init(key_module_t *key_module);
  58. void key_do_loop_in_each_period();
  59. void key_process_each(key_t *each);