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

"""
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)