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.

143 lines
4.6 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #include "key.h"
  2. static zkey_t s_keys[] = {
  3. ZKEY_INIT("timerkey", port_gpio_get_timer_key_state),
  4. ZKEY_INIT("gearskey", port_gpio_get_gears_key_state),
  5. // ZKEY_INIT("intervaey", port_gpio_get_interval_key_state),
  6. };
  7. zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
  8. void zkey_init(zkey_module_t *module) {
  9. /**
  10. * @brief ʼ״̬ijʼ֮ǰģڵģ֮
  11. *
  12. */
  13. s_module = module;
  14. s_inited = true; //��־λ˵��������ʼ������
  15. for (int i = 0; i < s_module->nkey; i++) {
  16. s_module->keys[i].cur_state = zks_keep;
  17. s_module->keys[i].last_io_state = s_module->keys[i].get_key_state();
  18. s_module->keys[i].after_filter_state = s_module->keys[i].get_key_state();
  19. }
  20. }
  21. void zkey_do_loop_in_each_period(void *_null) { /**
  22. * @brief ѭѯ״̬
  23. *
  24. */
  25. if (!s_inited)
  26. return;
  27. for (int i = 0; i < s_module->nkey; i++) //��ʼ��ÿ���������в�ѯ
  28. {
  29. zkey_process_each(&s_module->keys[i]);
  30. }
  31. }
  32. void zkey_process_each(zkey_t *each) {
  33. /**
  34. * @brief Ƿûʱʱ¼
  35. *
  36. * @param each
  37. */
  38. each->keep_state_count++;
  39. bool now_io_state = each->get_key_state(); //��ȡ���ڵİ���io״̬
  40. if (each->currentstatekeep_count < 1000) {
  41. each->currentstatekeep_count++;
  42. }
  43. if (now_io_state != each->last_real_state) //�����任
  44. {
  45. each->currentstatekeep_count = 0;
  46. }
  47. if (each->currentstatekeep_count >= 1) //����״̬����ʱ������20ms,���°���״̬
  48. {
  49. each->after_filter_state = now_io_state;
  50. }
  51. each->last_real_state = now_io_state;
  52. zkey_process_each_after_filter(each, each->after_filter_state);
  53. }
  54. void zkey_process_each_after_filter(zkey_t *each, bool now_io_state) {
  55. if (now_io_state != each->last_io_state) {
  56. if (now_io_state) {
  57. each->keep_state_count = 0;
  58. each->hasProcessed = false;
  59. each->cur_state = zks_rising_edge;
  60. s_module->onkey(each, each->cur_state);
  61. } else {
  62. each->cur_state = zks_falling_edge;
  63. s_module->onkey(each, each->cur_state);
  64. each->keep_state_count = 0;
  65. }
  66. each->last_io_state = now_io_state;
  67. } else {
  68. each->cur_state = zks_keep;
  69. if (now_io_state) {
  70. s_module->onkey(each, each->cur_state);
  71. }
  72. }
  73. }
  74. //############################### ԭ����main�еķ��� ���¶��� ###############################//
  75. extern uint32_t g_frequency;
  76. extern uint32_t g_duty[4];
  77. extern int g_ozen_gears;
  78. extern uint32_t g_count_down_begin_sys_time;
  79. extern int time_key_press_frequency; //ÿ����4�ν�����0
  80. extern uint32_t g_ozone_work_time;
  81. void onkey(zkey_t *key, zkey_state_t key_state) {
  82. /**
  83. * @brief жÿ״̬
  84. *
  85. * @param key
  86. * @param key_state
  87. */
  88. if (key == &s_keys[0] && //��ʱ����
  89. key->cur_state == zks_keep && //����
  90. !key->hasProcessed && //û�б�������
  91. key->keep_state_count >=
  92. POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //���³���ʱ������3s
  93. {
  94. key->hasProcessed = true;
  95. printf("key0 zks_keep\r\n");
  96. // stop_ozone_work();
  97. } else if (key == &s_keys[0] && //��ʱ����
  98. key->cur_state == zks_falling_edge && //�½��ش���
  99. !key->hasProcessed &&
  100. key->keep_state_count <=
  101. POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //��3s
  102. {
  103. key->hasProcessed = true;
  104. printf("key0 zks_falling_edge\r\n");
  105. set_ozone_work_time();
  106. // set_timing_time(running_time.timing_time_state);
  107. } else if (key == &s_keys[1] && //�ߵ͵�λѡ��
  108. key->cur_state == zks_rising_edge && //
  109. !key->hasProcessed && //
  110. key->keep_state_count <=
  111. POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  112. key->hasProcessed = true;
  113. // key_control_switch_gears(g_switch_gears);
  114. printf("key1 zks_rising_edge\r\n");
  115. set_ozen_gears(g_ozen_gears);
  116. } else if (key == &s_keys[2] && //��Ъʱ��ѡ��
  117. key->cur_state == zks_rising_edge && //
  118. !key->hasProcessed && //
  119. key->keep_state_count <=
  120. POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  121. key->hasProcessed = true;
  122. printf("key2 zks_rising_edge\r\n");
  123. // set_interval_time(running_time.interval_time_state);
  124. }
  125. }
  126. void port_key_state(void) {
  127. static uint32_t keylastprocess = 0;
  128. if (port_haspassedms(keylastprocess) > 20) {
  129. keylastprocess = get_sys_ticket();
  130. zkey_do_loop_in_each_period(NULL);
  131. }
  132. }