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
29 #include <rtthread.h>
30 #include "flexible_button.h"
31 #include <stdint.h>
32 #include <rtdevice.h>
33 #include <board.h>
34
35 /*The button PIN_KEY0,PIN_KEY1,PIN_KEY2 are an expansion button,which users can add according to their needs*/
36 #define PIN_KEY0 GET_PIN(D,10)
37 #define PIN_KEY1 GET_PIN(D,9)
38 #define PIN_KEY2 GET_PIN(D,8)
39 #define PIN_WK_UP GET_PIN(C,13)
40
41 typedef enum
42 {
43 USER_BUTTON_0 = 0,
44 USER_BUTTON_1,
45 USER_BUTTON_2,
46 USER_BUTTON_3,
47 USER_BUTTON_MAX
48 } user_button_t;
49
50 static flex_button_t user_button[USER_BUTTON_MAX];
51
btn_0_cb(flex_button_t * btn)52 static void btn_0_cb(flex_button_t *btn)
53 {
54 rt_kprintf("btn_0_cb\n");
55 switch (btn->event)
56 {
57 case FLEX_BTN_PRESS_DOWN:
58 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_DOWN]\n");
59 break;
60 case FLEX_BTN_PRESS_CLICK:
61 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_CLICK]\n");
62 break;
63 case FLEX_BTN_PRESS_DOUBLE_CLICK:
64 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
65 break;
66 case FLEX_BTN_PRESS_SHORT_START:
67 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_SHORT_START]\n");
68 break;
69 case FLEX_BTN_PRESS_SHORT_UP:
70 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
71 break;
72 case FLEX_BTN_PRESS_LONG_START:
73 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_START]\n");
74 break;
75 case FLEX_BTN_PRESS_LONG_UP:
76 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_UP]\n");
77 break;
78 case FLEX_BTN_PRESS_LONG_HOLD:
79 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
80 break;
81 case FLEX_BTN_PRESS_LONG_HOLD_UP:
82 rt_kprintf("btn_0_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
83 break;
84 }
85 }
86
btn_1_cb(flex_button_t * btn)87 static void btn_1_cb(flex_button_t *btn)
88 {
89 rt_kprintf("btn_1_cb\n");
90 switch (btn->event)
91 {
92 case FLEX_BTN_PRESS_DOWN:
93 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_DOWN]\n");
94 break;
95 case FLEX_BTN_PRESS_CLICK:
96 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_CLICK]\n");
97 break;
98 case FLEX_BTN_PRESS_DOUBLE_CLICK:
99 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
100 break;
101 case FLEX_BTN_PRESS_SHORT_START:
102 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_SHORT_START]\n");
103 break;
104 case FLEX_BTN_PRESS_SHORT_UP:
105 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
106 break;
107 case FLEX_BTN_PRESS_LONG_START:
108 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_START]\n");
109 break;
110 case FLEX_BTN_PRESS_LONG_UP:
111 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_UP]\n");
112 break;
113 case FLEX_BTN_PRESS_LONG_HOLD:
114 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
115 break;
116 case FLEX_BTN_PRESS_LONG_HOLD_UP:
117 rt_kprintf("btn_1_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
118 break;
119 }
120 }
121
btn_2_cb(flex_button_t * btn)122 static void btn_2_cb(flex_button_t *btn)
123 {
124 rt_kprintf("btn_2_cb\n");
125 switch (btn->event)
126 {
127 case FLEX_BTN_PRESS_DOWN:
128 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_DOWN]\n");
129 break;
130 case FLEX_BTN_PRESS_CLICK:
131 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_CLICK]\n");
132 break;
133 case FLEX_BTN_PRESS_DOUBLE_CLICK:
134 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
135 break;
136 case FLEX_BTN_PRESS_SHORT_START:
137 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_SHORT_START]\n");
138 break;
139 case FLEX_BTN_PRESS_SHORT_UP:
140 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
141 break;
142 case FLEX_BTN_PRESS_LONG_START:
143 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_START]\n");
144 break;
145 case FLEX_BTN_PRESS_LONG_UP:
146 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_UP]\n");
147 break;
148 case FLEX_BTN_PRESS_LONG_HOLD:
149 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
150 break;
151 case FLEX_BTN_PRESS_LONG_HOLD_UP:
152 rt_kprintf("btn_2_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
153 break;
154 }
155 }
156
157
btn_3_cb(flex_button_t * btn)158 static void btn_3_cb(flex_button_t *btn)
159 {
160 rt_kprintf("btn_3_cb\n");
161 switch (btn->event)
162 {
163 case FLEX_BTN_PRESS_DOWN:
164 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_DOWN]\n");
165 break;
166 case FLEX_BTN_PRESS_CLICK:
167 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_CLICK]\n");
168 break;
169 case FLEX_BTN_PRESS_DOUBLE_CLICK:
170 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_DOUBLE_CLICK]\n");
171 break;
172 case FLEX_BTN_PRESS_SHORT_START:
173 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_SHORT_START]\n");
174 break;
175 case FLEX_BTN_PRESS_SHORT_UP:
176 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_SHORT_UP]\n");
177 break;
178 case FLEX_BTN_PRESS_LONG_START:
179 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_START]\n");
180 break;
181 case FLEX_BTN_PRESS_LONG_UP:
182 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_UP]\n");
183 break;
184 case FLEX_BTN_PRESS_LONG_HOLD:
185 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_HOLD]\n");
186 break;
187 case FLEX_BTN_PRESS_LONG_HOLD_UP:
188 rt_kprintf("btn_3_cb [FLEX_BTN_PRESS_LONG_HOLD_UP]\n");
189 break;
190 }
191 }
192
193
194
button_key0_read(void)195 static uint8_t button_key0_read(void)
196 {
197 return rt_pin_read(PIN_KEY0);
198 }
199
button_key1_read(void)200 static uint8_t button_key1_read(void)
201 {
202 return rt_pin_read(PIN_KEY1);
203 }
204
button_key2_read(void)205 static uint8_t button_key2_read(void)
206 {
207 return rt_pin_read(PIN_KEY2);
208 }
209
button_keywkup_read(void)210 static uint8_t button_keywkup_read(void)
211 {
212 return rt_pin_read(PIN_WK_UP);
213 }
214
button_scan(void * arg)215 static void button_scan(void *arg)
216 {
217 while(1)
218 {
219 flex_button_scan();
220 rt_thread_mdelay(20);
221 }
222 }
223
user_button_init(void)224 static void user_button_init(void)
225 {
226 int i;
227
228 rt_memset(&user_button[0], 0x0, sizeof(user_button));
229
230 user_button[USER_BUTTON_0].usr_button_read = button_key0_read;
231 user_button[USER_BUTTON_1].usr_button_read = button_key1_read;
232 user_button[USER_BUTTON_2].usr_button_read = button_key2_read;
233
234 user_button[USER_BUTTON_3].usr_button_read = button_keywkup_read;
235 user_button[USER_BUTTON_3].cb = (flex_button_response_callback)btn_3_cb;
236
237 rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT); /* set KEY pin mode to input */
238 rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT); /* set KEY pin mode to input */
239 rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT); /* set KEY pin mode to input */
240 rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT); /* set KEY pin mode to input */
241
242 for (i = 0; i < USER_BUTTON_MAX; i ++)
243 {
244 user_button[i].pressed_logic_level = 0;
245 user_button[i].click_start_tick = 20;
246 user_button[i].short_press_start_tick = 100;
247 user_button[i].long_press_start_tick = 200;
248 user_button[i].long_hold_start_tick = 300;
249
250 if (i == USER_BUTTON_3)
251 {
252 user_button[USER_BUTTON_3].pressed_logic_level = 1;
253 }
254
255 flex_button_register(&user_button[i]);
256 }
257 }
258
flex_button_main(void)259 int flex_button_main(void)
260 {
261 rt_thread_t tid = RT_NULL;
262
263 user_button_init();
264
265 /* Create background ticks thread */
266 tid = rt_thread_create("flex_btn", button_scan, RT_NULL, 1024, 10, 10);
267 if(tid != RT_NULL)
268 {
269 rt_thread_startup(tid);
270 }
271
272 return 0;
273 }
274 #ifdef FINSH_USING_MSH
275 INIT_APP_EXPORT(flex_button_main);
276 #endif
277