key.c 3.7 KB

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