You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.7 KiB
Python
146 lines
3.7 KiB
Python
"""
|
|
LED pattern like Echo
|
|
"""
|
|
|
|
import time
|
|
|
|
|
|
class Echo(object):
|
|
brightness = 24 * 8
|
|
|
|
def __init__(self, show, number=12):
|
|
self.pixels_number = number
|
|
self.pixels = [0] * 4 * number
|
|
|
|
if not callable(show):
|
|
raise ValueError('show parameter is not callable')
|
|
|
|
self.show = show
|
|
self.stop = False
|
|
|
|
def wakeup(self, direction=0):
|
|
position = int((direction + 15) / (360 / self.pixels_number)) % self.pixels_number
|
|
|
|
pixels = [0, 0, 0, self.brightness] * self.pixels_number
|
|
pixels[position * 4 + 2] = self.brightness
|
|
|
|
self.show(pixels)
|
|
|
|
def listen(self):
|
|
pixels = [0, 0, 0, self.brightness] * self.pixels_number
|
|
|
|
self.show(pixels)
|
|
|
|
def think(self):
|
|
half_brightness = int(self.brightness / 2)
|
|
pixels = [0, 0, half_brightness, half_brightness, 0, 0, 0, self.brightness] * self.pixels_number
|
|
|
|
while not self.stop:
|
|
self.show(pixels)
|
|
time.sleep(0.2)
|
|
pixels = pixels[-4:] + pixels[:-4]
|
|
|
|
def speak(self):
|
|
step = int(self.brightness / 12)
|
|
position = int(self.brightness / 2)
|
|
while not self.stop:
|
|
pixels = [0, 0, position, self.brightness - position] * self.pixels_number
|
|
self.show(pixels)
|
|
time.sleep(0.01)
|
|
if position <= 0:
|
|
step = int(self.brightness / 12)
|
|
time.sleep(0.4)
|
|
elif position >= int(self.brightness / 2):
|
|
step = - int(self.brightness / 12)
|
|
time.sleep(0.4)
|
|
|
|
position += step
|
|
|
|
def off(self):
|
|
self.show([0] * 4 * 12)
|
|
|
|
class GoogleHome(object):
|
|
def __init__(self, show):
|
|
self.basis = [0] * 4 * 12
|
|
self.basis[0 * 4 + 1] = 8
|
|
self.basis[3 * 4 + 1] = 4
|
|
self.basis[3 * 4 + 2] = 4
|
|
self.basis[6 * 4 + 2] = 8
|
|
self.basis[9 * 4 + 3] = 8
|
|
|
|
self.pixels = self.basis
|
|
|
|
if not callable(show):
|
|
raise ValueError('show parameter is not callable')
|
|
|
|
self.show = show
|
|
self.stop = False
|
|
|
|
def wakeup(self, direction=0):
|
|
position = int((direction + 90 + 15) / 30) % 12
|
|
|
|
basis = self.basis[position*-4:] + self.basis[:position*-4]
|
|
|
|
pixels = [v * 25 for v in basis]
|
|
self.show(pixels)
|
|
time.sleep(0.1)
|
|
|
|
pixels = pixels[-4:] + pixels[:-4]
|
|
self.show(pixels)
|
|
time.sleep(0.1)
|
|
|
|
for i in range(2):
|
|
new_pixels = pixels[-4:] + pixels[:-4]
|
|
|
|
self.show([v/2+pixels[index] for index, v in enumerate(new_pixels)])
|
|
pixels = new_pixels
|
|
time.sleep(0.1)
|
|
|
|
self.show(pixels)
|
|
self.pixels = pixels
|
|
|
|
def listen(self):
|
|
pixels = self.pixels
|
|
for i in range(1, 25):
|
|
self.show([(v * i / 24) for v in pixels])
|
|
time.sleep(0.01)
|
|
|
|
def think(self):
|
|
pixels = self.pixels
|
|
|
|
while not self.stop:
|
|
pixels = pixels[-4:] + pixels[:-4]
|
|
self.show(pixels)
|
|
time.sleep(0.2)
|
|
|
|
t = 0.1
|
|
for i in range(0, 5):
|
|
pixels = pixels[-4:] + pixels[:-4]
|
|
self.show([(v * (4 - i) / 4) for v in pixels])
|
|
time.sleep(t)
|
|
t /= 2
|
|
|
|
self.pixels = pixels
|
|
|
|
def speak(self):
|
|
pixels = self.pixels
|
|
step = 1
|
|
brightness = 5
|
|
while not self.stop:
|
|
self.show([(v * brightness / 24) for v in pixels])
|
|
time.sleep(0.02)
|
|
|
|
if brightness <= 5:
|
|
step = 1
|
|
time.sleep(0.4)
|
|
elif brightness >= 24:
|
|
step = -1
|
|
time.sleep(0.4)
|
|
|
|
brightness += step
|
|
|
|
def off(self):
|
|
self.show([0] * 4 * 12)
|
|
|
|
|