import time
from sys import exit
try:
import cap1xxx
except ImportError:
exit("This library requires the cap1xxx module\nInstall with: sudo pip install cap1xxx")
__version__ = '0.0.1'
dh = cap1xxx.Cap1166(i2c_addr=0x2c)
auto_leds = True
PADS = list(range(1,7))
NAMES = [
'Back', 'A', 'B', 'C', 'D', 'Enter'
]
LEDMAP = [
5, 4, 3, 2, 1, 0
]
NUMMAP = [
1, 2, 3, 4, 5, 6
]
_on_press = [None] * 6
_on_release = [None] * 6
[docs]def on_touch(pad, handler=None):
"""Register a function to be called when a pad or pads are hit.
The function should expect one argument: event. You can look at event.pad to determine which pad was hit.
:param pad: A single integer 0 to 5, a pad name (Back, A, B, C, D, Enter), or a list
:param handler: The handler function to call on hit
"""
global _on_press
if handler is None:
def decorate(handler):
global _on_press
_bind_handler(_on_press, pad, handler)
return decorate
_bind_handler(_on_press, pad, handler)
[docs]def on_release(pad, handler=None):
"""Register a function to be called when a pad or pads are released.
The function should expect one argument: event. You can look at event.pad to determine which pad was released.
:param pad: A single integer from 0 to 5, a pad name (Back, A, B, C, D, Enter), or a list
:param handler: The handler function to call on release
"""
global _on_release
if handler is None:
def decorate(handler):
global _on_release
_bind_handler(_on_release, pad, handler)
return decorate
_bind_handler(_on_release, pad, handler)
def _bind_handler(target, pad, handler):
if type(pad) == list:
for p in pad:
channel = _pad_to_channel(p)
target[channel] = handler
else:
channel = _pad_to_channel(pad)
target[channel] = handler
def _pad_to_channel(pad):
try:
if type(pad) == str:
return NAMES.index(pad)
else:
return NUMMAP.index(pad)
except ValueError:
raise TypeError("Invalid touch pad {}".format(pad))
def _handle_press(event):
global _on_press
channel = event.channel
event.name = NAMES[channel]
event.pad = NUMMAP[channel]
if auto_leds:
dh.set_led_state(LEDMAP[channel], True)
if callable(_on_press[channel]):
try:
_on_press[channel](event)
except TypeError:
_on_press[channel]()
def _handle_release(event):
global _on_release
channel = event.channel
event.name = NAMES[channel]
event.pad = NUMMAP[channel]
if auto_leds:
dh.set_led_state(LEDMAP[channel], False)
if callable(_on_release[channel]):
try:
_on_release[channel](event)
except TypeError:
_on_release[channel]()
[docs]def led_on(pad):
"""Turn on an LED corresponding to a single pad.
:param pad: A single integer from 0 to 5 or a pad name (Back, A, B, C, D, Enter), corresponding to the pad whose LED you want to turn on.
"""
set_led(pad, True)
[docs]def all_off():
"""Turn off all LEDs"""
for pad in PADS:
led_off(pad)
[docs]def all_on():
"""Turn on all LEDs"""
for pad in PADS:
led_on(pad)
[docs]def led_off(pad):
"""Turn off an LED corresponding to a single pad.
:param pad: A single integer from 0 to 5 or a pad name (Back, A, B, C, D, Enter), corresponding to the pad whose LED you want to turn off.
"""
set_led(pad, False)
def set_led(pad, value):
idx = _pad_to_channel(pad)
led = LEDMAP[idx]
dh.set_led_state(led, value)
for x in range(6):
dh.on(x,event='press', handler=_handle_press)
dh.on(x,event='release', handler=_handle_release)
#"""Unlink the LEDs since Touch pHAT's LEDs don't match up with the channels"""
dh._write_byte(cap1xxx.R_LED_LINKING, 0b00000000)