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.

163 lines
5.7 KiB

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