FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
MultiButton/multi_button.c at master · xiaoe1999/MultiButton · GitHub
xiaoe1999
/
MultiButton
Public
forked from
0x1abin/MultiButton
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
MultiButton
/
multi_button.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
204 lines (185 loc) · 5.06 KB
Breadcrumbs
MultiButton
/
multi_button.c
Copy path
File metadata and controls
204 lines (185 loc) · 5.06 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/
#include
"multi_button.h"
#define
EVENT_CB
(
ev
) if(handle->cb[ev])handle->cb[ev]((Button*)handle)
//button handle list head.
static
struct
Button
*
head_handle
=
NULL
;
/**
* @brief Initializes the button struct handle.
* @param handle: the button handle strcut.
* @param pin_level: read the HAL GPIO of the connet button level.
* @param active_level: pressed GPIO level.
* @param button_id: the button id.
* @retval None
*/
void
button_init
(
struct
Button
*
handle
,
uint8_t
(
*
pin_level
)(
uint8_t
),
uint8_t
active_level
,
uint8_t
button_id
)
{
memset
(
handle
,
0
,
sizeof
(
struct
Button
));
handle
->
event
=
(
uint8_t
)
NONE_PRESS
;
handle
->
hal_button_Level
=
pin_level
;
handle
->
button_level
=
handle
->
hal_button_Level
(
button_id
);
handle
->
active_level
=
active_level
;
handle
->
button_id
=
button_id
;
}
/**
* @brief Attach the button event callback function.
* @param handle: the button handle strcut.
* @param event: trigger event type.
* @param cb: callback function.
* @retval None
*/
void
button_attach
(
struct
Button
*
handle
,
PressEvent
event
,
BtnCallback
cb
)
{
handle
->
cb
[
event
]
=
cb
;
}
/**
* @brief Inquire the button event happen.
* @param handle: the button handle strcut.
* @retval button event.
*/
PressEvent
get_button_event
(
struct
Button
*
handle
)
{
return
(
PressEvent
)(
handle
->
event
);
}
/**
* @brief Button driver core function, driver state machine.
* @param handle: the button handle strcut.
* @retval None
*/
void
button_handler
(
struct
Button
*
handle
)
{
uint8_t
read_gpio_level
=
handle
->
hal_button_Level
(
handle
->
button_id
);
//ticks counter working..
if
((
handle
->
state
)
>
0
)
handle
->
ticks
++
;
/*------------button debounce handle---------------*/
if
(
read_gpio_level
!=
handle
->
button_level
) {
//not equal to prev one
//continue read 3 times same new level change
if
(
++
(
handle
->
debounce_cnt
) >=
DEBOUNCE_TICKS
) {
handle
->
button_level
=
read_gpio_level
;
handle
->
debounce_cnt
=
0
;
}
}
else
{
//leved not change ,counter reset.
handle
->
debounce_cnt
=
0
;
}
/*-----------------State machine-------------------*/
switch
(
handle
->
state
) {
case
0
:
if
(
handle
->
button_level
==
handle
->
active_level
) {
//start press down
handle
->
event
=
(
uint8_t
)
PRESS_DOWN
;
EVENT_CB
(
PRESS_DOWN
);
handle
->
ticks
=
0
;
handle
->
repeat
=
1
;
handle
->
state
=
1
;
}
else
{
handle
->
event
=
(
uint8_t
)
NONE_PRESS
;
}
break
;
case
1
:
if
(
handle
->
button_level
!=
handle
->
active_level
) {
//released press up
handle
->
event
=
(
uint8_t
)
PRESS_UP
;
EVENT_CB
(
PRESS_UP
);
handle
->
ticks
=
0
;
handle
->
state
=
2
;
}
else
if
(
handle
->
ticks
>
LONG_TICKS
) {
handle
->
event
=
(
uint8_t
)
LONG_PRESS_START
;
EVENT_CB
(
LONG_PRESS_START
);
handle
->
state
=
5
;
}
break
;
case
2
:
if
(
handle
->
button_level
==
handle
->
active_level
) {
//press down again
handle
->
event
=
(
uint8_t
)
PRESS_DOWN
;
EVENT_CB
(
PRESS_DOWN
);
handle
->
repeat
++
;
EVENT_CB
(
PRESS_REPEAT
);
// repeat hit
handle
->
ticks
=
0
;
handle
->
state
=
3
;
}
else
if
(
handle
->
ticks
>
SHORT_TICKS
) {
//released timeout
if
(
handle
->
repeat
==
1
) {
handle
->
event
=
(
uint8_t
)
SINGLE_CLICK
;
EVENT_CB
(
SINGLE_CLICK
);
}
else
if
(
handle
->
repeat
==
2
) {
handle
->
event
=
(
uint8_t
)
DOUBLE_CLICK
;
EVENT_CB
(
DOUBLE_CLICK
);
// repeat hit
}
handle
->
state
=
0
;
}
break
;
case
3
:
if
(
handle
->
button_level
!=
handle
->
active_level
) {
//released press up
handle
->
event
=
(
uint8_t
)
PRESS_UP
;
EVENT_CB
(
PRESS_UP
);
if
(
handle
->
ticks
<
SHORT_TICKS
) {
handle
->
ticks
=
0
;
handle
->
state
=
2
;
//repeat press
}
else
{
handle
->
state
=
0
;
}
}
else
if
(
handle
->
ticks
>
SHORT_TICKS
){
// long press up
handle
->
state
=
0
;
}
break
;
case
5
:
if
(
handle
->
button_level
==
handle
->
active_level
) {
//continue hold trigger
handle
->
event
=
(
uint8_t
)
LONG_PRESS_HOLD
;
EVENT_CB
(
LONG_PRESS_HOLD
);
}
else
{
//releasd
handle
->
event
=
(
uint8_t
)
PRESS_UP
;
EVENT_CB
(
PRESS_UP
);
handle
->
state
=
0
;
//reset
}
break
;
default
:
handle
->
state
=
0
;
//reset
break
;
}
}
/**
* @brief Start the button work, add the handle into work list.
* @param handle: target handle strcut.
* @retval 0: succeed. -1: already exist.
*/
int
button_start
(
struct
Button
*
handle
)
{
struct
Button
*
target
=
head_handle
;
while
(
target
) {
if
(
target
==
handle
)
return
-1
;
//already exist.
target
=
target
->
next
;
}
handle
->
next
=
head_handle
;
head_handle
=
handle
;
return
0
;
}
/**
* @brief Stop the button work, remove the handle off work list.
* @param handle: target handle strcut.
* @retval None
*/
void
button_stop
(
struct
Button
*
handle
)
{
struct
Button
*
*
curr
;
for
(
curr
=
&
head_handle
;
*
curr
; ) {
struct
Button
*
entry
=
*
curr
;
if
(
entry
==
handle
) {
*
curr
=
entry
->
next
;
// free(entry);
return
;
//glacier add 2021-8-18
}
else
curr
=
&
entry
->
next
;
}
}
/**
* @brief background ticks, timer repeat invoking interval 5ms.
* @param None.
* @retval None
*/
void
button_ticks
()
{
struct
Button
*
target
;
for
(
target
=
head_handle
;
target
;
target
=
target
->
next
) {
button_handler
(
target
);
}
}
Back
|
FazBrowse Home
|
New Git URL