Remove wait_for_input, add_callback and remove_callback from the base
InputDevice class and add specific things for LightSensor:
wait_for_light and wait_for_dark to wait on those events occurring, and
when_light and when_dark which can be set to callbacks to call on those
events occurring.
* Move `is_active` to `GPIODevice`; it's equally applicable to inputs
and outputs so there's no point having it just in inputs
* Flip the pull-up status for `MotionSensor` (it was backwards leading
to reversed readings from the sensor)
* Add a `threshold` to `MotionSensor` (optional), and `value` (similar
to `LightSensor`)
* Also expose `pull_up` as a simple bool property
* Rejig `LightSensor` so it also derives from `InputDevice` (it inherits
enough to make it worthwhile) and so that its API is similar to
`MotionSensor` (a `value` property with a `*_detected` property, and a
background threaded queue which constantly monitors values)
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).
Small patch to ensure GPIO.cleanup is always called on interpreter
shutdown. This just means the library will "play nice" with whatever
comes afterward.
This is a quick *untested* implementation of a background threaded
queue for `MotionSensor`. The optional *queue_len* is the number of
values to store in the queue, *sample_rate* is the number of times per
second to query the motion sensor, and if *partial* is False (the
default) then the `motion_detected` property won't return anything until
the queue has been filled.
Expand gitignore to include the usual py developing stuff, add an
__init__ to make this a legitimate package, move GPIO initialization
into the package init, import all stuff from input and output devices in
the package to enable the access demonstrated in the example, remove a
duplicate method from LightSensor, and make motion_detected a property
(for consistency with is_active which it presumably parallels).