-
Notifications
You must be signed in to change notification settings - Fork 1
/
led.py
154 lines (123 loc) · 2.82 KB
/
led.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
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
"""
Module for controlling LEDs hooked into the GPIO ports on a Rasberry Pi.
"""
import time
import threading
__version__ = '0.3'
__all__ = ['GPIOLED', '__version__', '__all__']
class GPIOLED(object):
"""
Class for controlling an LED via GPIO.
"""
def __init__(self, pin):
"""
Initialize the class with a GPIO pin number and make sure that the
specified as been exported via /sys/class/gpio/export and that it
is marked for output.
"""
# GPIO pin
self.pin = int(pin)
# State information (for polling)
self.state = 'unknown'
# Thread information for blinking
self.thread = None
self.alive = threading.Event()
# Setup
if self.pin > 0:
try:
# Export
fh = open('/sys/class/gpio/export', 'w')
fh.write(str(self.pin))
fh.flush()
fh.close()
# Direction
fh = open('/sys/class/gpio/gpio%i/direction' % self.pin, 'w')
fh.write('out')
fh.flush()
fh.close()
except IOError:
pass
def getState(self):
"""
Get the state of the LED.
"""
return self.state
def on(self):
"""
Turn the LED on.
"""
if self.pin > 0:
try:
fh = open('/sys/class/gpio/gpio%i/value' % self.pin, 'w')
fh.write('1')
fh.close()
self.state = 'on'
except IOError:
pass
def off(self):
"""
Turn the LED off.
"""
if self.pin > 0:
try:
fh = open('/sys/class/gpio/gpio%i/value' % self.pin, 'w')
fh.write('0')
fh.close()
self.state = 'off'
except IOError:
pass
def blink(self, blinkPeriod=0.25):
"""
Set the LED to blinking with the specified interval in seconds. This function
starts the LED blinking if it isn't already and stops it if it is.
"""
self.period = float(blinkPeriod)
if self.thread is not None:
self._stop()
self.state = 'off'
else:
self._start()
self.state = 'blink'
def _start(self):
"""
Start the blinking thread.
"""
if self.pin > 0:
if self.thread is None:
self.thread = threading.Thread(target=self._cycle, name='blink%i' % self.pin)
self.thread.setDaemon(1)
self.alive.set()
self.thread.start()
def _stop(self):
"""
Stop the blinking thread.
"""
if self.pin > 0:
if self.thread is not None:
self.alive.clear()
self.thread.join()
self.thread = None
self.off()
def _cycle(self):
"""
Background function for controlling the LED's blinking.
"""
while self.alive.isSet():
# On
try:
fh = open('/sys/class/gpio/gpio%i/value' % self.pin, 'w')
fh.write('1')
fh.close()
except IOError:
pass
if self.alive.isSet():
time.sleep(self.period)
# Off
try:
fh = open('/sys/class/gpio/gpio%i/value' % self.pin, 'w')
fh.write('0')
fh.close()
except IOError:
pass
if self.alive.isSet():
time.sleep(self.period)