Files
python-gpiozero/gpiozero/output_devices.py
Dave Jones e2ddad6fea Shut down GPIO threads nicely
The motion sensor queue doesn't shut down properly at script end at the
moment and prevents the interpreter shutting down. This is because it's
a non-daemon thread so `__del__` never gets run and so on.

This is a bit of a major PR - I can split it up if you want. Firstly it
makes a common base class called `GPIODevice` for both `InputDevice` and
`OutputDevice`. This just takes care of the read-only pin stuff. Next it
makes a `GPIOThread` class that ensures its a daemon thread, and which
also ensures proper cleanup on shutdown.

Finally, it fixes `MotionSensor` to use the new `GPIOThread` class
(tested this time! Works nicely) and adds the `blink` method to the
`LED` class (which also works nicely this time).
2015-09-18 12:45:30 +01:00

61 lines
1.4 KiB
Python

from RPi import GPIO
from .devices import GPIODeviceError, GPIODevice, GPIOThread
class OutputDeviceError(GPIODeviceError):
pass
class OutputDevice(GPIODevice):
def __init__(self, pin=None):
super(OutputDevice, self).__init__(pin)
GPIO.setup(pin, GPIO.OUT)
def on(self):
GPIO.output(self.pin, True)
def off(self):
GPIO.output(self.pin, False)
class LED(OutputDevice):
def __init__(self, pin=None):
super(LED, self).__init__(pin)
self._blink_thread = None
def blink(self, on_time, off_time):
self._stop_blink()
self._blink_thread = GPIOThread(target=self._blink_led, args=(on_time, off_time))
self._blink_thread.start()
def _stop_blink(self):
if self._blink_thread:
self._blink_thread.stop()
self._blink_thread = None
def _blink_led(self, on_time, off_time):
while True:
super(LED, self).on()
if self._blink_thread.stopping.wait(on_time):
break
super(LED, self).off()
if self._blink_thread.stopping.wait(off_time):
break
def on(self):
self._stop_blink()
super(LED, self).on()
def off(self):
self._stop_blink()
super(LED, self).off()
class Buzzer(OutputDevice):
pass
class Motor(OutputDevice):
pass