mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Flexible events
Permit event callbacks to accept no parameters, or a single parameter providing the source input object
This commit is contained in:
		| @@ -1,5 +1,7 @@ | |||||||
| from __future__ import division | from __future__ import division | ||||||
|  |  | ||||||
|  | import inspect | ||||||
|  | from functools import wraps | ||||||
| from time import sleep, time | from time import sleep, time | ||||||
| from threading import Event | from threading import Event | ||||||
|  |  | ||||||
| @@ -54,21 +56,42 @@ class WaitableInputDevice(InputDevice): | |||||||
|         return self._when_activated |         return self._when_activated | ||||||
|  |  | ||||||
|     def _set_when_activated(self, value): |     def _set_when_activated(self, value): | ||||||
|         if not callable(value) and value is not None: |         self._when_activated = self._wrap_callback(value) | ||||||
|             raise InputDeviceError('value must be None or a function') |  | ||||||
|         self._when_activated = value |  | ||||||
|     when_activated = property(_get_when_activated, _set_when_activated) |     when_activated = property(_get_when_activated, _set_when_activated) | ||||||
|  |  | ||||||
|     def _get_when_deactivated(self): |     def _get_when_deactivated(self): | ||||||
|         return self._when_deactivated |         return self._when_deactivated | ||||||
|  |  | ||||||
|     def _set_when_deactivated(self, value): |     def _set_when_deactivated(self, value): | ||||||
|         if not callable(value) and value is not None: |         self._when_deactivated = self._wrap_callback(value) | ||||||
|             raise InputDeviceError('value must be None or a function') |  | ||||||
|         self._when_deactivated = value |  | ||||||
|  |  | ||||||
|     when_deactivated = property(_get_when_deactivated, _set_when_deactivated) |     when_deactivated = property(_get_when_deactivated, _set_when_deactivated) | ||||||
|  |  | ||||||
|  |     def _wrap_callback(self, fn): | ||||||
|  |         if fn is None: | ||||||
|  |             return None | ||||||
|  |         elif not callable(fn): | ||||||
|  |             raise InputDeviceError('value must be None or a callable') | ||||||
|  |         else: | ||||||
|  |             # Try binding ourselves to the argspec of the provided callable. | ||||||
|  |             # If this works, assume the function is capable of accepting us | ||||||
|  |             # as the only (mandatory) parameter. | ||||||
|  |             try: | ||||||
|  |                 inspect.getcallargs(fn, self) | ||||||
|  |                 @wraps(fn) | ||||||
|  |                 def wrapper(): | ||||||
|  |                     return fn(self) | ||||||
|  |                 return wrapper | ||||||
|  |             except TypeError: | ||||||
|  |                 try: | ||||||
|  |                     inspect.getcallargs(fn) | ||||||
|  |                     return fn | ||||||
|  |                 except TypeError: | ||||||
|  |                     raise InputDeviceError( | ||||||
|  |                         'value must be a callable which accepts up to one ' | ||||||
|  |                         'mandatory parameter') | ||||||
|  |  | ||||||
|     def _fire_events(self): |     def _fire_events(self): | ||||||
|         old_state = self._last_state |         old_state = self._last_state | ||||||
|         new_state = self._last_state = self.is_active |         new_state = self._last_state = self.is_active | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user