key.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/time.h>
  5. #include "key.h"
  6. #include "gpio.h"
  7. #include "log.h"
  8. #define KEY_NUM 3
  9. #define KEY_LONG_TIME 500
  10. #define KEY_PRESS_LEVEL 0
  11. #define K1_GPIO GET_PIN(E, 2) //PE2, K1
  12. #define K2_GPIO GET_PIN(E, 3) //PE3, K2
  13. #define K3_GPIO GET_PIN(E, 4) //PE4, K3
  14. typedef struct {
  15. int gpio;
  16. uint16_t key;
  17. uint8_t active_level;
  18. }io_info_t;
  19. static io_info_t io_info[KEY_NUM]={
  20. {K1_GPIO, KEY_UP, KEY_PRESS_LEVEL}, //S1
  21. {K2_GPIO, KEY_OK, KEY_PRESS_LEVEL}, //S2
  22. {K3_GPIO, KEY_DOWN, KEY_PRESS_LEVEL}, //S3
  23. };
  24. typedef struct {
  25. int key;
  26. uint64_t ms;
  27. }key_info_t;
  28. typedef struct {
  29. key_info_t k1;
  30. key_info_t k2;
  31. uint8_t long_trigged;
  32. }key_data_t;
  33. typedef struct {
  34. io_info_t *io;
  35. key_data_t kd[KEY_NUM];
  36. }key_handle_t;
  37. static key_handle_t keyHandle={0};
  38. static uint64_t get_ms(void)
  39. {
  40. struct timeval tv;
  41. gettimeofday(&tv, NULL);
  42. return (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000;
  43. }
  44. ///////////////////////////////////////////////////////////////
  45. int key_init(void)
  46. {
  47. int i;
  48. key_handle_t *h=&keyHandle;
  49. h->io = io_info;
  50. for(i=0; i<KEY_NUM; i++) {
  51. gpio_init(io_info[i].gpio, GPIO_IN, 0);
  52. h->kd[i].k1.key = -1;
  53. h->kd[i].k1.ms = 0;
  54. h->kd[i].k2 = h->kd[i].k1;
  55. h->kd[i].long_trigged = 0;
  56. }
  57. return 0;
  58. }
  59. int key_deinit(void)
  60. {
  61. int i;
  62. key_handle_t *h=&keyHandle;
  63. for(i=0; i<KEY_NUM; i++) {
  64. gpio_deinit(io_info[i].gpio);
  65. }
  66. return 0;
  67. }
  68. int key_get(key_val_t *kv)
  69. {
  70. int i,r;
  71. key_val_t k;
  72. uint64_t ms_max=0;
  73. key_handle_t *h=&keyHandle;
  74. if(!kv) {
  75. return -1;
  76. }
  77. kv->key = -1;
  78. for(i=0; i<KEY_NUM; i++) {
  79. key_data_t *p=&h->kd[i];
  80. key_info_t *p1=&p->k1;
  81. key_info_t *p2=&p->k2;
  82. r = gpio_get(h->io[i].gpio);
  83. if(r==KEY_PRESS_LEVEL) { //key pressed
  84. if(p1->key==-1) {
  85. p1->ms = get_ms();
  86. p1->key = h->io[i].key;
  87. }
  88. else {
  89. p2->ms = get_ms();
  90. p2->key = h->io[i].key;
  91. #if 0
  92. if(!p->long_trigged && p2->ms-p1->ms>=KEY_LONG_TIME) {
  93. *p1 = *p2;
  94. kv->type = TYPE_LONG;
  95. kv->key = p2->key;
  96. p->long_trigged = 1;
  97. return 0;
  98. }
  99. #endif
  100. }
  101. }
  102. else {
  103. if(p1->key>=0 && p2->key==-1) {
  104. p2->ms = get_ms();
  105. p2->key = h->io[i].key;
  106. }
  107. //key replease
  108. if(p2->key>=0) {
  109. kv->key = p2->key;
  110. if(p2->ms-p1->ms<KEY_LONG_TIME) {
  111. kv->type = TYPE_SHORT;
  112. }
  113. else {
  114. kv->type = TYPE_LONG;
  115. }
  116. p1->key = p2->key = -1;
  117. p->long_trigged = 0;
  118. return 0;
  119. }
  120. }
  121. }
  122. return -1;
  123. }
  124. int key_print(key_val_t *kv)
  125. {
  126. switch(kv->key) {
  127. case KEY_UP:
  128. printf("____ KEY_UP, %s\n", (kv->type==TYPE_LONG)?"LONG":"SHORT");
  129. break;
  130. case KEY_DOWN:
  131. printf("____ KEY_DOWN, %s\n", (kv->type==TYPE_LONG)?"LONG":"SHORT");
  132. break;
  133. case KEY_OK:
  134. printf("____ KEY_OK, %s\n", (kv->type==TYPE_LONG)?"LONG":"SHORT");
  135. break;
  136. }
  137. return 0;
  138. }