mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Merge pull request #161 from lurch/LEDBoard_background_blinking
Add a blink thread to LEDBoard
This commit is contained in:
		@@ -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):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user