-
Notifications
You must be signed in to change notification settings - Fork 9
/
button.py
68 lines (62 loc) · 2.5 KB
/
button.py
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
#!/usr/bin/python3
import os
import time
import RPi.GPIO as GPIO
"""
A class for the use of pushbuttons connected to the Raspberry Pi.
Buttons need to be pulled down (via external pull down resistor or
by using the pull down functionality of the microcontroller).
This class provides:
- software debounce (no chattering)
- execution of different functions on short press / long press
"""
# - - - - - - - - - - - - - - - -
# - - - - BUTTON CLASS - - - - -
# - - - - - - - - - - - - - - - -
class Button:
def __init__(self, pin, shortPressFun, longPressFun):
self.pin = pin
self.pressedFlag = False
self.helperFlag1 = False
self.releasedCounter = 0
self.longPressTime = 1000; # All time related properties in millisecs
self.pressStartTime = 0;
self.pressEndTime = 0;
self.pressDuration = 0
self.shortPressFun = shortPressFun
self.longPressFun = longPressFun
def update(self):
buttonStatus = GPIO.input(self.pin)
if buttonStatus and not self.helperFlag1:
# Trigger on positive flank of Button Input Signal
self.pressedFlag = True;
self.helperFlag1 = True
self.pressStartTime = self.getTimeStamp()
# helperFlag1 needs to be resetted after the Buttonpress was registered correctly
elif not buttonStatus and self.pressedFlag:
# We get in here when the button was pressed but isn't pressed anymore
self.releasedCounter += 1;
if self.releasedCounter >= 2:
self.pressedFlag = False
self.helperFlag1 = False
self.releasedCounter = 0
self.pressEndTime = self.getTimeStamp()
self.pressDuration = self.pressEndTime - self.pressStartTime
if self.pressDuration >= self.longPressTime:
# Long Press!
self.longPress()
else:
# Short Press!
self.shortPress()
elif buttonStatus and self.pressedFlag:
# Reset the releasedCounter if the buttonStatus gets high again very fast
self.releasedCounter = 0;
def getTimeStamp(self):
# returns the current TimeStamp in millisecs
return int(time.time()*1000)
def longPress(self):
print("pin {0} long press".format(self.pin))
self.longPressFun()
def shortPress(self):
print("pin {0} short press".format(self.pin))
self.shortPressFun()