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).
This commit is contained in:
Dave Jones
2015-09-18 11:19:13 +01:00
parent c810730cf5
commit e2ddad6fea
4 changed files with 118 additions and 37 deletions

View File

@@ -4,14 +4,11 @@ import atexit
from RPi import GPIO
def gpiozero_shutdown():
GPIO.cleanup()
atexit.register(gpiozero_shutdown)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
from .devices import (
_gpio_threads_shutdown,
GPIODeviceError,
GPIODevice,
)
from .input_devices import (
InputDeviceError,
InputDevice,
@@ -26,3 +23,13 @@ from .output_devices import (
Buzzer,
Motor,
)
def gpiozero_shutdown():
_gpio_threads_shutdown()
GPIO.cleanup()
atexit.register(gpiozero_shutdown)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)