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