More animations, now based on time and intervals. Massively WIP

This commit is contained in:
Kyle Brown 2019-02-19 18:07:22 -08:00
parent 7a58ac041f
commit 0ba5911f8f
2 changed files with 80 additions and 37 deletions

View File

@ -93,7 +93,7 @@ class Firmware:
pixel_pin = None pixel_pin = None
num_pixels = None num_pixels = None
pixels = None pixels = None
pixel_state = 0, 0 pixel_state = rgb.pixelinit()
def __init__(self): def __init__(self):
# Attempt to sanely guess a coord_mapping if one is not provided # Attempt to sanely guess a coord_mapping if one is not provided
@ -239,7 +239,6 @@ class Firmware:
if self.debug_enabled: if self.debug_enabled:
print("Firin' lazers. Keyboard is booted.") print("Firin' lazers. Keyboard is booted.")
while True: while True:
state_changed = False state_changed = False
@ -275,15 +274,7 @@ class Firmware:
if self.debug_enabled and state_changed: if self.debug_enabled and state_changed:
print('New State: {}'.format(self._state._to_dict())) print('New State: {}'.format(self._state._to_dict()))
gc.collect() if self.pixel_state['animation_mode'] is not None:
''' self.pixel_state = rgb.animate(self.pixel_state, self.pixels)
test = rgb.color_chase(self.pixels,
self.num_pixels,
color=(255,0,0),
color2=(0,255,255),
animation_state=self.pixel_state[0])
if test is not None: gc.collect()
# Debugging some strange errors with NoneType
self.pixel_state = test
'''

View File

@ -1,3 +1,6 @@
from math import sin, exp, pi
import time
COLORS = { COLORS = {
'OFF': (0, 0, 0), 'OFF': (0, 0, 0),
'RED': (255, 0, 0), 'RED': (255, 0, 0),
@ -16,29 +19,19 @@ def pixelinit():
's': 255, 's': 255,
'v': 255, 'v': 255,
'animation_mode': None, 'animation_mode': None,
'speed': 0, 'pos': 0,
'timer': None,
'intervals': (0, 0, 0, 0),
'speed': 120, # Bigger is slower
'enable': True 'enable': True
} }
def color_chase(pixels, num_pixels, color, color2=COLORS['OFF'], speed=100, animation_state=0): def time_ms():
if animation_state not in range(num_pixels): return time.monotonic_ns() / 10
color = color2
pixels[int(animation_state - num_pixels)] = color
else:
pixels[animation_state] = color
pixels.show()
animation_state += 1
if animation_state >= num_pixels * 2:
animation_state = 0
return animation_state, 0
def sethsv(hue, sat, val, pixels, index): def hsv_to_rgb(hue, sat, val):
r = 0 r = 0
g = 0 g = 0
b = 0 b = 0
@ -83,25 +76,84 @@ def sethsv(hue, sat, val, pixels, index):
g = base g = base
b = val - color b = val - color
rgb = (r, g, b) return r, g, b
setrgb(rgb, pixels, index)
def setrgb(rgb, pixels, index): def set_hsv(hue, sat, val, pixels, index):
set_rgb(hsv_to_rgb(hue, sat, val), pixels, index)
def set_hsv_fill(hue, sat, val, pixels):
pixels.fill(hsv_to_rgb(hue, sat, val))
pixels.show()
def set_rgb(rgb, pixels, index):
pixels[index] = (rgb[0], rgb[1], rgb[2]) pixels[index] = (rgb[0], rgb[1], rgb[2])
pixels.show()
def setrgbfill(rgb, pixels): def set_rgb_fill(rgb, pixels):
pixels.fill(rgb[0], rgb[1], rgb[2]) pixels.fill(rgb[0], rgb[1], rgb[2])
pixels.show()
def increasehue(hue, step): def increase_hue(hue, step):
return hue + step % 360 return hue + step % 360
def decreasehue(hue, step): def decrease_hue(hue, step):
if hue - step < 0: if hue - step < 0:
return (hue + 360 - step) % 360 return (hue + 360 - step) % 360
else: else:
return hue - step % 360 return hue - step % 360
def animate(state, pixels):
if state['animation_mode'] == 'breathing':
return effect_breathing(state, pixels)
elif state['animation_mode'] == 'rainbow':
return effect_rainbow(state, pixels)
return state
def animation_step(state):
interval = state['time'] - time_ms()
if interval in state['intervals']:
return interval
else:
return False
def effect_breathing(state, pixels):
if animation_step(state):
# http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/
state['v'] = (exp(sin(state['step'] / 2000.0 * pi)) - 0.36787944) * 108.0
set_hsv_fill(state['h'], state['s'], state['v'], pixels)
return state
def effect_rainbow(state, pixels):
if animation_step(state):
state['h'] = increase_hue(state['h'], 1)
set_hsv_fill(state['h'], state['s'], state['v'], pixels)
return state
def effect_rainbow_swirl(state, pixels):
interval = animation_step(state)
if interval:
MAX_RGB_NUM = 12 # TODO Actually pass this
for i in range(0, MAX_RGB_NUM):
state['h'] = (360 / MAX_RGB_NUM * i + state['h']) % 360
set_hsv_fill(state['h'], state['s'], state['v'], pixels)
if interval % 2:
state['h'] = increase_hue(state['h'], 1)
else:
state['h'] = decrease_hue(state['h'], 1)
return state