Files
python-gpiozero/gpiozero/output_devices.py
Dave Jones 7c647ec616 Fix #23
Add OutputDevice.toggle method with locking for correct threaded
operation
2015-09-23 13:38:37 +01:00

106 lines
2.4 KiB
Python

from time import sleep
from threading import Lock
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
self._lock = Lock()
def blink(self, on_time=1, off_time=1):
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()
def toggle(self):
with self._lock:
if self.is_active:
self.off()
else:
self.on()
class Buzzer(OutputDevice):
pass
class Motor(OutputDevice):
pass
class Robot(object):
def __init__(self, left=None, right=None):
if not all([left, right]):
raise GPIODeviceError('left and right pins must be provided')
self._left = Motor(left)
self._right = Motor(right)
def left(self, seconds=None):
self._left.on()
if seconds is not None:
sleep(seconds)
self._left.off()
def right(self, seconds=None):
self._right.on()
if seconds is not None:
sleep(seconds)
self._right.off()
def forwards(self, seconds=None):
self.left()
self.right()
if seconds is not None:
sleep(seconds)
self.stop()
def stop(self):
self._left.off()
self._right.off()