key_scan.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "include.h"
  2. void knob_init(void);
  3. void knob_process(void);
  4. u16 knob_process2(u16 *key_val);
  5. #if USER_MULTI_PRESS_EN
  6. const u16 tbl_double_key[] = USER_KEY_DOUBLE;
  7. #endif
  8. u8 bsp_tkey_scan(void);
  9. AT(.com_text.key.table)
  10. const key_shake_tbl_t key_shake_table = {
  11. .scan_cnt = KEY_SCAN_TIMES,
  12. .up_cnt = KEY_UP_TIMES,
  13. .long_cnt = KEY_LONG_TIMES,
  14. .hold_cnt = KEY_LONG_HOLD_TIMES,
  15. };
  16. AT(.text.bsp.key.init)
  17. void key_init(void)
  18. {
  19. key_var_init();
  20. #if USER_IOKEY
  21. io_key_init();
  22. #endif
  23. #if USER_ADKEY || USER_ADKEY2 || USER_NTC
  24. adkey_init();
  25. #endif
  26. #if USER_KEY_KNOB_EN
  27. knob_init();
  28. #endif
  29. pwrkey_init();
  30. #if VBAT_DETECT_EN
  31. vbat_init();
  32. #endif
  33. bsp_saradc_init();
  34. bsp_tkey_init();
  35. }
  36. #if USER_MULTI_PRESS_EN
  37. AT(.com_text.bsp.key)
  38. bool check_key_return(u16 key_return)
  39. {
  40. u8 i;
  41. if (key_return == NO_KEY) {
  42. return false;
  43. }
  44. //工具配置了哪些按键支持双击功能?
  45. i = check_key_double_configure(key_return);
  46. if (i > 0) {
  47. return (i - 1);
  48. }
  49. for (i=0; i<sizeof(tbl_double_key)/2; i++) {
  50. if (key_return == tbl_double_key[i]) {
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. #else
  57. AT(.com_text.bsp.key)
  58. bool check_key_return(u16 key_return)
  59. {
  60. return false;
  61. }
  62. #endif // USER_KEY_DOUBLE_EN
  63. AT(.text.bsp.key)
  64. u8 get_pwroff_pressed_time(void)
  65. {
  66. return PWROFF_PRESS_TIME;
  67. }
  68. AT(.text.bsp.key)
  69. u8 get_double_key_time(void)
  70. {
  71. if(DOUBLE_KEY_TIME > 7) {
  72. return 60;
  73. } else {
  74. return (u8)((u8)(DOUBLE_KEY_TIME + 2) * 20 + 1);
  75. }
  76. }
  77. AT(.com_text.bsp.key)
  78. bool get_poweron_flag(void)
  79. {
  80. return sys_cb.poweron_flag;
  81. }
  82. AT(.com_text.bsp.key)
  83. void set_poweron_flag(bool flag)
  84. {
  85. sys_cb.poweron_flag = flag;
  86. }
  87. AT(.com_text.bsp.key)
  88. u16 bsp_key_process(u16 key_val)
  89. {
  90. #if USER_KEY_KNOB2_EN
  91. static u8 timer1ms_cnt=0;
  92. timer1ms_cnt++;
  93. u16 key_ret = knob_process2(&key_val);
  94. if (key_ret != 0xffff && key_ret != NO_KEY) {
  95. return key_ret;
  96. }
  97. if(timer1ms_cnt < 5) {
  98. return NO_KEY; //貌似有问题
  99. }
  100. timer1ms_cnt=0;
  101. #endif
  102. u16 key_return = key_process(key_val);
  103. //双击处理
  104. #if USER_MULTI_PRESS_EN
  105. //配置工具是否使能了按键2/3/4/5击功能?
  106. if (xcfg_cb.user_key_multi_press_en) {
  107. key_return = key_multi_press_process(key_return);
  108. }
  109. #endif
  110. return key_return;
  111. }
  112. AT(.com_rodata.bsp.key)
  113. const char key_enqueue_str[] = "enqueue: %04x\n";
  114. AT(.com_text.bsp.key)
  115. static bool bsp_key_pwron_filter(u16 key_val)
  116. {
  117. if ((sys_cb.poweron_flag) && ((key_val & K_PWR_MASK) == K_PWR)) {
  118. return true; //剔除开机过程PWRKEY产处的按键消息
  119. }
  120. return false;
  121. }
  122. AT(.com_text.bsp.key)
  123. u8 bsp_key_scan_do(void)
  124. {
  125. u8 key_val = NO_KEY;
  126. if (!bsp_saradc_process()) {
  127. return NO_KEY;
  128. }
  129. #if USER_KEY_KNOB_EN
  130. knob_process();
  131. #endif
  132. #if USER_TKEY
  133. key_val = bsp_tkey_scan();
  134. #endif
  135. #if USER_PWRKEY
  136. if ((key_val == NO_KEY) && (!PWRKEY_2_HW_PWRON)) {
  137. key_val = pwrkey_get_val();
  138. }
  139. #endif
  140. #if USER_IOKEY
  141. if (key_val == NO_KEY) {
  142. key_val = get_iokey();
  143. }
  144. #endif
  145. #if USER_ADKEY || USER_ADKEY2 ||USER_ADKEY_MUX_SDCLK
  146. #if HLW_UI
  147. if(key_val == KEY_PLAY_PWR_USER_DEF)
  148. {
  149. if(adkey_get_val() == KEY_VOL_UP_NEXT)
  150. {
  151. key_val = KEY_PWR_NEXT;
  152. }
  153. }
  154. else if(key_val == NO_KEY)
  155. {
  156. key_val = adkey_get_val();
  157. }
  158. #else
  159. if (key_val == NO_KEY) {
  160. key_val = adkey_get_val();
  161. }
  162. #endif
  163. #endif
  164. return key_val;
  165. }
  166. AT(.com_text.bsp.key)
  167. u8 bsp_key_scan(void)
  168. {
  169. u8 key_val;
  170. u16 key = NO_KEY;
  171. key_val = bsp_key_scan_do();
  172. key = bsp_key_process(key_val);
  173. if ((key != NO_KEY) && (!bsp_key_pwron_filter(key))) {
  174. //防止enqueue多次HOLD消息
  175. if ((key & KEY_TYPE_MASK) == KEY_LONG) {
  176. sys_cb.kh_vol_msg = (key & 0xff) | KEY_HOLD;
  177. } else if ((key & KEY_TYPE_MASK) == KEY_LONG_UP) {
  178. msg_queue_detach(sys_cb.kh_vol_msg, 0);
  179. sys_cb.kh_vol_msg = NO_KEY;
  180. } else if (sys_cb.kh_vol_msg == key) {
  181. msg_queue_detach(key, 0);
  182. }
  183. // printf(key_enqueue_str, key);
  184. msg_enqueue(key);
  185. }
  186. return key_val;
  187. }
  188. uint8_t bsp_key_pwr_scan(void)
  189. {
  190. uint8_t key_val = NO_KEY;
  191. #if USER_TKEY
  192. key_val = bsp_tkey_scan();
  193. #endif
  194. #if USER_PWRKEY
  195. if (key_val == NO_KEY) {
  196. key_val = pwrkey_get_val();
  197. }
  198. #endif // USER_PWRKEY
  199. return key_val;
  200. }