import atexit
import time
from sys import exit
try:
import sn3218
except ImportError:
exit("This library requires the sn3218 module\nInstall with: sudo pip install sn3218")
__version__ = '1.2.4'
sn3218.enable()
sn3218.enable_leds(0b111111111111111111)
clear_on_exit = True
auto_update = False
_legs = [
# r o y g b w
[6, 7, 8, 5, 4, 9],
[17, 16, 15, 13, 11, 10],
[0, 1, 2, 3, 14, 12]
]
_map = _legs[0] + _legs[1] + _legs[2]
_values = [0] * 18
colours = {
"red": 0,
"orange": 1,
"yellow": 2,
"green": 3,
"blue": 4,
"white": 5
}
def white(v): ring(5, v)
def blue(v): ring(4, v)
def green(v): ring(3, v)
def yellow(v): ring(2, v)
def orange(v): ring(1, v)
def red(v): ring(0, v)
def arm1(v): arm(0, v)
def arm2(v): arm(1, v)
def arm3(v): arm(2, v)
def led1(v): set(0, v)
def led2(v): set(1, v)
def led3(v): set(2, v)
def led4(v): set(3, v)
def led5(v): set(4, v)
def led6(v): set(5, v)
def led7(v): set(6, v)
def led8(v): set(7, v)
def led9(v): set(8, v)
def led10(v): set(9, v)
def led11(v): set(10, v)
def led12(v): set(11, v)
def led13(v): set(12, v)
def led14(v): set(13, v)
def led15(v): set(14, v)
def led16(v): set(15, v)
def led17(v): set(16, v)
def led18(v): set(17, v)
def arm(x, y): leg(x - 1, y)
def spoke(x, y): leg(x - 1, y)
[docs]def show():
"""Output the contents of the values list to PiGlow."""
sn3218.output(_values)
def get():
return _values
[docs]def set(leds, value):
"""Set one or more LEDs with one or more values.
You can set multiple LEDs with the same value, or supply a list of LEDs and values.
:param led: A single index, or list of indexes of the LEDs to set
:param value: A single value, or list of values to set"""
if isinstance(value, list) and isinstance(leds, int):
offset = leds
leds = [(offset + x) % 18 for x in range(len(value))]
if isinstance(leds, list):
leds = [_map[l] for l in leds]
elif isinstance(leds, int):
leds = _map[leds]
_set(leds, value)
def _set(leds, value):
global _values
if isinstance(leds, list):
if isinstance(value, list):
for x in range(len(value)):
_values[leds[x] % 18] = (value[x] % 256)
else:
for led_index in leds:
_values[led_index % 18] = (value % 256)
elif isinstance(leds, int):
leds %= 18
if isinstance(value, list):
_values[leds:leds + len(value)] = map(lambda v: v % 256, value)
if len(_values) > 18:
wrap = _values[18:]
_values = _values[:18]
set(0, wrap)
else:
_values[leds] = (value % 256)
else:
raise ValueError("Invalid LED(s)")
if auto_update:
show()
[docs]def ring(ring_index, value):
"""Set the brightness of a specific ring"""
ring_index %= 7
_set([_legs[0][ring_index], _legs[1][ring_index], _legs[2][ring_index]], value)
[docs]def leg_bar(leg_index, percentage):
"""Display a bargraph on a leg.
A leg/arm/spoke is the line of 6 LEDs the emanates from the center of Piglow to the edge.
:param leg_index: leg from 0 to 2
:param percentage: percentage to display in decimal
"""
if percentage > 1.0 or percentage < 0:
raise ValueError("percentage must be between 0.0 and 1.0")
# 1530 = 6 * 255
amount = int(1530.0 * percentage)
for led_index in reversed(_legs[leg_index % 3]):
_set(led_index, 255 if amount > 255 else amount)
amount = 0 if amount < 255 else amount - 255
def leg(leg_index, intensity):
_set(_legs[leg_index % 3], intensity)
[docs]def led(led_index, intensity):
"""Compatibility function for old PiGlow library
Accepts LED between 1 and 18.
Calls set(led - 1, intesity)
:param led_index: LED number from 1 to 18
:param intensity: brightness from 0 to 255
"""
set(led_index - 1, intensity)
[docs]def single(leg_index, ring_index, intensity):
"""Sets a single LED by its leg/ring
:param leg_index: leg index of LED
:param ring_index: ring index of LED
:param intensity: brightness from 0 to 255
"""
_set(_legs[leg_index % 3][ring_index % 7], intensity)
[docs]def tween(duration, end, start=None):
"""Tweens to a particular set of intensities.
Also accepts an optional starting point, otherwise
the current state of the LED is used.
:param duration: duration in seconds
:param end: list of 18 values to tween to
:param start: list of 18 values to start from
"""
if not len(end) == 18:
raise ValueError("Requires list of 18 values")
fps = 1.0 / 60
steps = int(duration / fps)
if start is None:
start = _values
for x in range(steps):
new = []
for y in range(18):
s = start[y]
e = end[y]
c = float(e - s)
b = s + ((c / float(steps)) * (x + 1))
new.append(int(b))
_set(0, new)
show()
time.sleep(fps)
[docs]def colour(colour, intensity):
"""Set all LEDs of a particular colour to specified intensity
:param colour: text name of LED colour; red, orange, yellow, green, blue, white
:param intensity: brightness from 0 to 255
"""
if not isinstance(colour, int):
if colour in colours:
ring(colours[colour], intensity)
return True
else:
raise ValueError("Invalid Colour")
ring(colour - 1, intensity)
return True
[docs]def all(value):
"""Set all LEDs to a specific brightness"""
global _values
_values = [value] * 18
if auto_update:
show()
[docs]def clear():
"""Set all LEDS to 0/off"""
all(0)
[docs]def off():
"""Set all LEDs to 0/off"""
all(0)
show()
def _exit():
if clear_on_exit:
off()
atexit.register(_exit)