-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkas-button.h
66 lines (61 loc) · 2.01 KB
/
kas-button.h
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
/*
Attempt at debouncing buttons efficiently and with minimal latency at the positive edge
This assumes "updateButton" is called at a rate significantly (at least an order of magnitude)
above the haptic rate
Shoutouts to Rob Bothof for the "using a byte as a history of states" trick
Copyright (C) 2017 Kassen Oud
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
//our struct
struct Button
{
bool state; //current state of the button as we see it
unsigned char history; //history of the last 8 measured states
unsigned char pin; //the digital in we'll poll.
};
//takes a pointer to Button struct returns true if the state changed,
//at which point "my_button.state" can be used by your program to get the new state.
bool updateButton( struct Button *but)
{
//note we use the negation here because we assume pullup inputs are used
//delete the "!" if you're not using those.
bool in = !digitalRead( but->pin );
//push back history
but->history = but->history << 1;
//store input in most recent history location
but->history = but->history | (unsigned char)(in);
if (but->state)
{
if (!but->history) //last 8 values were all "off"
{
but->state = false;
return true;
}
else
{
return false;
}
}
else
{
if (in) //we assume buttons do not accidentally turn on
{
but->state = true;
return true;
}
else
{
return false;;
}
}
}