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