From 3ed1ab84468159a44f6e176aad4fa52d2ad203ec Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Mon, 1 Feb 2016 04:49:54 +0000 Subject: [PATCH] Add a blink thread to LEDBoard Fixes #94 --- gpiozero/boards.py | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/gpiozero/boards.py b/gpiozero/boards.py index 3b1d986..a9040ee 100644 --- a/gpiozero/boards.py +++ b/gpiozero/boards.py @@ -11,11 +11,12 @@ except ImportError: from time import sleep from collections import namedtuple +from itertools import repeat from .exc import InputDeviceError, OutputDeviceError from .input_devices import Button from .output_devices import LED, PWMLED, Buzzer, Motor -from .devices import CompositeDevice, SourceMixin +from .devices import GPIOThread, CompositeDevice, SourceMixin class LEDBoard(SourceMixin, CompositeDevice): @@ -41,12 +42,14 @@ class LEDBoard(SourceMixin, CompositeDevice): parameter can only be specified as a keyword parameter. """ def __init__(self, *pins, **kwargs): + self._blink_thread = None super(LEDBoard, self).__init__() pwm = kwargs.get('pwm', False) LEDClass = PWMLED if pwm else LED self._leds = tuple(LEDClass(pin) for pin in pins) def close(self): + self._stop_blink() for led in self.leds: led.close() @@ -79,6 +82,7 @@ class LEDBoard(SourceMixin, CompositeDevice): """ Turn all the LEDs on. """ + self._stop_blink() for led in self.leds: led.on() @@ -86,6 +90,7 @@ class LEDBoard(SourceMixin, CompositeDevice): """ Turn all the LEDs off. """ + self._stop_blink() for led in self.leds: led.off() @@ -116,9 +121,31 @@ class LEDBoard(SourceMixin, CompositeDevice): finished (warning: the default value of *n* will result in this method never returning). """ - # XXX This isn't going to work for background=False - for led in self.leds: - led.blink(on_time, off_time, n, background) + self._stop_blink() + self._blink_thread = GPIOThread( + target=self._blink_leds, args=(on_time, off_time, n) + ) + self._blink_thread.start() + if not background: + self._blink_thread.join() + self._blink_thread = None + + def _stop_blink(self): + if self._blink_thread: + self._blink_thread.stop() + self._blink_thread = None + + def _blink_leds(self, on_time, off_time, n): + iterable = repeat(0) if n is None else repeat(0, n) + for i in iterable: + for led in self.leds: + led.on() + if self._blink_thread.stopping.wait(on_time): + break + for led in self.leds: + led.off() + if self._blink_thread.stopping.wait(off_time): + break class PiLiter(LEDBoard):