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.

61 lines
1.9 KiB

4 years ago
  1. #pragma once
  2. #include "port.h"
  3. #define POWER_KEY_TRIGGER_TIME 3000
  4. #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
  5. #define ZKEY_INIT(_name, _get_key_state) \
  6. { .name = _name, .get_key_state = _get_key_state }
  7. #define ZMODULE_INIT(_keys, _onkey) /**/ \
  8. { /**/ \
  9. .keys = _keys, /**/ \
  10. .nkey = ARRAY_SIZE(_keys), /**/ \
  11. .onkey = _onkey /**/ \
  12. }
  13. typedef enum {
  14. // mode1
  15. zks_keep,
  16. zks_rising_edge, //�����ذ������´�0-1
  17. zks_falling_edge, //�½��ذ���̧��1-0
  18. // mode2
  19. zks_trigger_event, //����
  20. zks_longtime_trigger_event, //��ʱ�䴥��
  21. } zkey_event_t;
  22. typedef zkey_event_t zkey_state_t;
  23. typedef bool (*get_key_state_t)(void);
  24. typedef struct {
  25. const char *name;
  26. get_key_state_t get_key_state;
  27. bool last_io_state;
  28. zkey_state_t cur_state; //��ǰ��״̬
  29. uint32_t keep_state_count; /*������ǰ״̬�����˶���*/
  30. bool hasProcessed; /*useful for user*/
  31. bool after_filter_state;
  32. uint32_t currentstatekeep_count; //����ʹ��
  33. bool last_real_state; //����ʹ��
  34. } zkey_t;
  35. static uint16_t s_key_press_state;
  36. static uint16_t s_key_long_press_time_ms = 3000; //�����ж�ʱ��
  37. #define KEY_SCAN_PERIOD 20 //ɨ������20ms
  38. typedef struct {
  39. zkey_t *keys;
  40. int nkey;
  41. void (*onkey)(zkey_t *key, zkey_state_t key_state);
  42. } zkey_module_t;
  43. static zkey_module_t *s_module;
  44. static bool s_inited;
  45. void zkey_init(zkey_module_t *module);
  46. void zkey_do_loop_in_each_period(void *_null);
  47. void zkey_process_each(zkey_t *each);
  48. void zkey_process_each_after_filter(zkey_t *each, bool now_io_state);
  49. void read_key_state(void);