mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Fix #32
This commit is contained in:
		| @@ -62,6 +62,9 @@ class GPIOThread(Thread): | ||||
|     def stop(self): | ||||
|         self.stopping.set() | ||||
|         self.join() | ||||
|  | ||||
|     def join(self): | ||||
|         super(GPIOThread, self).join() | ||||
|         _GPIO_THREADS.discard(self) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| from time import sleep | ||||
| from threading import Lock | ||||
| from itertools import repeat | ||||
|  | ||||
| from RPi import GPIO | ||||
|  | ||||
| @@ -42,19 +43,19 @@ class DigitalOutputDevice(OutputDevice): | ||||
|  | ||||
|     def on(self): | ||||
|         """ | ||||
|         Turn the device on. | ||||
|         Turns the device on. | ||||
|         """ | ||||
|         self._stop_blink() | ||||
|         super(DigitalOutputDevice, self).on() | ||||
|  | ||||
|     def off(self): | ||||
|         """ | ||||
|         Turn the device off. | ||||
|         Turns the device off. | ||||
|         """ | ||||
|         self._stop_blink() | ||||
|         super(DigitalOutputDevice, self).off() | ||||
|  | ||||
|     def blink(self, on_time=1, off_time=1): | ||||
|     def blink(self, on_time=1, off_time=1, n=None, background=True): | ||||
|         """ | ||||
|         Make the device turn on and off repeatedly in the background. | ||||
|  | ||||
| @@ -63,12 +64,24 @@ class DigitalOutputDevice(OutputDevice): | ||||
|  | ||||
|         off_time: 1 | ||||
|             Number of seconds off | ||||
|  | ||||
|         n: None | ||||
|             Number of times to blink; None means forever | ||||
|  | ||||
|         background: True | ||||
|             If True, start a background thread to continue blinking and return | ||||
|             immediately. If False, only return when the blink is finished | ||||
|             (warning: the default value of n will result in this method never | ||||
|             returning). | ||||
|         """ | ||||
|         self._stop_blink() | ||||
|         self._blink_thread = GPIOThread( | ||||
|             target=self._blink_led, args=(on_time, off_time) | ||||
|             target=self._blink_led, args=(on_time, off_time, n) | ||||
|         ) | ||||
|         self._blink_thread.start() | ||||
|         if not background: | ||||
|             self._blink_thread.join() | ||||
|             self._blink_thread = None | ||||
|  | ||||
|     def toggle(self): | ||||
|         """ | ||||
| @@ -81,33 +94,14 @@ class DigitalOutputDevice(OutputDevice): | ||||
|             else: | ||||
|                 self.on() | ||||
|  | ||||
|     def flash(self, on_time=1, off_time=1, n=1): | ||||
|         """ | ||||
|         Turn the device on and off a given number of times. | ||||
|  | ||||
|         on_time: 1 | ||||
|             Number of seconds on | ||||
|  | ||||
|         off_time: 1 | ||||
|             Number of seconds off | ||||
|  | ||||
|         n: 1 | ||||
|             Number of iterations | ||||
|         """ | ||||
|         for i in range(n): | ||||
|             self.on() | ||||
|             sleep(on_time) | ||||
|             self.off() | ||||
|             if i+1 < n:  # don't sleep on final iteration | ||||
|                 sleep(off_time) | ||||
|  | ||||
|     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: | ||||
|     def _blink_led(self, on_time, off_time, n): | ||||
|         iterable = repeat(0) if n is None else repeat(0, n) | ||||
|         for i in iterable: | ||||
|             super(DigitalOutputDevice, self).on() | ||||
|             if self._blink_thread.stopping.wait(on_time): | ||||
|                 break | ||||
| @@ -132,7 +126,7 @@ class LED(DigitalOutputDevice): | ||||
|         """ | ||||
|         super(LED, self).off() | ||||
|  | ||||
|     def blink(self, on_time=1, off_time=1): | ||||
|     def blink(self, on_time=1, off_time=1, n=None, background=True): | ||||
|         """ | ||||
|         Make the LED turn on and off repeatedly in the background. | ||||
|  | ||||
| @@ -141,8 +135,17 @@ class LED(DigitalOutputDevice): | ||||
|  | ||||
|         off_time: 1 | ||||
|             Number of seconds off | ||||
|  | ||||
|         n: None | ||||
|             Number of times to blink; None means forever | ||||
|  | ||||
|         background: True | ||||
|             If True, start a background thread to continue blinking and return | ||||
|             immediately. If False, only return when the blink is finished | ||||
|             (warning: the default value of n will result in this method never | ||||
|             returning). | ||||
|         """ | ||||
|         super(LED, self).blink(on_time, off_time) | ||||
|         super(LED, self).blink(on_time, off_time, n, background) | ||||
|  | ||||
|     def toggle(self): | ||||
|         """ | ||||
| @@ -151,6 +154,7 @@ class LED(DigitalOutputDevice): | ||||
|         """ | ||||
|         super(LED, self).toggle() | ||||
|  | ||||
|  | ||||
| class Buzzer(DigitalOutputDevice): | ||||
|     """ | ||||
|     A Buzzer component. | ||||
| @@ -167,7 +171,7 @@ class Buzzer(DigitalOutputDevice): | ||||
|         """ | ||||
|         super(Buzzer, self).off() | ||||
|  | ||||
|     def blink(self, on_time=1, off_time=1): | ||||
|     def blink(self, on_time=1, off_time=1, n=None, background=True): | ||||
|         """ | ||||
|         Make the Buzzer turn on and off repeatedly in the background. | ||||
|  | ||||
| @@ -176,8 +180,17 @@ class Buzzer(DigitalOutputDevice): | ||||
|  | ||||
|         off_time: 1 | ||||
|             Number of seconds off | ||||
|  | ||||
|         n: None | ||||
|             Number of times to blink; None means forever | ||||
|  | ||||
|         background: True | ||||
|             If True, start a background thread to continue blinking and return | ||||
|             immediately. If False, only return when the blink is finished | ||||
|             (warning: the default value of n will result in this method never | ||||
|             returning). | ||||
|         """ | ||||
|         super(Buzzer, self).blink() | ||||
|         super(Buzzer, self).blink(on_time, off_time, n, background) | ||||
|  | ||||
|     def toggle(self): | ||||
|         """ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user