drv_key.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /**
  2. * @File: flexible_button_demo.c
  3. * @Author: MurphyZhao
  4. * @Date: 2018-09-29
  5. *
  6. * Copyright (c) 2018-2019 MurphyZhao <d2014zjt@163.com>
  7. * https://github.com/murphyzhao
  8. * All rights reserved.
  9. * License-Identifier: Apache-2.0
  10. *
  11. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  12. * not use this file except in compliance with the License.
  13. * You may obtain a copy of the License at
  14. *
  15. * http://www.apache.org/licenses/LICENSE-2.0
  16. *
  17. * Unless required by applicable law or agreed to in writing, software
  18. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  19. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20. * See the License for the specific language governing permissions and
  21. * limitations under the License.
  22. *
  23. * Change logs:
  24. * Date Author Notes
  25. * 2018-09-29 MurphyZhao First add
  26. * 2019-08-02 MurphyZhao 迁移代码到 murphyzhao 仓库
  27. */
  28. #include <rtthread.h>
  29. #include "flexible_button.h"
  30. #include <stdint.h>
  31. #include <rtdevice.h>
  32. #include <board.h>
  33. /*The button PIN_KEY0,PIN_KEY1,PIN_KEY2 are an expansion button,which users can add according to their needs*/
  34. #define PIN_KEY0 GET_PIN(D,10)
  35. #define PIN_KEY1 GET_PIN(D,9)
  36. #define PIN_KEY2 GET_PIN(D,8)
  37. #define PIN_WK_UP GET_PIN(C,13)
  38. typedef enum
  39. {
  40. USER_BUTTON_0 = 0,
  41. USER_BUTTON_1,
  42. USER_BUTTON_2,
  43. USER_BUTTON_3,
  44. USER_BUTTON_MAX
  45. } user_button_t;
  46. static flex_button_t user_button[USER_BUTTON_MAX];
  47. static void btn_0_cb(flex_button_t *btn)
  48. {
  49. rt_kprintf("btn_0_cb\n");
  50. switch (btn->event)
  51. {
  52. case FLEX_BTN_PRESS_DOWN:
  53. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_DOWN]\n");
  54. break;
  55. case FLEX_BTN_PRESS_CLICK:
  56. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_CLICK]\n");
  57. break;
  58. case FLEX_BTN_PRESS_DOUBLE_CLICK:
  59. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
  60. break;
  61. case FLEX_BTN_PRESS_SHORT_START:
  62. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_SHORT_START]\n");
  63. break;
  64. case FLEX_BTN_PRESS_SHORT_UP:
  65. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
  66. break;
  67. case FLEX_BTN_PRESS_LONG_START:
  68. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_START]\n");
  69. break;
  70. case FLEX_BTN_PRESS_LONG_UP:
  71. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_UP]\n");
  72. break;
  73. case FLEX_BTN_PRESS_LONG_HOLD:
  74. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
  75. break;
  76. case FLEX_BTN_PRESS_LONG_HOLD_UP:
  77. rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
  78. break;
  79. }
  80. }
  81. static void btn_1_cb(flex_button_t *btn)
  82. {
  83. rt_kprintf("btn_1_cb\n");
  84. switch (btn->event)
  85. {
  86. case FLEX_BTN_PRESS_DOWN:
  87. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_DOWN]\n");
  88. break;
  89. case FLEX_BTN_PRESS_CLICK:
  90. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_CLICK]\n");
  91. break;
  92. case FLEX_BTN_PRESS_DOUBLE_CLICK:
  93. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
  94. break;
  95. case FLEX_BTN_PRESS_SHORT_START:
  96. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_SHORT_START]\n");
  97. break;
  98. case FLEX_BTN_PRESS_SHORT_UP:
  99. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
  100. break;
  101. case FLEX_BTN_PRESS_LONG_START:
  102. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_START]\n");
  103. break;
  104. case FLEX_BTN_PRESS_LONG_UP:
  105. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_UP]\n");
  106. break;
  107. case FLEX_BTN_PRESS_LONG_HOLD:
  108. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
  109. break;
  110. case FLEX_BTN_PRESS_LONG_HOLD_UP:
  111. rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
  112. break;
  113. }
  114. }
  115. static void btn_2_cb(flex_button_t *btn)
  116. {
  117. rt_kprintf("btn_2_cb\n");
  118. switch (btn->event)
  119. {
  120. case FLEX_BTN_PRESS_DOWN:
  121. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_DOWN]\n");
  122. break;
  123. case FLEX_BTN_PRESS_CLICK:
  124. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_CLICK]\n");
  125. break;
  126. case FLEX_BTN_PRESS_DOUBLE_CLICK:
  127. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
  128. break;
  129. case FLEX_BTN_PRESS_SHORT_START:
  130. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_SHORT_START]\n");
  131. break;
  132. case FLEX_BTN_PRESS_SHORT_UP:
  133. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
  134. break;
  135. case FLEX_BTN_PRESS_LONG_START:
  136. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_START]\n");
  137. break;
  138. case FLEX_BTN_PRESS_LONG_UP:
  139. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_UP]\n");
  140. break;
  141. case FLEX_BTN_PRESS_LONG_HOLD:
  142. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
  143. break;
  144. case FLEX_BTN_PRESS_LONG_HOLD_UP:
  145. rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
  146. break;
  147. }
  148. }
  149. static void btn_3_cb(flex_button_t *btn)
  150. {
  151. rt_kprintf("btn_3_cb\n");
  152. switch (btn->event)
  153. {
  154. case FLEX_BTN_PRESS_DOWN:
  155. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_DOWN]\n");
  156. break;
  157. case FLEX_BTN_PRESS_CLICK:
  158. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_CLICK]\n");
  159. break;
  160. case FLEX_BTN_PRESS_DOUBLE_CLICK:
  161. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
  162. break;
  163. case FLEX_BTN_PRESS_SHORT_START:
  164. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_SHORT_START]\n");
  165. break;
  166. case FLEX_BTN_PRESS_SHORT_UP:
  167. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
  168. break;
  169. case FLEX_BTN_PRESS_LONG_START:
  170. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_START]\n");
  171. break;
  172. case FLEX_BTN_PRESS_LONG_UP:
  173. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_UP]\n");
  174. break;
  175. case FLEX_BTN_PRESS_LONG_HOLD:
  176. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
  177. break;
  178. case FLEX_BTN_PRESS_LONG_HOLD_UP:
  179. rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
  180. break;
  181. }
  182. }
  183. static uint8_t button_key0_read(void)
  184. {
  185. return rt_pin_read(PIN_KEY0);
  186. }
  187. static uint8_t button_key1_read(void)
  188. {
  189. return rt_pin_read(PIN_KEY1);
  190. }
  191. static uint8_t button_key2_read(void)
  192. {
  193. return rt_pin_read(PIN_KEY2);
  194. }
  195. static uint8_t button_keywkup_read(void)
  196. {
  197. return rt_pin_read(PIN_WK_UP);
  198. }
  199. static void button_scan(void *arg)
  200. {
  201. while(1)
  202. {
  203. flex_button_scan();
  204. rt_thread_mdelay(20);
  205. }
  206. }
  207. static void user_button_init(void)
  208. {
  209. int i;
  210. rt_memset(&user_button[0], 0x0, sizeof(user_button));
  211. user_button[USER_BUTTON_0].usr_button_read = button_key0_read;
  212. user_button[USER_BUTTON_1].usr_button_read = button_key1_read;
  213. user_button[USER_BUTTON_2].usr_button_read = button_key2_read;
  214. user_button[USER_BUTTON_3].usr_button_read = button_keywkup_read;
  215. user_button[USER_BUTTON_3].cb = (flex_button_response_callback)btn_3_cb;
  216. rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT); /* set KEY pin mode to input */
  217. rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT); /* set KEY pin mode to input */
  218. rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT); /* set KEY pin mode to input */
  219. rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT); /* set KEY pin mode to input */
  220. for (i = 0; i < USER_BUTTON_MAX; i ++)
  221. {
  222. user_button[i].pressed_logic_level = 0;
  223. user_button[i].click_start_tick = 20;
  224. user_button[i].short_press_start_tick = 100;
  225. user_button[i].long_press_start_tick = 200;
  226. user_button[i].long_hold_start_tick = 300;
  227. if (i == USER_BUTTON_3)
  228. {
  229. user_button[USER_BUTTON_3].pressed_logic_level = 1;
  230. }
  231. flex_button_register(&user_button[i]);
  232. }
  233. }
  234. int flex_button_main(void)
  235. {
  236. rt_thread_t tid = RT_NULL;
  237. user_button_init();
  238. /* Create background ticks thread */
  239. tid = rt_thread_create("flex_btn", button_scan, RT_NULL, 1024, 10, 10);
  240. if(tid != RT_NULL)
  241. {
  242. rt_thread_startup(tid);
  243. }
  244. return 0;
  245. }
  246. #ifdef FINSH_USING_MSH
  247. INIT_APP_EXPORT(flex_button_main);
  248. #endif