import atexit
from sys import exit, version_info
try:
import RPi.GPIO as GPIO
except ImportError:
exit("This library requires the RPi.GPIO module\nInstall with: sudo pip install RPi.GPIO")
__version__ = '0.0.2'
DAT_PIN = 10
CLK_PIN = 11
CHANNEL_PINS = [8,7,25,24]
NUM_PIXELS_PER_CHANNEL = 16
NUM_CHANNELS = 4
BRIGHTNESS = 15
MAX_BRIGHTNESS = 0b01111
pixels = [
[[0,0,0,BRIGHTNESS]] * NUM_PIXELS_PER_CHANNEL,
[[0,0,0,BRIGHTNESS]] * NUM_PIXELS_PER_CHANNEL,
[[0,0,0,BRIGHTNESS]] * NUM_PIXELS_PER_CHANNEL,
[[0,0,0,BRIGHTNESS]] * NUM_PIXELS_PER_CHANNEL
]
channels = [(16, False) for c in range(NUM_CHANNELS)]
_gpio_setup = False
_clear_on_exit = True
def _exit():
if _clear_on_exit:
clear()
show()
GPIO.cleanup()
def configure_channel(channel, num_pixels, gamma_correction=False):
global channels
channels[channel - 1] = (num_pixels, False)
def get_pixel_count(channel):
return channels[channel - 1][0]
[docs]def set_brightness(brightness):
"""Set the brightness of all pixels
:param brightness: Brightness: 0.0 to 1.0
"""
for c in range(NUM_CHANNELS):
for x in range(NUM_PIXELS_PER_CHANNEL):
pixels[c][x][3] = int(MAX_BRIGHTNESS * brightness) & MAX_BRIGHTNESS
[docs]def clear_channel(c):
"""Clear a single channel
:param c: Channel to clear: 0 to 3
"""
for x in range(NUM_PIXELS_PER_CHANNEL):
pixels[c-1][x][0:3] = [0,0,0]
[docs]def clear():
"""Clear the pixel buffer"""
for c in range(1, NUM_CHANNELS+1):
clear_channel(c)
def _select_channel(c):
for x in range(NUM_CHANNELS):
GPIO.output(CHANNEL_PINS[x], GPIO.LOW if x==c else GPIO.HIGH)
def _write_byte(byte):
for x in range(8):
GPIO.output(DAT_PIN, byte & 0b10000000)
GPIO.output(CLK_PIN, 1)
byte <<= 1
GPIO.output(CLK_PIN, 0)
# Emit exactly enough clock pulses to latch the small dark die APA102s which are weird
# for some reason it takes 36 clocks, the other IC takes just 4 (number of pixels/2)
def _eof():
GPIO.output(DAT_PIN, 0)
for x in range(42):
GPIO.output(CLK_PIN, 1)
GPIO.output(CLK_PIN, 0)
def _sof():
GPIO.output(DAT_PIN,0)
for x in range(32):
GPIO.output(CLK_PIN, 1)
GPIO.output(CLK_PIN, 0)
[docs]def show():
"""Output the buffer to Mote pHAT"""
global _gpio_setup
if not _gpio_setup:
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup([DAT_PIN,CLK_PIN],GPIO.OUT)
GPIO.setup(CHANNEL_PINS,GPIO.OUT)
_gpio_setup = True
for index, channel in enumerate(pixels):
_select_channel(index)
_sof()
for pixel in channel:
r, g, b, brightness = pixel
_write_byte(0b11100000 | brightness)
_write_byte(b)
_write_byte(g)
_write_byte(r)
_eof()
[docs]def set_all(r, g, b, brightness=None):
"""Set the RGB value and optionally brightness of all pixels
If you don't supply a brightness value, the last value set for each pixel be kept.
:param r: Amount of red: 0 to 255
:param g: Amount of green: 0 to 255
:param b: Amount of blue: 0 to 255
:param brightness: Brightness: 0.0 to 1.0 (default around 0.2)
"""
for c in range(1, NUM_CHANNELS+1):
for x in range(NUM_PIXELS_PER_CHANNEL):
set_pixel(c, x, r, g, b, brightness)
def get_pixel(c, x):
return tuple(pixels[c-1][x])
[docs]def set_pixel(c, x, r, g, b, brightness=None):
"""Set the RGB value, and optionally brightness, of a single pixel
If you don't supply a brightness value, the last value will be kept.
:param x: The horizontal position of the pixel: 0 to 7
:param r: Amount of red: 0 to 255
:param g: Amount of green: 0 to 255
:param b: Amount of blue: 0 to 255
:param brightness: Brightness: 0.0 to 1.0 (default around 0.2)
"""
c -= 1
c %= NUM_CHANNELS
x %= NUM_PIXELS_PER_CHANNEL
if brightness is None:
brightness = pixels[c][x][3]
else:
brightness = int(MAX_BRIGHTNESS * brightness) & MAX_BRIGHTNESS
pixels[c][x] = [int(r) & 0xff,int(g) & 0xff,int(b) & 0xff,brightness]
[docs]def set_clear_on_exit(value=True):
"""Set whether Mote pHAT should be cleared upon exit
By default Mote pHAT will turn off the pixels on exit, but calling::
blinkt.set_clear_on_exit(False)
Will ensure that it does not.
:param value: True or False (default True)
"""
global _clear_on_exit
_clear_on_exit = value
atexit.register(_exit)