mirror of
https://github.com/KevinMidboe/python-gpiozero.git
synced 2025-10-29 17:50:37 +00:00
Fix #32
This commit is contained in:
@@ -62,6 +62,9 @@ class GPIOThread(Thread):
|
|||||||
def stop(self):
|
def stop(self):
|
||||||
self.stopping.set()
|
self.stopping.set()
|
||||||
self.join()
|
self.join()
|
||||||
|
|
||||||
|
def join(self):
|
||||||
|
super(GPIOThread, self).join()
|
||||||
_GPIO_THREADS.discard(self)
|
_GPIO_THREADS.discard(self)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from time import sleep
|
from time import sleep
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
from itertools import repeat
|
||||||
|
|
||||||
from RPi import GPIO
|
from RPi import GPIO
|
||||||
|
|
||||||
@@ -42,19 +43,19 @@ class DigitalOutputDevice(OutputDevice):
|
|||||||
|
|
||||||
def on(self):
|
def on(self):
|
||||||
"""
|
"""
|
||||||
Turn the device on.
|
Turns the device on.
|
||||||
"""
|
"""
|
||||||
self._stop_blink()
|
self._stop_blink()
|
||||||
super(DigitalOutputDevice, self).on()
|
super(DigitalOutputDevice, self).on()
|
||||||
|
|
||||||
def off(self):
|
def off(self):
|
||||||
"""
|
"""
|
||||||
Turn the device off.
|
Turns the device off.
|
||||||
"""
|
"""
|
||||||
self._stop_blink()
|
self._stop_blink()
|
||||||
super(DigitalOutputDevice, self).off()
|
super(DigitalOutputDevice, self).off()
|
||||||
|
|
||||||
def blink(self, on_time=1, off_time=1):
|
def blink(self, on_time=1, off_time=1, n=None, background=True):
|
||||||
"""
|
"""
|
||||||
Make the device turn on and off repeatedly in the background.
|
Make the device turn on and off repeatedly in the background.
|
||||||
|
|
||||||
@@ -63,12 +64,24 @@ class DigitalOutputDevice(OutputDevice):
|
|||||||
|
|
||||||
off_time: 1
|
off_time: 1
|
||||||
Number of seconds off
|
Number of seconds off
|
||||||
|
|
||||||
|
n: None
|
||||||
|
Number of times to blink; None means forever
|
||||||
|
|
||||||
|
background: True
|
||||||
|
If True, start a background thread to continue blinking and return
|
||||||
|
immediately. If False, only return when the blink is finished
|
||||||
|
(warning: the default value of n will result in this method never
|
||||||
|
returning).
|
||||||
"""
|
"""
|
||||||
self._stop_blink()
|
self._stop_blink()
|
||||||
self._blink_thread = GPIOThread(
|
self._blink_thread = GPIOThread(
|
||||||
target=self._blink_led, args=(on_time, off_time)
|
target=self._blink_led, args=(on_time, off_time, n)
|
||||||
)
|
)
|
||||||
self._blink_thread.start()
|
self._blink_thread.start()
|
||||||
|
if not background:
|
||||||
|
self._blink_thread.join()
|
||||||
|
self._blink_thread = None
|
||||||
|
|
||||||
def toggle(self):
|
def toggle(self):
|
||||||
"""
|
"""
|
||||||
@@ -81,33 +94,14 @@ class DigitalOutputDevice(OutputDevice):
|
|||||||
else:
|
else:
|
||||||
self.on()
|
self.on()
|
||||||
|
|
||||||
def flash(self, on_time=1, off_time=1, n=1):
|
|
||||||
"""
|
|
||||||
Turn the device on and off a given number of times.
|
|
||||||
|
|
||||||
on_time: 1
|
|
||||||
Number of seconds on
|
|
||||||
|
|
||||||
off_time: 1
|
|
||||||
Number of seconds off
|
|
||||||
|
|
||||||
n: 1
|
|
||||||
Number of iterations
|
|
||||||
"""
|
|
||||||
for i in range(n):
|
|
||||||
self.on()
|
|
||||||
sleep(on_time)
|
|
||||||
self.off()
|
|
||||||
if i+1 < n: # don't sleep on final iteration
|
|
||||||
sleep(off_time)
|
|
||||||
|
|
||||||
def _stop_blink(self):
|
def _stop_blink(self):
|
||||||
if self._blink_thread:
|
if self._blink_thread:
|
||||||
self._blink_thread.stop()
|
self._blink_thread.stop()
|
||||||
self._blink_thread = None
|
self._blink_thread = None
|
||||||
|
|
||||||
def _blink_led(self, on_time, off_time):
|
def _blink_led(self, on_time, off_time, n):
|
||||||
while True:
|
iterable = repeat(0) if n is None else repeat(0, n)
|
||||||
|
for i in iterable:
|
||||||
super(DigitalOutputDevice, self).on()
|
super(DigitalOutputDevice, self).on()
|
||||||
if self._blink_thread.stopping.wait(on_time):
|
if self._blink_thread.stopping.wait(on_time):
|
||||||
break
|
break
|
||||||
@@ -132,7 +126,7 @@ class LED(DigitalOutputDevice):
|
|||||||
"""
|
"""
|
||||||
super(LED, self).off()
|
super(LED, self).off()
|
||||||
|
|
||||||
def blink(self, on_time=1, off_time=1):
|
def blink(self, on_time=1, off_time=1, n=None, background=True):
|
||||||
"""
|
"""
|
||||||
Make the LED turn on and off repeatedly in the background.
|
Make the LED turn on and off repeatedly in the background.
|
||||||
|
|
||||||
@@ -141,8 +135,17 @@ class LED(DigitalOutputDevice):
|
|||||||
|
|
||||||
off_time: 1
|
off_time: 1
|
||||||
Number of seconds off
|
Number of seconds off
|
||||||
|
|
||||||
|
n: None
|
||||||
|
Number of times to blink; None means forever
|
||||||
|
|
||||||
|
background: True
|
||||||
|
If True, start a background thread to continue blinking and return
|
||||||
|
immediately. If False, only return when the blink is finished
|
||||||
|
(warning: the default value of n will result in this method never
|
||||||
|
returning).
|
||||||
"""
|
"""
|
||||||
super(LED, self).blink(on_time, off_time)
|
super(LED, self).blink(on_time, off_time, n, background)
|
||||||
|
|
||||||
def toggle(self):
|
def toggle(self):
|
||||||
"""
|
"""
|
||||||
@@ -151,6 +154,7 @@ class LED(DigitalOutputDevice):
|
|||||||
"""
|
"""
|
||||||
super(LED, self).toggle()
|
super(LED, self).toggle()
|
||||||
|
|
||||||
|
|
||||||
class Buzzer(DigitalOutputDevice):
|
class Buzzer(DigitalOutputDevice):
|
||||||
"""
|
"""
|
||||||
A Buzzer component.
|
A Buzzer component.
|
||||||
@@ -167,7 +171,7 @@ class Buzzer(DigitalOutputDevice):
|
|||||||
"""
|
"""
|
||||||
super(Buzzer, self).off()
|
super(Buzzer, self).off()
|
||||||
|
|
||||||
def blink(self, on_time=1, off_time=1):
|
def blink(self, on_time=1, off_time=1, n=None, background=True):
|
||||||
"""
|
"""
|
||||||
Make the Buzzer turn on and off repeatedly in the background.
|
Make the Buzzer turn on and off repeatedly in the background.
|
||||||
|
|
||||||
@@ -176,8 +180,17 @@ class Buzzer(DigitalOutputDevice):
|
|||||||
|
|
||||||
off_time: 1
|
off_time: 1
|
||||||
Number of seconds off
|
Number of seconds off
|
||||||
|
|
||||||
|
n: None
|
||||||
|
Number of times to blink; None means forever
|
||||||
|
|
||||||
|
background: True
|
||||||
|
If True, start a background thread to continue blinking and return
|
||||||
|
immediately. If False, only return when the blink is finished
|
||||||
|
(warning: the default value of n will result in this method never
|
||||||
|
returning).
|
||||||
"""
|
"""
|
||||||
super(Buzzer, self).blink()
|
super(Buzzer, self).blink(on_time, off_time, n, background)
|
||||||
|
|
||||||
def toggle(self):
|
def toggle(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user