Source code for rainbowhat.touch
try:
import RPi.GPIO as GPIO
except ImportError:
raise ImportError("This library requires the RPi.GPIO module\nInstall with: sudo pip install RPi.GPIO")
PIN_A = 21
PIN_B = 20
PIN_C = 16
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
[docs]class Button(object):
def __init__(self, index, gpio_pin):
object.__init__(self)
self.pressed = False
self._on_press_handler = None
self._on_release_handler = None
self._gpio_pin = gpio_pin
self._index = index
self._is_setup = False
def setup(self):
if self._is_setup:
return
GPIO.setup(self._gpio_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(self._gpio_pin, GPIO.BOTH, bouncetime=1, callback=self._handle_button)
self._is_setup = True
def _handle_button(self, pin):
self.pressed = GPIO.input(pin) != GPIO.HIGH
if self.pressed and callable(self._on_press_handler):
try:
self._on_press_handler(self._index, self._gpio_pin)
except TypeError:
self._on_press_handler(self._index)
elif callable(self._on_release_handler):
try:
self._on_release_handler(self._index, self._gpio_pin)
except TypeError:
self._on_release_handler(self._index)
[docs] def press(self, handler=None):
"""Bind a function to handle touch press."""
self.setup()
if handler is None:
def decorate(handler):
self._on_press_handler = handler
return decorate
self._on_press_handler = handler
[docs] def release(self, handler=None):
"""Bind a funciton to handle touch release."""
self.setup()
if handler is None:
def decorate(handler):
self._on_release_handler = handler
return decorate
self._on_release_handler = handler
class Buttons(object):
A = Button(0, PIN_A)
B = Button(1, PIN_B)
C = Button(2, PIN_C)
_all = [A, B, C]
def __getitem__(self, key):
return self._all[key]
def press(self, handler=None):
if handler is None:
def decorate(handler):
self.A.press(handler)
self.B.press(handler)
self.C.press(handler)
return decorate
self.A.press(handler)
self.B.press(handler)
self.C.press(handler)
def release(self, handler=None):
if handler is None:
def decorate(handler):
self.A.release(handler)
self.B.release(handler)
self.C.release(handler)
return decorate
self.A.release(handler)
self.B.release(handler)
self.C.release(handler)
Buttons = Buttons()